package edu.harvard.iq.dataverse.passwordreset;
// based on http://howtodoinjava.com/2012/12/14/how-to-build-regex-based-password-validator-in-java/
/**
* @todo perhaps replace with
* https://code.google.com/p/vt-middleware/wiki/vtpassword
*/
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PasswordValidator {
private static PasswordValidator INSTANCE = new PasswordValidator();
private static String pattern = null;
/**
* No one can make a direct instance
*/
private PasswordValidator() {
//do nothing
}
/**
* Force the user to build a validator using this way only
*
* @param forceSpecialChar
* @param forceCapitalLetter
* @param forceNumber
* @param minLength
* @param maxLength
* @return
*/
public static PasswordValidator buildValidator(boolean forceSpecialChar,
boolean forceCapitalLetter,
boolean forceNumber,
int minLength,
int maxLength) {
// [a-z] is why one letter is required
StringBuilder patternBuilder = new StringBuilder("((?=.*[a-z])");
/**
* @todo should probably allow additional special characters
*/
if (forceSpecialChar) {
patternBuilder.append("(?=.*[@#$%])");
}
if (forceCapitalLetter) {
patternBuilder.append("(?=.*[A-Z])");
}
if (forceNumber) {
patternBuilder.append("(?=.*\\d)");
}
patternBuilder.append(".{" + minLength + "," + maxLength + "})");
pattern = patternBuilder.toString();
return INSTANCE;
}
/**
* Here we will validate the password
*
* @param password
*/
public boolean validatePassword(final String password) {
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(password);
return m.matches();
}
}