@PUT
  @Path("password")
  public JSONWithPadding setUserPasswordPut(
      @Context UriInfo ui,
      Map<String, Object> json,
      @QueryParam("callback") @DefaultValue("callback") String callback)
      throws Exception {

    if (json == null) {
      return null;
    }

    String oldPassword = string(json.get("oldpassword"));
    String newPassword = string(json.get("newpassword"));

    if (isServiceAdmin()) {
      management.setAdminUserPassword(user.getUuid(), newPassword);
    } else {
      management.setAdminUserPassword(user.getUuid(), oldPassword, newPassword);
    }

    ApiResponse response = createApiResponse();
    response.setAction("set user password");

    return new JSONWithPadding(response, callback);
  }
 @Override
 public ServiceResults invokeItemWithName(ServiceContext context, String name) throws Exception {
   if ("me".equals(name)) {
     UserInfo user = SubjectUtils.getUser();
     if ((user != null) && (user.getUuid() != null)) {
       return super.invokeItemWithId(context, user.getUuid());
     }
   }
   return super.invokeItemWithName(context, name);
 }
  @POST
  @Path("resetpw")
  @Consumes("application/x-www-form-urlencoded")
  @Produces(MediaType.TEXT_HTML)
  public Viewable handlePasswordResetForm(
      @Context UriInfo ui,
      @FormParam("token") String token,
      @FormParam("password1") String password1,
      @FormParam("password2") String password2,
      @FormParam("recaptcha_challenge_field") String challenge,
      @FormParam("recaptcha_response_field") String uresponse) {

    try {
      this.token = token;

      if ((password1 != null) || (password2 != null)) {
        if (management.checkPasswordResetTokenForAdminUser(user.getUuid(), token)) {
          if ((password1 != null) && password1.equals(password2)) {
            management.setAdminUserPassword(user.getUuid(), password1);
            return handleViewable("resetpw_set_success", this);
          } else {
            errorMsg = "Passwords didn't match, let's try again...";
            return handleViewable("resetpw_set_form", this);
          }
        } else {
          errorMsg = "Something odd happened, let's try again...";
          return handleViewable("resetpw_email_form", this);
        }
      }

      if (!useReCaptcha()) {
        management.startAdminUserPasswordResetFlow(user);
        return handleViewable("resetpw_email_success", this);
      }

      ReCaptchaImpl reCaptcha = new ReCaptchaImpl();
      reCaptcha.setPrivateKey(properties.getRecaptchaPrivate());

      ReCaptchaResponse reCaptchaResponse =
          reCaptcha.checkAnswer(httpServletRequest.getRemoteAddr(), challenge, uresponse);

      if (reCaptchaResponse.isValid()) {
        management.startAdminUserPasswordResetFlow(user);
        return handleViewable("resetpw_email_success", this);
      } else {
        errorMsg = "Incorrect Captcha";
        return handleViewable("resetpw_email_form", this);
      }

    } catch (RedirectionException e) {
      throw e;
    } catch (Exception e) {
      return handleViewable("error", e);
    }
  }
  @GET
  @Path("reactivate")
  public JSONWithPadding reactivate(
      @Context UriInfo ui, @QueryParam("callback") @DefaultValue("callback") String callback)
      throws Exception {

    logger.info("Send activation email for user: "******"reactivate user");
    return new JSONWithPadding(response, callback);
  }
  @GET
  @Path("activate")
  @Produces(MediaType.TEXT_HTML)
  public Viewable activate(@Context UriInfo ui, @QueryParam("token") String token) {

    try {
      management.handleActivationTokenForAdminUser(user.getUuid(), token);
      return handleViewable("activate", this);
    } catch (TokenException e) {
      return handleViewable("bad_activation_token", this);
    } catch (RedirectionException e) {
      throw e;
    } catch (Exception e) {
      return handleViewable("error", e);
    }
  }
  @POST
  @Path("revoketokens")
  public JSONWithPadding revokeTokensPost(
      @Context UriInfo ui, @QueryParam("callback") @DefaultValue("callback") String callback)
      throws Exception {

    UUID adminId = user.getUuid();

    logger.info("Revoking user tokens for {}", adminId);

    ApiResponse response = createApiResponse();

    management.revokeAccessTokensForAdminUser(adminId);

    response.setAction("revoked user tokens");
    return new JSONWithPadding(response, callback);
  }
  @GET
  @Path("confirm")
  @Produces(MediaType.TEXT_HTML)
  public Viewable confirm(@Context UriInfo ui, @QueryParam("token") String token) {

    try {
      ActivationState state = management.handleConfirmationTokenForAdminUser(user.getUuid(), token);
      if (state == ActivationState.CONFIRMED_AWAITING_ACTIVATION) {
        return handleViewable("confirm", this);
      }
      return handleViewable("activate", this);
    } catch (TokenException e) {
      return handleViewable("bad_confirmation_token", this);
    } catch (RedirectionException e) {
      throw e;
    } catch (Exception e) {
      return new Viewable("error", e);
    }
  }
  @GET
  @Path("resetpw")
  @Produces(MediaType.TEXT_HTML)
  public Viewable showPasswordResetForm(@Context UriInfo ui, @QueryParam("token") String token) {

    try {
      this.token = token;

      if (management.checkPasswordResetTokenForAdminUser(user.getUuid(), token)) {
        return handleViewable("resetpw_set_form", this);
      } else {
        return handleViewable("resetpw_email_form", this);
      }
    } catch (RedirectionException e) {
      throw e;
    } catch (Exception e) {
      return handleViewable("error", e);
    }
  }
  @RequireAdminUserAccess
  @GET
  public JSONWithPadding getUserData(
      @Context UriInfo ui,
      @QueryParam("ttl") long ttl,
      @QueryParam("callback") @DefaultValue("callback") String callback)
      throws Exception {

    ApiResponse response = createApiResponse();
    response.setAction("get admin user");

    String token = management.getAccessTokenForAdminUser(SubjectUtils.getUser().getUuid(), ttl);
    Map<String, Object> userOrganizationData =
        management.getAdminUserOrganizationData(user.getUuid());
    userOrganizationData.put("token", token);
    response.setData(userOrganizationData);
    response.setSuccess();

    return new JSONWithPadding(response, callback);
  }