|
@@ -4749,32 +4749,38 @@ function get_complete_user_data($field, $value, $mnethostid = null) { |
|
|
function check_password_policy($password, &$errmsg) { |
|
|
global $CFG; |
|
|
|
|
|
if (empty($CFG->passwordpolicy)) { |
|
|
return true; |
|
|
} |
|
|
|
|
|
$errmsg = ''; |
|
|
if (core_text::strlen($password) < $CFG->minpasswordlength) { |
|
|
$errmsg .= '<div>'. get_string('errorminpasswordlength', 'auth', $CFG->minpasswordlength) .'</div>'; |
|
|
|
|
|
} |
|
|
if (preg_match_all('/[[:digit:]]/u', $password, $matches) < $CFG->minpassworddigits) { |
|
|
$errmsg .= '<div>'. get_string('errorminpassworddigits', 'auth', $CFG->minpassworddigits) .'</div>'; |
|
|
|
|
|
} |
|
|
if (preg_match_all('/[[:lower:]]/u', $password, $matches) < $CFG->minpasswordlower) { |
|
|
$errmsg .= '<div>'. get_string('errorminpasswordlower', 'auth', $CFG->minpasswordlower) .'</div>'; |
|
|
|
|
|
if (!empty($CFG->passwordpolicy)) { |
|
|
$errmsg = ''; |
|
|
if (core_text::strlen($password) < $CFG->minpasswordlength) { |
|
|
$errmsg .= '<div>'. get_string('errorminpasswordlength', 'auth', $CFG->minpasswordlength) .'</div>'; |
|
|
} |
|
|
if (preg_match_all('/[[:digit:]]/u', $password, $matches) < $CFG->minpassworddigits) { |
|
|
$errmsg .= '<div>'. get_string('errorminpassworddigits', 'auth', $CFG->minpassworddigits) .'</div>'; |
|
|
} |
|
|
if (preg_match_all('/[[:lower:]]/u', $password, $matches) < $CFG->minpasswordlower) { |
|
|
$errmsg .= '<div>'. get_string('errorminpasswordlower', 'auth', $CFG->minpasswordlower) .'</div>'; |
|
|
} |
|
|
if (preg_match_all('/[[:upper:]]/u', $password, $matches) < $CFG->minpasswordupper) { |
|
|
$errmsg .= '<div>'. get_string('errorminpasswordupper', 'auth', $CFG->minpasswordupper) .'</div>'; |
|
|
} |
|
|
if (preg_match_all('/[^[:upper:][:lower:][:digit:]]/u', $password, $matches) < $CFG->minpasswordnonalphanum) { |
|
|
$errmsg .= '<div>'. get_string('errorminpasswordnonalphanum', 'auth', $CFG->minpasswordnonalphanum) .'</div>'; |
|
|
} |
|
|
if (!check_consecutive_identical_characters($password, $CFG->maxconsecutiveidentchars)) { |
|
|
$errmsg .= '<div>'. get_string('errormaxconsecutiveidentchars', 'auth', $CFG->maxconsecutiveidentchars) .'</div>'; |
|
|
} |
|
|
} |
|
|
if (preg_match_all('/[[:upper:]]/u', $password, $matches) < $CFG->minpasswordupper) { |
|
|
$errmsg .= '<div>'. get_string('errorminpasswordupper', 'auth', $CFG->minpasswordupper) .'</div>'; |
|
|
|
|
|
} |
|
|
if (preg_match_all('/[^[:upper:][:lower:][:digit:]]/u', $password, $matches) < $CFG->minpasswordnonalphanum) { |
|
|
$errmsg .= '<div>'. get_string('errorminpasswordnonalphanum', 'auth', $CFG->minpasswordnonalphanum) .'</div>'; |
|
|
} |
|
|
if (!check_consecutive_identical_characters($password, $CFG->maxconsecutiveidentchars)) { |
|
|
$errmsg .= '<div>'. get_string('errormaxconsecutiveidentchars', 'auth', $CFG->maxconsecutiveidentchars) .'</div>'; |
|
|
// Fire any additional password policy functions from plugins. |
|
|
// Plugin functions should output an error message string or empty string for success. |
|
|
$pluginsfunction = get_plugins_with_function('check_password_policy'); |
|
|
foreach ($pluginsfunction as $plugintype => $plugins) { |
|
|
foreach ($plugins as $pluginfunction) { |
|
|
$pluginerr = $pluginfunction($password); |
|
|
if ($pluginerr) { |
|
|
$errmsg .= '<div>'. $pluginerr .'</div>'; |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
if ($errmsg == '') { |
|
|