@@ -32,7 +32,8 @@ use zeroize::Zeroizing;
3232use super :: { MatrixError , MatrixJsonBody } ;
3333use crate :: {
3434 BoundActivityTracker , Limiter , METER , RequesterFingerprint , impl_from_error_for_route,
35- passwords:: PasswordManager , rate_limit:: PasswordCheckLimitedError ,
35+ passwords:: { PasswordManager , PasswordVerificationResult } ,
36+ rate_limit:: PasswordCheckLimitedError ,
3637} ;
3738
3839static LOGIN_COUNTER : LazyLock < Counter < u64 > > = LazyLock :: new ( || {
@@ -193,7 +194,7 @@ pub enum RouteError {
193194 NoPassword ,
194195
195196 #[ error( "password verification failed" ) ]
196- PasswordVerificationFailed ( # [ source ] anyhow :: Error ) ,
197+ PasswordMismatch ,
197198
198199 #[ error( "request rate limited" ) ]
199200 RateLimited ( #[ from] PasswordCheckLimitedError ) ,
@@ -210,6 +211,12 @@ pub enum RouteError {
210211
211212impl_from_error_for_route ! ( mas_storage:: RepositoryError ) ;
212213
214+ impl From < anyhow:: Error > for RouteError {
215+ fn from ( err : anyhow:: Error ) -> Self {
216+ Self :: Internal ( err. into ( ) )
217+ }
218+ }
219+
213220impl IntoResponse for RouteError {
214221 fn into_response ( self ) -> axum:: response:: Response {
215222 let sentry_event_id =
@@ -241,13 +248,11 @@ impl IntoResponse for RouteError {
241248 error : "Missing property 'identifier" ,
242249 status : StatusCode :: BAD_REQUEST ,
243250 } ,
244- Self :: UserNotFound | Self :: NoPassword | Self :: PasswordVerificationFailed ( _) => {
245- MatrixError {
246- errcode : "M_FORBIDDEN" ,
247- error : "Invalid username/password" ,
248- status : StatusCode :: FORBIDDEN ,
249- }
250- }
251+ Self :: UserNotFound | Self :: NoPassword | Self :: PasswordMismatch => MatrixError {
252+ errcode : "M_FORBIDDEN" ,
253+ error : "Invalid username/password" ,
254+ status : StatusCode :: FORBIDDEN ,
255+ } ,
251256 Self :: LoginTookTooLong => MatrixError {
252257 errcode : "M_FORBIDDEN" ,
253258 error : "Login token expired" ,
@@ -576,28 +581,32 @@ async fn user_password_login(
576581 // Verify the password
577582 let password = Zeroizing :: new ( password) ;
578583
579- let new_password_hash = password_manager
584+ match password_manager
580585 . verify_and_upgrade (
581586 & mut rng,
582587 user_password. version ,
583588 password,
584589 user_password. hashed_password . clone ( ) ,
585590 )
586- . await
587- . map_err ( RouteError :: PasswordVerificationFailed ) ?;
588-
589- if let Some ( ( version, hashed_password) ) = new_password_hash {
590- // Save the upgraded password if needed
591- repo. user_password ( )
592- . add (
593- & mut rng,
594- clock,
595- & user,
596- version,
597- hashed_password,
598- Some ( & user_password) ,
599- )
600- . await ?;
591+ . await ?
592+ {
593+ PasswordVerificationResult :: Success ( Some ( ( version, hashed_password) ) ) => {
594+ // Save the upgraded password if needed
595+ repo. user_password ( )
596+ . add (
597+ & mut rng,
598+ clock,
599+ & user,
600+ version,
601+ hashed_password,
602+ Some ( & user_password) ,
603+ )
604+ . await ?;
605+ }
606+ PasswordVerificationResult :: Success ( None ) => { }
607+ PasswordVerificationResult :: Failure => {
608+ return Err ( RouteError :: PasswordMismatch ) ;
609+ }
601610 }
602611
603612 // We're about to create a device, let's explicitly acquire a lock, so that
0 commit comments