@@ -187,7 +187,7 @@ pub(crate) async fn post(
187
187
. unwrap_or ( & form. username ) ;
188
188
189
189
// 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 ? else {
191
191
let form_state = form_state. with_error_on_form ( FormError :: InvalidCredentials ) ;
192
192
PASSWORD_LOGIN_COUNTER . add ( 1 , & [ KeyValue :: new ( RESULT , "error" ) ] ) ;
193
193
return render (
@@ -337,6 +337,37 @@ pub(crate) async fn post(
337
337
Ok ( ( cookie_jar, reply) . into_response ( ) )
338
338
}
339
339
340
+ async fn get_user_by_email_or_by_username (
341
+ site_config : SiteConfig ,
342
+ repo : & mut impl RepositoryAccess ,
343
+ username_or_email : & str ,
344
+ ) -> Result < Option < mas_data_model:: User > , Box < dyn std:: error:: Error > > {
345
+ if site_config. login_with_email_allowed && username_or_email. contains ( '@' ) {
346
+ let maybe_user_email = repo
347
+ . user_email ( )
348
+ . find_by_email ( username_or_email)
349
+ . await ?;
350
+
351
+ if let Some ( user_email) = maybe_user_email {
352
+ let user = repo
353
+ . user ( )
354
+ . lookup ( user_email. user_id )
355
+ . await ?;
356
+
357
+ if user. is_some ( ) {
358
+ return Ok ( user) ;
359
+ }
360
+ } ;
361
+ }
362
+
363
+ let user = repo
364
+ . user ( )
365
+ . find_by_username ( username_or_email)
366
+ . await ?;
367
+
368
+ Ok ( user)
369
+ }
370
+
340
371
fn handle_login_hint (
341
372
mut ctx : LoginContext ,
342
373
next : & PostAuthContext ,
0 commit comments