Name

global.PwdAjaxVerifyProcessor

Description

No description available

Script

var PwdAjaxVerifyProcessor = Class.create();

PwdAjaxVerifyProcessor.prototype = Object.extendsObject(PwdAjaxRequestProcessor, {
  
  QA_VERIFICATION_TYPE_ID: '39b15343eb10010045e1a5115206feb7',
  VERIFIED: 2,
  NOT_VERIFIED: 4,
  IN_PROGRESS: 0,
  PENDING_WITH_EXTERNAL_SYSTEM_STATUS: 3,
  
  verifyBL : new PwdVerifyStageBL(),
  
  isPublic: function() {
  	return true;
  },
  	
  /************
  * pwdAjaxVerifyProcessor() - Server side Ajax processor for verifying the user (iterate through the various verification methods).
  *
  * Required Properties:
  *  @sysparm_enrolled_user_id - a "session" property containing the enrolled user id.
  *  @sysparm_request_id       - a "session" property containing the request id.
  *
  * Return value:
  * "ok"     - if user is verified (by ALL verification methods).
  * "block"  - If too many attempts where made, and we'd like to block this user.
  * <error>  - Any other string, with the error (reason for failing); For example: "No request info found".
  *
  ***********/
  /* eslint-disable consistent-return */ 
  pwdAjaxVerifyProcessor: function() {
  	
  	// check the security before anything else.
  	// If any violation is found, then just return.
  	if (!this._validateSecurity())
  		return;		
  			
  	// Intentionally delay the response to ensure "bots" cannot attempt this ajax calls too frequently:
  	var milli = GlideProperties.getInt('password_reset.verification.delay', 1000);
  	new SNC.PwdUtil().sleep(milli);
  	
  	var userId = gs.getSession().getProperty('sysparm_sys_user_id');
  	var requestId = gs.getSession().getProperty('sysparm_request_id');
  	var userInput = gs.getSession().getProperty('sysparm_user_input');
  
  	var processId = this.verifyBL.trackingMgr.getProcessIdByRequestId(requestId);
  	var verificationId = this.getParameter('sysparm_verification_id');
  			
  	// return error if the request does not exist
  	if (!this.verifyBL.requestExists(requestId))
  		return "block";
  	
  	// If a verification id is specified, then only check that one. Otherwise, check all verifications
  	// for the process. Only "checkAllVerifications" (for the process) can advance the verification stage. 
  	var isValid = gs.nil(verificationId)? this.verifyBL.checkAllVerifications(userId, processId, requestId, this.request) :
  										  this.verifyBL.checkVerification(userId, processId, verificationId, requestId, this.request);
  	
  	
  	
  	// return error if all verifications were not successful:
  	if (!isValid)
  		return this._handleRetry(requestId, userInput, processId, verificationId, userId);
  	else {
  		   if (this.request.getParameter('sysparm_isFinalVerification')) {
  			var requestStatus = this.verifyBL.trackingMgr.getRequestStatus(requestId);
  			if (requestStatus != this.PENDING_WITH_EXTERNAL_SYSTEM_STATUS) {
  				var isRequestInvalid = this.verifyBL.trackingMgr.isRequestInvalid(requestId);
  				var status;
  				if (isRequestInvalid) {
  					status = this.NOT_VERIFIED;
  				} else {
  				    if (new SNC.PwdProcess(processId).getEmailPasswordResetUrl())
  				        status = this.IN_PROGRESS;
  				    else
  				        status = this.VERIFIED;
  				}
  				this.verifyBL.trackingMgr.updateRequestStatus(requestId, status);
  			}
  			gs.getSession().putProperty('sysparm_is_verified', true);
  	     }
  	}
  	
  	return "ok";
  },

  /* eslint-enable consistent-return */ 
  	
  _handleRetry: function(requestId, userInput, processId, verificationId, userId) {		
  	var retry = this.verifyBL.trackingMgr.updateRequestRetry(requestId);			
  	var retryResponse = this.newItem("retry");
  	retryResponse.setAttribute("count", retry);
  	
  	if (retry < 0) {
  		this.verifyBL.logWarning("Maximum retries reached, blocking user", requestId);
  		return "block";
  	}
  	if (gs.nil(verificationId)) {
  		return "block";
  	}
  	else {
  		/* Check to see if there is a retry macro that we want to compute. Right now, only QA verification type has this
  		 * 2 cases to check:
  		 *    1. Verification ID is known - check just that verification
  		 *    2. Verification ID is unknown - check all the verifications for the process. 
  		 */
  		var verificationsToCheck = gs.nil(verificationId) ? new SNC.PwdProcessManager().getVerificationIdsByProcessId(processId) : 
  															[verificationId];
  		var qaVerGr = new GlideRecord('pwd_verification');
  		qaVerGr.addQuery('type', this.QA_VERIFICATION_TYPE_ID);
  		qaVerGr.addQuery('sys_id', 'IN', verificationsToCheck);
  		qaVerGr.query();
  		
  		if (qaVerGr.next()) {
  			var verificationType =  new SNC.PwdVerificationType(this.QA_VERIFICATION_TYPE_ID);						
  			var macroName = verificationType.getVerificationUI();
  			var jellyRunner = new GlideJellyRunner();
  	
  			jellyRunner.setVariable('sysparm_verification_id', qaVerGr.getUniqueValue());
  			jellyRunner.setVariable('sysparm_sys_user_id', userId);
  			jellyRunner.setVariable('sysparm_request_id', requestId);
  			retryResponse.setAttribute("retry_macro", jellyRunner.runMacro(macroName));				
  		}
  		
  		this.verifyBL.logWarning("Attempt " + retry + " failed, allowing retry", requestId);
  		
  		// Return the user info that user typed in on the identify page			
  		return GlideStringUtil.escapeHTML(userInput);
  	}
  },
  
  type: 'PwdAjaxVerifyProcessor'
});

Sys ID

e283cb01bf200100710071a7bf07390d

Offical Documentation

Official Docs: