Ejemplo n.º 1
0
  /**
   * Update account information.
   *
   * <p>Form params:
   *
   * <p>firstName lastName email
   *
   * @param formData
   * @return
   */
  @Path("/")
  @POST
  @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
  public Response processAccountUpdate(final MultivaluedMap<String, String> formData) {
    if (auth == null) {
      return login(null);
    }

    require(AccountRoles.MANAGE_ACCOUNT);

    String action = formData.getFirst("submitAction");
    if (action != null && action.equals("Cancel")) {
      setReferrerOnPage();
      return account.createResponse(AccountPages.ACCOUNT);
    }

    csrfCheck(formData);

    UserModel user = auth.getUser();

    List<FormMessage> errors = Validation.validateUpdateProfileForm(realm, formData);
    if (errors != null && !errors.isEmpty()) {
      setReferrerOnPage();
      return account
          .setErrors(errors)
          .setProfileFormData(formData)
          .createResponse(AccountPages.ACCOUNT);
    }

    try {
      if (realm.isEditUsernameAllowed()) {
        String username = formData.getFirst("username");

        UserModel existing = session.users().getUserByUsername(username, realm);
        if (existing != null && !existing.getId().equals(user.getId())) {
          throw new ModelDuplicateException(Messages.USERNAME_EXISTS);
        }

        user.setUsername(username);
      }
      user.setFirstName(formData.getFirst("firstName"));
      user.setLastName(formData.getFirst("lastName"));

      String email = formData.getFirst("email");
      String oldEmail = user.getEmail();
      boolean emailChanged = oldEmail != null ? !oldEmail.equals(email) : email != null;
      if (emailChanged) {
        UserModel existing = session.users().getUserByEmail(email, realm);
        if (existing != null && !existing.getId().equals(user.getId())) {
          throw new ModelDuplicateException(Messages.EMAIL_EXISTS);
        }
      }

      user.setEmail(email);

      AttributeFormDataProcessor.process(formData, realm, user);

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

      if (emailChanged) {
        user.setEmailVerified(false);
        event
            .clone()
            .event(EventType.UPDATE_EMAIL)
            .detail(Details.PREVIOUS_EMAIL, oldEmail)
            .detail(Details.UPDATED_EMAIL, email)
            .success();
      }
      setReferrerOnPage();
      return account.setSuccess(Messages.ACCOUNT_UPDATED).createResponse(AccountPages.ACCOUNT);
    } catch (ModelReadOnlyException roe) {
      setReferrerOnPage();
      return account
          .setError(Messages.READ_ONLY_USER)
          .setProfileFormData(formData)
          .createResponse(AccountPages.ACCOUNT);
    } catch (ModelDuplicateException mde) {
      setReferrerOnPage();
      return account
          .setError(mde.getMessage())
          .setProfileFormData(formData)
          .createResponse(AccountPages.ACCOUNT);
    }
  }