Skip to content

Commit

Permalink
KEYCLOAK-5443 Fix update user account when both email as username and…
Browse files Browse the repository at this point in the history
… edit username are enabled
  • Loading branch information
stianst committed Dec 20, 2017
1 parent 351dbff commit f0c5752
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 10 deletions.
Expand Up @@ -99,7 +99,7 @@ protected void actionImpl(AuthenticationFlowContext context, SerializedBrokeredI


RealmModel realm = context.getRealm(); RealmModel realm = context.getRealm();


List<FormMessage> errors = Validation.validateUpdateProfileForm(!realm.isRegistrationEmailAsUsername(), formData); List<FormMessage> errors = Validation.validateUpdateProfileForm(realm, formData);
if (errors != null && !errors.isEmpty()) { if (errors != null && !errors.isEmpty()) {
Response challenge = context.form() Response challenge = context.form()
.setErrors(errors) .setErrors(errors)
Expand Down
Expand Up @@ -63,7 +63,7 @@ public void processAction(RequiredActionContext context) {
RealmModel realm = context.getRealm(); RealmModel realm = context.getRealm();




List<FormMessage> errors = Validation.validateUpdateProfileForm(realm.isEditUsernameAllowed(), formData); List<FormMessage> errors = Validation.validateUpdateProfileForm(realm, formData);
if (errors != null && !errors.isEmpty()) { if (errors != null && !errors.isEmpty()) {
Response challenge = context.form() Response challenge = context.form()
.setErrors(errors) .setErrors(errors)
Expand Down
Expand Up @@ -323,7 +323,7 @@ public Response processAccountUpdate(final MultivaluedMap<String, String> formDa


event.event(EventType.UPDATE_PROFILE).client(auth.getClient()).user(auth.getUser()); event.event(EventType.UPDATE_PROFILE).client(auth.getClient()).user(auth.getUser());


List<FormMessage> errors = Validation.validateUpdateProfileForm(realm.isEditUsernameAllowed(), formData); List<FormMessage> errors = Validation.validateUpdateProfileForm(realm, formData);
if (errors != null && !errors.isEmpty()) { if (errors != null && !errors.isEmpty()) {
setReferrerOnPage(); setReferrerOnPage();
return account.setErrors(Response.Status.BAD_REQUEST, errors).setProfileFormData(formData).createResponse(AccountPages.ACCOUNT); return account.setErrors(Response.Status.BAD_REQUEST, errors).setProfileFormData(formData).createResponse(AccountPages.ACCOUNT);
Expand Down Expand Up @@ -753,7 +753,7 @@ public static AccountSocialAction getAction(String action) {
private void updateUsername(String username, UserModel user, KeycloakSession session) { private void updateUsername(String username, UserModel user, KeycloakSession session) {
RealmModel realm = session.getContext().getRealm(); RealmModel realm = session.getContext().getRealm();
boolean usernameChanged = username == null || !user.getUsername().equals(username); boolean usernameChanged = username == null || !user.getUsername().equals(username);
if (realm.isEditUsernameAllowed()) { if (realm.isEditUsernameAllowed() && !realm.isRegistrationEmailAsUsername()) {
if (usernameChanged) { if (usernameChanged) {
UserModel existing = session.users().getUserByUsername(username, realm); UserModel existing = session.users().getUserByUsername(username, realm);
if (existing != null && !existing.getId().equals(user.getId())) { if (existing != null && !existing.getId().equals(user.getId())) {
Expand Down
Expand Up @@ -86,14 +86,10 @@ private static void addError(List<FormMessage> errors, String field, String mess
errors.add(new FormMessage(field, message)); errors.add(new FormMessage(field, message));
} }


public static List<FormMessage> validateUpdateProfileForm(MultivaluedMap<String, String> formData) { public static List<FormMessage> validateUpdateProfileForm(RealmModel realm, MultivaluedMap<String, String> formData) {
return validateUpdateProfileForm(false, formData);
}

public static List<FormMessage> validateUpdateProfileForm(boolean editUsernameAllowed, MultivaluedMap<String, String> formData) {
List<FormMessage> errors = new ArrayList<>(); List<FormMessage> errors = new ArrayList<>();


if (editUsernameAllowed && isBlank(formData.getFirst(FIELD_USERNAME))) { if (!realm.isRegistrationEmailAsUsername() && realm.isEditUsernameAllowed() && isBlank(formData.getFirst(FIELD_USERNAME))) {
addError(errors, FIELD_USERNAME, Messages.MISSING_USERNAME); addError(errors, FIELD_USERNAME, Messages.MISSING_USERNAME);
} }


Expand Down
Expand Up @@ -577,6 +577,42 @@ public void changeProfileEmailAsUsernameEnabled() throws Exception {


} }


// KEYCLOAK-5443
@Test
public void changeProfileEmailAsUsernameAndEditUsernameEnabled() throws Exception {
setEditUsernameAllowed(true);
setRegistrationEmailAsUsername(true);

profilePage.open();
loginPage.login("test-user@localhost", "password");
assertFalse(driver.findElements(By.id("username")).size() > 0);

profilePage.updateProfile("New First", "New Last", "new-email@email");

Assert.assertEquals("Your account has been updated.", profilePage.getSuccess());
Assert.assertEquals("New First", profilePage.getFirstName());
Assert.assertEquals("New Last", profilePage.getLastName());
Assert.assertEquals("new-email@email", profilePage.getEmail());

List<UserRepresentation> list = adminClient.realm("test").users().search(null, null, null, "new-email@email", null, null);
assertEquals(1, list.size());

UserRepresentation user = list.get(0);

assertEquals("new-email@email", user.getUsername());

// Revert

user.setUsername("test-user@localhost");
user.setFirstName("Tom");
user.setLastName("Brady");
user.setEmail("test-user@localhost");
adminClient.realm("test").users().get(user.getId()).update(user);

setRegistrationEmailAsUsername(false);
setEditUsernameAllowed(false);
}

private void setEditUsernameAllowed(boolean allowed) { private void setEditUsernameAllowed(boolean allowed) {
RealmRepresentation testRealm = testRealm().toRepresentation(); RealmRepresentation testRealm = testRealm().toRepresentation();
testRealm.setEditUsernameAllowed(allowed); testRealm.setEditUsernameAllowed(allowed);
Expand Down

0 comments on commit f0c5752

Please sign in to comment.