From: Brad Jorsch Date: Thu, 16 Jun 2016 21:43:12 +0000 (-0400) Subject: Add $options parameter for testUserForCreation() X-Git-Tag: 1.31.0-rc.0~6574^2 X-Git-Url: https://git.cyclocoop.org/%28%28?a=commitdiff_plain;ds=sidebyside;h=cd763560c85e783f095ca5f740ea6492119e3b8f;p=lhc%2Fweb%2Fwiklou.git Add $options parameter for testUserForCreation() This will allow providers to know whether the call is just for testing (from ApiQueryUsers) or for actual creation, and skip duplicate work when testForAccountCreation() is going to be called. Change-Id: Id3ef713fd377135d78f66e5100dedd4689293b59 Depends-On: I4af8b3b692f60c42f8685b90be5936da7ba4e2e2 Depends-On: Ie9639a15d04b387be0e72754301eb6d91cd8adc2 Depends-On: I063cbdfbd9a223bf2391fce2b714ab82ddd3272f Depends-On: I7c67512634f6e72251911238f083857da9fd3f84 --- diff --git a/includes/auth/AbstractPreAuthenticationProvider.php b/includes/auth/AbstractPreAuthenticationProvider.php index 48a9c88c9d..d997dbbc85 100644 --- a/includes/auth/AbstractPreAuthenticationProvider.php +++ b/includes/auth/AbstractPreAuthenticationProvider.php @@ -45,7 +45,7 @@ abstract class AbstractPreAuthenticationProvider extends AbstractAuthenticationP return \StatusValue::newGood(); } - public function testUserForCreation( $user, $autocreate ) { + public function testUserForCreation( $user, $autocreate, array $options = [] ) { return \StatusValue::newGood(); } diff --git a/includes/auth/AbstractPrimaryAuthenticationProvider.php b/includes/auth/AbstractPrimaryAuthenticationProvider.php index 2e0d669d3e..ea3dfa3bd6 100644 --- a/includes/auth/AbstractPrimaryAuthenticationProvider.php +++ b/includes/auth/AbstractPrimaryAuthenticationProvider.php @@ -91,7 +91,7 @@ abstract class AbstractPrimaryAuthenticationProvider extends AbstractAuthenticat public function postAccountCreation( $user, $creator, AuthenticationResponse $response ) { } - public function testUserForCreation( $user, $autocreate ) { + public function testUserForCreation( $user, $autocreate, array $options = [] ) { return \StatusValue::newGood(); } diff --git a/includes/auth/AbstractSecondaryAuthenticationProvider.php b/includes/auth/AbstractSecondaryAuthenticationProvider.php index 89fd6f92a5..00493bc7a4 100644 --- a/includes/auth/AbstractSecondaryAuthenticationProvider.php +++ b/includes/auth/AbstractSecondaryAuthenticationProvider.php @@ -77,7 +77,7 @@ abstract class AbstractSecondaryAuthenticationProvider extends AbstractAuthentic public function postAccountCreation( $user, $creator, AuthenticationResponse $response ) { } - public function testUserForCreation( $user, $autocreate ) { + public function testUserForCreation( $user, $autocreate, array $options = [] ) { return \StatusValue::newGood(); } diff --git a/includes/auth/AuthManager.php b/includes/auth/AuthManager.php index 7ca9c6a6df..6db5f2c625 100644 --- a/includes/auth/AuthManager.php +++ b/includes/auth/AuthManager.php @@ -878,10 +878,22 @@ class AuthManager implements LoggerAwareInterface { /** * Determine whether a particular account can be created * @param string $username - * @param int $flags Bitfield of User:READ_* constants + * @param array $options + * - flags: (int) Bitfield of User:READ_* constants, default User::READ_NORMAL + * - creating: (bool) For internal use only. Never specify this. * @return Status */ - public function canCreateAccount( $username, $flags = User::READ_NORMAL ) { + public function canCreateAccount( $username, $options = [] ) { + // Back compat + if ( is_int( $options ) ) { + $options = [ 'flags' => $options ]; + } + $options += [ + 'flags' => User::READ_NORMAL, + 'creating' => false, + ]; + $flags = $options['flags']; + if ( !$this->canCreateAccounts() ) { return Status::newFatal( 'authmanager-create-disabled' ); } @@ -905,7 +917,7 @@ class AuthManager implements LoggerAwareInterface { $this->getPrimaryAuthenticationProviders() + $this->getSecondaryAuthenticationProviders(); foreach ( $providers as $provider ) { - $status = $provider->testUserForCreation( $user, false ); + $status = $provider->testUserForCreation( $user, false, $options ); if ( !$status->isGood() ) { return Status::wrap( $status ); } @@ -1010,7 +1022,9 @@ class AuthManager implements LoggerAwareInterface { return AuthenticationResponse::newFail( $status->getMessage() ); } - $status = $this->canCreateAccount( $username, User::READ_LOCKING ); + $status = $this->canCreateAccount( + $username, [ 'flags' => User::READ_LOCKING, 'creating' => true ] + ); if ( !$status->isGood() ) { $this->logger->debug( __METHOD__ . ': {user} cannot be created: {reason}', [ 'user' => $username, @@ -1575,11 +1589,15 @@ class AuthManager implements LoggerAwareInterface { } // Denied by providers? + $options = [ + 'flags' => User::READ_LATEST, + 'creating' => true, + ]; $providers = $this->getPreAuthenticationProviders() + $this->getPrimaryAuthenticationProviders() + $this->getSecondaryAuthenticationProviders(); foreach ( $providers as $provider ) { - $status = $provider->testUserForCreation( $user, $source ); + $status = $provider->testUserForCreation( $user, $source, $options ); if ( !$status->isGood() ) { $ret = Status::wrap( $status ); $this->logger->debug( __METHOD__ . ': Provider denied creation of {username}: {reason}', [ diff --git a/includes/auth/CheckBlocksSecondaryAuthenticationProvider.php b/includes/auth/CheckBlocksSecondaryAuthenticationProvider.php index 070da9f542..54ccdf4aed 100644 --- a/includes/auth/CheckBlocksSecondaryAuthenticationProvider.php +++ b/includes/auth/CheckBlocksSecondaryAuthenticationProvider.php @@ -75,7 +75,7 @@ class CheckBlocksSecondaryAuthenticationProvider extends AbstractSecondaryAuthen return AuthenticationResponse::newAbstain(); } - public function testUserForCreation( $user, $autocreate ) { + public function testUserForCreation( $user, $autocreate, array $options = [] ) { $block = $user->isBlockedFromCreateAccount(); if ( $block ) { $errorParams = [ diff --git a/includes/auth/LegacyHookPreAuthenticationProvider.php b/includes/auth/LegacyHookPreAuthenticationProvider.php index 1a8a75892d..c98a184612 100644 --- a/includes/auth/LegacyHookPreAuthenticationProvider.php +++ b/includes/auth/LegacyHookPreAuthenticationProvider.php @@ -96,7 +96,7 @@ class LegacyHookPreAuthenticationProvider extends AbstractPreAuthenticationProvi return StatusValue::newGood(); } - public function testUserForCreation( $user, $autocreate ) { + public function testUserForCreation( $user, $autocreate, array $options = [] ) { if ( $autocreate !== false ) { $abortError = ''; if ( !\Hooks::run( 'AbortAutoAccount', [ $user, &$abortError ] ) ) { diff --git a/includes/auth/PreAuthenticationProvider.php b/includes/auth/PreAuthenticationProvider.php index 846d16e265..13fae6eb29 100644 --- a/includes/auth/PreAuthenticationProvider.php +++ b/includes/auth/PreAuthenticationProvider.php @@ -83,9 +83,17 @@ interface PreAuthenticationProvider extends AuthenticationProvider { * into such. * @param bool|string $autocreate False if this is not an auto-creation, or * the source of the auto-creation passed to AuthManager::autoCreateUser(). + * @param array $options + * - flags: (int) Bitfield of User:READ_* constants, default User::READ_NORMAL + * - creating: (bool) If false (or missing), this call is only testing if + * a user could be created. If set, this (non-autocreation) is for + * actually creating an account and will be followed by a call to + * testForAccountCreation(). In this case, the provider might return + * StatusValue::newGood() here and let the later call to + * testForAccountCreation() do a more thorough test. * @return StatusValue */ - public function testUserForCreation( $user, $autocreate ); + public function testUserForCreation( $user, $autocreate, array $options = [] ); /** * Post-creation callback diff --git a/includes/auth/PrimaryAuthenticationProvider.php b/includes/auth/PrimaryAuthenticationProvider.php index 169e7f138f..c44c8fc1c9 100644 --- a/includes/auth/PrimaryAuthenticationProvider.php +++ b/includes/auth/PrimaryAuthenticationProvider.php @@ -277,9 +277,17 @@ interface PrimaryAuthenticationProvider extends AuthenticationProvider { * into such. * @param bool|string $autocreate False if this is not an auto-creation, or * the source of the auto-creation passed to AuthManager::autoCreateUser(). + * @param array $options + * - flags: (int) Bitfield of User:READ_* constants, default User::READ_NORMAL + * - creating: (bool) If false (or missing), this call is only testing if + * a user could be created. If set, this (non-autocreation) is for + * actually creating an account and will be followed by a call to + * testForAccountCreation(). In this case, the provider might return + * StatusValue::newGood() here and let the later call to + * testForAccountCreation() do a more thorough test. * @return StatusValue */ - public function testUserForCreation( $user, $autocreate ); + public function testUserForCreation( $user, $autocreate, array $options = [] ); /** * Post-auto-creation callback diff --git a/includes/auth/SecondaryAuthenticationProvider.php b/includes/auth/SecondaryAuthenticationProvider.php index 0d52d2500b..1ccc9c6972 100644 --- a/includes/auth/SecondaryAuthenticationProvider.php +++ b/includes/auth/SecondaryAuthenticationProvider.php @@ -200,9 +200,17 @@ interface SecondaryAuthenticationProvider extends AuthenticationProvider { * into such. * @param bool|string $autocreate False if this is not an auto-creation, or * the source of the auto-creation passed to AuthManager::autoCreateUser(). + * @param array $options + * - flags: (int) Bitfield of User:READ_* constants, default User::READ_NORMAL + * - creating: (bool) If false (or missing), this call is only testing if + * a user could be created. If set, this (non-autocreation) is for + * actually creating an account and will be followed by a call to + * testForAccountCreation(). In this case, the provider might return + * StatusValue::newGood() here and let the later call to + * testForAccountCreation() do a more thorough test. * @return StatusValue */ - public function testUserForCreation( $user, $autocreate ); + public function testUserForCreation( $user, $autocreate, array $options = [] ); /** * Post-auto-creation callback