Merge "Adding test case for testing revision storage and retrieval."
[lhc/web/wiklou.git] / includes / api / ApiQueryAllUsers.php
index 6b8c2ee..e96676e 100644 (file)
  * @file
  */
 
-if ( !defined( 'MEDIAWIKI' ) ) {
-       // Eclipse helper - will be ignored in production
-       require_once( 'ApiQueryBase.php' );
-}
-
 /**
  * Query module to enumerate all registered users.
  *
@@ -39,6 +34,16 @@ class ApiQueryAllUsers extends ApiQueryBase {
                parent::__construct( $query, $moduleName, 'au' );
        }
 
+       /**
+        * This function converts the user name to a canonical form
+        * which is stored in the database.
+        * @param String $name
+        * @return String
+        */
+       private function getCanonicalUserName( $name ) {
+               return str_replace( '_', ' ', $name );
+       }
+
        public function execute() {
                $db = $this->getDB();
                $params = $this->extractRequestParams();
@@ -51,8 +56,9 @@ class ApiQueryAllUsers extends ApiQueryBase {
                        $fld_groups = isset( $prop['groups'] );
                        $fld_rights = isset( $prop['rights'] );
                        $fld_registration = isset( $prop['registration'] );
+                       $fld_implicitgroups = isset( $prop['implicitgroups'] );
                } else {
-                       $fld_blockinfo = $fld_editcount = $fld_groups = $fld_registration = $fld_rights = false;
+                       $fld_blockinfo = $fld_editcount = $fld_groups = $fld_registration = $fld_rights = $fld_implicitgroups = false;
                }
 
                $limit = $params['limit'];
@@ -61,13 +67,18 @@ class ApiQueryAllUsers extends ApiQueryBase {
                $useIndex = true;
 
                $dir = ( $params['dir'] == 'descending' ? 'older' : 'newer' );
-               $from = is_null( $params['from'] ) ? null : $this->keyToTitle( $params['from'] );
-               $to = is_null( $params['to'] ) ? null : $this->keyToTitle( $params['to'] );
+               $from = is_null( $params['from'] ) ? null : $this->getCanonicalUserName( $params['from'] );
+               $to = is_null( $params['to'] ) ? null : $this->getCanonicalUserName( $params['to'] );
+
+               # MySQL doesn't seem to use 'equality propagation' here, so like the
+               # ActiveUsers special page, we have to use rc_user_text for some cases.
+               $userFieldToSort = $params['activeusers'] ? 'rc_user_text' : 'user_name';
 
-               $this->addWhereRange( 'user_name', $dir, $from, $to );
+               $this->addWhereRange( $userFieldToSort, $dir, $from, $to );
 
                if ( !is_null( $params['prefix'] ) ) {
-                       $this->addWhere( 'user_name' . $db->buildLike( $this->keyToTitle( $params['prefix'] ), $db->anyString() ) );
+                       $this->addWhere( $userFieldToSort .
+                               $db->buildLike( $this->getCanonicalUserName( $params['prefix'] ), $db->anyString() ) );
                }
 
                if ( !is_null( $params['rights'] ) ) {
@@ -147,7 +158,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
                        $timestamp = $db->timestamp( wfTimestamp( TS_UNIX ) - $wgActiveUserDays*24*3600 );
                        $this->addWhere( "rc_timestamp >= {$db->addQuotes( $timestamp )}" );
 
-                       $this->addOption( 'GROUP BY', 'user_name' );
+                       $this->addOption( 'GROUP BY', $userFieldToSort );
                }
 
                $this->addOption( 'LIMIT', $sqlLimit );
@@ -189,15 +200,14 @@ class ApiQueryAllUsers extends ApiQueryBase {
                                        $lastUserData = null;
 
                                        if ( !$fit ) {
-                                               $this->setContinueEnumParameter( 'from',
-                                                               $this->keyToTitle( $lastUserData['name'] ) );
+                                               $this->setContinueEnumParameter( 'from', $lastUserData['name'] );
                                                break;
                                        }
                                }
 
                                if ( $count > $limit ) {
                                        // We've reached the one extra which shows that there are additional pages to be had. Stop here...
-                                       $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->user_name ) );
+                                       $this->setContinueEnumParameter( 'from', $row->user_name );
                                        break;
                                }
 
@@ -234,26 +244,45 @@ class ApiQueryAllUsers extends ApiQueryBase {
                                        'MediaWiki configuration error: the database contains more user groups than known to User::getAllGroups() function' );
                        }
 
