All Downloads are FREE. Search and download functionalities are using the official Maven repository.

prerna.auth.PasswordRequirements Maven / Gradle / Ivy

The newest version!
package prerna.auth;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import prerna.engine.api.IDatabaseEngine;
import prerna.engine.api.IRawSelectWrapper;
import prerna.query.querystruct.SelectQueryStruct;
import prerna.query.querystruct.selectors.QueryColumnSelector;
import prerna.rdf.engine.wrappers.WrapperManager;
import prerna.util.Constants;
import prerna.util.Utility;

public class PasswordRequirements {

	// minimum password length
	// at least one upper case
	// at least one lower case
	// at least one numeric
	// at least one special character
	// enable password expiration
	// 		# of days
	// password expiration requires admin reset
	// allow users to change their own password
	// prevent password reuse
	//		# of passwords to remember

	private static final Logger classLogger = LogManager.getLogger(PasswordRequirements.class);

	private static PasswordRequirements instance = null;

	private int minPassLength = 0;
	private boolean requireUpperCase = false;
	private boolean requireLowerCase = false;
	private boolean requireNumeric = false;
	private boolean requireSpecial = false;
	private int passwordExpirationDays = -1;
	private boolean requireAdminResetForExpiration = false;
	private boolean allowUserChangePassword = false;
	private int passReuseCount = -1;
	private int daysToLock = -1;
	private int daysToLockEmail = 14;
	
	public static PasswordRequirements getInstance() throws Exception {
		if(instance != null) {
			return instance;
		}

		if(instance == null) {
			synchronized(PasswordRequirements.class) {
				if(instance != null) {
					return instance;
				}
				
				instance = new PasswordRequirements();
				instance.loadRequirements();
			}
		}

		return instance;
	}

	public void loadRequirements() throws Exception {
		// pull the necessary details
		String[] colNames = new String[] { 
				"PASS_LENGTH", "REQUIRE_UPPER", "REQUIRE_LOWER", "REQUIRE_NUMERIC", "REQUIRE_SPECIAL", 
				"EXPIRATION_DAYS", "ADMIN_RESET_EXPIRATION", "ALLOW_USER_PASS_CHANGE", "PASS_REUSE_COUNT",
				"DAYS_TO_LOCK", "DAYS_TO_LOCK_WARNING"};
		
		IDatabaseEngine securityDb = Utility.getDatabase(Constants.SECURITY_DB);
		SelectQueryStruct qs = new SelectQueryStruct();
		for(String c : colNames) {
			qs.addSelector(new QueryColumnSelector("PASSWORD_RULES__" + c));
		}
		
		IRawSelectWrapper iterator = null;
		try {
			iterator = WrapperManager.getInstance().getRawWrapper(securityDb, qs);
			if(iterator.hasNext()) {
				Object[] data = iterator.next().getValues();
				int index = 0;
				this.minPassLength = ((Number) data[index++]).intValue();
				this.requireUpperCase = (Boolean) data[index++];
				this.requireLowerCase = (Boolean) data[index++];
				this.requireNumeric = (Boolean) data[index++];
				this.requireSpecial = (Boolean) data[index++];
				this.passwordExpirationDays = ((Number) data[index++]).intValue();
				this.requireAdminResetForExpiration = (Boolean) data[index++];
				this.allowUserChangePassword = (Boolean) data[index++];
				this.passReuseCount = ((Number) data[index++]).intValue();
				Number daysToLockNum = (Number) data[index++];
				if(daysToLockNum != null) {
					this.daysToLock = daysToLockNum.intValue();
				}
				Number daysToLockEmailNum = (Number) data[index++];
				if(daysToLockEmailNum != null) {
					this.daysToLockEmail = daysToLockEmailNum.intValue();
				}
			}
		} catch (Exception e) {
			classLogger.error(Constants.STACKTRACE, e);
			throw e;
		} finally {
			if(iterator != null) {
				try {
					iterator.close();
				} catch(IOException e) {
					classLogger.error(Constants.STACKTRACE, e);
				}
			}
		}
	}
	
