]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-15074 allow users without an email in database to login with a new email
authorLukasz Jarocki <lukasz.jarocki@sonarsource.com>
Thu, 1 Jul 2021 14:20:08 +0000 (16:20 +0200)
committersonartech <sonartech@sonarsource.com>
Fri, 2 Jul 2021 20:03:11 +0000 (20:03 +0000)
server/sonar-webserver-auth/src/main/java/org/sonar/server/authentication/UserRegistrarImpl.java
server/sonar-webserver-auth/src/test/java/org/sonar/server/authentication/UserRegistrarImplTest.java

index ef61f3ee8e97e23acf3aec852e4628f692e02792..c02b8b9c9a4fdca4e916429d9276cf0cbd93391a 100644 (file)
@@ -117,17 +117,17 @@ public class UserRegistrarImpl implements UserRegistrar {
   }
 
   private static void validateEmailToAvoidLoginRecycling(UserIdentity userIdentity, UserDto user, AuthenticationEvent.Source source) {
-    String userEmail = user.getEmail();
+    String dbEmail = user.getEmail();
 
-    if (userEmail == null) {
-      LOGGER.warn("User with login '{}' tried to login with email '{}' but we don't have a email on record",
-        userIdentity.getProviderLogin(), userIdentity.getEmail());
-      throw loginAlreadyUsedException(userIdentity, source);
+    if (dbEmail == null) {
+      return;
     }
 
-    if (!userEmail.equals(userIdentity.getEmail())) {
+    String externalEmail = userIdentity.getEmail();
+
+    if (!dbEmail.equals(externalEmail)) {
       LOGGER.warn("User with login '{}' tried to login with email '{}' which doesn't match the email on record '{}'",
-        userIdentity.getProviderLogin(), userIdentity.getEmail(), userEmail);
+        userIdentity.getProviderLogin(), externalEmail, dbEmail);
       throw loginAlreadyUsedException(userIdentity, source);
     }
   }
@@ -278,7 +278,7 @@ public class UserRegistrarImpl implements UserRegistrar {
   }
 
   private static UserDto[] toArray(Optional<UserDto> userDto) {
-    return userDto.map(u -> new UserDto[] {u}).orElse(new UserDto[] {});
+    return userDto.map(u -> new UserDto[]{u}).orElse(new UserDto[]{});
   }
 
   private static AuthenticationException generateExistingEmailError(UserRegistration authenticatorParameters, String email) {
index 6276d1ba27fb850f7e27502da4ab3e699fedcc52..e9ac84f8095013631211cb7a4ddda6e37b90f96d 100644 (file)
@@ -447,7 +447,7 @@ public class UserRegistrarImplTest {
   }
 
   @Test
-  public void do_not_authenticate_and_update_existing_user_matching_external_login_if_email_is_missing() {
+  public void authenticate_and_update_existing_user_matching_external_login_if_email_is_missing() {
     db.users().insertUser(u -> u
       .setLogin("Old login")
       .setName("Old name")
@@ -456,12 +456,11 @@ public class UserRegistrarImplTest {
       .setExternalLogin(USER_IDENTITY.getProviderLogin())
       .setExternalIdentityProvider(IDENTITY_PROVIDER.getKey()));
 
-    assertThatThrownBy(() -> underTest.register(newUserRegistration()))
-      .isInstanceOf(AuthenticationException.class)
-      .hasMessage(String.format("Login '%s' is already used", USER_IDENTITY.getProviderLogin()));
+    underTest.register(newUserRegistration());
 
-    assertThat(logTester.logs()).contains(String.format("User with login '%s' tried to login with email '%s' but we don't have a email on record",
-      USER_IDENTITY.getProviderLogin(), USER_IDENTITY.getEmail()));
+    Optional<UserDto> user = db.users().selectUserByLogin("Old login");
+    assertThat(user).isPresent();
+    assertThat(user.get().getEmail()).isEqualTo(USER_IDENTITY.getEmail());
   }
 
   @Test