@@ -187,7 +187,8 @@ pub(crate) async fn post(
187187 . unwrap_or ( & form. username ) ;
188188
189189 // First, lookup the user
190- let Some ( user) = repo. user ( ) . find_by_username ( username) . await ? else {
190+ let Some ( user) = get_user_by_email_or_by_username ( site_config, & mut repo, username) . await ?
191+ else {
191192 let form_state = form_state. with_error_on_form ( FormError :: InvalidCredentials ) ;
192193 PASSWORD_LOGIN_COUNTER . add ( 1 , & [ KeyValue :: new ( RESULT , "error" ) ] ) ;
193194 return render (
@@ -337,6 +338,28 @@ pub(crate) async fn post(
337338 Ok ( ( cookie_jar, reply) . into_response ( ) )
338339}
339340
341+ async fn get_user_by_email_or_by_username (
342+ site_config : SiteConfig ,
343+ repo : & mut impl RepositoryAccess ,
344+ username_or_email : & str ,
345+ ) -> Result < Option < mas_data_model:: User > , Box < dyn std:: error:: Error > > {
346+ if site_config. login_with_email_allowed && username_or_email. contains ( '@' ) {
347+ let maybe_user_email = repo. user_email ( ) . find_by_email ( username_or_email) . await ?;
348+
349+ if let Some ( user_email) = maybe_user_email {
350+ let user = repo. user ( ) . lookup ( user_email. user_id ) . await ?;
351+
352+ if user. is_some ( ) {
353+ return Ok ( user) ;
354+ }
355+ }
356+ }
357+
358+ let user = repo. user ( ) . find_by_username ( username_or_email) . await ?;
359+
360+ Ok ( user)
361+ }
362+
340363fn handle_login_hint (
341364 mut ctx : LoginContext ,
342365 next : & PostAuthContext ,
0 commit comments