327 lines
10 KiB
JavaScript
327 lines
10 KiB
JavaScript
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;
|
||
}
|
||
}
|
||
} |