Dn userDn = new Dn( "cn=userLockout3,ou=system" );
LdapConnection adminConnection = getAdminNetworkConnection( getLdapServer() );
addUser( adminConnection, "userLockout3", "12345" );
LdapConnection userConnection = new LdapNetworkConnection( "localhost", ldapServer.getPort() );
userConnection.setTimeOut( 0L );
// First attempt
checkBind( userConnection, userDn, "badPassword", 1,
"INVALID_CREDENTIALS: Bind failed: ERR_229 Cannot authenticate user cn=userLockout3,ou=system" );
Entry userEntry = adminConnection.lookup( userDn, "+" );
Attribute pwdFailureTime = userEntry
.get( PasswordPolicySchemaConstants.PWD_FAILURE_TIME_AT );
assertNotNull( pwdFailureTime );
assertEquals( 1, pwdFailureTime.size() );
Thread.sleep( 1000 );
// Second attempt
checkBind( userConnection, userDn, "badPassword", 1,
"INVALID_CREDENTIALS: Bind failed: ERR_229 Cannot authenticate user cn=userLockout3,ou=system" );
userEntry = adminConnection.lookup( userDn, "+" );
pwdFailureTime = userEntry
.get( PasswordPolicySchemaConstants.PWD_FAILURE_TIME_AT );
assertNotNull( pwdFailureTime );
assertEquals( 2, pwdFailureTime.size() );
Thread.sleep( 1000 );
// Third attempt
checkBind( userConnection, userDn, "badPassword", 1,
"INVALID_CREDENTIALS: Bind failed: ERR_229 Cannot authenticate user cn=userLockout3,ou=system" );
userEntry = adminConnection.lookup( userDn, "+" );
pwdFailureTime = userEntry
.get( PasswordPolicySchemaConstants.PWD_FAILURE_TIME_AT );
assertNotNull( pwdFailureTime );
assertEquals( 2, pwdFailureTime.size() );
Thread.sleep( 1000 );
// Forth attempt
checkBind( userConnection, userDn, "badPassword", 1,
"INVALID_CREDENTIALS: Bind failed: ERR_229 Cannot authenticate user cn=userLockout3,ou=system" );
userEntry = adminConnection.lookup( userDn, "+" );
pwdFailureTime = userEntry
.get( PasswordPolicySchemaConstants.PWD_FAILURE_TIME_AT );
assertNotNull( pwdFailureTime );
// We should not have more than 2 attempts stored
assertEquals( 2, pwdFailureTime.size() );
userConnection.close();
adminConnection.close();
}