	public Map getAllPasswordRequirements() {
		Map retMap = new HashMap<>();
		retMap.put("minPassLength", this.minPassLength);
		retMap.put("requireUpperCase", this.requireUpperCase);
		retMap.put("requireLowerCase", this.requireLowerCase);
		retMap.put("requireNumeric", this.requireNumeric);
		retMap.put("requireSpecial", this.requireSpecial);
		retMap.put("passwordExpirationDays", this.passwordExpirationDays);
		retMap.put("requireAdminResetForExpiration", this.requireAdminResetForExpiration);
		retMap.put("allowUserChangePassword", this.allowUserChangePassword );
		retMap.put("passReuseCount", this.passReuseCount);
		retMap.put("daysToLock", this.daysToLock);
		retMap.put("daysToLockEmail", this.daysToLockEmail);
		return retMap;
	}

	public boolean validatePassword(String password) {
		boolean isValid = true;
		StringBuilder errorMessage = new StringBuilder();
		if(password.length() < this.minPassLength) {
			errorMessage.append("Password must be at least ").append(this.minPassLength).append(" characters in length.\n");
			isValid = false;
		}
		if(this.requireUpperCase) {
			String upperCaseChars = "(.*[A-Z].*)";
			if(!password.matches(upperCaseChars )) {
				errorMessage.append("Password must have atleast one uppercase character.\n");
				isValid = false;
			}
		}
		if(this.requireLowerCase) {
			String lowerCaseChars = "(.*[a-z].*)";
			if(!password.matches(lowerCaseChars )) {
				errorMessage.append("Password must have atleast one lowercase character.\n");
				isValid = false;
			}
		}
		if(this.requireNumeric) {
			String numbers = "(.*[0-9].*)";
			if(!password.matches(numbers )) {
				System.out.println("Password must have atleast one number");
				isValid = false;
			}
		}
		if(this.requireSpecial) {
			String specialChars = "(.*[!,@,#,$,%,^,&,*].*$)";
			if(!password.matches(specialChars )) {
				errorMessage.append("Password must have atleast one special character among [!,@,#,$,%,^,&,*]");
				isValid = false;
			}
		}
		
		if(!isValid) {
			throw new IllegalArgumentException(errorMessage.toString());
		}
		
		return isValid; 
	}

	public int getMinPassLength() {
		return minPassLength;
	}

	public void setMinPassLength(int minPassLength) {
		this.minPassLength = minPassLength;
	}

	public boolean isRequireUpperCase() {
		return requireUpperCase;
	}

	public void setRequireUpperCase(boolean requireUpperCase) {
		this.requireUpperCase = requireUpperCase;
	}

	public boolean isRequireLowerCase() {
		return requireLowerCase;
	}

	public void setRequireLowerCase(boolean requireLowerCase) {
		this.requireLowerCase = requireLowerCase;
	}

	public boolean isRequireNumeric() {
		return requireNumeric;
	}

	public void setRequireNumeric(boolean requireNumeric) {
		this.requireNumeric = requireNumeric;
	}

	public boolean isRequireSpecial() {
		return requireSpecial;
	}

	public void setRequireSpecial(boolean requireSpecial) {
		this.requireSpecial = requireSpecial;
	}

	public int getPasswordExpirationDays() {
		return passwordExpirationDays;
	}

	public void setPasswordExpirationDays(int passwordExpirationDays) {
		this.passwordExpirationDays = passwordExpirationDays;
	}

	public boolean isRequireAdminResetForExpiration() {
		return requireAdminResetForExpiration;
	}

	public void setRequireAdminResetForExpiration(boolean requireAdminResetForExpiration) {
		this.requireAdminResetForExpiration = requireAdminResetForExpiration;
	}

	public boolean isAllowUserChangePassword() {
		return allowUserChangePassword;
	}

	public void setAllowUserChangePassword(boolean allowUserChangePassword) {
		this.allowUserChangePassword = allowUserChangePassword;
	}

	public int getPassReuseCount() {
		return passReuseCount;
	}

	public void setPassReuseCount(int passReuseCount) {
		this.passReuseCount = passReuseCount;
	}

	public int getDaysToLock() {
		return daysToLock;
	}

	public void setDaysToLock(int daysToLock) {
		this.daysToLock = daysToLock;
	}

	public int getDaysToLockEmail() {
		return daysToLockEmail;
	}

	public void setDaysToLockEmail(int daysToLockEmail) {
		this.daysToLockEmail = daysToLockEmail;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy