feat: 初始提交 - Code Server Bridge完整实现

- OAuth认证系统(Gitea + Lua扩展)
- Git自动化操作(本地/SSH远程)
- 实时进度WebSocket推送
- 现代化Tab界面UI
- Cobra CLI命令行(init/version/serve)
- 完整构建系统(Makefile + Taskfile)
- UPX压缩支持(体积减少70%)
This commit is contained in:
2026-01-08 23:32:29 +08:00
commit 8265df0dcd
40 changed files with 3786 additions and 0 deletions

View File

@@ -0,0 +1,8 @@
package auth
type Identify struct {
Provider string `lua:"provider"`
UserId string `lua:"uid"`
Username string `lua:"username"`
Avatar string `lua:"avatar"`
}

87
internal/auth/token.go Normal file
View File

@@ -0,0 +1,87 @@
package auth
import (
"crypto/rand"
"cs-bridge/internal/db"
"encoding/hex"
"errors"
"fmt"
"time"
"gorm.io/gorm"
)
var (
ErrTokenNotFound = errors.New("token not found")
ErrTokenExpired = errors.New("token expired")
ErrTokenUsed = errors.New("token already used")
)
// GenerateWorkspaceToken 生成workspace访问token
// workspacePath: workspace的路径
// ttl: token有效期
// 返回生成的token字符串和可能的错误
func GenerateWorkspaceToken(workspacePath string, ttl time.Duration) (string, error) {
// 生成随机token (32字节 = 64个十六进制字符)
tokenBytes := make([]byte, 32)
if _, err := rand.Read(tokenBytes); err != nil {
return "", err
}
token := hex.EncodeToString(tokenBytes)
// 计算过期时间
expiresAt := time.Now().Add(time.Second * ttl)
fmt.Println("GenerateWorkspaceToken: expiresAt: ", expiresAt)
// 保存到数据库
workspaceToken := db.WorkspaceToken{
Token: token,
WorkspacePath: workspacePath,
ExpiresAt: expiresAt,
Used: false,
}
database := db.GetDB()
if err := database.Create(&workspaceToken).Error; err != nil {
return "", err
}
return token, nil
}
// ValidateToken 验证token (可多次使用,直到过期)
// token: 要验证的token字符串
// 返回workspace路径和可能的错误
func ValidateAndConsumeToken(token string) (string, error) {
database := db.GetDB()
var workspaceToken db.WorkspaceToken
// 查找token
if err := database.Where("token = ?", token).First(&workspaceToken).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return "", ErrTokenNotFound
}
return "", err
}
// 检查是否过期
if time.Now().After(workspaceToken.ExpiresAt) {
return "", ErrTokenExpired
}
// Token有效,可以多次使用直到过期
return workspaceToken.WorkspacePath, nil
}
// CleanExpiredTokens 清理过期的token
// 删除所有已过期的token记录
func CleanExpiredTokens() error {
database := db.GetDB()
// 删除所有过期的token
result := database.Where("expires_at < ?", time.Now()).Delete(&db.WorkspaceToken{})
return result.Error
}