|
@@ -0,0 +1,78 @@
|
|
|
|
+package org.acegisecurity.providers.ldap.authenticator;
|
|
|
|
+
|
|
|
|
+import org.acegisecurity.ldap.InitialDirContextFactory;
|
|
|
|
+import org.acegisecurity.ldap.DefaultInitialDirContextFactory;
|
|
|
|
+import org.acegisecurity.ldap.ppolicy.PasswordExpiredException;
|
|
|
|
+import org.acegisecurity.ldap.ppolicy.AccountLockedException;
|
|
|
|
+import org.acegisecurity.ldap.ppolicy.PasswordPolicyException;
|
|
|
|
+import org.acegisecurity.ldap.ppolicy.PasswordInHistoryException;
|
|
|
|
+import org.apache.commons.logging.Log;
|
|
|
|
+import org.apache.commons.logging.LogFactory;
|
|
|
|
+
|
|
|
|
+import java.util.regex.Pattern;
|
|
|
|
+import java.util.regex.Matcher;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * @author Luke
|
|
|
|
+ * @version $Id$
|
|
|
|
+ */
|
|
|
|
+public class OracleIDBindAuthenticator extends BindAuthenticator {
|
|
|
|
+ //~ Static fields/initializers =====================================================================================
|
|
|
|
+
|
|
|
|
+ private static final Log logger = LogFactory.getLog(OracleIDBindAuthenticator.class);
|
|
|
|
+
|
|
|
|
+ private static final Pattern oidErrorMsgPattern = Pattern.compile("^\\[LDAP: error code ([0-9]+) - .*:([0-9]{4}):.*");
|
|
|
|
+
|
|
|
|
+ //~ Constructors ===================================================================================================
|
|
|
|
+
|
|
|
|
+ protected OracleIDBindAuthenticator(InitialDirContextFactory initialDirContextFactory) {
|
|
|
|
+ super(initialDirContextFactory);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ 9000 GSL_PWDEXPIRED_EXCP Your Password has expired. Please contact the Administrator to change your password.
|
|
|
|
+ 9001 GSL_ACCOUNTLOCKED_EXCP Your account is locked. Please contact the Administrator.
|
|
|
|
+ 9002 GSL_EXPIREWARNING_EXCP Your Password will expire in pwdexpirewarning seconds. Please change your password now.
|
|
|
|
+ 9003 GSL_PWDMINLENGTH_EXCP Your Password must be at least pwdminlength characters long.
|
|
|
|
+ 9004 GSL_PWDNUMERIC_EXCP Your Password must contain at least orclpwdalphanumeric numeric characters.
|
|
|
|
+ 9005 GSL_PWDNULL_EXCP Your Password cannot be a Null Password.
|
|
|
|
+ 9006 GSL_PWDINHISTORY_EXCP Your New Password cannot be the same as your Old Password.
|
|
|
|
+ 9007 GSL_PWDILLEGALVALUE_EXCP Your Password cannot be the same as your orclpwdillegalvalues.
|
|
|
|
+ 9008 GSL_GRACELOGIN_EXCP Your Password has expired. You have pwdgraceloginlimit Grace logins left.
|
|
|
|
+ 9050 GSL_ACCTDISABLED_EXCP Your Account has been disabled. Please contact the administrator.
|
|
|
|
+*/
|
|
|
|
+ protected void handleBindException(String userDn, String username, Throwable exception) {
|
|
|
|
+ int errorCode = parseOracleErrorCode(exception.getMessage());
|
|
|
|
+
|
|
|
|
+ if(errorCode > 0) {
|
|
|
|
+ switch (errorCode) {
|
|
|
|
+ case 9000:
|
|
|
|
+ throw new PasswordExpiredException("Password has expired. Please contact an administrator.");
|
|
|
|
+ case 9001:
|
|
|
|
+ throw new AccountLockedException("Account is locked. Please contact an administrator.");
|
|
|
|
+// case 9006:
|
|
|
|
+// throw new PasswordInHistoryException("Password must not match previous password");
|
|
|
|
+ }
|
|
|
|
+ throw new PasswordPolicyException("OID exception: " + exception.getMessage());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Just debug log the exception
|
|
|
|
+ super.handleBindException(userDn, username, exception);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Attempts to parse the error code from the exception message returned by OID.
|
|
|
|
+ */
|
|
|
|
+ private int parseOracleErrorCode(String msg) {
|
|
|
|
+ Matcher matcher = oidErrorMsgPattern.matcher(msg);
|
|
|
|
+
|
|
|
|
+ if(matcher.matches()) {
|
|
|
|
+ String code = matcher.group(2);
|
|
|
|
+
|
|
|
|
+ return Integer.parseInt(code);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+}
|