Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 20 additions & 35 deletions controller/discord.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package controller

import (
"encoding/json"
"errors"
"fmt"
"net/http"
"net/url"
Expand All @@ -11,7 +9,9 @@ import (
"time"

"github.com/QuantumNous/new-api/common"
"github.com/QuantumNous/new-api/i18n"
"github.com/QuantumNous/new-api/model"
"github.com/QuantumNous/new-api/oauth"
"github.com/QuantumNous/new-api/setting/system_setting"

"github.com/gin-contrib/sessions"
Expand All @@ -33,9 +33,9 @@ type DiscordUser struct {
Name string `json:"global_name"`
}

func getDiscordUserInfoByCode(code string) (*DiscordUser, error) {
func getDiscordUserInfoByCode(c *gin.Context, code string) (*DiscordUser, error) {
if code == "" {
return nil, errors.New("无效的参数")
return nil, oauth.NewOAuthError(i18n.MsgOAuthInvalidCode, nil)
}

values := url.Values{}
Expand All @@ -57,18 +57,18 @@ func getDiscordUserInfoByCode(code string) (*DiscordUser, error) {
res, err := client.Do(req)
if err != nil {
common.SysLog(err.Error())
return nil, errors.New("无法连接至 Discord 服务器,请稍后重试!")
return nil, oauth.NewOAuthErrorWithRaw(i18n.MsgOAuthConnectFailed, providerParams("Discord"), err.Error())
}
defer res.Body.Close()
var discordResponse DiscordResponse
err = json.NewDecoder(res.Body).Decode(&discordResponse)
err = common.DecodeJson(res.Body, &discordResponse)
if err != nil {
return nil, err
}

if discordResponse.AccessToken == "" {
common.SysError("Discord 获取 Token 失败,请检查设置!")
return nil, errors.New("Discord 获取 Token 失败,请检查设置!")
return nil, oauth.NewOAuthError(i18n.MsgOAuthTokenFailed, providerParams("Discord"))
}

req, err = http.NewRequest("GET", "https://discord.com/api/v10/users/@me", nil)
Expand All @@ -79,22 +79,22 @@ func getDiscordUserInfoByCode(code string) (*DiscordUser, error) {
res2, err := client.Do(req)
if err != nil {
common.SysLog(err.Error())
return nil, errors.New("无法连接至 Discord 服务器,请稍后重试!")
return nil, oauth.NewOAuthErrorWithRaw(i18n.MsgOAuthConnectFailed, providerParams("Discord"), err.Error())
}
defer res2.Body.Close()
if res2.StatusCode != http.StatusOK {
common.SysError("Discord 获取用户信息失败!请检查设置!")
return nil, errors.New("Discord 获取用户信息失败!请检查设置!")
return nil, oauth.NewOAuthError(i18n.MsgOAuthGetUserErr, nil)
}

var discordUser DiscordUser
err = json.NewDecoder(res2.Body).Decode(&discordUser)
err = common.DecodeJson(res2.Body, &discordUser)
if err != nil {
return nil, err
}
if discordUser.UID == "" || discordUser.ID == "" {
common.SysError("Discord 获取用户信息为空!请检查设置!")
return nil, errors.New("Discord 获取用户信息为空!请检查设置!")
return nil, oauth.NewOAuthError(i18n.MsgOAuthUserInfoEmpty, providerParams("Discord"))
}
return &discordUser, nil
}
Expand All @@ -115,16 +115,13 @@ func DiscordOAuth(c *gin.Context) {
return
}
if !system_setting.GetDiscordSettings().Enabled {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": "管理员未开启通过 Discord 登录以及注册",
})
common.ApiErrorI18n(c, i18n.MsgOAuthNotEnabled, providerParams("Discord"))
return
}
code := c.Query("code")
discordUser, err := getDiscordUserInfoByCode(code)
discordUser, err := getDiscordUserInfoByCode(c, code)
if err != nil {
common.ApiError(c, err)
handleOAuthError(c, err)
return
}
user := model.User{
Expand Down Expand Up @@ -160,46 +157,34 @@ func DiscordOAuth(c *gin.Context) {
return
}
} else {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": "管理员关闭了新用户注册",
})
common.ApiErrorI18n(c, i18n.MsgUserRegisterDisabled)
return
}
}

if user.Status != common.UserStatusEnabled {
c.JSON(http.StatusOK, gin.H{
"message": "用户已被封禁",
"success": false,
})
common.ApiErrorI18n(c, i18n.MsgOAuthUserBanned)
return
}
setupLogin(&user, c)
}

func DiscordBind(c *gin.Context) {
if !system_setting.GetDiscordSettings().Enabled {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": "管理员未开启通过 Discord 登录以及注册",
})
common.ApiErrorI18n(c, i18n.MsgOAuthNotEnabled, providerParams("Discord"))
return
}
code := c.Query("code")
discordUser, err := getDiscordUserInfoByCode(code)
discordUser, err := getDiscordUserInfoByCode(c, code)
if err != nil {
common.ApiError(c, err)
handleOAuthError(c, err)
return
}
user := model.User{
DiscordId: discordUser.UID,
}
if model.IsDiscordIdAlreadyTaken(user.DiscordId) {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": "该 Discord 账户已被绑定",
})
common.ApiErrorI18n(c, i18n.MsgOAuthAlreadyBound, providerParams("Discord"))
return
}
session := sessions.Default(c)
Expand Down
58 changes: 20 additions & 38 deletions controller/github.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@ package controller

