@@ -187,7 +187,8 @@ 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 ?
191
+ else {
191
192
let form_state = form_state. with_error_on_form ( FormError :: InvalidCredentials ) ;
192
193
PASSWORD_LOGIN_COUNTER . add ( 1 , & [ KeyValue :: new ( RESULT , "error" ) ] ) ;
193
194
return render (
@@ -337,6 +338,28 @@ pub(crate) async fn post(
337
338
Ok ( ( cookie_jar, reply) . into_response ( ) )
338
339
}
339
340
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
+
340
363
fn handle_login_hint (
341
364
mut ctx : LoginContext ,
342
365
next : & PostAuthContext ,
0 commit comments