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
This commit is contained in:
Brad Jorsch 2016-06-16 17:43:12 -04:00
parent f61e147bfc
commit cd763560c8
9 changed files with 55 additions and 13 deletions

View file

@ -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();
}

View file

@ -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();
}

View file

@ -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();
}

View file

@ -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}', [

View file

@ -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 = [

View file

@ -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 ] ) ) {

View file

@ -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

View file

@ -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

View file

@ -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