import (
"bytes"
"encoding/json"
"errors"
"fmt"
"net/http"
"strconv"
"time"

"github.com/QuantumNous/new-api/common"
"github.com/QuantumNous/new-api/i18n"
"github.com/QuantumNous/new-api/model"
"github.com/QuantumNous/new-api/oauth"

"github.com/gin-contrib/sessions"
"github.com/gin-gonic/gin"
Expand All @@ -28,12 +28,12 @@ type GitHubUser struct {
Email string `json:"email"`
}

func getGitHubUserInfoByCode(code string) (*GitHubUser, error) {
func getGitHubUserInfoByCode(c *gin.Context, code string) (*GitHubUser, error) {
if code == "" {
return nil, errors.New("无效的参数")
return nil, oauth.NewOAuthError(i18n.MsgOAuthInvalidCode, nil)
}
values := map[string]string{"client_id": common.GitHubClientId, "client_secret": common.GitHubClientSecret, "code": code}
jsonData, err := json.Marshal(values)
jsonData, err := common.Marshal(values)
if err != nil {
return nil, err
}
Expand All @@ -49,11 +49,11 @@ func getGitHubUserInfoByCode(code string) (*GitHubUser, error) {
res, err := client.Do(req)
if err != nil {
common.SysLog(err.Error())
return nil, errors.New("无法连接至 GitHub 服务器,请稍后重试!")
return nil, oauth.NewOAuthErrorWithRaw(i18n.MsgOAuthConnectFailed, providerParams("GitHub"), err.Error())
}
defer res.Body.Close()
var oAuthResponse GitHubOAuthResponse
err = json.NewDecoder(res.Body).Decode(&oAuthResponse)
err = common.DecodeJson(res.Body, &oAuthResponse)
if err != nil {
return nil, err
}
Expand All @@ -65,16 +65,16 @@ func getGitHubUserInfoByCode(code string) (*GitHubUser, error) {
res2, err := client.Do(req)
if err != nil {
common.SysLog(err.Error())
return nil, errors.New("无法连接至 GitHub 服务器,请稍后重试!")
return nil, oauth.NewOAuthErrorWithRaw(i18n.MsgOAuthConnectFailed, providerParams("GitHub"), err.Error())
}
defer res2.Body.Close()
var githubUser GitHubUser
err = json.NewDecoder(res2.Body).Decode(&githubUser)
err = common.DecodeJson(res2.Body, &githubUser)
if err != nil {
return nil, err
}
if githubUser.Login == "" {
return nil, errors.New("返回值非法,用户字段为空,请稍后重试!")
return nil, oauth.NewOAuthError(i18n.MsgOAuthUserInfoEmpty, providerParams("GitHub"))
}
return &githubUser, nil
}
Expand All @@ -96,16 +96,13 @@ func GitHubOAuth(c *gin.Context) {
}

if !common.GitHubOAuthEnabled {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": "管理员未开启通过 GitHub 登录以及注册",
})
common.ApiErrorI18n(c, i18n.MsgOAuthNotEnabled, providerParams("GitHub"))
return
}
code := c.Query("code")
githubUser, err := getGitHubUserInfoByCode(code)
githubUser, err := getGitHubUserInfoByCode(c, code)
if err != nil {
common.ApiError(c, err)
handleOAuthError(c, err)
return
}
user := model.User{
Expand All @@ -124,10 +121,7 @@ func GitHubOAuth(c *gin.Context) {
}
// if user.Id == 0 , user has been deleted
if user.Id == 0 {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": "用户已注销",
})
common.ApiErrorI18n(c, i18n.MsgOAuthUserDeleted)
return
}
} else {
Expand Down Expand Up @@ -155,46 +149,34 @@ func GitHubOAuth(c *gin.Context) {
return
}
} else {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": "管理员关闭了新用户注册",
})
common.ApiErrorI18n(c, i18n.MsgUserRegisterDisabled)
return
}
}

if user.Status != common.UserStatusEnabled {
c.JSON(http.StatusOK, gin.H{
"message": "用户已被封禁",
"success": false,
})
common.ApiErrorI18n(c, i18n.MsgOAuthUserBanned)
return
}
setupLogin(&user, c)
}

func GitHubBind(c *gin.Context) {
if !common.GitHubOAuthEnabled {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": "管理员未开启通过 GitHub 登录以及注册",
})
common.ApiErrorI18n(c, i18n.MsgOAuthNotEnabled, providerParams("GitHub"))
return
}
code := c.Query("code")
githubUser, err := getGitHubUserInfoByCode(code)
githubUser, err := getGitHubUserInfoByCode(c, code)
if err != nil {
common.ApiError(c, err)
handleOAuthError(c, err)
return
}
user := model.User{
GitHubId: githubUser.Login,
}
if model.IsGitHubIdAlreadyTaken(user.GitHubId) {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": "该 GitHub 账户已被绑定",
})
common.ApiErrorI18n(c, i18n.MsgOAuthAlreadyBound, providerParams("GitHub"))
return
}
session := sessions.Default(c)
Expand Down
Loading