X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;ds=sidebyside;f=includes%2FUser.php;h=1ccb732637e40bf9f3dd4480f88e076ec59738f4;hb=43b7373b48e210ca38cdc46162f5bfb0e812b277;hp=6d9f3724ee4b7523509cf993341bacfac9d25aca;hpb=5b8215cb57a34ee54fbac51d94bd6e9f02899b3c;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/User.php b/includes/User.php index 6d9f3724ee..1ccb732637 100644 --- a/includes/User.php +++ b/includes/User.php @@ -697,6 +697,7 @@ class User { return $this->getPasswordValidity( $password ) === true; } + /** * Given unvalidated password input, return error message on failure. * @@ -704,6 +705,33 @@ class User { * @return mixed: true on success, string or array of error message on failure */ public function getPasswordValidity( $password ) { + $result = $this->checkPasswordValidity( $password ); + if ( $result->isGood() ) { + return true; + } else { + $messages = array(); + foreach ( $result->getErrorsByType( 'error' ) as $error ) { + $messages[] = $error['message']; + } + foreach ( $result->getErrorsByType( 'warning' ) as $warning ) { + $messages[] = $warning['message']; + } + if ( count( $messages ) === 1 ) { + return $messages[0]; + } + return $messages; + } + } + + /** + * Check if this is a valid password for this user. Status will be good if + * the password is valid, or have an array of error messages if not. + * + * @param string $password Desired password + * @return Status + * @since 1.23 + */ + public function checkPasswordValidity( $password ) { global $wgMinimalPasswordLength, $wgContLang; static $blockedLogins = array( @@ -711,30 +739,37 @@ class User { 'Apitestsysop' => 'testpass', 'Apitestuser' => 'testpass' # r75605 ); + $status = Status::newGood(); + $result = false; //init $result to false for the internal checks if ( !wfRunHooks( 'isValidPassword', array( $password, &$result, $this ) ) ) { - return $result; + $status->error( $result ); + return $status; } if ( $result === false ) { if ( strlen( $password ) < $wgMinimalPasswordLength ) { - return 'passwordtooshort'; + $status->error( 'passwordtooshort', $wgMinimalPasswordLength ); + return $status; } elseif ( $wgContLang->lc( $password ) == $wgContLang->lc( $this->mName ) ) { - return 'password-name-match'; + $status->error( 'password-name-match' ); + return $status; } elseif ( isset( $blockedLogins[$this->getName()] ) && $password == $blockedLogins[$this->getName()] ) { - return 'password-login-forbidden'; + $status->error( 'password-login-forbidden' ); + return $status; } else { - //it seems weird returning true here, but this is because of the + //it seems weird returning a Good status here, but this is because of the //initialization of $result to false above. If the hook is never run or it //doesn't modify $result, then we will likely get down into this if with //a valid password. - return true; + return $status; } } elseif ( $result === true ) { - return true; + return $status; } else { - return $result; //the isValidPassword hook set a string $result and returned true + $status->error( $result ); + return $status; //the isValidPassword hook set a string $result and returned true } } @@ -1088,7 +1123,7 @@ class User { } else { $result = 0; for ( $i = 0; $i < strlen( $answer ); $i++ ) { - $result |= ord( $answer{$i} ) ^ ord( $test{$i} ); + $result |= ord( $answer[$i] ) ^ ord( $test[$i] ); } $passwordCorrect = ( $result == 0 ); } @@ -1665,7 +1700,7 @@ class User { // Already pinged? if ( $count ) { if ( $count >= $max ) { - wfDebugLog( 'ratelimit', $this->getName() . " tripped! $key at $count $summary"); + wfDebugLog( 'ratelimit', $this->getName() . " tripped! $key at $count $summary" ); $triggered = true; } else { wfDebug( __METHOD__ . ": ok. $key at $count $summary\n" ); @@ -3687,14 +3722,9 @@ class User { global $wgAuth, $wgLegacyEncoding; $this->load(); - // Even though we stop people from creating passwords that - // are shorter than this, doesn't mean people wont be able - // to. Certain authentication plugins do NOT want to save + // Certain authentication plugins do NOT want to save // domain passwords in a mysql database, so we should // check this (in case $wgAuth->strict() is false). - if ( !$this->isValidPassword( $password ) ) { - return false; - } if ( $wgAuth->authenticate( $this->getName(), $password ) ) { return true;