class PasswordSecurity { numbers = "0123456789"; lowercaseLetters = "abcdefghijklmnopqrstuvwxyz"; uppercaseLetters = "ABDEFGHIJKLMNOPQRSTUVWXYZ"; lowercaseUmlauts = "äöüß"; uppercaseUmlauts = "ÄÖÜ"; specialChars1 = "\\\"\'µ@€!"; specialChars2 = "&/()=?+*"; specialChars3 = ",.-;:_><|"; specialChars4 = "§$%'{[]}´"; specialChars5 = "`^°~²³"; isPartial = false; partialPassword = ""; passwordLengthDifference = 0; score = 0; previousValue = 0; schalter = false; previousValues = []; passwordLabelId = ""; constructor(pwLabelId) { this.passwordLabelId = pwLabelId; } validatePassword(password) { if (false === isUndefinedOrNull(password) && password.length > 0) { var sx = ""; var passwordStrength = -1; for (var i = 0; i < password.length; i++) { sx += password[i]; if (sx.length < this.partialPassword.length) { this.isPartial = true; this.passwordLengthDifference = this.partialPassword.length - sx.length; } if (this.partialPassword !== sx) { this.partialPassword = sx; } passwordStrength = this.calculatePasswordStrength(sx); } this.displayPasswordStrength(passwordStrength); return; } this.score = 0; this.previousValue = 0; this.displayPasswordStrength(-1); } getIntegerFromArray(arr, index) { if (arr === undefined || arr === null || arr.length < index) { return 0; } var intValue = $.parseInt(arr[index], 10); return $.isNumeric(intValue) ? intValue : 0; } getLastValue() { if (this.previousValues === undefined || this.previousValues === null || this.previousValues.length === 0) { return 0; } return this.previousValues[this.previousValues.length - 1]; } calculatePasswordStrength(passwordToValidate) { var passwordStrength = 0; this.previousValue = 0; if (this.isPartial === true) { if (this.passwordLengthDifference === 1) { this.score -= this.getLastValue(); this.previousValues.pop(); } else { for (var i = 0; i < this.passwordLengthDifference; i++) { this.score -= this.getLastValue(); this.previousValues.pop(); } } this.isPartial = false; } else { var passwordLength = passwordToValidate.length; if (passwordLength >= 6 && passwordLength < 9) { this.score += 1; this.previousValue = 1; this.schalter = true; } if (passwordLength >= 9 && passwordLength < 12) { this.score += 2; this.previousValue = 2; this.schalter = true; } if (passwordLength >= 12 && passwordLength < 18) { this.score += 3; this.previousValue = 3; this.schalter = true; } if (passwordLength >= 18) { this.score += 4; this.previousValue = 4; this.schalter = true; } var passwordAsArray = Array.from(passwordToValidate); // Zahlen var containsNumbers = false; for (var i = 0; i < passwordAsArray.length; i++) { if (this.numbers.includes(passwordAsArray[i])) { containsNumbers = true; break; } } // Kleinbuchstaben var containsLowercaseLetters = false; for (var i = 0; i < passwordAsArray.length; i++) { if (this.lowercaseLetters.includes(passwordAsArray[i])) { containsLowercaseLetters = true; break; } } // Großbuchstaben var containsUppercaseLetters = false; for (var i = 0; i < passwordAsArray.length; i++) { if (this.uppercaseLetters.includes(passwordAsArray[i])) { containsUppercaseLetters = true; break; } } // Kleinumlaute var containsLowercaseUmlauts = false; for (var i = 0; i < passwordAsArray.length; i++) { if (this.lowercaseUmlauts.includes(passwordAsArray[i])) { containsLowercaseUmlauts = true; break; } } // Großumlaute var containsUppercaseUmlauts = false; for (var i = 0; i < passwordAsArray.length; i++) { if (this.uppercaseUmlauts.includes(passwordAsArray[i])) { containsUppercaseUmlauts = true; break; } } // Sonderzeichen 1 var containsSpecialCharacters1 = false; for (var i = 0; i < passwordAsArray.length; i++) { if (this.specialChars1.includes(passwordAsArray[i])) { containsSpecialCharacters1 = true; break; } } var containsSpecialCharacters2 = false; for (var i = 0; i < passwordAsArray.length; i++) { if (this.specialChars2.includes(passwordAsArray[i])) { containsSpecialCharacters2 = true; break; } } var containsSpecialCharacters3 = false; for (var i = 0; i < passwordAsArray.length; i++) { if (this.specialChars3.includes(passwordAsArray[i])) { containsSpecialCharacters3 = true; break; } } var containsSpecialCharacters4 = false; for (var i = 0; i < passwordAsArray.length; i++) { if (this.specialChars4.includes(passwordAsArray[i])) { containsSpecialCharacters4 = true; break; } } var containsSpecialCharacters5 = false; for (var i = 0; i < passwordAsArray.length; i++) { if (this.specialChars5.includes(passwordAsArray[i])) { containsSpecialCharacters5 = true; break; } } if (containsNumbers === true) { this.addScoreValue(3); } if (containsLowercaseLetters === true) { this.addScoreValue(2); } if (containsUppercaseLetters === true) { this.addScoreValue(3); } if (containsLowercaseUmlauts === true) { this.addScoreValue(2); } if (containsUppercaseUmlauts === true) { this.addScoreValue(2); } if (containsSpecialCharacters1 === true) { this.addScoreValue(4); } if (containsSpecialCharacters2 === true) { this.addScoreValue(4); } if (containsSpecialCharacters3 === true) { this.addScoreValue(4); } if (containsSpecialCharacters4 === true) { this.addScoreValue(4); } if (containsSpecialCharacters5 === true) { this.addScoreValue(4); } this.previousValues.push(this.previousValue); } if (this.score <= 15) { passwordStrength = 0; } if (this.score > 15 && this.score <= 55) { passwordStrength = 1; } if (this.score > 55 && this.score <= 115) { passwordStrength = 2; } if (this.score > 115 && this.score <= 155) { passwordStrength = 3; } if (this.score > 155) { passwordStrength = 4; } return passwordStrength; } addScoreValue(defaultValue) { if (defaultValue === undefined || defaultValue === null || false === $.isNumeric(defaultValue)) { return; } this.score += defaultValue; if (this.schalter === true) { this.previousValue += defaultValue; } else { this.previousValue = defaultValue; } } displayPasswordStrength(passwordStrength) { var passwordLabel = $("#" + this.passwordLabelId); if (passwordStrength === undefined || !$.isNumeric(passwordStrength) || !passwordLabel.length) { return; } passwordLabel.removeClass("text-success text-danger text-warning"); switch (passwordStrength) { case -1: passwordLabel.addClass("d-none"); passwordLabel.html(""); break; case 0: passwordLabel.removeClass("d-none"); passwordLabel.html("Passwortstärke: Sehr schwach"); passwordLabel.addClass("text-danger"); break; case 1: passwordLabel.removeClass("d-none"); passwordLabel.html("Passwortstärke: Schwach"); passwordLabel.addClass("text-danger"); break; case 2: passwordLabel.removeClass("d-none"); passwordLabel.html("Passwortstärke: Mittel"); passwordLabel.addClass("text-warning"); break; case 3: passwordLabel.removeClass("d-none"); passwordLabel.html("Passwortstärke: Stark"); passwordLabel.addClass("text-success"); break; case 4: passwordLabel.removeClass("d-none"); passwordLabel.html("Passwortstärke: Sehr stark"); passwordLabel.addClass("text-success"); break; } } }