2021-07-24 13:16:34 +03:00
// Copyright 2021 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2021-07-24 13:16:34 +03:00
package db
import (
2023-09-14 20:09:32 +03:00
"context"
2023-07-04 01:39:38 +03:00
"fmt"
2021-11-24 12:49:20 +03:00
user_model "code.gitea.io/gitea/models/user"
2021-07-24 13:16:34 +03:00
"code.gitea.io/gitea/modules/setting"
2023-07-04 01:39:38 +03:00
"code.gitea.io/gitea/modules/util"
2021-07-24 13:16:34 +03:00
)
2023-07-04 01:39:38 +03:00
// ErrUserPasswordNotSet represents a "ErrUserPasswordNotSet" kind of error.
type ErrUserPasswordNotSet struct {
UID int64
Name string
}
func ( err ErrUserPasswordNotSet ) Error ( ) string {
return fmt . Sprintf ( "user's password isn't set [uid: %d, name: %s]" , err . UID , err . Name )
}
// Unwrap unwraps this error as a ErrInvalidArgument error
func ( err ErrUserPasswordNotSet ) Unwrap ( ) error {
return util . ErrInvalidArgument
}
// ErrUserPasswordInvalid represents a "ErrUserPasswordInvalid" kind of error.
type ErrUserPasswordInvalid struct {
UID int64
Name string
}
func ( err ErrUserPasswordInvalid ) Error ( ) string {
return fmt . Sprintf ( "user's password is invalid [uid: %d, name: %s]" , err . UID , err . Name )
}
// Unwrap unwraps this error as a ErrInvalidArgument error
func ( err ErrUserPasswordInvalid ) Unwrap ( ) error {
return util . ErrInvalidArgument
}
2021-07-24 13:16:34 +03:00
// Authenticate authenticates the provided user against the DB
2023-09-14 20:09:32 +03:00
func Authenticate ( ctx context . Context , user * user_model . User , login , password string ) ( * user_model . User , error ) {
2021-07-24 13:16:34 +03:00
if user == nil {
2021-11-24 12:49:20 +03:00
return nil , user_model . ErrUserNotExist { Name : login }
2021-07-24 13:16:34 +03:00
}
2023-07-04 01:39:38 +03:00
if ! user . IsPasswordSet ( ) {
return nil , ErrUserPasswordNotSet { UID : user . ID , Name : user . Name }
} else if ! user . ValidatePassword ( password ) {
return nil , ErrUserPasswordInvalid { UID : user . ID , Name : user . Name }
2021-07-24 13:16:34 +03:00
}
// Update password hash if server password hash algorithm have changed
2022-01-04 18:13:52 +03:00
// Or update the password when the salt length doesn't match the current
// recommended salt length, this in order to migrate user's salts to a more secure salt.
if user . PasswdHashAlgo != setting . PasswordHashAlgo || len ( user . Salt ) != user_model . SaltByteLength * 2 {
2021-07-24 13:16:34 +03:00
if err := user . SetPassword ( password ) ; err != nil {
return nil , err
}
2023-09-14 20:09:32 +03:00
if err := user_model . UpdateUserCols ( ctx , user , "passwd" , "passwd_hash_algo" , "salt" ) ; err != nil {
2021-07-24 13:16:34 +03:00
return nil , err
}
}
// WARN: DON'T check user.IsActive, that will be checked on reqSign so that
2023-04-19 16:40:42 +03:00
// user could be hinted to resend confirm email.
2021-07-24 13:16:34 +03:00
if user . ProhibitLogin {
2021-11-24 12:49:20 +03:00
return nil , user_model . ErrUserProhibitLogin {
2021-07-24 13:16:34 +03:00
UID : user . ID ,
Name : user . Name ,
}
}
2023-04-17 19:36:50 +03:00
// attempting to login as a non-user account
if user . Type != user_model . UserTypeIndividual {
return nil , user_model . ErrUserProhibitLogin {
UID : user . ID ,
Name : user . Name ,
}
}
2021-07-24 13:16:34 +03:00
return user , nil
}