This commit is contained in:
ayuan 2025-07-03 03:47:51 +00:00 committed by GitHub
commit 1a9c4a27cf
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 75 additions and 57 deletions

View File

@ -198,10 +198,26 @@ func GitHubBind(c *gin.Context) {
}) })
return return
} }
session := sessions.Default(c) func GitHubBind(c *gin.Context) {
id := session.Get("id") session := sessions.Default(c)
// id := c.GetInt("id") // critical bug! idInterface := session.Get("id")
user.Id = id.(int) if idInterface == nil {
c.JSON(http.StatusBadRequest, gin.H{
"success": false,
"message": "用户未登录",
})
return
}
id, ok := idInterface.(int)
if !ok {
c.JSON(http.StatusInternalServerError, gin.H{
"success": false,
"message": "用户ID类型错误",
})
return
}
user.Id = id
err = user.FillUserById() err = user.FillUserById()
if err != nil { if err != nil {
c.JSON(http.StatusOK, gin.H{ c.JSON(http.StatusOK, gin.H{

View File

@ -538,27 +538,52 @@ func UpdateSelf(c *gin.Context) {
}) })
return return
} }
if user.Password == "" { func UpdateSelf(c *gin.Context) {
user.Password = "$I_LOVE_U" // make Validator happy :) var user model.User
} err := json.NewDecoder(c.Request.Body).Decode(&user)
if err := common.Validate.Struct(&user); err != nil { if err != nil {
c.JSON(http.StatusOK, gin.H{ c.JSON(http.StatusBadRequest, gin.H{
"success": false, "success": false,
"message": "输入不合法 " + err.Error(), "message": "无效的请求数据",
}) })
return return
} }
cleanUser := model.User{ // 移除魔法字符串,使用更安全的验证方式
Id: c.GetInt("id"), passwordEmpty := user.Password == ""
Username: user.Username,
Password: user.Password, if err := common.Validate.Struct(&user); err != nil {
DisplayName: user.DisplayName, // 如果密码为空且验证失败,检查是否只是密码字段的问题
} if passwordEmpty {
if user.Password == "$I_LOVE_U" { // 创建临时用户对象进行验证,排除密码字段
user.Password = "" // rollback to what it should be tempUser := user
cleanUser.Password = "" tempUser.Password = "temp_password_for_validation"
} if tempErr := common.Validate.Struct(&tempUser); tempErr != nil {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": "输入不合法 " + err.Error(),
})
return
}
} else {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": "输入不合法 " + err.Error(),
})
return
}
}
cleanUser := model.User{
Id: c.GetInt("id"),
Username: user.Username,
DisplayName: user.DisplayName,
}
// 只有当密码不为空时才设置密码
if !passwordEmpty {
cleanUser.Password = user.Password
}
updatePassword := user.Password != "" updatePassword := user.Password != ""
if err := cleanUser.Update(updatePassword); err != nil { if err := cleanUser.Update(updatePassword); err != nil {
c.JSON(http.StatusOK, gin.H{ c.JSON(http.StatusOK, gin.H{

View File

@ -50,38 +50,15 @@ func OpenAIErrorWrapperLocal(err error, code string, statusCode int) *dto.OpenAI
return openaiErr return openaiErr
} }
func RelayErrorHandler(resp *http.Response) (errWithStatusCode *dto.OpenAIErrorWithStatusCode) { func cacheSetUserName(userId int, username string) {
errWithStatusCode = &dto.OpenAIErrorWithStatusCode{ if !common.RedisEnabled {
StatusCode: resp.StatusCode, return
Error: dto.OpenAIError{ }
Type: "upstream_error", key := fmt.Sprintf("user_name:%d", userId)
Code: "bad_response_status_code", err := common.RedisSet(key, username, time.Duration(UserId2UsernameCacheSeconds)*time.Second)
Param: strconv.Itoa(resp.StatusCode), if err != nil {
}, common.SysError("Redis set user name error: " + err.Error()) // 修正错误信息
} }
responseBody, err := io.ReadAll(resp.Body)
if err != nil {
return
}
err = resp.Body.Close()
if err != nil {
return
}
var errResponse dto.GeneralErrorResponse
err = json.Unmarshal(responseBody, &errResponse)
if err != nil {
return
}
if errResponse.Error.Message != "" {
// OpenAI format error, so we override the default one
errWithStatusCode.Error = errResponse.Error
} else {
errWithStatusCode.Error.Message = errResponse.ToMessage()
}
if errWithStatusCode.Error.Message == "" {
errWithStatusCode.Error.Message = fmt.Sprintf("bad response status code %d", resp.StatusCode)
}
return
} }
func ResetStatusCode(openaiErr *dto.OpenAIErrorWithStatusCode, statusCodeMappingStr string) { func ResetStatusCode(openaiErr *dto.OpenAIErrorWithStatusCode, statusCodeMappingStr string) {