PermutationConfiguration.java
/*
* Copyright (C) 2019 sw4j.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.sw4j.tool.p12breaker.permutation;
/**
*
* @author Uwe Plonus
*/
public class PermutationConfiguration {
private static final String DIGITS = "0123456789";
private static final String UPPER_CASE_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private static final String LOWER_CASE_CHARACTERS = "abcdefghijklmnopqrstuvwxyz";
private static final String SPECIAL_CHARACTERS = "<>-_.:,;#'+*~?\\()[]/{}&%$\"!";
private final int minimumLength;
private final int maximumLength;
private final boolean useDigits;
private final boolean useUpperCaseCharacters;
private final boolean useLowerCaseCharacters;
private final boolean useSpecialCharacters;
private final boolean useBlank;
private final String permutationString;
private PermutationConfiguration(final int minimumLength, final int maximumLength, final boolean useDigits,
final boolean useUpperCaseCharacters, final boolean useLowerCaseCharacters,
final boolean useSpecialCharacters, final boolean useBlank) {
this.minimumLength = minimumLength;
this.maximumLength = maximumLength;
this.useDigits = useDigits;
this.useUpperCaseCharacters = useUpperCaseCharacters;
this.useLowerCaseCharacters = useLowerCaseCharacters;
this.useSpecialCharacters = useSpecialCharacters;
this.useBlank = useBlank;
this.permutationString = null;
}
private PermutationConfiguration(final int minimumLength, final int maximumLength, final String permutationString) {
this.minimumLength = minimumLength;
this.maximumLength = maximumLength;
this.useDigits = false;
this.useUpperCaseCharacters = false;
this.useLowerCaseCharacters = false;
this.useSpecialCharacters = false;
this.useBlank = false;
this.permutationString = permutationString;
}
public static Builder builder() {
return new Builder();
}
public int getMinimumLength() {
return minimumLength;
}
public int getMaximumLength() {
return maximumLength;
}
public String getPermutationString() {
StringBuilder permutations = new StringBuilder();
if (this.permutationString == null) {
if (useDigits) {
permutations.append(DIGITS);
}
if (useUpperCaseCharacters) {
permutations.append(UPPER_CASE_CHARACTERS);
}
if (useLowerCaseCharacters) {
permutations.append(LOWER_CASE_CHARACTERS);
}
if (useSpecialCharacters) {
permutations.append(SPECIAL_CHARACTERS);
}
if (useBlank) {
permutations.append(" ");
}
} else {
permutations.append(this.permutationString);
}
return permutations.toString();
}
public static class Builder {
private int minimumLength;
private int maximumLength;
private boolean useDigits;
private boolean useUpperCaseCharacters;
private boolean useLowerCaseCharacters;
private boolean useSpecialCharacters;
private boolean useBlank;
private String permutationString;
private Builder() {
minimumLength = 4;
maximumLength = 12;
useDigits = true;
useUpperCaseCharacters = true;
useLowerCaseCharacters = true;
}
public Builder minimumLength(final int minimumLength) {
if (minimumLength < 1) {
throw new IllegalArgumentException("Length may not be negative.");
}
this.minimumLength = minimumLength;
return this;
}
public Builder maximumLength(final int maximumLength) {
if (maximumLength < 1) {
throw new IllegalArgumentException("Length may not be negative.");
}
this.maximumLength = maximumLength;
return this;
}
public Builder useDigits(final boolean useDigits) {
this.useDigits = useDigits;
return this;
}
public Builder useUpperCaseCharacters(final boolean useUpperCaseCharacters) {
this.useUpperCaseCharacters = useUpperCaseCharacters;
return this;
}
public Builder useLowerCaseCharacters(final boolean useLowerCaseCharacters) {
this.useLowerCaseCharacters = useLowerCaseCharacters;
return this;
}
public Builder useSpecialCharacters(final boolean useSpecialCharacters) {
this.useSpecialCharacters = useSpecialCharacters;
return this;
}
public Builder useBlank(final boolean useBlank) {
this.useBlank = useBlank;
return this;
}
public Builder permutationString(String permutationString) {
this.permutationString = permutationString;
return this;
}
public PermutationConfiguration build() {
if (!useDigits && !useUpperCaseCharacters && !useLowerCaseCharacters && !useSpecialCharacters &&
!useBlank && (permutationString == null || "".equals(permutationString))) {
throw new IllegalArgumentException("The configured permutation string is empty");
}
if (minimumLength > maximumLength) {
throw new IllegalArgumentException("The minimum length may not be larger than the maximum length");
}
if (permutationString == null) {
return new PermutationConfiguration(minimumLength, maximumLength, useDigits, useUpperCaseCharacters,
useLowerCaseCharacters, useSpecialCharacters, useBlank);
} else {
return new PermutationConfiguration(minimumLength, maximumLength, permutationString);
}
}
}
}