Uma classe Authenticator tem um método perform que recebe uma instância de Password e se o Authenticator julga que a senha contido no objeto está correto ele executa um trecho de código privilegiado (que no caso desse exemplo é um System.out.println()
)
Criei duas versões desta classe, cada um está com problemas diferentes.
A classe Password é um "wrapper" simples para uma senha:
public class Password {
private char[] passwordChars;
public Password(String password) {
this.passwordChars = password.toCharArray();
}
public int length() {
return this.passwordChars.length;
}
public char getPasswordChar(int index) {
return this.passwordChars[index];
}
}
Este é o primeiro Authenticator, acho que é o mais fácil:
public final class Authenticator1 {
private Password adminPassword = new Password("aa!NN9sdhauwe32i");
public void perform(Password password) {
if (password == null) return;
boolean passwordCorrect = true;
try {
if (adminPassword.length() != password.length()) {
passwordCorrect = false; // pw length does not match
}
if (passwordCorrect) {
for (int i=0; i < adminPassword.length(); i++) {
if (adminPassword.getPasswordChar(i) != password.getPasswordChar(i)) {
passwordCorrect = false;
break;
}
}
}
} catch(Exception ex) {
ex.printStackTrace();
}
if (passwordCorrect) {
performPriviledged();
}
}
private void performPriviledged() {
System.out.println("Performing priviledged actions 1.");
}
}
E o segundo que talvez seja um pouco mais difícil:
public final class Authenticator2 {
private Password adminPassword = new Password("aa!NN9sdhauwe32i");
public void perform(Password password) {
if (password == null) return;
boolean passwordCorrect = true;
if (adminPassword.length() != password.length()) {
passwordCorrect = false; // pw length does not match
}
if (passwordCorrect) {
for (int i=0; i < password.length(); i++) {
if (adminPassword.getPasswordChar(i) != password.getPasswordChar(i)) {
passwordCorrect = false;
break;
}
}
}
if (passwordCorrect) {
performPriviledged();
}
}
private void performPriviledged() {
System.out.println("Performing priviledged actions 2.");
}
}
Então. O objetivo: Adicione tal código (de preferência dentro do método main desta classe Test) que consegue rodar o método "performPriviledged()" de uma (ou de ambas) dessas duas classes (Authenticator1 e Authenticator2).
public class Test {
private static final Authenticator1 authenticator1 = new Authenticator1();
private static final Authenticator2 authenticator2 = new Authenticator2();
public static void main(String[] args) {
//authenticator1.perform(new Password("aa!NN9sdhauwe32i"));
//authenticator2.perform(new Password("aa!NN9sdhauwe32i"));
}
}
Coloquei comentado como seria o jeito de invocar os métodos caso a gente soubesse a senha correta. Mas vamos pretender que nós não sabemos a senha. Este é um exemplo meio tosco, mas a intenção é somente demonstrar que escrever código seguro é uma tarefa difícil e quase sempre que possível é melhor utilizar os mecanismos de segurança existentes nos containers e frameworks do que escrever seu próprio mecanismo.
Ou seja, extendendo a classe Password e lançando uma exceção do tipo unchecked no método length().
Mesmo se for uma crítica eu gostaria de entender qual foi o aspeto criticado.