@Test
  public void testMultipleRealms() throws Exception {
    IdentityManager identityManager = getIdentityManager();
    String accountName = "someUser";
    Account user = createAccount(accountName);
    Digest realmAPassword = new Digest();

    realmAPassword.setRealm("Realm A");
    realmAPassword.setUsername(accountName);
    realmAPassword.setPassword("somePassword");

    identityManager.updateCredential(user, realmAPassword);

    Digest realmBPassword = new Digest();

    realmBPassword.setRealm("Realm B");
    realmBPassword.setUsername(accountName);
    realmBPassword.setPassword("somePassword");

    identityManager.updateCredential(user, realmBPassword);

    realmAPassword.setDigest(
        DigestUtil.calculateA1(
            accountName, realmAPassword.getRealm(), realmAPassword.getPassword().toCharArray()));

    DigestCredentials realmACredentials = new DigestCredentials(realmAPassword);

    identityManager.validateCredentials(realmACredentials);

    assertEquals(Credentials.Status.VALID, realmACredentials.getStatus());

    realmBPassword.setDigest(
        DigestUtil.calculateA1(
            accountName, realmBPassword.getRealm(), realmBPassword.getPassword().toCharArray()));

    DigestCredentials realmBCredentials = new DigestCredentials(realmBPassword);

    identityManager.validateCredentials(realmBCredentials);

    assertEquals(Credentials.Status.VALID, realmBCredentials.getStatus());

    realmBPassword.setDigest(
        DigestUtil.calculateA1(
            accountName, realmAPassword.getRealm(), realmBPassword.getPassword().toCharArray()));

    realmBCredentials = new DigestCredentials(realmBPassword);

    identityManager.validateCredentials(realmBCredentials);

    assertEquals(Credentials.Status.INVALID, realmBCredentials.getStatus());
  }
  @Test
  public void testResetCredential() throws Exception {
    IdentityManager identityManager = getIdentityManager();
    String accountName = "someUser";
    Account user = createAccount(accountName);
    Digest digest = new Digest();

    digest.setRealm("pl-idm");
    digest.setUsername(accountName);
    digest.setPassword("somePassword");

    Calendar expirationDate = Calendar.getInstance();

    expirationDate.add(Calendar.MINUTE, -1);

    identityManager.updateCredential(user, digest, new Date(), expirationDate.getTime());

    DigestCredentials credential = new DigestCredentials(digest);

    digest.setDigest(
        DigestUtil.calculateA1(accountName, digest.getRealm(), digest.getPassword().toCharArray()));

    identityManager.validateCredentials(credential);

    assertEquals(Credentials.Status.EXPIRED, credential.getStatus());

    digest.setDigest(
        DigestUtil.calculateA1(accountName, digest.getRealm(), "bad_password".toCharArray()));

    identityManager.validateCredentials(credential);

    assertEquals(Credentials.Status.INVALID, credential.getStatus());

    Digest newPassword = new Digest();

    newPassword.setRealm("pl-idm");
    newPassword.setUsername(accountName);
    newPassword.setPassword("someNewPassword");

    identityManager.updateCredential(user, newPassword);

    credential = new DigestCredentials(newPassword);

    newPassword.setDigest(
        DigestUtil.calculateA1(
            accountName, newPassword.getRealm(), newPassword.getPassword().toCharArray()));

    identityManager.validateCredentials(credential);

    assertEquals(Credentials.Status.VALID, credential.getStatus());
  }
  @Test
  public void testSuccessfulValidation() throws Exception {
    IdentityManager identityManager = getIdentityManager();
    String accountName = "someUser";
    Account user = createAccount(accountName);
    Digest digestPassword = new Digest();

    digestPassword.setRealm("pl-idm");
    digestPassword.setUsername(accountName);
    digestPassword.setPassword("somePassword");

    identityManager.updateCredential(user, digestPassword);

    digestPassword.setDigest(
        DigestUtil.calculateA1(
            accountName, digestPassword.getRealm(), digestPassword.getPassword().toCharArray()));

    DigestCredentials credential = new DigestCredentials(digestPassword);

    identityManager.validateCredentials(credential);

    assertEquals(Credentials.Status.VALID, credential.getStatus());
    assertNotNull(credential.getValidatedAccount());
    assertEquals(user.getId(), credential.getValidatedAccount().getId());
  }
  @Test
  public void testUserDisabled() throws Exception {
    IdentityManager identityManager = getIdentityManager();
    String accountName = "someUser";
    Account user = createAccount(accountName);
    Digest digestPassword = new Digest();

    digestPassword.setRealm("pl-idm");
    digestPassword.setUsername(accountName);
    digestPassword.setPassword("somePassword");

    identityManager.updateCredential(user, digestPassword);

    digestPassword.setDigest(
        DigestUtil.calculateA1(
            accountName, digestPassword.getRealm(), digestPassword.getPassword().toCharArray()));

    DigestCredentials credential = new DigestCredentials(digestPassword);

    identityManager.validateCredentials(credential);

    assertEquals(Credentials.Status.VALID, credential.getStatus());

    user.setEnabled(false);

    identityManager.update(user);

    identityManager.validateCredentials(credential);

    assertEquals(Credentials.Status.ACCOUNT_DISABLED, credential.getStatus());
  }
  private String buildAuthorizationHeader(Digest digest, String userName, String password) {
    String clientResponse = null;

    digest.setUsername(userName);
    digest.setMethod("GET");
    digest.setUri("/digestProtectedUri/");
    digest.setNonce(digest.getNonce());
    digest.setClientNonce(digest.getNonce());
    digest.setNonceCount("00001");

    clientResponse = HTTPDigestUtil.clientResponseValue(digest, password.toCharArray());

    StringBuilder str = new StringBuilder();

    str.append("Digest ")
        .append("username=\"")
        .append(digest.getUsername())
        .append("\",")
        .append("realm=\"")
        .append(digest.getRealm())
        .append("\",")
        .append("nonce=\"")
        .append(digest.getNonce())
        .append("\",")
        .append("cnonce=\"")
        .append(digest.getClientNonce())
        .append("\",")
        .append("uri=\"")
        .append(digest.getUri())
        .append("\",")
        .append("qop=")
        .append(digest.getQop())
        .append(",")
        .append("nc=")
        .append(digest.getNonceCount())
        .append(",")
        .append("response=\"")
        .append(clientResponse)
        .append("\"");

    return str.toString();
  }
  @Test
  @Configuration(exclude = LDAPStoreConfigurationTester.class)
  public void testRetrieveCurrentCredential() throws Exception {
    IdentityManager identityManager = getIdentityManager();
    String accountName = "someUser";
    Account user = createAccount(accountName);
    Digest realmAPassword = new Digest();

    realmAPassword.setRealm("Realm A");
    realmAPassword.setUsername(accountName);
    realmAPassword.setPassword("somePassword");

    identityManager.updateCredential(user, realmAPassword);

    DigestCredentialStorage currentStorage =
        identityManager.retrieveCurrentCredential(user, DigestCredentialStorage.class);

    assertNotNull(currentStorage);
    assertTrue(CredentialUtils.isCurrentCredential(currentStorage));

    assertNotNull(currentStorage.getEffectiveDate());
    assertNotNull(currentStorage.getHa1());
    assertNotNull(currentStorage.getRealm());
  }