package controller import ( "crypto/hmac" "crypto/sha256" "encoding/hex" "io" "one-api/common" "one-api/model" "sort" "github.com/gin-contrib/sessions" "github.com/gin-gonic/gin" ) func TelegramBind(c *gin.Context) { if !common.TelegramOAuthEnabled { c.JSON(200, gin.H{ "message": "管理员未开启通过 Telegram 登录以及注册", "success": false, }) return } params := c.Request.URL.Query() if !checkTelegramAuthorization(params, common.TelegramBotToken) { c.JSON(200, gin.H{ "message": "无效的请求", "success": false, }) return } telegramId := params["id"][0] if model.IsTelegramIdAlreadyTaken(telegramId) { c.JSON(200, gin.H{ "message": "该 Telegram 账户已被绑定", "success": false, }) return } session := sessions.Default(c) id := session.Get("id") user := model.User{Id: id.(int)} if err := user.FillUserById(); err != nil { c.JSON(200, gin.H{ "message": err.Error(), "success": false, }) return } user.TelegramId = telegramId if err := user.Update(false); err != nil { c.JSON(200, gin.H{ "message": err.Error(), "success": false, }) return } c.Redirect(302, "/setting") } func TelegramLogin(c *gin.Context) { if !common.TelegramOAuthEnabled { c.JSON(200, gin.H{ "message": "管理员未开启通过 Telegram 登录以及注册", "success": false, }) return } params := c.Request.URL.Query() if !checkTelegramAuthorization(params, common.TelegramBotToken) { c.JSON(200, gin.H{ "message": "无效的请求", "success": false, }) return } telegramId := params["id"][0] user := model.User{TelegramId: telegramId} if err := user.FillUserByTelegramId(); err != nil { c.JSON(200, gin.H{ "message": err.Error(), "success": false, }) return } setupLogin(&user, c) } func checkTelegramAuthorization(params map[string][]string, token string) bool { strs := []string{} var hash = "" for k, v := range params { if k == "hash" { hash = v[0] continue } strs = append(strs, k+"="+v[0]) } sort.Strings(strs) var imploded = "" for _, s := range strs { if imploded != "" { imploded += "\n" } imploded += s } sha256hash := sha256.New() io.WriteString(sha256hash, token) hmachash := hmac.New(sha256.New, sha256hash.Sum(nil)) io.WriteString(hmachash, imploded) ss := hex.EncodeToString(hmachash.Sum(nil)) return hash == ss }