kevin
6026beb107
fix: 修正 macOS ditto 打包选项为 --keepParent
2026-07-07 20:22:22 +08:00
kevin
8c903860c2
docs: README 添加服务端项目地址与 CI 说明
2026-07-07 20:13:50 +08:00
kevin
7abbf9e6cc
feat: 添加 GitHub Actions 多平台自动发布工作流
2026-07-07 20:12:09 +08:00
kevin
45b9fa24a1
up
2026-07-07 19:57:54 +08:00
kevin
4108adf1f7
up
2026-07-07 19:57:33 +08:00
kevin
6074dd5a73
up readme
2026-07-07 19:43:48 +08:00
kevin
3c076785f6
feat: Windows 安装器 + 修复 daemon 无法连接问题
...
- 新增 Inno Setup 安装器脚本 (installer/lmvpn.iss),支持自定义安装路径、
桌面快捷方式、安装前杀死旧进程,打包 wintun.dll
- Makefile 新增 installer-windows 目标,支持 ISCC 和 Wine 两种编译方式
- Windows IPC 从 AF_UNIX 改为 TCP (127.0.0.1:18923),解决提权 daemon 与
非提权 GUI 之间的完整性级别限制导致 daemon did not become reachable
- 修复 elevation_windows.go 中 ShellExecute 参数路径含空格时被截断的问题
(C:\Program Files\LMVPN\lmvpnd.exe → 只取到 C:\Program)
- ensureDaemon 重试次数 40→60,添加连接失败日志便于诊断
- 新增 IPCNetwork()/IPCAddress() 跨平台函数,统一 IPC 传输层抽象
2026-07-07 19:29:41 +08:00
kevin
019df7bc23
修复图标显示
2026-07-07 17:58:04 +08:00
kevin
9a1aca5d1b
up
2026-07-07 17:48:48 +08:00
kevin
027d837cb2
fix: 修复 Windows 端密码无法持久化的问题
...
Windows 端使用内存版 MemStore(keychain_other.go, 构建标签 !darwin),
进程退出后密码丢失,导致每次启动都需重新输入密码才能连接。
新增 keychain_windows.go,基于 Windows 凭据管理器(Credential Manager)
实现 Store 接口,密码经 Windows 登录凭据加密并持久化,跨重启保留。
keychain_other.go 构建标签收窄为 !darwin && !windows,作为 Linux 回退。
macOS 版本不受影响(仍由 keychain_darwin.go 独占编译)。
2026-07-07 17:47:41 +08:00
kevin
0c5e996bfd
fix: 修复 Windows 端 IPv6 无法下行的问题
...
根因: netsh interface ipv6 命令参数名用错
- configureIPv6Addr: name= → interface=,IPv6 地址未实际分配到适配器
- SetMTU IPv6: name= → interface=
路由修复:
- cidrToV6Prefix: 用 Mask.Size() 取前缀长度,修复 fmt.Sprintf(%d, mask) 输出字节切片的 bug
- addRoute6/deleteRoute6: netsh → route -6,用 :: 作 on-link gateway
- addRouteVia6/deleteRouteVia6: 加 -6 flag
- defaultGateway6: route -6 print :: → route -6 print(避免过滤掉 ::/0)
- applyFull: IPv6 bypass 路由失败不再阻断全隧道路由
2026-07-07 17:37:09 +08:00
kevin
65a5932eba
feat: 支持 Windows x86_64 平台编译
...
- 新增 WinTun TUN 设备实现(tun_windows.go),无需安装驱动,
wintun.dll 嵌入 exe 运行时自动释放
- 新增 Windows 路由管理(route_windows.go),使用 route/netsh 命令
- 新增 Windows 路径(paths_windows.go),使用 %APPDATA%/%LOCALAPPDATA%
- 拆分 daemon 启动逻辑:launch_unix.go(Setsid) / launch_windows.go
(CREATE_NEW_PROCESS_GROUP),公共代码提取到 launch_common.go
- 拆分提权逻辑:elevation_darwin.go(osascript) / elevation_windows.go
(ShellExecute UAC) / elevation_other.go(pkexec)
- IPCSocketPath 按平台分散,Windows 用 %TEMP%\lmvpn.sock
- daemon 二进制名用编译时常量(daemonBinaryName),按平台选定 .exe 后缀
- Makefile 新增 build-windows 目标
- 重新标记 !darwin 文件为 !darwin && !windows
2026-07-07 16:50:42 +08:00
kevin
6b9960076d
up
2026-07-07 14:40:07 +08:00
kevin
56102589f6
feat: 认证失败时停止重连并提示用户
...
密码错误、账户禁用、令牌过期或限流等永久性认证错误不再无限
重连,改为置 StateError 并通过 EvError 弹窗告知用户具体原因
(中英文本地化)。网络错误仍正常指数退避重试。
- protocol: 新增 AuthErrorCode 类型与消息映射
- transport: AuthError/ServerError 携带 Code 字段
- vpn: run() 循环识别致命认证错误并停止,新增 onError 回调
- ipc/daemon/ui: 打通错误码到 UI 的本地化展示
2026-07-07 14:37:26 +08:00
kevin
6daa73fdb0
增加图标
2026-07-07 14:16:09 +08:00
kevin
abcbb6ae68
更新项目连接
2026-07-07 13:44:37 +08:00
kevin
9c16d804d9
修复按钮逻辑bug
2026-07-07 13:34:48 +08:00
kevin
e08480f609
整合配置列表
2026-07-07 13:16:07 +08:00
kevin
4420532a66
fix: ensureDaemon 自动检测并重启过期守护进程
...
问题: 重新构建后 IPv6 等新功能不生效,客户端仍运行旧代码。
根因: ensureDaemon() 通过 IPC socket 拨号时,若旧 daemon 进程仍在
运行(重建后未退出),GUI 会直接复用旧进程,永不启动新二进制。
日志证实旧 daemon 处理连接(init 日志无 ip6 字段),新代码从未执行。
解决方案: 新增版本握手协议,GUI 启动时查询 daemon 构建版本,
版本不匹配则自动关闭旧进程并启动新的。
- 新建 internal/version 包,GUI 与 daemon 共享同一 Version 变量,
均通过 Makefile ldflags 注入
- IPC 新增 CmdVersion 命令,daemon 返回 version.Version;
Response 增加 Version 字段,Client 新增 QueryVersion() 方法
- ensureDaemon() 拨号后查询版本,不匹配则发 CmdShutdown、等待
socket 释放、重新启动 daemon;旧 daemon 不识别 CmdVersion 时
返回错误,同样触发重启
- Makefile LDFLAGS 改为注入 lmvpn/internal/version.Version
2026-07-07 12:42:23 +08:00
kevin
a332857973
up
2026-07-07 12:24:48 +08:00
kevin
8f6daf9f49
feat: 新增 IPv6 双栈支持
...
- 协议: InitMessage 增加 ip6/prefix6/server_ip6 字段(omitempty,向后兼容)
- TUN: Device 接口新增 ConfigureIPv6, macOS 用 ifconfig inet6, Linux 用 ip -6 addr add
- 路由: full 模式自动添加 ::/1+8000::/1, v6 服务器旁路 /128, resolveHosts 双栈解析
- 会话: setupTUN 解析 v6 字段并配置 TUN+路由, connectOnce 传 v6 给 stats/日志
- 统计: SetConnected(ip,ip6), Snapshot.AssignedIP6
- DB: connection_logs 增加 assigned_ip6 列 + migrateV3 幂等迁移
- UI: 状态卡片新增独立 IPv6 行, 始终可见(未获取显示 IPv6: —)
- 文档: 同步 client-development.md 至服务端 IPv6 版本
2026-07-07 12:24:20 +08:00
kevin
e867c8e248
修复滚动问题
2026-07-06 21:17:00 +08:00
kevin
43adeb9684
功能基本实现
2026-07-06 21:08:30 +08:00
kevin
5134290bf2
增加版本显示
2026-07-06 21:04:25 +08:00
kevin
96278fdf37
拆分服务器地址配置为独立字段,支持CDN优选IP故障切换,新增重置数据库按钮
...
- model: ServerURL → Protocol/Host/ServerIPs/Port/Path 五个字段
- db: 自动迁移旧 server_url 列到新表结构
- ui: 配置窗口改为横向分组布局,保存失败时不再关闭窗口
- transport: 支持 TLS SNI + Host 头覆盖以连接 CDN 边缘节点
- session: CDN IP 列表连接失败自动切换到下一个
- 新增重置数据库按钮,一键清空所有配置
2026-07-06 20:58:11 +08:00
kevin
32471e25b0
修复滚动问题
2026-07-06 20:29:10 +08:00
kevin
12210423f2
修改logo,修改配置页面的窗口
2026-07-06 20:22:25 +08:00
kevin
04d2e6e429
fix: correct connect/disconnect button state on connection lifecycle
...
- Enable disconnect button immediately when connect is clicked, so the
user can cancel without waiting for the StateConnecting IPC event.
- Disable disconnect button on all error paths in the connect goroutine
to restore the default disconnected button state.
- Capture ipcClient once at eventLoop start instead of re-reading every
iteration, preventing a second onConnect call from making the old
event loop jump to the new client and consume events concurrently.
- In eventLoop recv error recovery, only reset button states if the
current ipcClient still matches the captured one, so a stale
disconnection does not clobber the state of a newer session.
- Disable connect button in StateReconnecting case (was missing).
- Remove WriteOK from daemon startSession: the StateConnecting event
already serves as the implicit acknowledgment; the OK response was
being read by eventLoop as a no-op event, adding unnecessary noise.
2026-07-06 19:34:29 +08:00
kevin
b0aa386ee2
修复 daemon 启动问题,分离 GUI 和 daemon 二进制
...
- 分离二进制: cmd/lmvpn (GUI+Fyne) 和 cmd/lmvpnd (daemon, 无 Fyne)
消除 daemon 启动时的 Fyne locale 初始化错误
- 新增 daemon-launch 子命令: 用 syscall.SysProcAttr{Setsid: true}
替代 nohup, 解决 osascript 无 TTY 时的 'Inappropriate ioctl' 错误
- daemon 日志写到用户家目录: paths.SetUserHome() 覆盖 root 默认路径
- IPC socket chown 给用户: 解决 root:wheel 0660 导致 GUI 无法连接
- 修复 JWT→密码认证回退: 捕获 ServerError{auth_err} 而非仅 AuthError
- 修复 token URL 编码: 用 url.QueryEscape 替代裸拼接
- 日志去重: LMVPN_DAEMON=1 时 daemon 不再 stderr 镜像到文件
- Makefile 构建双二进制并打包到 .app bundle
2026-07-06 17:46:36 +08:00
kevin
124d6ad363
up
2026-07-06 16:53:24 +08:00
kevin
1f1794fcc7
增加多语言支持
2026-07-06 16:52:04 +08:00
kevin
1e3db0a724
up
2026-07-06 16:26:22 +08:00
kevin
bb9f685221
init
2026-07-06 16:21:06 +08:00