|
|
@@ -1,6 +1,7 @@
|
|
|
package middleware
|
|
|
|
|
|
import (
|
|
|
+ "errors"
|
|
|
"fmt"
|
|
|
"net"
|
|
|
"net/http"
|
|
|
@@ -9,6 +10,7 @@ import (
|
|
|
|
|
|
"github.com/QuantumNous/new-api/common"
|
|
|
"github.com/QuantumNous/new-api/constant"
|
|
|
+ "github.com/QuantumNous/new-api/i18n"
|
|
|
"github.com/QuantumNous/new-api/logger"
|
|
|
"github.com/QuantumNous/new-api/model"
|
|
|
"github.com/QuantumNous/new-api/service"
|
|
|
@@ -17,6 +19,7 @@ import (
|
|
|
|
|
|
"github.com/gin-contrib/sessions"
|
|
|
"github.com/gin-gonic/gin"
|
|
|
+ "gorm.io/gorm"
|
|
|
)
|
|
|
|
|
|
func validUserInfo(username string, role int) bool {
|
|
|
@@ -43,17 +46,33 @@ func authHelper(c *gin.Context, minRole int) {
|
|
|
if accessToken == "" {
|
|
|
c.JSON(http.StatusUnauthorized, gin.H{
|
|
|
"success": false,
|
|
|
- "message": "无权进行此操作,未登录且未提供 access token",
|
|
|
+ "message": common.TranslateMessage(c, i18n.MsgAuthNotLoggedIn),
|
|
|
})
|
|
|
c.Abort()
|
|
|
return
|
|
|
}
|
|
|
- user := model.ValidateAccessToken(accessToken)
|
|
|
+ user, authErr := model.ValidateAccessToken(accessToken)
|
|
|
+ if authErr != nil {
|
|
|
+ if errors.Is(authErr, model.ErrDatabase) {
|
|
|
+ common.SysLog("ValidateAccessToken database error: " + authErr.Error())
|
|
|
+ c.JSON(http.StatusInternalServerError, gin.H{
|
|
|
+ "success": false,
|
|
|
+ "message": common.TranslateMessage(c, i18n.MsgDatabaseError),
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ c.JSON(http.StatusOK, gin.H{
|
|
|
+ "success": false,
|
|
|
+ "message": common.TranslateMessage(c, i18n.MsgAuthAccessTokenInvalid),
|
|
|
+ })
|
|
|
+ }
|
|
|
+ c.Abort()
|
|
|
+ return
|
|
|
+ }
|
|
|
if user != nil && user.Username != "" {
|
|
|
if !validUserInfo(user.Username, user.Role) {
|
|
|
c.JSON(http.StatusOK, gin.H{
|
|
|
"success": false,
|
|
|
- "message": "无权进行此操作,用户信息无效",
|
|
|
+ "message": common.TranslateMessage(c, i18n.MsgAuthUserInfoInvalid),
|
|
|
})
|
|
|
c.Abort()
|
|
|
return
|
|
|
@@ -67,7 +86,7 @@ func authHelper(c *gin.Context, minRole int) {
|
|
|
} else {
|
|
|
c.JSON(http.StatusOK, gin.H{
|
|
|
"success": false,
|
|
|
- "message": "无权进行此操作,access token 无效",
|
|
|
+ "message": common.TranslateMessage(c, i18n.MsgAuthAccessTokenInvalid),
|
|
|
})
|
|
|
c.Abort()
|
|
|
return
|
|
|
@@ -78,7 +97,7 @@ func authHelper(c *gin.Context, minRole int) {
|
|
|
if apiUserIdStr == "" {
|
|
|
c.JSON(http.StatusUnauthorized, gin.H{
|
|
|
"success": false,
|
|
|
- "message": "无权进行此操作,未提供 New-Api-User",
|
|
|
+ "message": common.TranslateMessage(c, i18n.MsgAuthUserIdNotProvided),
|
|
|
})
|
|
|
c.Abort()
|
|
|
return
|
|
|
@@ -87,7 +106,7 @@ func authHelper(c *gin.Context, minRole int) {
|
|
|
if err != nil {
|
|
|
c.JSON(http.StatusUnauthorized, gin.H{
|
|
|
"success": false,
|
|
|
- "message": "无权进行此操作,New-Api-User 格式错误",
|
|
|
+ "message": common.TranslateMessage(c, i18n.MsgAuthUserIdFormatError),
|
|
|
})
|
|
|
c.Abort()
|
|
|
return
|
|
|
@@ -96,7 +115,7 @@ func authHelper(c *gin.Context, minRole int) {
|
|
|
if id != apiUserId {
|
|
|
c.JSON(http.StatusUnauthorized, gin.H{
|
|
|
"success": false,
|
|
|
- "message": "无权进行此操作,New-Api-User 与登录用户不匹配",
|
|
|
+ "message": common.TranslateMessage(c, i18n.MsgAuthUserIdMismatch),
|
|
|
})
|
|
|
c.Abort()
|
|
|
return
|
|
|
@@ -104,7 +123,7 @@ func authHelper(c *gin.Context, minRole int) {
|
|
|
if status.(int) == common.UserStatusDisabled {
|
|
|
c.JSON(http.StatusOK, gin.H{
|
|
|
"success": false,
|
|
|
- "message": "用户已被封禁",
|
|
|
+ "message": common.TranslateMessage(c, i18n.MsgAuthUserBanned),
|
|
|
})
|
|
|
c.Abort()
|
|
|
return
|
|
|
@@ -112,7 +131,7 @@ func authHelper(c *gin.Context, minRole int) {
|
|
|
if role.(int) < minRole {
|
|
|
c.JSON(http.StatusOK, gin.H{
|
|
|
"success": false,
|
|
|
- "message": "无权进行此操作,权限不足",
|
|
|
+ "message": common.TranslateMessage(c, i18n.MsgAuthInsufficientPrivilege),
|
|
|
})
|
|
|
c.Abort()
|
|
|
return
|
|
|
@@ -120,7 +139,7 @@ func authHelper(c *gin.Context, minRole int) {
|
|
|
if !validUserInfo(username.(string), role.(int)) {
|
|
|
c.JSON(http.StatusOK, gin.H{
|
|
|
"success": false,
|
|
|
- "message": "无权进行此操作,用户信息无效",
|
|
|
+ "message": common.TranslateMessage(c, i18n.MsgAuthUserInfoInvalid),
|
|
|
})
|
|
|
c.Abort()
|
|
|
return
|
|
|
@@ -198,7 +217,7 @@ func TokenAuthReadOnly() func(c *gin.Context) {
|
|
|
if key == "" {
|
|
|
c.JSON(http.StatusUnauthorized, gin.H{
|
|
|
"success": false,
|
|
|
- "message": "未提供 Authorization 请求头",
|
|
|
+ "message": common.TranslateMessage(c, i18n.MsgTokenNotProvided),
|
|
|
})
|
|
|
c.Abort()
|
|
|
return
|
|
|
@@ -212,19 +231,28 @@ func TokenAuthReadOnly() func(c *gin.Context) {
|
|
|
|
|
|
token, err := model.GetTokenByKey(key, false)
|
|
|
if err != nil {
|
|
|
- c.JSON(http.StatusUnauthorized, gin.H{
|
|
|
- "success": false,
|
|
|
- "message": "无效的令牌",
|
|
|
- })
|
|
|
+ if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
|
+ c.JSON(http.StatusUnauthorized, gin.H{
|
|
|
+ "success": false,
|
|
|
+ "message": common.TranslateMessage(c, i18n.MsgTokenInvalid),
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ common.SysLog("TokenAuthReadOnly GetTokenByKey database error: " + err.Error())
|
|
|
+ c.JSON(http.StatusInternalServerError, gin.H{
|
|
|
+ "success": false,
|
|
|
+ "message": common.TranslateMessage(c, i18n.MsgDatabaseError),
|
|
|
+ })
|
|
|
+ }
|
|
|
c.Abort()
|
|
|
return
|
|
|
}
|
|
|
|
|
|
userCache, err := model.GetUserCache(token.UserId)
|
|
|
if err != nil {
|
|
|
+ common.SysLog(fmt.Sprintf("TokenAuthReadOnly GetUserCache error for user %d: %v", token.UserId, err))
|
|
|
c.JSON(http.StatusInternalServerError, gin.H{
|
|
|
"success": false,
|
|
|
- "message": err.Error(),
|
|
|
+ "message": common.TranslateMessage(c, i18n.MsgDatabaseError),
|
|
|
})
|
|
|
c.Abort()
|
|
|
return
|
|
|
@@ -232,7 +260,7 @@ func TokenAuthReadOnly() func(c *gin.Context) {
|
|
|
if userCache.Status != common.UserStatusEnabled {
|
|
|
c.JSON(http.StatusForbidden, gin.H{
|
|
|
"success": false,
|
|
|
- "message": "用户已被封禁",
|
|
|
+ "message": common.TranslateMessage(c, i18n.MsgAuthUserBanned),
|
|
|
})
|
|
|
c.Abort()
|
|
|
return
|
|
|
@@ -309,7 +337,14 @@ func TokenAuth() func(c *gin.Context) {
|
|
|
}
|
|
|
}
|
|
|
if err != nil {
|
|
|
- abortWithOpenAiMessage(c, http.StatusUnauthorized, err.Error())
|
|
|
+ if errors.Is(err, model.ErrDatabase) {
|
|
|
+ common.SysLog("TokenAuth ValidateUserToken database error: " + err.Error())
|
|
|
+ abortWithOpenAiMessage(c, http.StatusInternalServerError,
|
|
|
+ common.TranslateMessage(c, i18n.MsgDatabaseError))
|
|
|
+ } else {
|
|
|
+ abortWithOpenAiMessage(c, http.StatusUnauthorized,
|
|
|
+ common.TranslateMessage(c, i18n.MsgTokenInvalid))
|
|
|
+ }
|
|
|
return
|
|
|
}
|
|
|
|
|
|
@@ -331,12 +366,14 @@ func TokenAuth() func(c *gin.Context) {
|
|
|
|
|
|
userCache, err := model.GetUserCache(token.UserId)
|
|
|
if err != nil {
|
|
|
- abortWithOpenAiMessage(c, http.StatusInternalServerError, err.Error())
|
|
|
+ common.SysLog(fmt.Sprintf("TokenAuth GetUserCache error for user %d: %v", token.UserId, err))
|
|
|
+ abortWithOpenAiMessage(c, http.StatusInternalServerError,
|
|
|
+ common.TranslateMessage(c, i18n.MsgDatabaseError))
|
|
|
return
|
|
|
}
|
|
|
userEnabled := userCache.Status == common.UserStatusEnabled
|
|
|
if !userEnabled {
|
|
|
- abortWithOpenAiMessage(c, http.StatusForbidden, "用户已被封禁")
|
|
|
+ abortWithOpenAiMessage(c, http.StatusForbidden, common.TranslateMessage(c, i18n.MsgAuthUserBanned))
|
|
|
return
|
|
|
}
|
|
|
|