use of org.wso2.carbon.identity.application.authentication.framework.context.AuthenticationContext in project identity-outbound-auth-sms-otp by wso2-extensions.
the class SMSOTPAuthenticator method checkWithBackUpCodes.
/**
* If user forgets the mobile, then user can use the back up codes to authenticate the user.
*
* @param context the AuthenticationContext
* @param userToken the userToken
* @param authenticatedUser the name of authenticatedUser
* @throws AuthenticationFailedException
*/
private void checkWithBackUpCodes(AuthenticationContext context, String userToken, AuthenticatedUser authenticatedUser) throws AuthenticationFailedException {
String savedOTPString = null;
String username = context.getProperty(SMSOTPConstants.USER_NAME).toString();
String tenantAwareUsername = MultitenantUtils.getTenantAwareUsername(username);
UserRealm userRealm = getUserRealm(username);
try {
if (userRealm != null) {
savedOTPString = userRealm.getUserStoreManager().getUserClaimValue(tenantAwareUsername, SMSOTPConstants.SAVED_OTP_LIST, null);
}
if (StringUtils.isEmpty(savedOTPString)) {
if (log.isDebugEnabled()) {
log.debug("The claim " + SMSOTPConstants.SAVED_OTP_LIST + " does not contain any values");
}
throw new AuthenticationFailedException("The claim " + SMSOTPConstants.SAVED_OTP_LIST + " does not contain any values");
} else if (savedOTPString.contains(userToken)) {
if (log.isDebugEnabled()) {
log.debug("Found saved backup SMS OTP for user :" + authenticatedUser);
}
context.setSubject(authenticatedUser);
savedOTPString = savedOTPString.replaceAll(userToken, "").replaceAll(",,", ",");
userRealm.getUserStoreManager().setUserClaimValue(tenantAwareUsername, SMSOTPConstants.SAVED_OTP_LIST, savedOTPString, null);
} else {
if (log.isDebugEnabled()) {
log.debug("User entered OTP :" + userToken + " does not match with any of the saved backup codes");
}
throw new AuthenticationFailedException("Verification Error due to Code " + userToken + " mismatch.");
}
} catch (UserStoreException e) {
throw new AuthenticationFailedException("Cannot find the user claim for OTP list for user : " + authenticatedUser, e);
}
}
use of org.wso2.carbon.identity.application.authentication.framework.context.AuthenticationContext in project identity-outbound-auth-sms-otp by wso2-extensions.
the class SMSOTPAuthenticator method processAuthenticationResponse.
/**
* Process the response of the SMSOTP end-point.
*
* @param request the HttpServletRequest
* @param response the HttpServletResponse
* @param context the AuthenticationContext
* @throws AuthenticationFailedException
*/
@Override
protected void processAuthenticationResponse(HttpServletRequest request, HttpServletResponse response, AuthenticationContext context) throws AuthenticationFailedException {
String userToken = request.getParameter(SMSOTPConstants.CODE);
String contextToken = (String) context.getProperty(SMSOTPConstants.OTP_TOKEN);
AuthenticatedUser authenticatedUser = (AuthenticatedUser) context.getProperty(SMSOTPConstants.AUTHENTICATED_USER);
if (StringUtils.isEmpty(request.getParameter(SMSOTPConstants.CODE))) {
throw new InvalidCredentialsException("Code cannot not be null");
}
if (Boolean.parseBoolean(request.getParameter(SMSOTPConstants.RESEND))) {
if (log.isDebugEnabled()) {
log.debug("Retrying to resend the OTP");
}
throw new InvalidCredentialsException("Retrying to resend the OTP");
}
if (userToken.equals(contextToken)) {
context.setSubject(authenticatedUser);
} else if (SMSOTPUtils.getBackupCode(context, getName()).equals("true")) {
checkWithBackUpCodes(context, userToken, authenticatedUser);
} else {
context.setProperty(SMSOTPConstants.CODE_MISMATCH, true);
throw new AuthenticationFailedException("Code mismatch");
}
}
use of org.wso2.carbon.identity.application.authentication.framework.context.AuthenticationContext in project identity-outbound-auth-sms-otp by wso2-extensions.
the class SMSOTPUtils method isSMSOTPDisableForLocalUser.
/**
* Check whether SMSOTP is disable by user.
*
* @param username the Username
* @param context the AuthenticationContext
* @return true or false
* @throws SMSOTPException
*/
public static boolean isSMSOTPDisableForLocalUser(String username, AuthenticationContext context, String authenticatorName) throws SMSOTPException, AuthenticationFailedException {
UserRealm userRealm;
try {
String tenantDomain = MultitenantUtils.getTenantDomain(username);
int tenantId = IdentityTenantUtil.getTenantId(tenantDomain);
RealmService realmService = IdentityTenantUtil.getRealmService();
userRealm = realmService.getTenantUserRealm(tenantId);
username = MultitenantUtils.getTenantAwareUsername(String.valueOf(username));
boolean isEnablingControlledByUser = isSMSOTPEnableOrDisableByUser(context, authenticatorName);
if (userRealm != null) {
if (isEnablingControlledByUser) {
Map<String, String> claimValues = userRealm.getUserStoreManager().getUserClaimValues(username, new String[] { SMSOTPConstants.USER_SMSOTP_DISABLED_CLAIM_URI }, null);
return Boolean.parseBoolean(claimValues.get(SMSOTPConstants.USER_SMSOTP_DISABLED_CLAIM_URI));
}
} else {
throw new SMSOTPException("Cannot find the user realm for the given tenant domain : " + CarbonContext.getThreadLocalCarbonContext().getTenantDomain());
}
} catch (UserStoreException e) {
throw new SMSOTPException("Failed while trying to access userRealm of the user : " + username, e);
}
return false;
}
use of org.wso2.carbon.identity.application.authentication.framework.context.AuthenticationContext in project identity-outbound-auth-sms-otp by wso2-extensions.
the class SMSOTPAuthenticatorTest method testRedirectToMobileNumberReqPage.
@Test
public void testRedirectToMobileNumberReqPage() throws Exception {
mockStatic(SMSOTPUtils.class);
AuthenticationContext authenticationContext = new AuthenticationContext();
when(SMSOTPUtils.isEnableMobileNoUpdate(authenticationContext, SMSOTPConstants.AUTHENTICATOR_NAME)).thenReturn(true);
when(SMSOTPUtils.getMobileNumberRequestPage(authenticationContext, SMSOTPConstants.AUTHENTICATOR_NAME)).thenReturn("/smsotpauthenticationendpoint/mobile.jsp");
ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
Whitebox.invokeMethod(smsotpAuthenticator, "redirectToMobileNoReqPage", httpServletResponse, authenticationContext, null);
verify(httpServletResponse).sendRedirect(captor.capture());
Assert.assertTrue(captor.getValue().contains(SMSOTPConstants.AUTHENTICATOR_NAME));
}
use of org.wso2.carbon.identity.application.authentication.framework.context.AuthenticationContext in project identity-outbound-auth-sms-otp by wso2-extensions.
the class SMSOTPAuthenticatorTest method testRedirectToErrorPage.
@Test
public void testRedirectToErrorPage() throws Exception {
mockStatic(SMSOTPUtils.class);
AuthenticationContext authenticationContext = new AuthenticationContext();
when(SMSOTPUtils.getErrorPageFromXMLFile(authenticationContext, SMSOTPConstants.AUTHENTICATOR_NAME)).thenReturn("/smsotpauthenticationendpoint/smsotpError.jsp");
ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
Whitebox.invokeMethod(smsotpAuthenticator, "redirectToErrorPage", httpServletResponse, authenticationContext, null, null);
verify(httpServletResponse).sendRedirect(captor.capture());
Assert.assertTrue(captor.getValue().contains(SMSOTPConstants.AUTHENTICATOR_NAME));
}
Aggregations