diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/authentication/handlers/CustomOAuth2UserServiceImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/authentication/handlers/CustomOAuth2UserServiceImpl.java index 040de654a0..f65d091b1a 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/authentication/handlers/CustomOAuth2UserServiceImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/authentication/handlers/CustomOAuth2UserServiceImpl.java @@ -59,6 +59,13 @@ public class CustomOAuth2UserServiceImpl extends DefaultReactiveOAuth2UserServic newUser.setIsEnabled(true); return userService.create(newUser); - })); + })) + .flatMap(user -> { + if (!user.getIsEnabled()) { + user.setIsEnabled(true); + return repository.save(user); + } + return Mono.just(user); + }); } } diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/authentication/handlers/CustomOidcUserServiceImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/authentication/handlers/CustomOidcUserServiceImpl.java index a631fa9a45..2c121fb145 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/authentication/handlers/CustomOidcUserServiceImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/authentication/handlers/CustomOidcUserServiceImpl.java @@ -66,6 +66,13 @@ public class CustomOidcUserServiceImpl extends OidcReactiveOAuth2UserService newUser.setIsEnabled(true); return userService.create(newUser); - })); + })) + .flatMap(user -> { + if (!user.getIsEnabled()) { + user.setIsEnabled(true); + return repository.save(user); + } + return Mono.just(user); + }); } } diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/UserServiceImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/UserServiceImpl.java index 7a87dbb333..aa34cb4d8b 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/UserServiceImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/UserServiceImpl.java @@ -480,8 +480,26 @@ public class UserServiceImpl extends BaseService i } final String finalOriginHeader = originHeader; - return userCreate(user) + // If the user doesn't exist, create the user. If the user exists, return a duplicate key exception + return repository.findByEmail(user.getUsername()) + .flatMap(savedUser -> { + if (!savedUser.getIsEnabled()) { + // First enable the user + savedUser.setIsEnabled(true); + // In case of form login, store the password + if (LoginSource.FORM.equals(user.getSource())) { + if (user.getPassword() == null || user.getPassword().isBlank()) { + return Mono.error(new AppsmithException(AppsmithError.INVALID_CREDENTIALS)); + } + savedUser.setPassword(this.passwordEncoder.encode(user.getPassword())); + } + return repository.save(savedUser); + } + return Mono.error(new AppsmithException(AppsmithError.DUPLICATE_KEY)); + }) + .switchIfEmpty(userCreate(user)) .flatMap(savedUser -> sendWelcomeEmail(savedUser, finalOriginHeader)); + } public Mono sendWelcomeEmail(User user, String originHeader) { diff --git a/app/server/appsmith-server/src/test/java/com/appsmith/server/services/UserServiceTest.java b/app/server/appsmith-server/src/test/java/com/appsmith/server/services/UserServiceTest.java index d5c4c6c168..23261861d7 100644 --- a/app/server/appsmith-server/src/test/java/com/appsmith/server/services/UserServiceTest.java +++ b/app/server/appsmith-server/src/test/java/com/appsmith/server/services/UserServiceTest.java @@ -6,6 +6,7 @@ import com.appsmith.server.configurations.WithMockAppsmithUser; import com.appsmith.server.constants.FieldName; import com.appsmith.server.domains.Application; import com.appsmith.server.domains.InviteUser; +import com.appsmith.server.domains.LoginSource; import com.appsmith.server.domains.Organization; import com.appsmith.server.domains.User; import com.appsmith.server.exceptions.AppsmithError; @@ -110,10 +111,10 @@ public class UserServiceTest { } @Test - @WithMockUser(username = "anonymousUser", roles = {"ANONYMOUS"}) + @WithMockAppsmithUser public void createNewUserFormSignupNullPassword() { User newUser = new User(); - newUser.setEmail("new-user-email@email.com"); + newUser.setEmail("new-user-email-with-null-password@email.com"); Mono userMono = userService.create(newUser); @@ -246,6 +247,7 @@ public class UserServiceTest { } @Test + @WithMockAppsmithUser public void confirmInviteTokenFlow() { User newUser = new User(); newUser.setEmail("newEmail@newEmail.com"); @@ -267,5 +269,55 @@ public class UserServiceTest { .verifyComplete(); } + + @Test + @WithMockAppsmithUser + public void signUpViaFormLoginIfAlreadyInvited() { + User newUser = new User(); + newUser.setEmail("alreadyInvited@alreadyInvited.com"); + newUser.setIsEnabled(false); + + userRepository.save(newUser).block(); + + User signupUser = new User(); + signupUser.setEmail(newUser.getEmail()); + signupUser.setPassword("password"); + signupUser.setSource(LoginSource.FORM); + + Mono userMono = userService.create(signupUser); + + StepVerifier.create(userMono) + .assertNext(user -> { + assertThat(user.getEmail().equals(newUser.getEmail())); + assertThat(user.getSource().equals(LoginSource.FORM)); + assertThat(user.getIsEnabled()).isTrue(); + }) + .verifyComplete(); + } + + @Test + @WithMockAppsmithUser + public void signUpViaGoogleIfAlreadyInvited() { + User newUser = new User(); + newUser.setEmail("alreadyInvited@google-gmail.com"); + newUser.setIsEnabled(false); + + userRepository.save(newUser).block(); + + User signupUser = new User(); + signupUser.setEmail(newUser.getEmail()); + signupUser.setPassword("password"); + signupUser.setSource(LoginSource.GOOGLE); + + Mono userMono = userService.create(signupUser); + + StepVerifier.create(userMono) + .assertNext(user -> { + assertThat(user.getEmail().equals(newUser.getEmail())); + assertThat(user.getSource().equals(LoginSource.GOOGLE)); + assertThat(user.getIsEnabled()).isTrue(); + }) + .verifyComplete(); + } }