init
[garradin.git] / www / admin / static / password.js
1 (function () {
2 var strength_elm, match_elm, pw_elm, pw2_elm, suggest_elm;
3
4 RegExp.quote = function(str) {
5 return (str+'').replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
6 };
7
8 window.initPasswordField = function(suggest, password, password2)
9 {
10 suggest_elm = (typeof suggest == 'string') ? document.getElementById(suggest) : suggest;
11 pw_elm = (typeof password == 'string') ? document.getElementById(password) : password;
12 pw2_elm = (typeof password2 == 'string') ? document.getElementById(password2) : password2;
13
14 suggest_elm.size = suggest_elm.value.length;
15
16 suggest_elm.onclick = function () {
17 pw_elm.value = this.value;
18 pw2_elm.value = this.value;
19 this.select();
20 checkPasswordStrength();
21 checkPasswordMatch();
22 };
23
24 strength_elm = document.createElement('span');
25 strength_elm.className = 'password_check';
26
27 pw_elm.parentNode.appendChild(strength_elm);
28
29 match_elm = document.createElement('span');
30 match_elm.className = 'password_check';
31
32 pw2_elm.parentNode.appendChild(match_elm);
33
34 pw_elm.onkeyup = checkPasswordStrength;
35 pw_elm.onchange = function () { checkPasswordStrength(); checkPasswordMatch(); };
36 pw_elm.onblur = function () { checkPasswordStrength(); checkPasswordMatch(); };
37 pw2_elm.onkeypress = checkPasswordMatch;
38 pw2_elm.onblur = checkPasswordMatch;
39 pw2_elm.onchange = checkPasswordMatch;
40
41 pw_elm.form.addEventListener('submit', function (e) {
42 if (pw_elm.value == '') return true;
43 if (scorePassword(pw_elm.value) <= 30 && !window.confirm("Êtes-vous sûr de vouloir utiliser un mot de passe aussi mauvais que ça ?"))
44 {
45 e = e || window.event;
46 if(e.preventDefault)
47 e.preventDefault();
48 if(e.stopPropagation)
49 e.stopPropagation();
50 e.returnValue = false;
51 e.cancelBubble = true;
52 return false;
53 }
54 }, true);
55 };
56
57 function scorePassword(pass) {
58 var score = 0;
59
60 if (!pass)
61 return score;
62
63 // Date
64 if (/19\d\d|200\d|201\d/.test(pass))
65 score -= 5;
66
67 // Autres champs du formulaire
68 var inputs = document.getElementsByTagName('input');
69
70 for (var i = 0; i < inputs.length; i++)
71 {
72 var input = inputs[i];
73
74 if (input.type != 'text' && input.type != 'url' && input.type != 'email')
75 continue;
76
77 if (input == suggest_elm)
78 continue;
79
80 if (input.value.replace(/\s/, '') == '')
81 continue;
82
83 var v = input.value.split(/[\W]/);
84 for (var j = 0; j < v.length; j++)
85 {
86 if (v[j].length < 4)
87 continue;
88
89 var r = new RegExp(RegExp.quote(v[j]), 'ig');
90 score -= pass.match(r) ? pass.match(r).length * 5 : 0;
91 }
92 }
93
94 // award every unique letter until 5 repetitions
95 var letters = new Object();
96 for (var i=0; i<pass.length; i++) {
97 letters[pass[i]] = (letters[pass[i]] || 0) + 1;
98 score += 5.0 / letters[pass[i]];
99 }
100
101 // bonus points for mixing it up
102 var variations = {
103 digits: /\d/.test(pass),
104 lower: /[a-z]/.test(pass),
105 upper: /[A-Z]/.test(pass),
106 nonWords: /\W/.test(pass),
107 }
108
109 variationCount = 0;
110 for (var check in variations) {
111 variationCount += (variations[check] == true) ? 1 : 0;
112 }
113 score += (variationCount - 1) * 10;
114
115 return parseInt(score);
116 }
117
118 function checkPasswordStrength() {
119 if (pw_elm.value == '')
120 {
121 strength_elm.className = strength_elm.className.split(' ')[0];
122 strength_elm.innerHTML = '';
123 return true;
124 }
125
126 var score = scorePassword(pw_elm.value);
127
128 if (score > 80)
129 {
130 strength_elm.className = strength_elm.className.split(' ')[0] + ' ok';
131 strength_elm.innerHTML = 'Sécurité : <b>forte</b>';
132 }
133 else if (score > 60)
134 {
135 strength_elm.className = strength_elm.className.split(' ')[0] + ' medium';
136 strength_elm.innerHTML = 'Sécurité : <b>moyenne</b>';
137 }
138 else if (score >= 30)
139 {
140 strength_elm.className = strength_elm.className.split(' ')[0] + ' weak';
141 strength_elm.innerHTML = 'Sécurité : <b>mauvaise</b>';
142 }
143 else
144 {
145 strength_elm.className = strength_elm.className.split(' ')[0] + ' fail';
146 strength_elm.innerHTML = 'Sécurité : <b>aucune</b>';
147 }
148
149 return true;
150 }
151
152 function checkPasswordMatch()
153 {
154 if (pw2_elm.value == '' && pw_elm.value == '')
155 {
156 match_elm.className = strength_elm.className.split(' ')[0];
157 match_elm.innerHTML = '';
158 }
159 else if (pw_elm.value !== pw2_elm.value)
160 {
161 match_elm.className = strength_elm.className.split(' ')[0] + ' fail';
162 match_elm.innerHTML = 'Ne correspond pas au mot de passe entré.';
163 }
164 else
165 {
166 match_elm.className = strength_elm.className.split(' ')[0] + ' ok';
167 match_elm.innerHTML = '&#10003;';
168 }
169 }
170 }());