An invited user on signup should be set to enabled and should not lead to duplicate key exception. (#36)

This commit is contained in:
trishaanand 2020-07-06 12:46:46 +05:30 committed by GitHub
parent bbbdbd50b5
commit 4a05ba6ac5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 89 additions and 5 deletions

View File

@ -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);
});
}
}

View File

@ -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);
});
}
}

View File

@ -480,8 +480,26 @@ public class UserServiceImpl extends BaseService<UserRepository, User, String> 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<User> sendWelcomeEmail(User user, String originHeader) {

View File

@ -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<User> 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<User> 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<User> 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();
}
}