package com.intrbiz.bergamot.ui.security.password.check; import java.util.concurrent.CopyOnWriteArrayList; /** * A set of checks to apply to reduce poor password choices */ public class PasswordCheckEngine implements PasswordChecker { private static final PasswordCheckEngine DEFAULT_INSTANCE = createDefaultInstance(8, 7); /** * Create a password checking engine using the default checkers * @param minLength the minimum password length to enforce */ public static final PasswordCheckEngine createDefaultInstance(int minLength, int minUniqueCharacters) { PasswordCheckEngine engine = new PasswordCheckEngine(); // enforce minimum length engine.registerChecker(new MinLengthChecker(minLength)); // enforce mixed case engine.registerChecker(new MixedCaseChecker()); // ban common passwords engine.registerChecker(new BannedPasswordChecker(new WordReader(PasswordCheckEngine.class.getResourceAsStream("common_passwords.txt")))); // enforce minimum number of unique characters engine.registerChecker(new UniqueCharactersChecker(minUniqueCharacters)); return engine; } /** * Get the default, system wide password checking engine */ public static final PasswordCheckEngine getDefaultInstance() { return DEFAULT_INSTANCE; } private CopyOnWriteArrayList<PasswordChecker> checkers = new CopyOnWriteArrayList<PasswordChecker>(); public PasswordCheckEngine() { super(); } public void registerChecker(PasswordChecker checker) { this.checkers.add(checker); } @Override public void check(String password) throws BadPassword { for (PasswordChecker checker : this.checkers) { checker.check(password); } } public String toString() { return "Password Check Engine { checkers: " + this.checkers + " }"; } }