Merge "Add rc_name_type_patrolled_timestamp index"
[lhc/web/wiklou.git] / includes / api / ApiQueryUsers.php
index ea9d48d..cfc1e46 100644 (file)
@@ -38,7 +38,7 @@ class ApiQueryUsers extends ApiQueryBase {
         * contains anything not listed here, the cache mode will never be public for logged-in users.
         * @var array
         */
-       protected static $publicProps = array(
+       protected static $publicProps = [
                // everything except 'blockinfo' which might show hidden records if the user
                // making the request has the appropriate permissions
                'groups',
@@ -49,7 +49,8 @@ class ApiQueryUsers extends ApiQueryBase {
                'emailable',
                'gender',
                'centralids',
-       );
+               'cancreate',
+       ];
 
        public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'us' );
@@ -71,13 +72,13 @@ class ApiQueryUsers extends ApiQueryBase {
                // If we're in a mode that breaks the same-origin policy, no tokens can
                // be obtained
                if ( $this->lacksSameOriginSecurity() ) {
-                       return array();
+                       return [];
                }
 
-               $this->tokenFunctions = array(
-                       'userrights' => array( 'ApiQueryUsers', 'getUserrightsToken' ),
-               );
-               Hooks::run( 'APIQueryUsersTokens', array( &$this->tokenFunctions ) );
+               $this->tokenFunctions = [
+                       'userrights' => [ 'ApiQueryUsers', 'getUserrightsToken' ],
+               ];
+               Hooks::run( 'APIQueryUsersTokens', [ &$this->tokenFunctions ] );
 
                return $this->tokenFunctions;
        }
@@ -101,23 +102,23 @@ class ApiQueryUsers extends ApiQueryBase {
                if ( !is_null( $params['prop'] ) ) {
                        $this->prop = array_flip( $params['prop'] );
                } else {
-                       $this->prop = array();
+                       $this->prop = [];
                }
 
                $users = (array)$params['users'];
-               $goodNames = $done = array();
+               $goodNames = $done = [];
                $result = $this->getResult();
                // Canonicalize user names
                foreach ( $users as $u ) {
                        $n = User::getCanonicalName( $u );
                        if ( $n === false || $n === '' ) {
-                               $vals = array( 'name' => $u, 'invalid' => true );
-                               $fit = $result->addValue( array( 'query', $this->getModuleName() ),
+                               $vals = [ 'name' => $u, 'invalid' => true ];
+                               $fit = $result->addValue( [ 'query', $this->getModuleName() ],
                                        null, $vals );
                                if ( !$fit ) {
                                        $this->setContinueEnumParameter( 'users',
                                                implode( '|', array_diff( $users, $done ) ) );
-                                       $goodNames = array();
+                                       $goodNames = [];
                                        break;
                                }
                                $done[] = $u;
@@ -135,19 +136,19 @@ class ApiQueryUsers extends ApiQueryBase {
 
                        $this->showHiddenUsersAddBlockInfo( isset( $this->prop['blockinfo'] ) );
 
-                       $data = array();
+                       $data = [];
                        $res = $this->select( __METHOD__ );
                        $this->resetQueryParams();
 
                        // get user groups if needed
                        if ( isset( $this->prop['groups'] ) || isset( $this->prop['rights'] ) ) {
-                               $userGroups = array();
+                               $userGroups = [];
 
                                $this->addTables( 'user' );
                                $this->addWhereFld( 'user_name', $goodNames );
                                $this->addTables( 'user_groups' );
-                               $this->addJoinConds( array( 'user_groups' => array( 'INNER JOIN', 'ug_user=user_id' ) ) );
-                               $this->addFields( array( 'user_name', 'ug_group' ) );
+                               $this->addJoinConds( [ 'user_groups' => [ 'INNER JOIN', 'ug_user=user_id' ] ] );
+                               $this->addFields( [ 'user_name', 'ug_group' ] );
                                $userGroupsRes = $this->select( __METHOD__ );
 
                                foreach ( $userGroupsRes as $row ) {
@@ -162,9 +163,9 @@ class ApiQueryUsers extends ApiQueryBase {
                                        $user = User::newFromRow( $row );
                                } else {
                                        if ( !isset( $userGroups[$row->user_name] ) || !is_array( $userGroups[$row->user_name] ) ) {
-                                               $userGroups[$row->user_name] = array();
+                                               $userGroups[$row->user_name] = [];
                                        }
-                                       $user = User::newFromRow( $row, array( 'user_groups' => $userGroups[$row->user_name] ) );
+                                       $user = User::newFromRow( $row, [ 'user_groups' => $userGroups[$row->user_name] ] );
                                }
                                $name = $user->getName();
 
@@ -238,7 +239,7 @@ class ApiQueryUsers extends ApiQueryBase {
                // Second pass: add result data to $retval
                foreach ( $goodNames as $u ) {
                        if ( !isset( $data[$u] ) ) {
-                               $data[$u] = array( 'name' => $u );
+                               $data[$u] = [ 'name' => $u ];
                                $urPage = new UserrightsPage;
                                $urPage->setContext( $context );
                                $iwUser = $urPage->fetchUser( $u );
@@ -260,6 +261,13 @@ class ApiQueryUsers extends ApiQueryBase {
                                        }
                                } else {
                                        $data[$u]['missing'] = true;
+                                       if ( isset( $this->prop['cancreate'] ) ) {
+                                               $status = MediaWiki\Auth\AuthManager::singleton()->canCreateAccount( $u );
+                                               $data[$u]['cancreate'] = $status->isGood();
+                                               if ( !$status->isGood() ) {
+                                                       $data[$u]['cancreateerror'] = $this->getErrorFormatter()->arrayFromStatus( $status );
+                                               }
+                                       }
                                }
                        } else {
                                if ( isset( $this->prop['groups'] ) && isset( $data[$u]['groups'] ) ) {
@@ -276,7 +284,7 @@ class ApiQueryUsers extends ApiQueryBase {
                                }
                        }
 
-                       $fit = $result->addValue( array( 'query', $this->getModuleName() ),
+                       $fit = $result->addValue( [ 'query', $this->getModuleName() ],
                                null, $data[$u] );
                        if ( !$fit ) {
                                $this->setContinueEnumParameter( 'users',
@@ -285,7 +293,7 @@ class ApiQueryUsers extends ApiQueryBase {
                        }
                        $done[] = $u;
                }
-               $result->addIndexedTagName( array( 'query', $this->getModuleName() ), 'user' );
+               $result->addIndexedTagName( [ 'query', $this->getModuleName() ], 'user' );
        }
 
        public function getCacheMode( $params ) {
@@ -299,10 +307,10 @@ class ApiQueryUsers extends ApiQueryBase {
        }
 
        public function getAllowedParams() {
-               return array(
-                       'prop' => array(
+               return [
+                       'prop' => [
                                ApiBase::PARAM_ISMULTI => true,
-                               ApiBase::PARAM_TYPE => array(
+                               ApiBase::PARAM_TYPE => [
                                        'blockinfo',
                                        'groups',
                                        'implicitgroups',
@@ -312,27 +320,30 @@ class ApiQueryUsers extends ApiQueryBase {
                                        'emailable',
                                        'gender',
                                        'centralids',
-                               ),
-                               ApiBase::PARAM_HELP_MSG_PER_VALUE => array(),
-                       ),
+                                       'cancreate',
+                                       // When adding a prop, consider whether it should be added
+                                       // to self::$publicProps
+                               ],
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE => [],
+                       ],
                        'attachedwiki' => null,
-                       'users' => array(
+                       'users' => [
                                ApiBase::PARAM_TYPE => 'user',
                                ApiBase::PARAM_ISMULTI => true
-                       ),
-                       'token' => array(
+                       ],
+                       'token' => [
                                ApiBase::PARAM_DEPRECATED => true,
                                ApiBase::PARAM_TYPE => array_keys( $this->getTokenFunctions() ),
                                ApiBase::PARAM_ISMULTI => true
-                       ),
-               );
+                       ],
+               ];
        }
 
        protected function getExamplesMessages() {
-               return array(
+               return [
                        'action=query&list=users&ususers=Example&usprop=groups|editcount|gender'
                                => 'apihelp-query+users-example-simple',
-               );
+               ];
        }
 
        public function getHelpUrls() {