feat(client): add authorized WireGuard device enrollment and desktop connection

This commit is contained in:
opsx committed 2026-10-21 14:53:55 +08:00
1 parent d2f1f5040e
commit 6dd3c7dd45
25 files changed
+3274 -131

No files matched your search

+40 -7
View File
@@ -110,12 +110,12 @@ type Tunnel struct {
type Node struct {
ID uint `gorm:"primaryKey" json:"id"`
Name string `gorm:"size:128" json:"name"`
Address string `gorm:"size:256" json:"address"` // 节点地址(IP 或域名)
Port int `gorm:"default:22" json:"port"` // SSH 端口
Kind string `gorm:"size:32;default:local" json:"kind"` // local / remote
Username string `gorm:"size:64" json:"username"` // SSH 登录用户
Address string `gorm:"size:256" json:"address"` // 节点地址(IP 或域名)
Port int `gorm:"default:22" json:"port"` // SSH 端口
Kind string `gorm:"size:32;default:local" json:"kind"` // local / remote
Username string `gorm:"size:64" json:"username"` // SSH 登录用户
AuthType string `gorm:"size:16;default:password" json:"auth_type"` // password / key
Secrets string `gorm:"type:text" json:"-"` // AES-GCM 加密的 {password, private_key} JSON
Secrets string `gorm:"type:text" json:"-"` // AES-GCM 加密的 {password, private_key} JSON
Status string `gorm:"size:16;default:unknown" json:"status"` // verified / failed / unknown
Remark string `gorm:"size:512" json:"remark"`
UpdatedAt time.Time `json:"updated_at"`
@@ -175,12 +175,45 @@ type ConnectionLog struct {
CreatedAt time.Time `json:"created_at"`
}
// ClientDevice 终端用户设备(桌面/移动客户端注册)。
// 私钥只在客户端生成与保管,服务端仅保存公钥;撤销后不可恢复,需用新密钥重新注册。
type ClientDevice struct {
ID uint `gorm:"primaryKey" json:"id"`
VPNUserID uint `gorm:"index" json:"-"`
TunnelID uint `gorm:"index;index:idx_client_device_user" json:"tunnel_id"`
Username string `gorm:"size:128;index:idx_client_device_user" json:"username"` // 拨号用户名(VPNUser)
Name string `gorm:"size:128" json:"name"` // 设备名,如 "张三的 MacBook"
Platform string `gorm:"size:32" json:"platform"` // windows / macos / linux / android / ios
PeerID string `gorm:"size:64" json:"peer_id"` // WireGuard Peer ID(dev-<设备ID>)
PublicKey string `gorm:"size:64;uniqueIndex" json:"public_key"`
ClientAddress string `gorm:"size:64" json:"client_address"` // 分配的 VPN 地址,如 10.8.0.7/32
Revoked bool `gorm:"default:false" json:"revoked"`
RxBytes int64 `gorm:"default:0" json:"rx_bytes"`
TxBytes int64 `gorm:"default:0" json:"tx_bytes"`
LastSeenAt *time.Time `json:"last_seen_at"` // 最近一次握手时间
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
// ClientSession 客户端长期访问令牌(只保存 SHA-256 哈希,滑动续期)。
// 与管理后台内存会话完全隔离,不携带任何管理权限。
type ClientSession struct {
ID uint `gorm:"primaryKey" json:"id"`
TokenHash string `gorm:"size:64;uniqueIndex" json:"-"`
Grants string `gorm:"type:text" json:"-"` // 授权的 VPNUser ID 与凭据指纹;旧会话无授权
Username string `gorm:"size:128;index" json:"username"`
DeviceName string `gorm:"size:128" json:"device_name"`
Platform string `gorm:"size:32" json:"platform"`
ExpireAt time.Time `gorm:"index" json:"expire_at"`
CreatedAt time.Time `json:"created_at"`
}
// TrafficPolicy 流量配额与限速策略(挂在 Tunnel 上) // Logan.Li
type TrafficPolicy struct {
ID uint `gorm:"primaryKey" json:"id"`
TunnelID uint `gorm:"uniqueIndex" json:"tunnel_id"`
QuotaBytes int64 `gorm:"default:0" json:"quota_bytes"` // 总配额,0=不限
RateLimitMbps int `gorm:"default:0" json:"rate_limit_mbps"` // 限速 Mbps,0=不限
QuotaBytes int64 `gorm:"default:0" json:"quota_bytes"` // 总配额,0=不限
RateLimitMbps int `gorm:"default:0" json:"rate_limit_mbps"` // 限速 Mbps,0=不限
UsedBytes int64 `gorm:"default:0" json:"used_bytes"`
ResetCycle string `gorm:"size:16;default:none" json:"reset_cycle"` // daily / monthly / none
LastResetAt time.Time `json:"last_reset_at"`