class MoKPasswordSecurity { _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; } } }