From 91c0f386c64ed745912bd6bc1ed621ccb366b74a Mon Sep 17 00:00:00 2001 From: kolaente Date: Mon, 23 Mar 2026 12:22:02 +0100 Subject: [PATCH] fix(user): handle status errors in pkg/user callers, remove redundant checks --- pkg/user/user.go | 25 ++++++++++++++++--------- pkg/user/user_create.go | 2 +- pkg/user/user_email_confirm.go | 8 ++------ pkg/user/user_password_reset.go | 16 ++++------------ 4 files changed, 23 insertions(+), 28 deletions(-) diff --git a/pkg/user/user.go b/pkg/user/user.go index d1bd45b50..3349a2f85 100644 --- a/pkg/user/user.go +++ b/pkg/user/user.go @@ -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 } diff --git a/pkg/user/user_create.go b/pkg/user/user_create.go index 6b2c542b0..d56c16943 100644 --- a/pkg/user/user_create.go +++ b/pkg/user/user_create.go @@ -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 } diff --git a/pkg/user/user_email_confirm.go b/pkg/user/user_email_confirm.go index f59942a9b..2cbde886c 100644 --- a/pkg/user/user_email_confirm.go +++ b/pkg/user/user_email_confirm.go @@ -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 diff --git a/pkg/user/user_password_reset.go b/pkg/user/user_password_reset.go index 204cef3c4..8df1e943b 100644 --- a/pkg/user/user_password_reset.go +++ b/pkg/user/user_password_reset.go @@ -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)