+                       $lastUserObj = User::newFromId( $row->user_id );
+
                        // Add user's group info
                        if ( $fld_groups ) {
                                if ( !isset( $lastUserData['groups'] ) ) {
-                                       $lastUserData['groups'] = ApiQueryUsers::getAutoGroups( User::newFromName( $lastUser ) );
+                                       if ( $lastUserObj ) {
+                                               $lastUserData['groups'] = ApiQueryUsers::getAutoGroups( $lastUserObj );
+                                       } else {
+                                               // This should not normally happen
+                                               $lastUserData['groups'] = array();
+                                       }
                                }
 
                                if ( !is_null( $row->ug_group2 ) ) {
                                        $lastUserData['groups'][] = $row->ug_group2;
                                }
+
                                $result->setIndexedTagName( $lastUserData['groups'], 'g' );
                        }
 
+                       if ( $fld_implicitgroups && !isset( $lastUserData['implicitgroups'] ) && $lastUserObj ) {
+                               $lastUserData['implicitgroups'] = ApiQueryUsers::getAutoGroups( $lastUserObj );
+                               $result->setIndexedTagName( $lastUserData['implicitgroups'], 'g' );
+                       }
                        if ( $fld_rights ) {
                                if ( !isset( $lastUserData['rights'] ) ) {
-                                       $lastUserData['rights'] =  User::getGroupPermissions( User::newFromName( $lastUser )->getAutomaticGroups() );
+                                       if ( $lastUserObj ) {
+                                               $lastUserData['rights'] =  User::getGroupPermissions( $lastUserObj->getAutomaticGroups() );
+                                       } else {
+                                               // This should not normally happen
+                                               $lastUserData['rights'] = array();
+                                       }
                                }
+
                                if ( !is_null( $row->ug_group2 ) ) {
                                        $lastUserData['rights'] = array_unique( array_merge( $lastUserData['rights'],
-                                                                               User::getGroupPermissions( array( $row->ug_group2 ) ) ) );
+                                               User::getGroupPermissions( array( $row->ug_group2 ) ) ) );
                                }
+
                                $result->setIndexedTagName( $lastUserData['rights'], 'r' );
                        }
                }
@@ -262,8 +291,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
                        $fit = $result->addValue( array( 'query', $this->getModuleName() ),
                                null, $lastUserData );
                        if ( !$fit ) {
-                               $this->setContinueEnumParameter( 'from',
-                                       $this->keyToTitle( $lastUserData['name'] ) );
+                               $this->setContinueEnumParameter( 'from', $lastUserData['name'] );
                        }
                }
 
@@ -304,6 +332,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
                                ApiBase::PARAM_TYPE => array(
                                        'blockinfo',
                                        'groups',
+                                       'implicitgroups',
                                        'rights',
                                        'editcount',
                                        'registration'
@@ -333,11 +362,12 @@ class ApiQueryAllUsers extends ApiQueryBase {
                        'rights' => 'Limit users to given right(s)',
                        'prop' => array(
                                'What pieces of information to include.',
-                               ' blockinfo     - Adds the information about a current block on the user',
-                               ' groups        - Lists groups that the user is in. This uses more server resources and may return fewer results than the limit',
-                               ' rights        - Lists rights that the user has',
-                               ' editcount     - Adds the edit count of the user',
-                               ' registration  - Adds the timestamp of when the user registered if available (may be blank)',
+                               ' blockinfo      - Adds the information about a current block on the user',
+                               ' groups         - Lists groups that the user is in. This uses more server resources and may return fewer results than the limit',
+                               ' implicitgroups - Lists all the groups the user is automatically in',
+                               ' rights         - Lists rights that the user has',
+                               ' editcount      - Adds the edit count of the user',
+                               ' registration   - Adds the timestamp of when the user registered if available (may be blank)',
                                ),
                        'limit' => 'How many total user names to return',
                        'witheditsonly' => 'Only list users who have made edits',
@@ -355,14 +385,14 @@ class ApiQueryAllUsers extends ApiQueryBase {
                ) );
        }
 
-       protected function getExamples() {
+       public function getExamples() {
                return array(
                        'api.php?action=query&list=allusers&aufrom=Y',
                );
        }
 
        public function getHelpUrls() {
-               return 'http://www.mediawiki.org/wiki/API:Allusers';
+               return 'https://www.mediawiki.org/wiki/API:Allusers';
        }
 
        public function getVersion() {