@ -105,15 +105,36 @@ async fn _password_login(data: ConnectData, conn: DbConn, ip: &ClientIp) -> Json
None = > err ! ( "Username or password is incorrect. Try again" , format ! ( "IP: {}. Username: {}." , ip . ip , username ) ) ,
} ;
// Check if the user is disabled
if ! user . enabled {
err ! ( "This user has been disabled" , format ! ( "IP: {}. Username: {}." , ip . ip , username ) )
}
// Check password
let password = data . password . as_ref ( ) . unwrap ( ) ;
if ! user . check_valid_password ( password ) {
err ! ( "Username or password is incorrect. Try again" , format ! ( "IP: {}. Username: {}." , ip . ip , username ) )
// When the configuration limits the number of attempts
if CONFIG . login_max_retry ( ) > 0 {
let mut user = user ;
let invalid_count = user . invalid_login_count ;
//It is already the nth attempts, disable the user !
if user . invalid_login_count > = CONFIG . login_max_retry ( ) {
user . enabled = false ;
user . invalid_login_count = 0 ;
} else {
user . invalid_login_count + = 1 ;
}
if let Err ( e ) = user . save ( & conn ) . await {
error ! ( "Error updating user: {:#?}" , e ) ;
}
// Check if the user is disabled
if ! user . enabled {
err ! ( "This user has been disabled" , format ! ( "IP: {}. Username: {}." , ip . ip , username ) )
err ! ( "Too many failed login attempts. User has been disabled" , format ! ( "IP: {}. Username: {}. Invalid logins: {}." , ip . ip , username , invalid_count ) )
}
}
err ! ( "Username or password is incorrect. Try again" , format ! ( "IP: {}. Username: {}." , ip . ip , username ) )
}
let now = Utc ::now ( ) . naive_utc ( ) ;
@ -184,6 +205,13 @@ async fn _password_login(data: ConnectData, conn: DbConn, ip: &ClientIp) -> Json
result [ "TwoFactorToken" ] = Value ::String ( token ) ;
}
// Reset the number of attempts on success logins
let mut user = user ;
user . invalid_login_count = 0 ;
if let Err ( e ) = user . save ( & conn ) . await {
error ! ( "Error updating user: {:#?}" , e ) ;
}
info ! ( "User {} logged in successfully. IP: {}" , username , ip . ip ) ;
Ok ( Json ( result ) )
}