use of com.rsa.authagent.authapi.PinData in project OpenAM by OpenRock.
the class SecurID method process.
public int process(Callback[] callbacks, int state) throws AuthLoginException {
String nextToken;
int rtnval = -1;
String tmp_passcode = null;
/*
* state starts at 1, numbering corresponds to order of screens.
* return -1 if done, next screen# if another screen
*/
wtOrgName = getRequestOrg();
if (debug.messageEnabled()) {
debug.message("SecurID:process: Org = " + wtOrgName + "\n\tstate = " + state);
}
/*
* see if this org not initialized.
* the path to sdconf.rec was gotten in init();
* verify that it exists once. after that, can
* get the AuthSessionFactory.getInstance every time,
* as it will return the same one, given the same path.
*/
if (!configDone.containsKey(STR_SECURID_CONFIG_PATH)) {
// verify path to sdconf.rec
verifyConfigPath();
configDone.put(STR_SECURID_CONFIG_PATH, "true");
}
/*
* not particularly pretty getting the
* AuthSessionFactory instance every time, but the
* SecurID api states that it returns the same instance
* for the given path. plus this way saves having to
* keep track of stuff...
*/
if (api == null) {
debug.message("SecurID.process:getting Session instance");
try {
api = AuthSessionFactory.getInstance(STR_SECURID_CONFIG_PATH);
} catch (AuthAgentException e) {
debug.error("SecurID.process:" + "Unable to get SecurID API.");
throw new AuthLoginException(bundleName, "SecurIDInitLex", null, e);
}
}
if (debug.messageEnabled()) {
debug.message("SecurID:process:after configDone: Org = " + wtOrgName + "\n\tstate = " + state + "\n\tconfig_path = " + STR_SECURID_CONFIG_PATH + "\n\tuserTokenId = " + userTokenId + "\n\tusername = " + username);
}
String newPin = "";
int authStatus = AuthSession.ACCESS_DENIED;
PinData pinData = null;
switch(state) {
case // initial state (1)
ISAuthConstants.LOGIN_START:
{
if (callbacks != null && callbacks.length == 0) {
username = (String) sharedState.get(getUserKey());
tmp_passcode = (String) sharedState.get(getPwdKey());
if (username == null || tmp_passcode == null) {
return 1;
}
getCredentialsFromSharedState = true;
} else {
username = ((NameCallback) callbacks[0]).getName();
// null userid is a no-no
if (username == null || username.length() == 0) {
throw new AuthLoginException(bundleName, "SecurIDUserIdNull", null);
}
tmp_passcode = charToString(((PasswordCallback) callbacks[1]).getPassword(), callbacks[1]);
// null passcode is also a no-no
if (tmp_passcode == null || tmp_passcode.length() == 0) {
throw new AuthLoginException(bundleName, "SecurIDPasscodeNull", null);
}
}
if (debug.messageEnabled()) {
debug.message("SecurID.process(): username: " + username);
}
storeUsernamePasswd(username, tmp_passcode);
// got the userid and passcode
try {
session = api.createUserSession();
} catch (AuthAgentException aaex) {
debug.error("SecurID.process:createUserSession() error:" + aaex.getMessage());
setFailureID(username);
throw new AuthLoginException(bundleName, "SecurIDInitializeLex", new Object[] { aaex.getMessage() });
}
try {
authStatus = session.lock(username);
if (debug.messageEnabled()) {
debug.message("SecurID.process:session.lock returns = " + authStatus);
}
authStatus = session.check(username, tmp_passcode);
if (debug.messageEnabled()) {
debug.message("SecurID.process:session.check returns = " + authStatus);
}
switch(authStatus) {
case AuthSession.ACCESS_OK:
debug.message("SecurID.process:ACCESS_OK");
userTokenId = username;
rtnval = ISAuthConstants.LOGIN_SUCCEED;
break;
case // new PIN mode
AuthSession.NEW_PIN_REQUIRED:
{
debug.message("SecurID.process:NEW_PIN_REQUIRED");
pinData = session.getPinData();
int pinState = pinData.getUserSelectable();
String msg = getNewPinMsg(pinData);
// if user can't choose their own pin
if (pinState == PinData.CANNOT_CHOOSE_PIN) {
debug.message("SecurID.process:CANNOT_CHOOSE_PIN");
newPin = pinData.getSystemPin().trim();
// submit new PIN
if (newPin.length() != 0) {
authStatus = session.pin(newPin);
if (debug.messageEnabled()) {
debug.message("SecurID.process:CCP:pin rtns = " + authStatus);
}
if (authStatus != AuthSession.PIN_ACCEPTED) {
/*
* weird that we'd get an error
* submitting the PIN provided by
* the system...
* could do error handling here,
* or having the user submit a
* null pin will make things terminate
* subsequently...
*/
debug.error("SecurID.process:CCP:sys pin " + "not accepted!");
if (session != null) {
try {
session.close();
} catch (AuthAgentException aax) {
debug.error("SecurID.process:NPRCCP:" + "close err = " + aax.getMessage());
}
session = null;
}
throw new AuthLoginException(bundleName, "SecurIDLoginFailed", new Object[] { username });
}
} else {
/*
* weird that we'd get a null PIN
* from the system...
*/
debug.message("SecurID.process:CCP:newPin 0-length");
newPin = "";
if (session != null) {
try {
session.close();
} catch (AuthAgentException aax) {
debug.error("SecurID.process:LSNP:" + "close err = " + aax.getMessage());
}
session = null;
}
throw new AuthLoginException(bundleName, "SecurIDLoginFailed", new Object[] { username });
}
/*
* then tell user the new PIN, and to do
* next token
*/
setDynamicText(true, ISAuthConstants.LOGIN_NEW_PIN_NEXT_TOKEN, bundle.getString("SecurIDWaitPin") + bundle.getString("SecurIDNewSysPin") + newPin);
rtnval = ISAuthConstants.LOGIN_NEW_PIN_NEXT_TOKEN;
} else if (pinState == PinData.USER_SELECTABLE) {
// see if user wants user-gen or sys-gen
debug.message("SecurID.process:USER_SELECTABLE");
setDynamicText(false, ISAuthConstants.LOGIN_SYS_GEN_PIN, bundle.getString("SecurIDSysGenPin"));
rtnval = ISAuthConstants.LOGIN_SYS_GEN_PIN;
} else if (pinState == PinData.MUST_CHOOSE_PIN) {
debug.message("SecurID.process:MUST_CHOOSE_PIN");
// user must provide new PIN
setDynamicText(true, ISAuthConstants.LOGIN_CHALLENGE, msg);
rtnval = ISAuthConstants.LOGIN_CHALLENGE;
if (debug.messageEnabled()) {
debug.message("SecurID.process:prompt = " + msg);
}
} else {
// huh?
debug.error("SecurID.process:NEW_PIN_REQUIRED:" + "unknown pinState = " + pinState);
if (session != null) {
try {
session.close();
} catch (AuthAgentException aax) {
debug.error("SecurID.process:NPRQ:" + "close err = " + aax.getMessage());
}
session = null;
setFailureID(username);
throw new AuthLoginException(bundleName, "SecurIDLoginFailed", new Object[] { username });
}
}
}
break;
case // next token mode
AuthSession.NEXT_CODE_REQUIRED:
debug.message("SecurID.process:NEXT_CODE_REQUIRED");
rtnval = ISAuthConstants.LOGIN_NEXT_TOKEN;
break;
case AuthSession.ACCESS_DENIED:
debug.message("SecurID.process:ACCESS_DENIED");
default:
debug.message("SecurID.process:state == default");
if (getCredentialsFromSharedState && !isUseFirstPassEnabled()) {
getCredentialsFromSharedState = false;
rtnval = ISAuthConstants.LOGIN_START;
break;
}
setFailureID(username);
if (session != null) {
try {
session.close();
} catch (AuthAgentException aax) {
debug.error("SecurID.process:LSAD:" + "close err = " + aax.getMessage());
}
session = null;
}
throw new AuthLoginException(bundleName, "SecurIDLoginFailed", new Object[] { username });
}
} catch (AuthAgentException aaex) {
if (session != null) {
try {
session.close();
} catch (AuthAgentException aax) {
debug.error("SecurID.process:LS:close err = " + aax.getMessage());
}
session = null;
}
debug.error("SecurID.process:session lock/check:" + aaex.getMessage());
setFailureID(username);
throw new AuthLoginException(bundleName, "SecurIDInitializeLex", new Object[] { aaex.getMessage() });
}
}
break;
case // new PIN mode (2)
ISAuthConstants.LOGIN_CHALLENGE:
{
debug.message("SecurID.process:LOGIN_CHALLENGE");
// submit new PIN
String newPIN = charToString(((PasswordCallback) callbacks[0]).getPassword(), callbacks[0]);
/*
* if no PIN provided, submit "" as the new PIN, and
* let the ACE/Server handle it (by returning an error)
*/
if (newPIN == null) {
// might not pass the ASCII test below
newPIN = "";
}
if (debug.messageEnabled()) {
debug.message("SecurID.process:state2: token length = " + newPIN.length());
}
try {
if (!newPIN.equals(new String(newPIN.getBytes("ASCII"), "ASCII"))) {
if (session != null) {
try {
session.close();
} catch (AuthAgentException aax) {
debug.error("SecurID.process:LC:close err = " + aax.getMessage());
}
session = null;
}
setFailureID(username);
throw new AuthLoginException(bundleName, "SecurIDNewPINNotASCII", null);
}
} catch (UnsupportedEncodingException ueex) {
if (session != null) {
try {
session.close();
} catch (AuthAgentException aax) {
debug.error("SecurID.process:LC2:close err = " + aax.getMessage());
}
session = null;
}
setFailureID(username);
throw new AuthLoginException(bundleName, "SecurIDInputEncodingException", null);
}
try {
authStatus = session.pin(newPIN);
if (debug.messageEnabled()) {
debug.message("SecurID.process:session.pin returns " + authStatus);
}
if (authStatus == AuthSession.PIN_ACCEPTED) {
debug.message("SecurID.process:new pin ACCEPTED");
rtnval = ISAuthConstants.LOGIN_NEW_PIN_NEXT_TOKEN;
setDynamicText(true, ISAuthConstants.LOGIN_NEW_PIN_NEXT_TOKEN, bundle.getString("SecurIDWaitPin"));
userTokenId = username;
} else if (authStatus == AuthSession.PIN_REJECTED) {
debug.message("SecurID:process:New PIN specified is invalid.");
if (session != null) {
try {
session.close();
} catch (AuthAgentException aax) {
debug.error("SecurID.process:LC3:close err = " + aax.getMessage());
}
session = null;
}
setFailureID(username);
throw new AuthLoginException(bundleName, "SecurIDAuthInvNewPin", null);
} else {
// hmmm...
debug.error("SecurID.process:unsure this pin response value.");
if (session != null) {
try {
session.close();
} catch (AuthAgentException aax) {
debug.error("SecurID.process:LC4:close err = " + aax.getMessage());
}
session = null;
}
}
} catch (AuthAgentException aaex) {
// probably have to terminate the session
debug.error("SecurID.process:session.pin exception: " + aaex.getMessage());
if (session != null) {
try {
session.close();
} catch (AuthAgentException aax) {
debug.error("SecurID.process:LC5:close err = " + aax.getMessage());
}
session = null;
}
setFailureID(username);
throw new AuthLoginException(bundleName, "SecurIDAuthInvNewPin", null);
}
}
break;
case // next token mode (3)
ISAuthConstants.LOGIN_NEXT_TOKEN:
{
// can do PIN+passcode or just passcode
debug.message("SecurID.process:LOGIN_NEXT_TOKEN");
// got the next token; submit it
nextToken = charToString(((PasswordCallback) callbacks[0]).getPassword(), callbacks[0]);
// must have something
if (nextToken == null) {
// might not pass the ASCII test below
nextToken = "";
}
if (debug.messageEnabled()) {
debug.message("SecurID.process:LOGIN_NEXT_TOKEN:token length = " + nextToken.length());
}
try {
if (!nextToken.equals(new String(nextToken.getBytes("ASCII"), "ASCII"))) {
setFailureID(username);
if (session != null) {
try {
session.close();
} catch (AuthAgentException aax) {
debug.error("SecurID.process:NT:close err = " + aax.getMessage());
}
session = null;
}
debug.error("SecurID.process:LOGIN_NEXT_TOKEN:" + "nextToken not ascii");
throw new AuthLoginException(bundleName, "SecurIDNextTokenNotASCII", null);
}
} catch (UnsupportedEncodingException ueex) {
if (session != null) {
try {
session.close();
} catch (AuthAgentException aax) {
debug.error("SecurID.process:NT2:close err = " + aax.getMessage());
}
session = null;
}
setFailureID(username);
debug.error("SecurID.process:LOGIN_NEXT_TOKEN:" + "nextToken input encoding");
throw new AuthLoginException(bundleName, "SecurIDInputEncodingException", null);
}
try {
authStatus = session.next(nextToken);
if (debug.messageEnabled()) {
debug.message("SecurID.process:LOGIN_NEXT_TOKEN:" + "next returns " + authStatus);
}
} catch (AuthAgentException aaex) {
debug.error("SecurID.process:LOGIN_NEXT_TOKEN:next() exception:" + aaex.getMessage());
if (session != null) {
try {
session.close();
} catch (AuthAgentException aax) {
debug.error("SecurID.process:NT3:close err = " + aax.getMessage());
}
session = null;
}
setFailureID(username);
throw new AuthLoginException(bundleName, "SecurIDInvNextToken", null);
}
if (authStatus == AuthSession.ACCESS_OK) {
// succeed
userTokenId = username;
rtnval = ISAuthConstants.LOGIN_SUCCEED;
} else {
if (session != null) {
try {
session.close();
} catch (AuthAgentException aax) {
debug.error("SecurID.process:NT4:close err = " + aax.getMessage());
}
session = null;
}
setFailureID(username);
if (debug.messageEnabled()) {
debug.message("SecurID.process:LOGIN_NEXT_TOKEN:" + "nextToken failure");
}
throw new AuthLoginException(bundleName, "SecurIDInvNextToken", null);
}
}
break;
case // sys genned PIN answer(4)
ISAuthConstants.LOGIN_SYS_GEN_PIN:
{
debug.message("SecurID.process:LOGIN_SYS_GEN_PIN");
// server asked if sys-genned PIN wanted, user said...
String answer = ((NameCallback) callbacks[0]).getName();
if (debug.messageEnabled()) {
debug.message("SecurID.process:received answer(state 4) = " + answer);
}
// must have something
boolean sysgenpin = false;
if (answer == null || answer.length() == 0) {
// make it system generated
sysgenpin = true;
if (debug.messageEnabled()) {
debug.message("SecurID.process:made answer(state 4) = " + sysgenpin);
}
} else if (answer.startsWith("y") || answer.startsWith("Y")) {
sysgenpin = true;
}
if (sysgenpin) {
debug.message("SecurID.process:LOGIN_SYS_GEN_PIN:" + "about to getSystemPin");
try {
pinData = session.getPinData();
newPin = pinData.getSystemPin();
authStatus = session.pin(newPin);
if (debug.messageEnabled()) {
debug.message("SecurID.process:LSGP:" + "newPin:pin() response = " + authStatus);
}
setDynamicText(true, ISAuthConstants.LOGIN_NEW_PIN_NEXT_TOKEN, bundle.getString("SecurIDWaitPin") + bundle.getString("SecurIDNewSysPin") + newPin);
userTokenId = username;
rtnval = ISAuthConstants.LOGIN_NEW_PIN_NEXT_TOKEN;
} catch (AuthAgentException aaex) {
// probably have to terminate the session
debug.error("SecurID.process:LSGP:getSystemPin/pin error = " + aaex.getMessage());
if (session != null) {
try {
session.close();
} catch (AuthAgentException aax) {
debug.error("SecurID.process:SGP:close err = " + aax.getMessage());
}
session = null;
}
setFailureID(username);
if (getCredentialsFromSharedState && !isUseFirstPassEnabled()) {
getCredentialsFromSharedState = false;
rtnval = ISAuthConstants.LOGIN_START;
}
throw new AuthLoginException(bundleName, "SecurIDAuthInvNewPin", null);
}
} else {
// user-generated PIN
try {
String msg = getNewPinMsg(session.getPinData());
if (debug.messageEnabled()) {
debug.message("SecurID.process:LOGIN_SYS_GEN_PIN:" + "about to get user-genned PIN, prompt = \n\t" + msg);
}
setDynamicText(true, ISAuthConstants.LOGIN_CHALLENGE, msg);
rtnval = ISAuthConstants.LOGIN_CHALLENGE;
} catch (AuthAgentException aaex) {
// probably have to terminate the session
debug.error("SecurID.process:" + "session.getPinData exception: " + aaex.getMessage());
if (session != null) {
try {
session.close();
} catch (AuthAgentException aax) {
debug.error("SecurID.process:UGP:close err = " + aax.getMessage());
}
session = null;
}
setFailureID(username);
throw new AuthLoginException(bundleName, "SecurIDAuthInvNewPin", null);
}
}
}
break;
case // 5
ISAuthConstants.LOGIN_NEW_PIN_NEXT_TOKEN:
{
if (debug.messageEnabled()) {
debug.message("LOGIN_NEW_PIN_NEXT_TOKEN:username = " + username);
}
if (username == null || username.length() == 0) {
setFailureID(username);
throw new AuthLoginException(bundleName, "SecurIDPrevUserid", null);
}
// only one callback... the new pin + token
nextToken = charToString(((PasswordCallback) callbacks[0]).getPassword(), callbacks[0]);
/*
* if nothing provided,
* send a null string, and let the ACE/Server handle it.
*/
if (nextToken == null) {
// might not pass ASCII test below
nextToken = "";
}
try {
if (!nextToken.equals(new String(nextToken.getBytes("ASCII"), "ASCII"))) {
setFailureID(username);
if (session != null) {
try {
session.close();
} catch (AuthAgentException aax) {
debug.error("SecurID.process:NPT:close err = " + aax.getMessage());
}
session = null;
}
throw new AuthLoginException(bundleName, "SecurIDNextTokenNotASCII", null);
}
} catch (UnsupportedEncodingException ueex) {
if (session != null) {
try {
session.close();
} catch (AuthAgentException aax) {
debug.error("SecurID.process:NPT2:close err = " + aax.getMessage());
}
session = null;
}
setFailureID(username);
throw new AuthLoginException(bundleName, "SecurIDInputEncodingException", null);
}
debug.message("SecurID.process:LNPNT:doing session.check");
authStatus = AuthSession.ACCESS_DENIED;
try {
authStatus = session.lock(username);
if (debug.messageEnabled()) {
debug.message("SecurID.process:LNPNT:lock returns " + authStatus);
}
authStatus = session.check(username, nextToken);
if (debug.messageEnabled()) {
debug.message("SecurID.process:LNPNT:next returns " + authStatus);
}
} catch (AuthAgentException aaex) {
debug.error("SecurID.process:LNPNT:next() gets exception:" + aaex.getMessage());
if (session != null) {
try {
session.close();
} catch (AuthAgentException aax) {
debug.error("SecurID.process:NPT3:close err = " + aax.getMessage());
}
session = null;
}
setFailureID(username);
throw new AuthLoginException(bundleName, "SecurIDLoginFailed", new Object[] { username });
}
if (debug.messageEnabled()) {
debug.message("SecurID.process:LNPNT:ACCESS_OK = " + AuthSession.ACCESS_OK + ", authStatus = " + authStatus);
}
if (authStatus == AuthSession.ACCESS_OK) {
// succeed
if (debug.messageEnabled()) {
debug.message("SecurID.process:LNPNT:next() =" + " LOGIN_SUCCEED, username = " + username);
}
userTokenId = username;
rtnval = ISAuthConstants.LOGIN_SUCCEED;
} else {
// login failed
if (debug.messageEnabled()) {
debug.message("SecurID.process:LNPNT:next() " + "gets NOT Succeed = " + authStatus);
}
if (session != null) {
try {
session.close();
} catch (AuthAgentException aax) {
debug.error("SecurID.process:NPT4:close err = " + aax.getMessage());
}
session = null;
}
setFailureID(username);
throw new AuthLoginException(bundleName, "SecurIDLoginFailed", new Object[] { username });
}
}
break;
default:
if (session != null) {
try {
session.close();
} catch (AuthAgentException aax) {
debug.error("SecurID.process:DEF:close err = " + aax.getMessage());
}
session = null;
}
setFailureID(username);
throw new AuthLoginException(bundleName, "SecurIDAuth", null);
}
if (debug.messageEnabled()) {
debug.message("process; after process:" + "\n\tstate = " + state + "\n\tuserTokenId = " + userTokenId + "\n\tusername = " + username + "\n\trtnval = " + rtnval);
}
if (rtnval == ISAuthConstants.LOGIN_SUCCEED) {
if (session != null) {
try {
session.close();
} catch (AuthAgentException aax) {
debug.error("SecurID.process:LOGIN_SUCCEED:close err = " + aax.getMessage());
}
session = null;
}
}
return (rtnval);
}
Aggregations