Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,9 @@ public PasswordController(PasswordService passwordService) {
}

@GetMapping("/api/password")
public PasswordResponse generatePassword(@RequestParam(defaultValue = "12") int length) {

String password = passwordService.generatePassword(length);
public PasswordResponse generatePassword(@RequestParam(defaultValue = "12") int length) {
String password = passwordService.generatePassword(length);
return new PasswordResponse(password, length);
}

return new PasswordResponse(password, length);
}
}
57 changes: 42 additions & 15 deletions src/main/java/github/murillosnds/spg/service/PasswordService.java
Original file line number Diff line number Diff line change
@@ -1,40 +1,67 @@
package github.murillosnds.spg.service;

import org.passay.CharacterRule;
import org.passay.CharacterData;
import org.passay.CharacterRule;
import org.passay.EnglishCharacterData;
import org.passay.PasswordGenerator;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.List;

@Service
public class PasswordService {

private static final int MIN_LENGTH = 12;
private static final int MAX_LENGTH = 256;
private static final int COUNT_PER_RULE = 2;
private static final String SPECIAL_CHARACTERS = "!@#$%^&*()_+";

private final PasswordGenerator passwordGenerator;

public PasswordService() {
this(new PasswordGenerator());
}

public PasswordService(PasswordGenerator passwordGenerator) {
this.passwordGenerator = passwordGenerator;
}

public String generatePassword(int length) {
validateLength(length);

List<CharacterRule> rules = buildRules();
return passwordGenerator.generatePassword(length, rules);
}

if (length < 12 || length > 256) {
private void validateLength(int length) {
if (length < MIN_LENGTH || length > MAX_LENGTH) {
throw new IllegalArgumentException(
"The size must be between 12 and 256"
"The size must be between " + MIN_LENGTH + " and " + MAX_LENGTH
);
}
}

PasswordGenerator gen = new PasswordGenerator();

CharacterRule lowercase = new CharacterRule(EnglishCharacterData.LowerCase, 2);
CharacterRule uppercase = new CharacterRule(EnglishCharacterData.UpperCase, 2);
CharacterRule digit = new CharacterRule(EnglishCharacterData.Digit, 2);
private List<CharacterRule> buildRules() {
CharacterRule lowercase = new CharacterRule(EnglishCharacterData.LowerCase, COUNT_PER_RULE);
CharacterRule uppercase = new CharacterRule(EnglishCharacterData.UpperCase, COUNT_PER_RULE);
CharacterRule digit = new CharacterRule(EnglishCharacterData.Digit, COUNT_PER_RULE);

CharacterData specialChars = new CharacterData() {
public String getErrorCode() { return "ERR_SPECIAL"; }
public String getCharacters() { return "!@#$%^&*()_+"; }
};
CharacterRule special = new CharacterRule(specialChars, 2);
@Override
public String getErrorCode() {
return "ERR_SPECIAL";
}

List<CharacterRule> rules = Arrays.asList(lowercase, uppercase, digit, special);
@Override
public String getCharacters() {
return SPECIAL_CHARACTERS;
}
};

return gen.generatePassword(length, rules);
CharacterRule special = new CharacterRule(specialChars, COUNT_PER_RULE);


return Arrays.asList(lowercase, uppercase, digit, special);
}
}