@tiba-spark/client-shared-lib 25.1.0-648 → 25.1.0-649
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/libraries/services/password-strength.service.mjs +55 -35
- package/fesm2022/tiba-spark-client-shared-lib.mjs +54 -34
- package/fesm2022/tiba-spark-client-shared-lib.mjs.map +1 -1
- package/libraries/services/password-strength.service.d.ts +6 -0
- package/libraries/services/password-strength.service.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -7,41 +7,61 @@ const commonPasswords = [
|
|
|
7
7
|
];
|
|
8
8
|
export class PasswordStrengthService {
|
|
9
9
|
evaluatePasswordStrength(password) {
|
|
10
|
+
let score = !password ? 0 : this.calculatePasswordScore(password);
|
|
11
|
+
return this.getPasswordScoreResult(score);
|
|
12
|
+
}
|
|
13
|
+
calculatePasswordScore(password) {
|
|
10
14
|
let score = 0;
|
|
11
|
-
if (
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
if (this.isCommonPassword(password)) {
|
|
16
|
+
score = 2; // Assign a weak score if the password is commonly used
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
score += this.getLengthScore(password);
|
|
20
|
+
score += this.getCharacterVarietyScore(password);
|
|
21
|
+
score += this.getPenaltyForWeakPatterns(password);
|
|
22
|
+
}
|
|
23
|
+
return score;
|
|
24
|
+
}
|
|
25
|
+
getLengthScore(password) {
|
|
26
|
+
let lengthScore = 0;
|
|
17
27
|
if (password.length >= 8)
|
|
18
|
-
|
|
28
|
+
lengthScore += 1;
|
|
19
29
|
if (password.length >= 12)
|
|
20
|
-
|
|
30
|
+
lengthScore += 1;
|
|
21
31
|
if (password.length >= 15)
|
|
22
|
-
|
|
32
|
+
lengthScore += 1;
|
|
23
33
|
if (password.length >= 18)
|
|
24
|
-
|
|
25
|
-
|
|
34
|
+
lengthScore += 1;
|
|
35
|
+
return lengthScore;
|
|
36
|
+
}
|
|
37
|
+
getCharacterVarietyScore(password) {
|
|
38
|
+
let varietyScore = 0;
|
|
26
39
|
if (/[A-Z]/.test(password))
|
|
27
|
-
|
|
40
|
+
varietyScore += 1;
|
|
28
41
|
if (/[a-z]/.test(password))
|
|
29
|
-
|
|
42
|
+
varietyScore += 1;
|
|
30
43
|
if (/\d/.test(password))
|
|
31
|
-
|
|
44
|
+
varietyScore += 1;
|
|
32
45
|
if (/[^A-Za-z0-9]/.test(password))
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
46
|
+
varietyScore += 1;
|
|
47
|
+
return varietyScore;
|
|
48
|
+
}
|
|
49
|
+
getPenaltyForWeakPatterns(password) {
|
|
50
|
+
return (this.hasSequentialChars(password) || this.hasRepeatedChars(password)) ? -1 : 0;
|
|
51
|
+
}
|
|
52
|
+
getPasswordScoreResult(score) {
|
|
53
|
+
let passwordScore;
|
|
54
|
+
if (score <= 0)
|
|
55
|
+
passwordScore = null;
|
|
56
|
+
else if (score <= 1)
|
|
57
|
+
passwordScore = PasswordScore.Insecure;
|
|
58
|
+
else if (score <= 3)
|
|
59
|
+
passwordScore = PasswordScore.Weak;
|
|
60
|
+
else if (score <= 5)
|
|
61
|
+
passwordScore = PasswordScore.Medium;
|
|
62
|
+
else
|
|
63
|
+
passwordScore = PasswordScore.Strong;
|
|
64
|
+
return passwordScore;
|
|
45
65
|
}
|
|
46
66
|
hasSequentialChars(password) {
|
|
47
67
|
const sequences = [
|
|
@@ -51,14 +71,14 @@ export class PasswordStrengthService {
|
|
|
51
71
|
'qwertyuiopasdfghjklzxcvbnm',
|
|
52
72
|
'QWERTYUIOPASDFGHJKLZXCVBNM'
|
|
53
73
|
];
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
74
|
+
return sequences.some(seq => this.containsSequence(password.toLowerCase(), seq.toLowerCase()));
|
|
75
|
+
}
|
|
76
|
+
containsSequence(password, sequence) {
|
|
77
|
+
for (let i = 0; i < sequence.length - 3; i++) {
|
|
78
|
+
const forwardSeq = sequence.substring(i, i + 4);
|
|
79
|
+
const backwardSeq = forwardSeq.split('').reverse().join('');
|
|
80
|
+
if (password.includes(forwardSeq) || password.includes(backwardSeq)) {
|
|
81
|
+
return true;
|
|
62
82
|
}
|
|
63
83
|
}
|
|
64
84
|
return false;
|
|
@@ -78,4 +98,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
78
98
|
providedIn: 'root',
|
|
79
99
|
}]
|
|
80
100
|
}] });
|
|
81
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
101
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzc3dvcmQtc3RyZW5ndGguc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC1zaGFyZWQtbGliL3NyYy9saWJyYXJpZXMvc2VydmljZXMvcGFzc3dvcmQtc3RyZW5ndGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7QUFFN0QsTUFBTSxlQUFlLEdBQUc7SUFDdEIsVUFBVSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLFFBQVE7SUFDckQsV0FBVyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFVBQVU7Q0FDdkQsQ0FBQztBQUtGLE1BQU0sT0FBTyx1QkFBdUI7SUFFbEMsd0JBQXdCLENBQUMsUUFBZ0I7UUFDdkMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xFLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxRQUFnQjtRQUM3QyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFFZCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNuQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsdURBQXVEO1NBQ25FO2FBQU07WUFDTCxLQUFLLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN2QyxLQUFLLElBQUksSUFBSSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pELEtBQUssSUFBSSxJQUFJLENB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QUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM1RCxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRTtnQkFDbkUsT0FBTyxJQUFJLENBQUM7YUFDYjtTQUNGO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU8sZ0JBQWdCLENBQUMsUUFBZ0I7UUFDdkMsT0FBTyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxRQUFnQjtRQUN2QyxPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLEtBQUssUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDL0YsQ0FBQzsrR0FwRlUsdUJBQXVCO21IQUF2Qix1QkFBdUIsY0FGdEIsTUFBTTs7NEZBRVAsdUJBQXVCO2tCQUhuQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFBhc3N3b3JkU2NvcmUgfSBmcm9tICcuLi9lbnVtcy9wYXNzd29yZC1zY29yZS5lbnVtJztcblxuY29uc3QgY29tbW9uUGFzc3dvcmRzID0gW1xuICBcInBhc3N3b3JkXCIsIFwiMTIzNDU2XCIsIFwiMTIzNDU2Nzg5XCIsIFwicXdlcnR5XCIsIFwiYWJjMTIzXCIsXG4gIFwicGFzc3dvcmQxXCIsIFwiYWRtaW5cIiwgXCJsZXRtZWluXCIsIFwid2VsY29tZVwiLCBcImlsb3ZleW91XCJcbl07XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBQYXNzd29yZFN0cmVuZ3RoU2VydmljZSB7XG5cbiAgZXZhbHVhdGVQYXNzd29yZFN0cmVuZ3RoKHBhc3N3b3JkOiBzdHJpbmcpOiBQYXNzd29yZFNjb3JlIHtcbiAgICBsZXQgc2NvcmUgPSAhcGFzc3dvcmQgPyAwIDogdGhpcy5jYWxjdWxhdGVQYXNzd29yZFNjb3JlKHBhc3N3b3JkKTtcbiAgICByZXR1cm4gdGhpcy5nZXRQYXNzd29yZFNjb3JlUmVzdWx0KHNjb3JlKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlUGFzc3dvcmRTY29yZShwYXNzd29yZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBsZXQgc2NvcmUgPSAwO1xuXG4gICAgaWYgKHRoaXMuaXNDb21tb25QYXNzd29yZChwYXNzd29yZCkpIHtcbiAgICAgIHNjb3JlID0gMjsgLy8gQXNzaWduIGEgd2VhayBzY29yZSBpZiB0aGUgcGFzc3dvcmQgaXMgY29tbW9ubHkgdXNlZFxuICAgIH0gZWxzZSB7XG4gICAgICBzY29yZSArPSB0aGlzLmdldExlbmd0aFNjb3JlKHBhc3N3b3JkKTtcbiAgICAgIHNjb3JlICs9IHRoaXMuZ2V0Q2hhcmFjdGVyVmFyaWV0eVNjb3JlKHBhc3N3b3JkKTtcbiAgICAgIHNjb3JlICs9IHRoaXMuZ2V0UGVuYWx0eUZvcldlYWtQYXR0ZXJucyhwYXNzd29yZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNjb3JlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMZW5ndGhTY29yZShwYXNzd29yZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBsZXQgbGVuZ3RoU2NvcmUgPSAwO1xuICAgIGlmIChwYXNzd29yZC5sZW5ndGggPj0gOCkgbGVuZ3RoU2NvcmUgKz0gMTtcbiAgICBpZiAocGFzc3dvcmQubGVuZ3RoID49IDEyKSBsZW5ndGhTY29yZSArPSAxO1xuICAgIGlmIChwYXNzd29yZC5sZW5ndGggPj0gMTUpIGxlbmd0aFNjb3JlICs9IDE7XG4gICAgaWYgKHBhc3N3b3JkLmxlbmd0aCA+PSAxOCkgbGVuZ3RoU2NvcmUgKz0gMTtcbiAgICByZXR1cm4gbGVuZ3RoU2NvcmU7XG4gIH1cblxuICBwcml2YXRlIGdldENoYXJhY3RlclZhcmlldHlTY29yZShwYXNzd29yZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBsZXQgdmFyaWV0eVNjb3JlID0gMDtcbiAgICBpZiAoL1tBLVpdLy50ZXN0KHBhc3N3b3JkKSkgdmFyaWV0eVNjb3JlICs9IDE7XG4gICAgaWYgKC9bYS16XS8udGVzdChwYXNzd29yZCkpIHZhcmlldHlTY29yZSArPSAxO1xuICAgIGlmICgvXFxkLy50ZXN0KHBhc3N3b3JkKSkgdmFyaWV0eVNjb3JlICs9IDE7XG4gICAgaWYgKC9bXkEtWmEtejAtOV0vLnRlc3QocGFzc3dvcmQpKSB2YXJpZXR5U2NvcmUgKz0gMTtcbiAgICByZXR1cm4gdmFyaWV0eVNjb3JlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQZW5hbHR5Rm9yV2Vha1BhdHRlcm5zKHBhc3N3b3JkOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiAodGhpcy5oYXNTZXF1ZW50aWFsQ2hhcnMocGFzc3dvcmQpIHx8IHRoaXMuaGFzUmVwZWF0ZWRDaGFycyhwYXNzd29yZCkpID8gLTEgOiAwO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQYXNzd29yZFNjb3JlUmVzdWx0KHNjb3JlOiBudW1iZXIpOiBQYXNzd29yZFNjb3JlIHtcbiAgICBsZXQgcGFzc3dvcmRTY29yZTogUGFzc3dvcmRTY29yZTtcbiAgICBpZiAoc2NvcmUgPD0gMCkgcGFzc3dvcmRTY29yZSA9IG51bGw7XG4gICAgZWxzZSBpZiAoc2NvcmUgPD0gMSkgcGFzc3dvcmRTY29yZSA9IFBhc3N3b3JkU2NvcmUuSW5zZWN1cmU7XG4gICAgZWxzZSBpZiAoc2NvcmUgPD0gMykgcGFzc3dvcmRTY29yZSA9IFBhc3N3b3JkU2NvcmUuV2VhaztcbiAgICBlbHNlIGlmIChzY29yZSA8PSA1KSBwYXNzd29yZFNjb3JlID0gUGFzc3dvcmRTY29yZS5NZWRpdW07XG4gICAgZWxzZSBwYXNzd29yZFNjb3JlID0gUGFzc3dvcmRTY29yZS5TdHJvbmc7XG4gICAgcmV0dXJuIHBhc3N3b3JkU2NvcmU7XG4gIH1cblxuICBwcml2YXRlIGhhc1NlcXVlbnRpYWxDaGFycyhwYXNzd29yZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2VxdWVuY2VzID0gW1xuICAgICAgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyxcbiAgICAgICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicsXG4gICAgICAnMDEyMzQ1Njc4OScsXG4gICAgICAncXdlcnR5dWlvcGFzZGZnaGprbHp4Y3Zibm0nLFxuICAgICAgJ1FXRVJUWVVJT1BBU0RGR0hKS0xaWENWQk5NJ1xuICAgIF07XG5cbiAgICByZXR1cm4gc2VxdWVuY2VzLnNvbWUoc2VxID0+XG4gICAgICB0aGlzLmNvbnRhaW5zU2VxdWVuY2UocGFzc3dvcmQudG9Mb3dlckNhc2UoKSwgc2VxLnRvTG93ZXJDYXNlKCkpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udGFpbnNTZXF1ZW5jZShwYXNzd29yZDogc3RyaW5nLCBzZXF1ZW5jZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXF1ZW5jZS5sZW5ndGggLSAzOyBpKyspIHtcbiAgICAgIGNvbnN0IGZvcndhcmRTZXEgPSBzZXF1ZW5jZS5zdWJzdHJpbmcoaSwgaSArIDQpO1xuICAgICAgY29uc3QgYmFja3dhcmRTZXEgPSBmb3J3YXJkU2VxLnNwbGl0KCcnKS5yZXZlcnNlKCkuam9pbignJyk7XG4gICAgICBpZiAocGFzc3dvcmQuaW5jbHVkZXMoZm9yd2FyZFNlcSkgfHwgcGFzc3dvcmQuaW5jbHVkZXMoYmFja3dhcmRTZXEpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGhhc1JlcGVhdGVkQ2hhcnMocGFzc3dvcmQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAvKC4pXFwxezIsfS8udGVzdChwYXNzd29yZCk7XG4gIH1cblxuICBwcml2YXRlIGlzQ29tbW9uUGFzc3dvcmQocGFzc3dvcmQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjb21tb25QYXNzd29yZHMuc29tZShjb21tb25Qd2QgPT4gY29tbW9uUHdkLnRvTG93ZXJDYXNlKCkgPT09IHBhc3N3b3JkLnRvTG93ZXJDYXNlKCkpO1xuICB9XG59XG4iXX0=
|
|
@@ -93366,41 +93366,61 @@ const commonPasswords = [
|
|
|
93366
93366
|
];
|
|
93367
93367
|
class PasswordStrengthService {
|
|
93368
93368
|
evaluatePasswordStrength(password) {
|
|
93369
|
+
let score = !password ? 0 : this.calculatePasswordScore(password);
|
|
93370
|
+
return this.getPasswordScoreResult(score);
|
|
93371
|
+
}
|
|
93372
|
+
calculatePasswordScore(password) {
|
|
93369
93373
|
let score = 0;
|
|
93370
|
-
if (
|
|
93371
|
-
|
|
93372
|
-
|
|
93373
|
-
|
|
93374
|
-
|
|
93375
|
-
|
|
93374
|
+
if (this.isCommonPassword(password)) {
|
|
93375
|
+
score = 2; // Assign a weak score if the password is commonly used
|
|
93376
|
+
}
|
|
93377
|
+
else {
|
|
93378
|
+
score += this.getLengthScore(password);
|
|
93379
|
+
score += this.getCharacterVarietyScore(password);
|
|
93380
|
+
score += this.getPenaltyForWeakPatterns(password);
|
|
93381
|
+
}
|
|
93382
|
+
return score;
|
|
93383
|
+
}
|
|
93384
|
+
getLengthScore(password) {
|
|
93385
|
+
let lengthScore = 0;
|
|
93376
93386
|
if (password.length >= 8)
|
|
93377
|
-
|
|
93387
|
+
lengthScore += 1;
|
|
93378
93388
|
if (password.length >= 12)
|
|
93379
|
-
|
|
93389
|
+
lengthScore += 1;
|
|
93380
93390
|
if (password.length >= 15)
|
|
93381
|
-
|
|
93391
|
+
lengthScore += 1;
|
|
93382
93392
|
if (password.length >= 18)
|
|
93383
|
-
|
|
93384
|
-
|
|
93393
|
+
lengthScore += 1;
|
|
93394
|
+
return lengthScore;
|
|
93395
|
+
}
|
|
93396
|
+
getCharacterVarietyScore(password) {
|
|
93397
|
+
let varietyScore = 0;
|
|
93385
93398
|
if (/[A-Z]/.test(password))
|
|
93386
|
-
|
|
93399
|
+
varietyScore += 1;
|
|
93387
93400
|
if (/[a-z]/.test(password))
|
|
93388
|
-
|
|
93401
|
+
varietyScore += 1;
|
|
93389
93402
|
if (/\d/.test(password))
|
|
93390
|
-
|
|
93403
|
+
varietyScore += 1;
|
|
93391
93404
|
if (/[^A-Za-z0-9]/.test(password))
|
|
93392
|
-
|
|
93393
|
-
|
|
93394
|
-
|
|
93395
|
-
|
|
93396
|
-
|
|
93397
|
-
|
|
93398
|
-
|
|
93399
|
-
|
|
93400
|
-
|
|
93401
|
-
|
|
93402
|
-
|
|
93403
|
-
|
|
93405
|
+
varietyScore += 1;
|
|
93406
|
+
return varietyScore;
|
|
93407
|
+
}
|
|
93408
|
+
getPenaltyForWeakPatterns(password) {
|
|
93409
|
+
return (this.hasSequentialChars(password) || this.hasRepeatedChars(password)) ? -1 : 0;
|
|
93410
|
+
}
|
|
93411
|
+
getPasswordScoreResult(score) {
|
|
93412
|
+
let passwordScore;
|
|
93413
|
+
if (score <= 0)
|
|
93414
|
+
passwordScore = null;
|
|
93415
|
+
else if (score <= 1)
|
|
93416
|
+
passwordScore = PasswordScore.Insecure;
|
|
93417
|
+
else if (score <= 3)
|
|
93418
|
+
passwordScore = PasswordScore.Weak;
|
|
93419
|
+
else if (score <= 5)
|
|
93420
|
+
passwordScore = PasswordScore.Medium;
|
|
93421
|
+
else
|
|
93422
|
+
passwordScore = PasswordScore.Strong;
|
|
93423
|
+
return passwordScore;
|
|
93404
93424
|
}
|
|
93405
93425
|
hasSequentialChars(password) {
|
|
93406
93426
|
const sequences = [
|
|
@@ -93410,14 +93430,14 @@ class PasswordStrengthService {
|
|
|
93410
93430
|
'qwertyuiopasdfghjklzxcvbnm',
|
|
93411
93431
|
'QWERTYUIOPASDFGHJKLZXCVBNM'
|
|
93412
93432
|
];
|
|
93413
|
-
|
|
93414
|
-
|
|
93415
|
-
|
|
93416
|
-
|
|
93417
|
-
|
|
93418
|
-
|
|
93419
|
-
|
|
93420
|
-
|
|
93433
|
+
return sequences.some(seq => this.containsSequence(password.toLowerCase(), seq.toLowerCase()));
|
|
93434
|
+
}
|
|
93435
|
+
containsSequence(password, sequence) {
|
|
93436
|
+
for (let i = 0; i < sequence.length - 3; i++) {
|
|
93437
|
+
const forwardSeq = sequence.substring(i, i + 4);
|
|
93438
|
+
const backwardSeq = forwardSeq.split('').reverse().join('');
|
|
93439
|
+
if (password.includes(forwardSeq) || password.includes(backwardSeq)) {
|
|
93440
|
+
return true;
|
|
93421
93441
|
}
|
|
93422
93442
|
}
|
|
93423
93443
|
return false;
|