Home > OS >  How can I get the password to return back to password request if an invalid password is entered in J
How can I get the password to return back to password request if an invalid password is entered in J

Time:04-06

I am trying to get the password to return and re-ask for the password if an invalid password is entered. And if a password is invalid 3 consecutive times, the system should terminate.

Is there an issue how I have structured the sequence of the lines of code? Please advise as I am rather new to Java.

public static void main(String []args){


    final int MAX=10;
    int invalidCount = 0;                        

    final int MIN_Uppercase=1;
    int uppercaseCounter=0;
    int digitCounter=0;
    int specialCounter=0;            

    System.out.println("Enter the password\n");

    Scanner input = new Scanner(System.in);        

    String password = input.nextLine();

    for (int i=0; i < password.length(); i   ) {
        char c = password.charAt(i);

        if(Character.isDigit(c)) 
            digitCounter  ;     
        if(Character.isUpperCase(c)) 
            uppercaseCounter  ;
        if(c == '!' || c == '@' || c == '#' || c == '$' || c == '%' || c == '^' || c == '&' || c == '*' || c == '(' || c == ')' || c == '-' || c == '_' || c == '=' || c == ' '){
            specialCounter  ;
        }                    
    }

    if (password.length() >= MAX && uppercaseCounter >= 1 && specialCounter == 1 && (digitCounter == 2 || digitCounter == 3)) { 
        System.out.println("Valid Password");
    }
    else {
        invalidCount  ;     

        if(password.length() < MAX)
            System.out.println("Enter atleast 10 characters");
        if (uppercaseCounter < MIN_Uppercase) 
            System.out.println("Enter at least 1 uppercase character");
        if(digitCounter != 2 && digitCounter != 3) 
            System.out.println("Enter either 2 or 3 digits only");
        if(specialCounter != 1)
            System.out.println("Password must contain 1 special character");  

        if (invalidCount == 3)
            System.out.println("Maximum tries reached"); 
        System.exit(invalidCount);          

    }      
    return;
}

CodePudding user response:

You need to put this entire logic in a while loop that keeps tracks of invalidCount.

The other solution is to put the entire logic in a while loop which is always true and it breaks out of the loop in case correct password is entered.

Also, by seeing the if condition in your code, I would like to point out only the first println statement is inside the if part and not the second println statement.

 if (invalidCount == 3)
                System.out.println("Maximum tries reached"); 
                System.exit(invalidCount);

but i think you wanted to put it something like this. such that when the count reaches 3, then it should terminate.

            if (invalidCount == 3) {
                System.out.println("Maximum tries reached");
                System.exit(invalidCount);
            }

CodePudding user response:

Place the Password prompt into a while loop with a counter, for example:

Scanner userInput = new Scanner(System.in);
int maxPasswordAttempts = 3;
int passwordCounter = 0;
String password = "";
while (password.isEmpty()) {
    passwordCounter  ;
    if (passwordCounter > maxPasswordAttempts) {
        System.out.println("Maximum allowable password attempts ("   maxPasswordAttempts 
                           ")has been\ncarried out! No longer accepting a passwords!");
        System.exit(0);
    }
    System.out.print("Please enter a password (c to cancel): --> ");
    password = userInput.nextLine().trim();
    if (password.equalsIgnoreCase("c")) {
        System.out.println("Password Entry - CANCELED!");
        return;
    }
        
    /* Regex from the website: 
       https://mkyong.com/regular-expressions/how-to-validate-password-with-regular-expression/
       Give it a read...                           */
    if (!password.matches("^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#&()–[{}]:;',?/%*~$^ =<>]).{8,20}$")) {
        System.out.println();
        System.out.println("INVALID PASSWORD! - Secure Password requirements:\n"  
                           "-------------------------------------------------\n"  
                           "Password must contain at least one digit [0-9].\n"  
                           "Password must contain at least one lowercase Latin character [a-z].\n"  
                           "Password must contain at least one uppercase Latin character [A-Z].\n"  
                           "Password must contain at least one special character like: ! @ # & ( ). %, etc.\n"  
                           "Password must contain a length of at least 8 characters and a maximum of 20 characters.\n"  
                           "Try Again...\n");
        password = "";
    }
}
System.out.println("\nYour VALID password is: "   password);
System.out.println("Now HASH it! :)");
  • Related