2024-06-05 14:45:33 +02:00
|
|
|
|
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 = "";
|
2023-07-05 17:24:52 +02:00
|
|
|
|
|
|
|
|
|
|
constructor(pwLabelId) {
|
2024-06-05 14:45:33 +02:00
|
|
|
|
this._passwordLabelId = pwLabelId;
|
2023-07-05 17:24:52 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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];
|
|
|
|
|
|
|
2024-06-05 14:45:33 +02:00
|
|
|
|
if (sx.length < this._partialPassword.length) {
|
|
|
|
|
|
this._isPartial = true;
|
|
|
|
|
|
this._passwordLengthDifference = this._partialPassword.length - sx.length;
|
2023-07-05 17:24:52 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-06-05 14:45:33 +02:00
|
|
|
|
if (this._partialPassword !== sx) {
|
|
|
|
|
|
this._partialPassword = sx;
|
2023-07-05 17:24:52 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-10-25 21:52:23 +02:00
|
|
|
|
passwordStrength = this.calculatePasswordStrength(sx);
|
2023-07-05 17:24:52 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-10-25 21:52:23 +02:00
|
|
|
|
this.displayPasswordStrength(passwordStrength);
|
2023-07-05 17:24:52 +02:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-06-05 14:45:33 +02:00
|
|
|
|
this._score = 0;
|
|
|
|
|
|
this._previousValue = 0;
|
2023-07-05 17:24:52 +02:00
|
|
|
|
|
2023-10-25 21:52:23 +02:00
|
|
|
|
this.displayPasswordStrength(-1);
|
2023-07-05 17:24:52 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-10-25 21:52:23 +02:00
|
|
|
|
getIntegerFromArray(arr, index) {
|
2023-07-05 17:24:52 +02:00
|
|
|
|
if (arr === undefined || arr === null || arr.length < index) {
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var intValue = $.parseInt(arr[index], 10);
|
|
|
|
|
|
|
|
|
|
|
|
return $.isNumeric(intValue) ? intValue : 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-10-25 21:52:23 +02:00
|
|
|
|
getLastValue() {
|
2024-06-05 14:45:33 +02:00
|
|
|
|
if (this._previousValues === undefined || this._previousValues === null || this._previousValues.length === 0) {
|
2023-07-05 17:24:52 +02:00
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-06-05 14:45:33 +02:00
|
|
|
|
return this._previousValues[this._previousValues.length - 1];
|
2023-07-05 17:24:52 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-10-25 21:52:23 +02:00
|
|
|
|
calculatePasswordStrength(passwordToValidate) {
|
2023-07-05 17:24:52 +02:00
|
|
|
|
var passwordStrength = 0;
|
2024-06-05 14:45:33 +02:00
|
|
|
|
this._previousValue = 0;
|
2023-07-05 17:24:52 +02:00
|
|
|
|
|
2024-06-05 14:45:33 +02:00
|
|
|
|
if (this._isPartial === true) {
|
|
|
|
|
|
if (this._passwordLengthDifference === 1) {
|
|
|
|
|
|
this._score -= this.getLastValue();
|
|
|
|
|
|
this._previousValues.pop();
|
2023-07-05 17:24:52 +02:00
|
|
|
|
} else {
|
2024-06-05 14:45:33 +02:00
|
|
|
|
for (var i = 0; i < this._passwordLengthDifference; i++) {
|
|
|
|
|
|
this._score -= this.getLastValue();
|
|
|
|
|
|
this._previousValues.pop();
|
2023-07-05 17:24:52 +02:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-06-05 14:45:33 +02:00
|
|
|
|
this._isPartial = false;
|
2023-07-05 17:24:52 +02:00
|
|
|
|
} else {
|
|
|
|
|
|
var passwordLength = passwordToValidate.length;
|
|
|
|
|
|
|
|
|
|
|
|
if (passwordLength >= 6 && passwordLength < 9) {
|
2024-06-05 14:45:33 +02:00
|
|
|
|
this._score += 1;
|
|
|
|
|
|
this._previousValue = 1;
|
|
|
|
|
|
this._schalter = true;
|
2023-07-05 17:24:52 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (passwordLength >= 9 && passwordLength < 12) {
|
2024-06-05 14:45:33 +02:00
|
|
|
|
this._score += 2;
|
|
|
|
|
|
this._previousValue = 2;
|
|
|
|
|
|
this._schalter = true;
|
2023-07-05 17:24:52 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (passwordLength >= 12 && passwordLength < 18) {
|
2024-06-05 14:45:33 +02:00
|
|
|
|
this._score += 3;
|
|
|
|
|
|
this._previousValue = 3;
|
|
|
|
|
|
this._schalter = true;
|
2023-07-05 17:24:52 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (passwordLength >= 18) {
|
2024-06-05 14:45:33 +02:00
|
|
|
|
this._score += 4;
|
|
|
|
|
|
this._previousValue = 4;
|
|
|
|
|
|
this._schalter = true;
|
2023-07-05 17:24:52 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var passwordAsArray = Array.from(passwordToValidate);
|
|
|
|
|
|
|
|
|
|
|
|
// Zahlen
|
|
|
|
|
|
var containsNumbers = false;
|
|
|
|
|
|
for (var i = 0; i < passwordAsArray.length; i++) {
|
2024-06-05 14:45:33 +02:00
|
|
|
|
if (this._numbers.includes(passwordAsArray[i])) {
|
2023-07-05 17:24:52 +02:00
|
|
|
|
containsNumbers = true;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Kleinbuchstaben
|
|
|
|
|
|
var containsLowercaseLetters = false;
|
|
|
|
|
|
for (var i = 0; i < passwordAsArray.length; i++) {
|
2024-06-05 14:45:33 +02:00
|
|
|
|
if (this._lowercaseLetters.includes(passwordAsArray[i])) {
|
2023-07-05 17:24:52 +02:00
|
|
|
|
containsLowercaseLetters = true;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Großbuchstaben
|
|
|
|
|
|
var containsUppercaseLetters = false;
|
|
|
|
|
|
for (var i = 0; i < passwordAsArray.length; i++) {
|
2024-06-05 14:45:33 +02:00
|
|
|
|
if (this._uppercaseLetters.includes(passwordAsArray[i])) {
|
2023-07-05 17:24:52 +02:00
|
|
|
|
containsUppercaseLetters = true;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Kleinumlaute
|
|
|
|
|
|
var containsLowercaseUmlauts = false;
|
|
|
|
|
|
for (var i = 0; i < passwordAsArray.length; i++) {
|
2024-06-05 14:45:33 +02:00
|
|
|
|
if (this._lowercaseUmlauts.includes(passwordAsArray[i])) {
|
2023-07-05 17:24:52 +02:00
|
|
|
|
containsLowercaseUmlauts = true;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Großumlaute
|
|
|
|
|
|
var containsUppercaseUmlauts = false;
|
|
|
|
|
|
for (var i = 0; i < passwordAsArray.length; i++) {
|
2024-06-05 14:45:33 +02:00
|
|
|
|
if (this._uppercaseUmlauts.includes(passwordAsArray[i])) {
|
2023-07-05 17:24:52 +02:00
|
|
|
|
containsUppercaseUmlauts = true;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Sonderzeichen 1
|
|
|
|
|
|
var containsSpecialCharacters1 = false;
|
|
|
|
|
|
for (var i = 0; i < passwordAsArray.length; i++) {
|
2024-06-05 14:45:33 +02:00
|
|
|
|
if (this._specialChars1.includes(passwordAsArray[i])) {
|
2023-07-05 17:24:52 +02:00
|
|
|
|
containsSpecialCharacters1 = true;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var containsSpecialCharacters2 = false;
|
|
|
|
|
|
for (var i = 0; i < passwordAsArray.length; i++) {
|
2024-06-05 14:45:33 +02:00
|
|
|
|
if (this._specialChars2.includes(passwordAsArray[i])) {
|
2023-07-05 17:24:52 +02:00
|
|
|
|
containsSpecialCharacters2 = true;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var containsSpecialCharacters3 = false;
|
|
|
|
|
|
for (var i = 0; i < passwordAsArray.length; i++) {
|
2024-06-05 14:45:33 +02:00
|
|
|
|
if (this._specialChars3.includes(passwordAsArray[i])) {
|
2023-07-05 17:24:52 +02:00
|
|
|
|
containsSpecialCharacters3 = true;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var containsSpecialCharacters4 = false;
|
|
|
|
|
|
for (var i = 0; i < passwordAsArray.length; i++) {
|
2024-06-05 14:45:33 +02:00
|
|
|
|
if (this._specialChars4.includes(passwordAsArray[i])) {
|
2023-07-05 17:24:52 +02:00
|
|
|
|
containsSpecialCharacters4 = true;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var containsSpecialCharacters5 = false;
|
|
|
|
|
|
for (var i = 0; i < passwordAsArray.length; i++) {
|
2024-06-05 14:45:33 +02:00
|
|
|
|
if (this._specialChars5.includes(passwordAsArray[i])) {
|
2023-07-05 17:24:52 +02:00
|
|
|
|
containsSpecialCharacters5 = true;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (containsNumbers === true) {
|
2023-10-25 21:52:23 +02:00
|
|
|
|
this.addScoreValue(3);
|
2023-07-05 17:24:52 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (containsLowercaseLetters === true) {
|
2023-10-25 21:52:23 +02:00
|
|
|
|
this.addScoreValue(2);
|
2023-07-05 17:24:52 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (containsUppercaseLetters === true) {
|
2023-10-25 21:52:23 +02:00
|
|
|
|
this.addScoreValue(3);
|
2023-07-05 17:24:52 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (containsLowercaseUmlauts === true) {
|
2023-10-25 21:52:23 +02:00
|
|
|
|
this.addScoreValue(2);
|
2023-07-05 17:24:52 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (containsUppercaseUmlauts === true) {
|
2023-10-25 21:52:23 +02:00
|
|
|
|
this.addScoreValue(2);
|
2023-07-05 17:24:52 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (containsSpecialCharacters1 === true) {
|
2023-10-25 21:52:23 +02:00
|
|
|
|
this.addScoreValue(4);
|
2023-07-05 17:24:52 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (containsSpecialCharacters2 === true) {
|
2023-10-25 21:52:23 +02:00
|
|
|
|
this.addScoreValue(4);
|
2023-07-05 17:24:52 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (containsSpecialCharacters3 === true) {
|
2023-10-25 21:52:23 +02:00
|
|
|
|
this.addScoreValue(4);
|
2023-07-05 17:24:52 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (containsSpecialCharacters4 === true) {
|
2023-10-25 21:52:23 +02:00
|
|
|
|
this.addScoreValue(4);
|
2023-07-05 17:24:52 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (containsSpecialCharacters5 === true) {
|
2023-10-25 21:52:23 +02:00
|
|
|
|
this.addScoreValue(4);
|
2023-07-05 17:24:52 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-06-05 14:45:33 +02:00
|
|
|
|
this._previousValues.push(this._previousValue);
|
2023-07-05 17:24:52 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-06-05 14:45:33 +02:00
|
|
|
|
if (this._score <= 15) {
|
2023-07-05 17:24:52 +02:00
|
|
|
|
passwordStrength = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-06-05 14:45:33 +02:00
|
|
|
|
if (this._score > 15 && this._score <= 55) {
|
2023-07-05 17:24:52 +02:00
|
|
|
|
passwordStrength = 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-06-05 14:45:33 +02:00
|
|
|
|
if (this._score > 55 && this._score <= 115) {
|
2023-07-05 17:24:52 +02:00
|
|
|
|
passwordStrength = 2;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-06-05 14:45:33 +02:00
|
|
|
|
if (this._score > 115 && this._score <= 155) {
|
2023-07-05 17:24:52 +02:00
|
|
|
|
passwordStrength = 3;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-06-05 14:45:33 +02:00
|
|
|
|
if (this._score > 155) {
|
2023-07-05 17:24:52 +02:00
|
|
|
|
passwordStrength = 4;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return passwordStrength;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-10-25 21:52:23 +02:00
|
|
|
|
addScoreValue(defaultValue) {
|
2023-07-05 17:24:52 +02:00
|
|
|
|
if (defaultValue === undefined || defaultValue === null || false === $.isNumeric(defaultValue)) {
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-06-05 14:45:33 +02:00
|
|
|
|
this._score += defaultValue;
|
2023-07-05 17:24:52 +02:00
|
|
|
|
|
2024-06-05 14:45:33 +02:00
|
|
|
|
if (this._schalter === true) {
|
|
|
|
|
|
this._previousValue += defaultValue;
|
2023-07-05 17:24:52 +02:00
|
|
|
|
} else {
|
2024-06-05 14:45:33 +02:00
|
|
|
|
this._previousValue = defaultValue;
|
2023-07-05 17:24:52 +02:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-10-25 21:52:23 +02:00
|
|
|
|
displayPasswordStrength(passwordStrength) {
|
2024-06-05 14:45:33 +02:00
|
|
|
|
var passwordLabel = $("#" + this._passwordLabelId);
|
2023-07-05 17:24:52 +02:00
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|