Conditions | 47 |
Paths | > 20000 |
Total Lines | 233 |
Code Lines | 171 |
Lines | 0 |
Ratio | 0 % |
Changes | 0 |
Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.
For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.
Commonly applied refactorings include:
If many parameters/temporary variables are present:
1 | <?php namespace Myth\Auth; |
||
142 | public static function isStrongPassword($password, $minbits = 18, $usedict = false, $minwordlen = 4) |
||
143 | { |
||
144 | // NIST password strength rules allow up to 6 extra bits for mixed case and non-alphabetic. |
||
145 | $upper = false; |
||
146 | $lower = false; |
||
147 | $numeric = false; |
||
148 | $other = false; |
||
149 | $space = false; |
||
150 | $y = strlen($password); |
||
151 | for ($x = 0; $x < $y; $x++) |
||
152 | { |
||
153 | $tempchr = ord(substr($password, $x, 1)); |
||
154 | if ($tempchr >= ord("A") && $tempchr <= ord("Z")) $upper = true; |
||
155 | else if ($tempchr >= ord("a") && $tempchr <= ord("z")) $lower = true; |
||
156 | else if ($tempchr >= ord("0") && $tempchr <= ord("9")) $numeric = true; |
||
157 | else if ($tempchr == ord(" ")) $space = true; |
||
158 | else $other = true; |
||
159 | } |
||
160 | $extrabits = ($upper && $lower && $other ? ($numeric ? 6 : 5) : ($numeric && !$upper && !$lower ? ($other ? -2 : -6) : 0)); |
||
161 | if (!$space) $extrabits -= 2; |
||
162 | else if (count(explode(" ", preg_replace('/\s+/', " ", $password))) > 3) $extrabits++; |
||
163 | $result = self::getNISTNumBits($password, true) + $extrabits; |
||
164 | |||
165 | $password = strtolower($password); |
||
166 | $revpassword = strrev($password); |
||
167 | $numbits = self::getNISTNumBits($password) + $extrabits; |
||
168 | if ($result > $numbits) $result = $numbits; |
||
169 | |||
170 | // Remove QWERTY strings. |
||
171 | $qwertystrs = array( |
||
172 | "1234567890-qwertyuiopasdfghjkl;zxcvbnm,./", |
||
173 | "1qaz2wsx3edc4rfv5tgb6yhn7ujm8ik,9ol.0p;/-['=]:?_{\"+}", |
||
174 | "1qaz2wsx3edc4rfv5tgb6yhn7ujm8ik9ol0p", |
||
175 | "qazwsxedcrfvtgbyhnujmik,ol.p;/-['=]:?_{\"+}", |
||
176 | "qazwsxedcrfvtgbyhnujmikolp", |
||
177 | "]\"/=[;.-pl,0okm9ijn8uhb7ygv6tfc5rdx4esz3wa2q1", |
||
178 | "pl0okm9ijn8uhb7ygv6tfc5rdx4esz3wa2q1", |
||
179 | "]\"/[;.pl,okmijnuhbygvtfcrdxeszwaq", |
||
180 | "plokmijnuhbygvtfcrdxeszwaq", |
||
181 | "014725836914702583697894561230258/369*+-*/", |
||
182 | "abcdefghijklmnopqrstuvwxyz" |
||
183 | ); |
||
184 | foreach ($qwertystrs as $qwertystr) |
||
185 | { |
||
186 | $qpassword = $password; |
||
187 | $qrevpassword = $revpassword; |
||
188 | $z = 6; |
||
189 | do |
||
190 | { |
||
191 | $y = strlen($qwertystr) - $z; |
||
192 | for ($x = 0; $x < $y; $x++) |
||
193 | { |
||
194 | $str = substr($qwertystr, $x, $z); |
||
195 | $qpassword = str_replace($str, "*", $qpassword); |
||
196 | $qrevpassword = str_replace($str, "*", $qrevpassword); |
||
197 | } |
||
198 | |||
199 | $z--; |
||
200 | } while ($z > 2); |
||
201 | |||
202 | $numbits = self::getNISTNumBits($qpassword) + $extrabits; |
||
203 | if ($result > $numbits) $result = $numbits; |
||
204 | $numbits = self::getNISTNumBits($qrevpassword) + $extrabits; |
||
205 | if ($result > $numbits) $result = $numbits; |
||
206 | |||
207 | if ($result < $minbits) return false; |
||
208 | } |
||
209 | |||
210 | if ($usedict && $result >= $minbits) |
||
211 | { |
||
212 | $passwords = array(); |
||
213 | |||
214 | // Add keyboard shifting password variants. |
||
215 | $keyboardmap_down_noshift = array( |
||
216 | "z" => "", "x" => "", "c" => "", "v" => "", "b" => "", "n" => "", "m" => "", "," => "", "." => "", "/" => "", "<" => "", ">" => "", "?" => "" |
||
217 | ); |
||
218 | if ($password == str_replace(array_keys($keyboardmap_down_noshift), array_values($keyboardmap_down_noshift), $password)) |
||
219 | { |
||
220 | $keyboardmap_downright = array( |
||
221 | "a" => "z", |
||
222 | "q" => "a", |
||
223 | "1" => "q", |
||
224 | "s" => "x", |
||
225 | "w" => "s", |
||
226 | "2" => "w", |
||
227 | "d" => "c", |
||
228 | "e" => "d", |
||
229 | "3" => "e", |
||
230 | "f" => "v", |
||
231 | "r" => "f", |
||
232 | "4" => "r", |
||
233 | "g" => "b", |
||
234 | "t" => "g", |
||
235 | "5" => "t", |
||
236 | "h" => "n", |
||
237 | "y" => "h", |
||
238 | "6" => "y", |
||
239 | "j" => "m", |
||
240 | "u" => "j", |
||
241 | "7" => "u", |
||
242 | "i" => "k", |
||
243 | "8" => "i", |
||
244 | "o" => "l", |
||
245 | "9" => "o", |
||
246 | "0" => "p", |
||
247 | ); |
||
248 | |||
249 | $keyboardmap_downleft = array( |
||
250 | "2" => "q", |
||
251 | "w" => "a", |
||
252 | "3" => "w", |
||
253 | "s" => "z", |
||
254 | "e" => "s", |
||
255 | "4" => "e", |
||
256 | "d" => "x", |
||
257 | "r" => "d", |
||
258 | "5" => "r", |
||
259 | "f" => "c", |
||
260 | "t" => "f", |
||
261 | "6" => "t", |
||
262 | "g" => "v", |
||
263 | "y" => "g", |
||
264 | "7" => "y", |
||
265 | "h" => "b", |
||
266 | "u" => "h", |
||
267 | "8" => "u", |
||
268 | "j" => "n", |
||
269 | "i" => "j", |
||
270 | "9" => "i", |
||
271 | "k" => "m", |
||
272 | "o" => "k", |
||
273 | "0" => "o", |
||
274 | "p" => "l", |
||
275 | "-" => "p", |
||
276 | ); |
||
277 | |||
278 | $password2 = str_replace(array_keys($keyboardmap_downright), array_values($keyboardmap_downright), $password); |
||
279 | $passwords[] = $password2; |
||
280 | $passwords[] = strrev($password2); |
||
281 | |||
282 | $password2 = str_replace(array_keys($keyboardmap_downleft), array_values($keyboardmap_downleft), $password); |
||
283 | $passwords[] = $password2; |
||
284 | $passwords[] = strrev($password2); |
||
285 | } |
||
286 | |||
287 | // Deal with LEET-Speak substitutions. |
||
288 | $leetspeakmap = array( |
||
289 | "@" => "a", |
||
290 | "!" => "i", |
||
291 | "$" => "s", |
||
292 | "1" => "i", |
||
293 | "2" => "z", |
||
294 | "3" => "e", |
||
295 | "4" => "a", |
||
296 | "5" => "s", |
||
297 | "6" => "g", |
||
298 | "7" => "t", |
||
299 | "8" => "b", |
||
300 | "9" => "g", |
||
301 | "0" => "o" |
||
302 | ); |
||
303 | |||
304 | $password2 = str_replace(array_keys($leetspeakmap), array_values($leetspeakmap), $password); |
||
305 | $passwords[] = $password2; |
||
306 | $passwords[] = strrev($password2); |
||
307 | |||
308 | $leetspeakmap["1"] = "l"; |
||
309 | $password3 = str_replace(array_keys($leetspeakmap), array_values($leetspeakmap), $password); |
||
310 | if ($password3 != $password2) |
||
311 | { |
||
312 | $passwords[] = $password3; |
||
313 | $passwords[] = strrev($password3); |
||
314 | } |
||
315 | |||
316 | // Process the password, while looking for words in the dictionary. |
||
317 | $a = ord("a"); |
||
318 | $z = ord("z"); |
||
319 | $data = file_get_contents(DICTIONARY_PATH); |
||
320 | foreach ($passwords as $num => $password) |
||
321 | { |
||
322 | $y = strlen($password); |
||
323 | for ($x = 0; $x < $y; $x++) |
||
324 | { |
||
325 | $tempchr = ord(substr($password, $x, 1)); |
||
326 | if ($tempchr >= $a && $tempchr <= $z) |
||
327 | { |
||
328 | for ($x2 = $x + 1; $x2 < $y; $x2++) |
||
329 | { |
||
330 | $tempchr = ord(substr($password, $x2, 1)); |
||
331 | if ($tempchr < $a || $tempchr > $z) break; |
||
332 | } |
||
333 | |||
334 | $found = false; |
||
335 | while (!$found && $x2 - $x >= $minwordlen) |
||
336 | { |
||
337 | $word = "/\\n" . substr($password, $x, $minwordlen); |
||
338 | for ($x3 = $x + $minwordlen; $x3 < $x2; $x3++) $word .= "(" . $password{$x3}; |
||
339 | for ($x3 = $x + $minwordlen; $x3 < $x2; $x3++) $word .= ")?"; |
||
340 | $word .= "\\n/"; |
||
341 | |||
342 | preg_match_all($word, $data, $matches); |
||
343 | if (!count($matches[0])) |
||
344 | { |
||
345 | $password{$x} = "*"; |
||
346 | $x++; |
||
347 | $numbits = self::getNISTNumBits(substr($password, 0, $x)) + $extrabits; |
||
348 | if ($numbits >= $minbits) $found = true; |
||
349 | } |
||
350 | else |
||
351 | { |
||
352 | foreach ($matches[0] as $match) |
||
353 | { |
||
354 | $password2 = str_replace(trim($match), "*", $password); |
||
355 | $numbits = self::getNISTNumBits($password2) + $extrabits; |
||
356 | if ($result > $numbits) $result = $numbits; |
||
357 | |||
358 | if ($result < $minbits) return false; |
||
359 | } |
||
360 | |||
361 | $found = true; |
||
362 | } |
||
363 | } |
||
364 | |||
365 | if ($found) break; |
||
366 | |||
367 | $x = $x2 - 1; |
||
368 | } |
||
369 | } |
||
370 | } |
||
371 | } |
||
372 | |||
373 | return $result >= $minbits; |
||
374 | } |
||
375 | } |
||
376 |