@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.
@@ -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 (!password)
12
- return null;
13
- // Common Passwords
14
- if (this.isCommonPassword(password))
15
- return PasswordScore.Weak;
16
- // Length
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
- score += 1;
28
+ lengthScore += 1;
19
29
  if (password.length >= 12)
20
- score += 1;
30
+ lengthScore += 1;
21
31
  if (password.length >= 15)
22
- score += 1;
32
+ lengthScore += 1;
23
33
  if (password.length >= 18)
24
- score += 1;
25
- // Character Variety
34
+ lengthScore += 1;
35
+ return lengthScore;
36
+ }
37
+ getCharacterVarietyScore(password) {
38
+ let varietyScore = 0;
26
39
  if (/[A-Z]/.test(password))
27
- score += 1;
40
+ varietyScore += 1;
28
41
  if (/[a-z]/.test(password))
29
- score += 1;
42
+ varietyScore += 1;
30
43
  if (/\d/.test(password))
31
- score += 1;
44
+ varietyScore += 1;
32
45
  if (/[^A-Za-z0-9]/.test(password))
33
- score += 1;
34
- // Sequential or Repeated Characters
35
- if (this.hasSequentialChars(password) || this.hasRepeatedChars(password))
36
- score -= 1;
37
- // Final Score Evaluation
38
- if (score <= 1)
39
- return PasswordScore.Insecure;
40
- if (score <= 3)
41
- return PasswordScore.Weak;
42
- if (score <= 5)
43
- return PasswordScore.Medium;
44
- return PasswordScore.Strong;
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
- for (const seq of sequences) {
55
- for (let i = 0; i < seq.length - 3; i++) {
56
- const forwardSeq = seq.substring(i, i + 4);
57
- const backwardSeq = forwardSeq.split('').reverse().join('');
58
- if (password.toLowerCase().includes(forwardSeq.toLowerCase()) ||
59
- password.toLowerCase().includes(backwardSeq.toLowerCase())) {
60
- return true;
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzc3dvcmQtc3RyZW5ndGguc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC1zaGFyZWQtbGliL3NyYy9saWJyYXJpZXMvc2VydmljZXMvcGFzc3dvcmQtc3RyZW5ndGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7QUFFN0QsTUFBTSxlQUFlLEdBQUc7SUFDdEIsVUFBVSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLFFBQVE7SUFDckQsV0FBVyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFVBQVU7Q0FDdkQsQ0FBQztBQUtGLE1BQU0sT0FBTyx1QkFBdUI7SUFFbEMsd0JBQXdCLENBQUMsUUFBZ0I7UUFDdkMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPLElBQUksQ0FBQztRQUUzQixtQkFBbUI7UUFDbkIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO1lBQUUsT0FBTyxhQUFhLENBQUMsSUFBSSxDQUFDO1FBRS9ELFNBQVM7UUFDVCxJQUFJLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQztZQUFFLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDckMsSUFBSSxRQUFRLENBQUMsTUFBTSxJQUFJLEVBQUU7WUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQ3RDLElBQUksUUFBUSxDQUFDLE1BQU0sSUFBSSxFQUFFO1lBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQztRQUN0QyxJQUFJLFFBQVEsQ0FBQyxNQUFNLElBQUksRUFBRTtZQUFFLEtBQUssSUFBSSxDQUFDLENBQUM7UUFFdEMsb0JBQW9CO1FBQ3BCLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7WUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQ3ZDLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7WUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQ3ZDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7WUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQ3BDLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7WUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDO1FBRTlDLG9DQUFvQztRQUNwQyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO1lBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQztRQUVyRix5QkFBeUI7UUFDekIsSUFBSSxLQUFLLElBQUksQ0FBQztZQUFFLE9BQU8sYUFBYSxDQUFDLFFBQVEsQ0FBQztRQUM5QyxJQUFJLEtBQUssSUFBSSxDQUFDO1lBQUUsT0FBTyxhQUFhLENBQUMsSUFBSSxDQUFDO1FBQzFDLElBQUksS0FBSyxJQUFJLENBQUM7WUFBRSxPQUFPLGFBQWEsQ0FBQyxNQUFNLENBQUM7UUFDNUMsT0FBTyxhQUFhLENBQUMsTUFBTSxDQUFDO0lBQzlCLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxRQUFnQjtRQUN6QyxNQUFNLFNBQVMsR0FBRztZQUNoQiw0QkFBNEI7WUFDNUIsNEJBQTRCO1lBQzVCLFlBQVk7WUFDWiw0QkFBNEI7WUFDNUIsNEJBQTRCO1NBQzdCLENBQUM7UUFFRixLQUFLLE1BQU0sR0FBRyxJQUFJLFNBQVMsRUFBRTtZQUMzQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3ZDLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDM0MsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBRTVELElBQUksUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQzNELFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUU7b0JBQzVELE9BQU8sSUFBSSxDQUFDO2lCQUNiO2FBQ0Y7U0FDRjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVPLGdCQUFnQixDQUFDLFFBQWdCO1FBQ3ZDLE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsUUFBZ0I7UUFDdkMsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxLQUFLLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQy9GLENBQUM7K0dBNURVLHVCQUF1QjttSEFBdkIsdUJBQXVCLGNBRnRCLE1BQU07OzRGQUVQLHVCQUF1QjtrQkFIbkMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQYXNzd29yZFNjb3JlIH0gZnJvbSAnLi4vZW51bXMvcGFzc3dvcmQtc2NvcmUuZW51bSc7XG5cbmNvbnN0IGNvbW1vblBhc3N3b3JkcyA9IFtcbiAgXCJwYXNzd29yZFwiLCBcIjEyMzQ1NlwiLCBcIjEyMzQ1Njc4OVwiLCBcInF3ZXJ0eVwiLCBcImFiYzEyM1wiLFxuICBcInBhc3N3b3JkMVwiLCBcImFkbWluXCIsIFwibGV0bWVpblwiLCBcIndlbGNvbWVcIiwgXCJpbG92ZXlvdVwiXG5dO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgUGFzc3dvcmRTdHJlbmd0aFNlcnZpY2Uge1xuXG4gIGV2YWx1YXRlUGFzc3dvcmRTdHJlbmd0aChwYXNzd29yZDogc3RyaW5nKTogUGFzc3dvcmRTY29yZSB7XG4gICAgbGV0IHNjb3JlID0gMDtcbiAgICBpZiAoIXBhc3N3b3JkKSByZXR1cm4gbnVsbDtcblxuICAgIC8vIENvbW1vbiBQYXNzd29yZHNcbiAgICBpZiAodGhpcy5pc0NvbW1vblBhc3N3b3JkKHBhc3N3b3JkKSkgcmV0dXJuIFBhc3N3b3JkU2NvcmUuV2VhaztcblxuICAgIC8vIExlbmd0aFxuICAgIGlmIChwYXNzd29yZC5sZW5ndGggPj0gOCkgc2NvcmUgKz0gMTtcbiAgICBpZiAocGFzc3dvcmQubGVuZ3RoID49IDEyKSBzY29yZSArPSAxO1xuICAgIGlmIChwYXNzd29yZC5sZW5ndGggPj0gMTUpIHNjb3JlICs9IDE7XG4gICAgaWYgKHBhc3N3b3JkLmxlbmd0aCA+PSAxOCkgc2NvcmUgKz0gMTtcblxuICAgIC8vIENoYXJhY3RlciBWYXJpZXR5XG4gICAgaWYgKC9bQS1aXS8udGVzdChwYXNzd29yZCkpIHNjb3JlICs9IDE7XG4gICAgaWYgKC9bYS16XS8udGVzdChwYXNzd29yZCkpIHNjb3JlICs9IDE7XG4gICAgaWYgKC9cXGQvLnRlc3QocGFzc3dvcmQpKSBzY29yZSArPSAxO1xuICAgIGlmICgvW15BLVphLXowLTldLy50ZXN0KHBhc3N3b3JkKSkgc2NvcmUgKz0gMTtcblxuICAgIC8vIFNlcXVlbnRpYWwgb3IgUmVwZWF0ZWQgQ2hhcmFjdGVyc1xuICAgIGlmICh0aGlzLmhhc1NlcXVlbnRpYWxDaGFycyhwYXNzd29yZCkgfHwgdGhpcy5oYXNSZXBlYXRlZENoYXJzKHBhc3N3b3JkKSkgc2NvcmUgLT0gMTtcblxuICAgIC8vIEZpbmFsIFNjb3JlIEV2YWx1YXRpb25cbiAgICBpZiAoc2NvcmUgPD0gMSkgcmV0dXJuIFBhc3N3b3JkU2NvcmUuSW5zZWN1cmU7XG4gICAgaWYgKHNjb3JlIDw9IDMpIHJldHVybiBQYXNzd29yZFNjb3JlLldlYWs7XG4gICAgaWYgKHNjb3JlIDw9IDUpIHJldHVybiBQYXNzd29yZFNjb3JlLk1lZGl1bTtcbiAgICByZXR1cm4gUGFzc3dvcmRTY29yZS5TdHJvbmc7XG4gIH1cblxuICBwcml2YXRlIGhhc1NlcXVlbnRpYWxDaGFycyhwYXNzd29yZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2VxdWVuY2VzID0gW1xuICAgICAgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyxcbiAgICAgICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicsXG4gICAgICAnMDEyMzQ1Njc4OScsXG4gICAgICAncXdlcnR5dWlvcGFzZGZnaGprbHp4Y3Zibm0nLFxuICAgICAgJ1FXRVJUWVVJT1BBU0RGR0hKS0xaWENWQk5NJ1xuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IHNlcSBvZiBzZXF1ZW5jZXMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VxLmxlbmd0aCAtIDM7IGkrKykge1xuICAgICAgICBjb25zdCBmb3J3YXJkU2VxID0gc2VxLnN1YnN0cmluZyhpLCBpICsgNCk7XG4gICAgICAgIGNvbnN0IGJhY2t3YXJkU2VxID0gZm9yd2FyZFNlcS5zcGxpdCgnJykucmV2ZXJzZSgpLmpvaW4oJycpO1xuXG4gICAgICAgIGlmIChwYXNzd29yZC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZvcndhcmRTZXEudG9Mb3dlckNhc2UoKSkgfHxcbiAgICAgICAgICBwYXNzd29yZC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGJhY2t3YXJkU2VxLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNSZXBlYXRlZENoYXJzKHBhc3N3b3JkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gLyguKVxcMXsyLH0vLnRlc3QocGFzc3dvcmQpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0NvbW1vblBhc3N3b3JkKHBhc3N3b3JkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gY29tbW9uUGFzc3dvcmRzLnNvbWUoY29tbW9uUHdkID0+IGNvbW1vblB3ZC50b0xvd2VyQ2FzZSgpID09PSBwYXNzd29yZC50b0xvd2VyQ2FzZSgpKTtcbiAgfVxufVxuIl19
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 (!password)
93371
- return null;
93372
- // Common Passwords
93373
- if (this.isCommonPassword(password))
93374
- return PasswordScore.Weak;
93375
- // Length
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
- score += 1;
93387
+ lengthScore += 1;
93378
93388
  if (password.length >= 12)
93379
- score += 1;
93389
+ lengthScore += 1;
93380
93390
  if (password.length >= 15)
93381
- score += 1;
93391
+ lengthScore += 1;
93382
93392
  if (password.length >= 18)
93383
- score += 1;
93384
- // Character Variety
93393
+ lengthScore += 1;
93394
+ return lengthScore;
93395
+ }
93396
+ getCharacterVarietyScore(password) {
93397
+ let varietyScore = 0;
93385
93398
  if (/[A-Z]/.test(password))
93386
- score += 1;
93399
+ varietyScore += 1;
93387
93400
  if (/[a-z]/.test(password))
93388
- score += 1;
93401
+ varietyScore += 1;
93389
93402
  if (/\d/.test(password))
93390
- score += 1;
93403
+ varietyScore += 1;
93391
93404
  if (/[^A-Za-z0-9]/.test(password))
93392
- score += 1;
93393
- // Sequential or Repeated Characters
93394
- if (this.hasSequentialChars(password) || this.hasRepeatedChars(password))
93395
- score -= 1;
93396
- // Final Score Evaluation
93397
- if (score <= 1)
93398
- return PasswordScore.Insecure;
93399
- if (score <= 3)
93400
- return PasswordScore.Weak;
93401
- if (score <= 5)
93402
- return PasswordScore.Medium;
93403
- return PasswordScore.Strong;
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
- for (const seq of sequences) {
93414
- for (let i = 0; i < seq.length - 3; i++) {
93415
- const forwardSeq = seq.substring(i, i + 4);
93416
- const backwardSeq = forwardSeq.split('').reverse().join('');
93417
- if (password.toLowerCase().includes(forwardSeq.toLowerCase()) ||
93418
- password.toLowerCase().includes(backwardSeq.toLowerCase())) {
93419
- return true;
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;