/*
* Copyright (c) 2014 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.security.password.rules;
import com.emc.storageos.security.password.Password;
import com.emc.storageos.svcs.errorhandling.resources.BadRequestException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public abstract class CharacterRuleFactory {
private static final Logger _log = LoggerFactory.getLogger(CharacterRuleFactory.class);
public enum CharacterRuleType {
LOWERCASE,
UPPERCASE,
NUMERIC,
SPECIAL,
}
public static CharacterRule getCharacterRule(CharacterRuleType type, int num) {
CharacterRule rule = null;
switch (type) {
case LOWERCASE:
rule = new LowercaseCharacterRule(num);
break;
case UPPERCASE:
rule = new UppercaseCharacterRule(num);
break;
case NUMERIC:
rule = new NumericCharacterRule(num);
break;
case SPECIAL:
rule = new SpecialCharacterRule(num);
break;
}
return rule;
}
/**
* Rule for determining if a password contains the correct number of lowercase
* characters.
*/
private static class LowercaseCharacterRule extends AbstractCharacterRule {
private static final String CHARACTER_TYPE = "lowercase";
public LowercaseCharacterRule(final int num) {
setNumberOfCharacters(num);
}
@Override
public int getNumber(Password password) {
return password.getNumberOfLowercase();
}
@Override
public String getType() {
return CHARACTER_TYPE;
}
@Override
public BadRequestException getException() {
return BadRequestException.badRequests.passwordInvalidLowercaseNumber(getNumberOfCharacters());
}
}
/**
* Rule for determining if a password contains the correct number of numeric characters.
*/
public static class NumericCharacterRule extends AbstractCharacterRule {
private static final String TYPE = "numeric";
public NumericCharacterRule(final int num) {
setNumberOfCharacters(num);
}
@Override
public int getNumber(Password password) {
return password.getNumberOfDigits();
}
@Override
public String getType() {
return TYPE;
}
@Override
public BadRequestException getException() {
return BadRequestException.badRequests.passwordInvalidNumericNumber(getNumberOfCharacters());
}
}
/**
* Rule for determining if a password contains correct number of special characters.
*/
public static class SpecialCharacterRule extends AbstractCharacterRule {
private static final String CHARACTER_TYPE = "special";
public SpecialCharacterRule(final int num) {
setNumberOfCharacters(num);
}
@Override
public int getNumber(Password password) {
return password.getNumberOfSpeicial();
}
@Override
public String getType() {
return CHARACTER_TYPE;
}
@Override
public BadRequestException getException() {
return BadRequestException.badRequests.passwordInvalidSpecialNumber(getNumberOfCharacters());
}
}
/**
* Rule for determining if a password contains the correct number of lowercase
* characters.
*/
public static class UppercaseCharacterRule extends AbstractCharacterRule {
private static final String CHARACTER_TYPE = "uppercase";
public UppercaseCharacterRule(final int num) {
setNumberOfCharacters(num);
}
@Override
public int getNumber(Password password) {
return password.getNumberOfUppercase();
}
@Override
public String getType() {
return CHARACTER_TYPE;
}
@Override
public BadRequestException getException() {
return BadRequestException.badRequests.passwordInvalidUppercaseNumber(getNumberOfCharacters());
}
}
}