private Optional<UserDto> detectEmailUpdate(DbSession dbSession, UserRegistration authenticatorParameters) { String email = authenticatorParameters.getUserIdentity().getEmail(); if (email == null) { return Optional.empty(); } List<UserDto> existingUsers = dbClient.userDao().selectByEmail(dbSession, email); if (existingUsers.isEmpty()) { return Optional.empty(); } if (existingUsers.size() > 1) { throw generateExistingEmailError(authenticatorParameters, email); } UserDto existingUser = existingUsers.get(0); if (existingUser == null || isSameUser(existingUser, authenticatorParameters)) { return Optional.empty(); } ExistingEmailStrategy existingEmailStrategy = authenticatorParameters.getExistingEmailStrategy(); switch (existingEmailStrategy) { case ALLOW: existingUser.setEmail(null); dbClient.userDao().update(dbSession, existingUser); return Optional.of(existingUser); case WARN: throw new EmailAlreadyExistsRedirectionException(email, existingUser, authenticatorParameters.getUserIdentity(), authenticatorParameters.getProvider()); case FORBID: throw generateExistingEmailError(authenticatorParameters, email); default: throw new IllegalStateException(format("Unknown strategy %s", existingEmailStrategy)); } }
@Test public void select_by_email() { UserDto activeUser1 = db.users().insertUser(u -> u.setEmail("user1@email.com")); UserDto activeUser2 = db.users().insertUser(u -> u.setEmail("user1@email.com")); UserDto disableUser = db.users().insertUser(u -> u.setActive(false)); assertThat(underTest.selectByEmail(session, "user1@email.com")).hasSize(2); assertThat(underTest.selectByEmail(session, disableUser.getEmail())).isEmpty(); assertThat(underTest.selectByEmail(session, "unknown")).isEmpty(); }
@Test public void authenticate_new_user_generate_login_when_no_login_provided() { organizationFlags.setEnabled(true); underTest.register(UserRegistration.builder() .setUserIdentity(UserIdentity.builder() .setProviderId("ABCD") .setProviderLogin("johndoo") .setName("John Doe") .setEmail("john@email.com") .build()) .setProvider(IDENTITY_PROVIDER) .setSource(Source.realm(BASIC, IDENTITY_PROVIDER.getName())) .setExistingEmailStrategy(ExistingEmailStrategy.FORBID) .setUpdateLoginStrategy(UpdateLoginStrategy.ALLOW) .build()); UserDto user = db.getDbClient().userDao().selectByEmail(db.getSession(), "john@email.com").get(0); assertThat(user).isNotNull(); assertThat(user.isActive()).isTrue(); assertThat(user.getLogin()).isNotEqualTo("John Doe").startsWith("john-doe"); assertThat(user.getEmail()).isEqualTo("john@email.com"); assertThat(user.getExternalLogin()).isEqualTo("johndoo"); assertThat(user.getExternalIdentityProvider()).isEqualTo("github"); assertThat(user.getExternalId()).isEqualTo("ABCD"); }
return Optional.empty(); List<UserDto> existingUsers = dbClient.userDao().selectByEmail(dbSession, email); if (existingUsers.isEmpty()) { return Optional.empty();