Dan Tromp
Dan Tromp

Reputation: 199

Check password strength against an API value

I get my password spec from an API which then I split the object into the needed fields and check that I have the required number of lower, upper, special and length of my password.

    function isStrong(passwordChecker) {

    if (!passwordChecker) {
        return false;
    }

    debugger;
    var securityOption = JSON.parse(localStorage.getItem("Security"));

    var MinLength = securityOption.PasswordMinRequiredLength;
    var SpecialChars = securityOption.PasswordMinRequiredNonalphanumericCharacters;
    var MinLowercase = securityOption.PasswordMinRequiredLowercase;
    var MinUppercase = securityOption.PasswordMinRequiredUppercase;

    //LenghtCheck
    if (passwordChecker.length < MinLength);
        return false;

    if (!CountSpecialChars(passwordChecker) > SpecialChars) {
        return false;
    }

    if (MinLowercase > 0) {
        if (!CountLowerCase(passwordChecker) > MinLowercase) {
            return false;
        }
    }

    if (MinUppercase > 0) {
        if (!CountUpperCase(passwordChecker) > MinLowercase) {
            return false;
        }
    }    
}

function CountSpecialChars(text) {
    var Count = 0;
    for (var i = 0; i < text.length; i++) {
        var c = text[i];

        if (text[i] >= 33 && text[i] <= 63){
            Count++;
        }        
    }
}

function MinLowercase(text) {
    var Count = 0;
    for (var i = 0; i < text.length; i++) {
        var c = text[i];
        if (text[i] >= 97 && text[i] <= 122) {
            Count++;
        }
    }
}

function MinUppercase(text) {
    var Count = 0;
    for (var i = 0; i < text.length; i++) {
        var c = text[i];
        if (text[i] >= 65 && text[i] <= 90) {
            Count++;
        }
    }
}

Now what I want to do is, check the different conditions as a whole and if all of the conditions are true then change the class to green..

        $(pageId + ' #password').bind('keyup', function () {
        var currentpassword = $(pageId + ' #password').val();
        if (isStrong(currentpassword)) {
            $(pageId + ' #password').addClass('green');

        } else {
            $(pageId + ' #password').addClass('red');
        }

    });

I am not sure how to check the conditions as a whole and return an overall true because as I start trying in my password it instantly changes to green as in my password spec you do not need any UpperCase or LowerCase letters so on any input of a char it returns true..

Upvotes: 2

Views: 330

Answers (1)

Anthony
Anthony

Reputation: 37065

You should refactor your functions so that they accept both the string and the parameter and return true or false. For example:

function CountSpecialChars(text) {
    var Count = 0;
    for (var i = 0; i < text.length; i++) {
        var c = text[i];

        if (text[i] >= 33 && text[i] <= 63){
            Count++;
        }        
    }
}

if (!CountSpecialChars(passwordChecker) > SpecialChars) {
        return false;
    }

Should instead be:

function CountSpecialChars(text, min) {
    var count = 0;
    for (var i = 0; i < text.length; i++) {
        var c = text[i];

        if (text[i] >= 33 && text[i] <= 63){
            count++;
        }
    }

    return count > min;

}


return CountSpecialChars(passwordChecker, SpecialChars);

Also, as a bonus, you could also avoid that for loop for those functions by using replace, like so:

function MinChars(text, min) {

    return text.length > min;

}

function MinUppercase(text, min) {

    var non_uppers = /[^A-Z]/g;

    var uppers =  text.replace(non_uppers, text);

    return uppers.length > min;

}

function MinLowercase(text, min) {

    var non_lowers = /[^a-z]/g;

    var lowers =  text.replace(non_lowers, text);

    return lowers.length > min;

}

function MinSpecialChars(text, min) {

    var non_specials = /[^!-\?]/g;

    var specials =  text.replace(non_specials, text);

    return specials.length > min;

}

Now with those functions, you can have:

if !MinChars(pw, MinLength) return false;
if !MinSpecialChars(pw, SpecialChars) return false;
if !MinLowercase(pw, MinLowercase) return false;
if !MinUppercase(pw, MinUppercase) return false;
return true;

Upvotes: 2

Related Questions