- DCAuth 协议升级到 v2,签名原文只含设备码;客户端 2.0.0,旧版本返回 426 - 删除客户端机器码采集、后端 machine_code_* 字段与日志、后台机器码展示 - 102 迁移在生产执行前直接改为无机器码结构;SQL 守卫仅放行该文件 - Mock 短信不启用每日限额;修复慢电脑首次启动的协议转发竞态 - 新增 macOS DCAuth.app 打包脚本,注册 dcauth:// 协议,浏览器可直接唤起
65 lines
1.5 KiB
Go
65 lines
1.5 KiB
Go
//go:build !windows && !darwin
|
|
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
)
|
|
|
|
func runClient(protocolArg string) {
|
|
identity, err := loadOrCreateIdentity()
|
|
if err != nil {
|
|
showError("DCAuth 初始化失败", err.Error())
|
|
return
|
|
}
|
|
|
|
if protocolArg == "" {
|
|
text := fmt.Sprintf(
|
|
"DCAuth v%s\n设备码:%s\n\n设备码用于识别本机设备。\n请从后台登录页点击“验证本机”完成登录。",
|
|
clientVersion,
|
|
identity.deviceID,
|
|
)
|
|
copyToClipboard(identity.deviceID)
|
|
showInfo("DCAuth v"+clientVersion+" 设备信息", text+"\n\n设备码已复制到剪贴板。")
|
|
return
|
|
}
|
|
|
|
target, err := parseAuthorizeURL(protocolArg)
|
|
if err != nil {
|
|
showError("DCAuth 协议无效", err.Error())
|
|
return
|
|
}
|
|
app := appRegistry[target.App]
|
|
if !confirm(
|
|
app.DisplayName+" · 本机登录确认",
|
|
fmt.Sprintf("是否确认使用本机设备登录「%s」?\n\n设备码:%s", app.DisplayName, identity.deviceID),
|
|
) {
|
|
return
|
|
}
|
|
if err := submitAuthorization(identity, target); err != nil {
|
|
showError("本机验证失败", err.Error())
|
|
return
|
|
}
|
|
showInfo("本机验证成功", "已确认本机设备,请回到浏览器继续登录。")
|
|
}
|
|
|
|
func showInfo(title, text string) {
|
|
fmt.Printf("[%s]\n%s\n", title, text)
|
|
}
|
|
|
|
func showError(title, text string) {
|
|
fmt.Fprintf(os.Stderr, "[%s]\n%s\n", title, text)
|
|
}
|
|
|
|
func confirm(title, text string) bool {
|
|
fmt.Printf("[%s]\n%s\n[y/N] ", title, text)
|
|
var answer string
|
|
_, _ = fmt.Scanln(&answer)
|
|
return answer == "y" || answer == "Y"
|
|
}
|
|
|
|
func copyToClipboard(text string) {
|
|
_ = text
|
|
}
|