Files
BeWoPlaner/BeWoPlanerMobil/Scripts/ownSoft-Scripts/utils/MoKPasswordSecurity.js

327 lines
10 KiB
JavaScript
Raw Normal View History

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) {
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];
if (sx.length < this._partialPassword.length) {
this._isPartial = true;
this._passwordLengthDifference = this._partialPassword.length - sx.length;
2023-07-05 17:24:52 +02:00
}
if (this._partialPassword !== sx) {
this._partialPassword = sx;
2023-07-05 17:24:52 +02:00
}
passwordStrength = this.calculatePasswordStrength(sx);
2023-07-05 17:24:52 +02:00
}
this.displayPasswordStrength(passwordStrength);
2023-07-05 17:24:52 +02:00
return;
}
this._score = 0;
this._previousValue = 0;
2023-07-05 17:24:52 +02:00
this.displayPasswordStrength(-1);
2023-07-05 17:24:52 +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;
}
getLastValue() {
if (this._previousValues === undefined || this._previousValues === null || this._previousValues.length === 0) {
2023-07-05 17:24:52 +02:00
return 0;
}
return this._previousValues[this._previousValues.length - 1];
2023-07-05 17:24:52 +02:00
}
calculatePasswordStrength(passwordToValidate) {
2023-07-05 17:24:52 +02:00
var passwordStrength = 0;
this._previousValue = 0;
2023-07-05 17:24:52 +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 {
for (var i = 0; i < this._passwordLengthDifference; i++) {
this._score -= this.getLastValue();
this._previousValues.pop();
2023-07-05 17:24:52 +02:00
}
}
this._isPartial = false;
2023-07-05 17:24:52 +02:00
} else {
var passwordLength = passwordToValidate.length;
if (passwordLength >= 6 && passwordLength < 9) {
this._score += 1;
this._previousValue = 1;
this._schalter = true;
2023-07-05 17:24:52 +02:00
}
if (passwordLength >= 9 && passwordLength < 12) {
this._score += 2;
this._previousValue = 2;
this._schalter = true;
2023-07-05 17:24:52 +02:00
}
if (passwordLength >= 12 && passwordLength < 18) {
this._score += 3;
this._previousValue = 3;
this._schalter = true;
2023-07-05 17:24:52 +02:00
}
if (passwordLength >= 18) {
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++) {
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++) {
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++) {
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++) {
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++) {
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++) {
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++) {
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++) {
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++) {
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++) {
if (this._specialChars5.includes(passwordAsArray[i])) {
2023-07-05 17:24:52 +02:00
containsSpecialCharacters5 = true;
break;
}
}
if (containsNumbers === true) {
this.addScoreValue(3);
2023-07-05 17:24:52 +02:00
}
if (containsLowercaseLetters === true) {
this.addScoreValue(2);
2023-07-05 17:24:52 +02:00
}
if (containsUppercaseLetters === true) {
this.addScoreValue(3);
2023-07-05 17:24:52 +02:00
}
if (containsLowercaseUmlauts === true) {
this.addScoreValue(2);
2023-07-05 17:24:52 +02:00
}
if (containsUppercaseUmlauts === true) {
this.addScoreValue(2);
2023-07-05 17:24:52 +02:00
}
if (containsSpecialCharacters1 === true) {
this.addScoreValue(4);
2023-07-05 17:24:52 +02:00
}
if (containsSpecialCharacters2 === true) {
this.addScoreValue(4);
2023-07-05 17:24:52 +02:00
}
if (containsSpecialCharacters3 === true) {
this.addScoreValue(4);
2023-07-05 17:24:52 +02:00
}
if (containsSpecialCharacters4 === true) {
this.addScoreValue(4);
2023-07-05 17:24:52 +02:00
}
if (containsSpecialCharacters5 === true) {
this.addScoreValue(4);
2023-07-05 17:24:52 +02:00
}
this._previousValues.push(this._previousValue);
2023-07-05 17:24:52 +02:00
}
if (this._score <= 15) {
2023-07-05 17:24:52 +02:00
passwordStrength = 0;
}
if (this._score > 15 && this._score <= 55) {
2023-07-05 17:24:52 +02:00
passwordStrength = 1;
}
if (this._score > 55 && this._score <= 115) {
2023-07-05 17:24:52 +02:00
passwordStrength = 2;
}
if (this._score > 115 && this._score <= 155) {
2023-07-05 17:24:52 +02:00
passwordStrength = 3;
}
if (this._score > 155) {
2023-07-05 17:24:52 +02:00
passwordStrength = 4;
}
return passwordStrength;
}
addScoreValue(defaultValue) {
2023-07-05 17:24:52 +02:00
if (defaultValue === undefined || defaultValue === null || false === $.isNumeric(defaultValue)) {
return;
}
this._score += defaultValue;
2023-07-05 17:24:52 +02:00
if (this._schalter === true) {
this._previousValue += defaultValue;
2023-07-05 17:24:52 +02:00
} else {
this._previousValue = defaultValue;
2023-07-05 17:24:52 +02:00
}
}
displayPasswordStrength(passwordStrength) {
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;
}
}
}