fix(user): handle status errors in pkg/user callers, remove redundant checks

This commit is contained in:
kolaente 2026-03-23 12:22:02 +01:00 committed by kolaente
parent 04704e0fde
commit 91c0f386c6
4 changed files with 23 additions and 28 deletions

View File

@ -39,6 +39,11 @@ import (
"xorm.io/xorm"
)
// isErrUserStatusError returns true if the error is an ErrAccountDisabled or ErrAccountLocked.
func isErrUserStatusError(err error) bool {
return IsErrAccountDisabled(err) || IsErrAccountLocked(err)
}
// Login Object to recive user credentials in JSON format
type Login struct {
// The username used to log in.
@ -129,7 +134,7 @@ func (u *User) RouteForMail() (string, error) {
s := db.NewSession()
defer s.Close()
user, err := getUser(s, &User{ID: u.ID}, true)
if err != nil {
if err != nil && !isErrUserStatusError(err) {
return "", err
}
return user.Email, nil
@ -151,12 +156,14 @@ func (u *User) ShouldNotify(sessions ...*xorm.Session) (bool, error) {
s = db.NewSession()
defer s.Close()
}
user, err := getUser(s, &User{ID: u.ID}, true)
_, err := getUser(s, &User{ID: u.ID}, true)
if isErrUserStatusError(err) {
return false, nil
}
if err != nil {
return false, err
}
return user.Status != StatusDisabled && user.Status != StatusAccountLocked, err
return true, nil
}
func (u *User) Lang() string {
@ -531,7 +538,7 @@ func UpdateUser(s *xorm.Session, user *User, forceOverride bool) (updatedUser *U
// Check if it exists
theUser, err := GetUserWithEmail(s, &User{ID: user.ID})
if err != nil {
if err != nil && !isErrUserStatusError(err) {
return &User{}, err
}
@ -541,7 +548,7 @@ func UpdateUser(s *xorm.Session, user *User, forceOverride bool) (updatedUser *U
} else {
// Check if the new username already exists
uu, err := GetUserByUsername(s, user.Username)
if err != nil && !IsErrUserDoesNotExist(err) {
if err != nil && !IsErrUserDoesNotExist(err) && !isErrUserStatusError(err) {
return nil, err
}
if uu.ID != 0 && uu.ID != user.ID {
@ -563,7 +570,7 @@ func UpdateUser(s *xorm.Session, user *User, forceOverride bool) (updatedUser *U
Issuer: user.Issuer,
Subject: user.Subject,
}, true)
if err != nil && !IsErrUserDoesNotExist(err) {
if err != nil && !IsErrUserDoesNotExist(err) && !isErrUserStatusError(err) {
return nil, err
}
if uu.ID != 0 && uu.ID != user.ID {
@ -629,7 +636,7 @@ func UpdateUser(s *xorm.Session, user *User, forceOverride bool) (updatedUser *U
// Get the newly updated user
updatedUser, err = GetUserByID(s, user.ID)
if err != nil {
if err != nil && !isErrUserStatusError(err) {
return &User{}, err
}
@ -652,7 +659,7 @@ func UpdateUserPassword(s *xorm.Session, user *User, newPassword string) (err er
// Get all user details
theUser, err := GetUserByID(s, user.ID)
if err != nil {
if err != nil && !isErrUserStatusError(err) {
return err
}

View File

@ -84,7 +84,7 @@ func CreateUser(s *xorm.Session, user *User) (newUser *User, err error) {
// Get the full new User
newUserOut, err := GetUserByID(s, user.ID)
if err != nil {
if err != nil && !isErrUserStatusError(err) {
return nil, err
}

View File

@ -43,12 +43,8 @@ func ConfirmEmail(s *xorm.Session, c *EmailConfirm) (err error) {
}
user, err := GetUserByID(s, token.UserID)
if err != nil {
return
}
if user.Status == StatusDisabled {
return &ErrAccountDisabled{UserID: user.ID}
if err != nil && !IsErrAccountLocked(err) {
return err
}
user.Status = StatusActive

View File

@ -54,8 +54,8 @@ func ResetPassword(s *xorm.Session, reset *PasswordReset) (userID int64, err err
}
user, err := GetUserByID(s, token.UserID)
if err != nil {
return
if err != nil && !IsErrAccountLocked(err) {
return 0, err
}
userID = user.ID
@ -70,10 +70,6 @@ func ResetPassword(s *xorm.Session, reset *PasswordReset) (userID int64, err err
return
}
if user.Status == StatusDisabled {
return 0, &ErrAccountDisabled{UserID: user.ID}
}
if user.Status == StatusAccountLocked || user.Status == StatusEmailConfirmationRequired {
user.Status = StatusActive
}
@ -112,12 +108,8 @@ func RequestUserPasswordResetTokenByEmail(s *xorm.Session, tr *PasswordTokenRequ
// Check if the user exists
user, err := GetUserWithEmail(s, &User{Email: tr.Email})
if err != nil {
return
}
if user.Status == StatusDisabled {
return &ErrAccountDisabled{UserID: user.ID}
if err != nil && !IsErrAccountLocked(err) {
return err
}
return RequestUserPasswordResetToken(s, user)