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

94
scripts/oauth/gitea.lua Normal file
View File

@@ -0,0 +1,94 @@
-- Gitea OAuth Provider
-- 使用完整的Lua API功能
-- 1. 生成授权URL
function auth_url(cfg, state)
log.info("Gitea: 生成授权URL, state=%s", state)
-- 构建查询参数
local params = {
"client_id=" .. util.url_encode(cfg.client_id),
"redirect_uri=" .. util.url_encode(cfg.redirect_uri),
"response_type=code",
"scope=read:user",
"state=" .. util.url_encode(state)
}
-- 拼接URL
local url = cfg.base_url .. cfg.authorize_url .. "?" .. table.concat(params, "&")
log.debug("Gitea: 授权URL生成完成")
return url
end
-- 2. 交换授权码获取访问令牌
function exchange(cfg, code)
log.info("Gitea: 开始交换授权码获取访问令牌")
-- 准备请求数据
local data = {
client_id = cfg.client_id,
client_secret = cfg.client_secret,
code = code,
grant_type = "authorization_code",
redirect_uri = cfg.redirect_uri
}
local url = cfg.base_url .. cfg.token_url
log.debug("Gitea: 请求token URL: %s", url)
-- 发送POST请求
local resp, err = http.post(url, data, {
Accept = "application/json"
})
if err then
log.error("Gitea: 获取token失败: %s", err)
return nil, err
end
-- 检查响应
if not resp.access_token then
log.error("Gitea: 响应中没有access_token")
log.debug("Gitea: 响应内容: %s", json.encode(resp))
return ""
end
log.info("Gitea: 成功获取访问令牌")
return resp.access_token
end
-- 3. 获取用户信息
function user_info(cfg, token)
log.info("Gitea: 开始获取用户信息")
local url = cfg.base_url .. cfg.user_url
log.debug("Gitea: 请求用户信息URL: %s", url)
-- 发送GET请求
local resp, err = http.get(url, {
Authorization = "Bearer " .. token,
Accept = "application/json"
})
if err then
log.error("Gitea: 获取用户信息失败: %s", err)
return nil, err
end
-- 验证响应
if not resp.id then
log.error("Gitea: 用户信息响应格式错误")
log.debug("Gitea: 响应内容: %s", json.encode(resp))
return {}
end
log.info("Gitea: 成功获取用户信息, 用户名=%s", resp.login or "unknown")
-- 返回标准化的用户信息
return {
uid = tostring(resp.id),
username = resp.login,
avatar = resp.avatar_url
}
end