Das Mehrfachbuchungsformular hat ebenfalls die Schnittmenge der Leistungen und Kategorien von den ausgewählten Hilfeplänen. Das Caching ist wieder aktiviert. Und lädt pro Post-Aufruf nur noch einmal 13 MB und danach nur noch 300 kb herunter. Überall konsequent geprüft, ob das Model nicht null ist und falls dem so ist, wird ausgeloggt, damit es zu keinen Fehlern mehr kommt.
327 lines
10 KiB
JavaScript
327 lines
10 KiB
JavaScript
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;
|
||
}
|
||
}
|
||
} |