-
Notifications
You must be signed in to change notification settings - Fork 0
/
script.js
99 lines (82 loc) · 2.48 KB
/
script.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
const strengthMeter = document.getElementById("strength-meter");
const passwordInput = document.getElementById("password-input");
const reasonsContainer = document.getElementById("reasons");
passwordInput.addEventListener("input", updateStrengthMeter);
function updateStrengthMeter() {
const weaknesses = calculatePasswordStrength(passwordInput.value);
let strength = 100;
reasonsContainer.innerHTML = "";
weaknesses.forEach((weakness) => {
if (weakness == null) return;
strength -= weakness.deduction;
const messageElement = document.createElement("div");
messageElement.innerText = weakness.message;
reasonsContainer.appendChild(messageElement);
});
strengthMeter.style.setProperty("--strength", strength);
}
function calculatePasswordStrength(password) {
const weaknesses = [];
weaknesses.push(lengthWeakness(password));
weaknesses.push(lowercaseWeakness(password));
weaknesses.push(uppercaseWeakness(password));
weaknesses.push(numberWeakness(password));
weaknesses.push(specialCharactersWeakness(password));
weaknesses.push(repeatCharactersWeakness(password));
return weaknesses;
}
function lengthWeakness(password) {
const length = password.length;
if (length <= 5) {
return {
message: "Your password is too short.",
deduction: 40,
};
}
if (length <= 10) {
return {
message: "Your password could be longer.",
deduction: 15,
};
}
}
function uppercaseWeakness(password) {
return characterTypeWeakness(password, /[A-Z]/g, "uppercase characters");
}
function lowercaseWeakness(password) {
return characterTypeWeakness(password, /[a-z]/g, "lowercase characters");
}
function numberWeakness(password) {
return characterTypeWeakness(password, /[0-9]/g, "numbers");
}
function specialCharactersWeakness(password) {
return characterTypeWeakness(
password,
/[^0-9a-zA-Z\s]/g,
"special characters"
);
}
function characterTypeWeakness(password, regex, type) {
const matches = password.match(regex) || [];
if (matches.length === 0) {
return {
message: `Your password has no ${type}.`,
deduction: 20,
};
}
if (matches.length <= 0) {
return {
message: `Your password could use more ${type}.`,
deduction: 5,
};
}
}
function repeatCharactersWeakness(password) {
const matches = password.match(/(.)\1/) || [];
if (matches.length > 0) {
return {
message: "Your password has characters that repeat.",
deduction: matches.length * 10,
};
}
}