From 9db190c7e736ec8d063187d4241b59feaf7dc2d1 Mon Sep 17 00:00:00 2001 From: Pierre Schmitz Date: Wed, 22 Jun 2011 11:28:20 +0200 Subject: update to MediaWiki 1.17.0 --- includes/api/ApiQueryUsers.php | 190 ++++++++++++++++++++++++----------------- 1 file changed, 112 insertions(+), 78 deletions(-) (limited to 'includes/api/ApiQueryUsers.php') diff --git a/includes/api/ApiQueryUsers.php b/includes/api/ApiQueryUsers.php index 5dc0e4a6..2619d200 100644 --- a/includes/api/ApiQueryUsers.php +++ b/includes/api/ApiQueryUsers.php @@ -1,11 +1,10 @@ .@home.nl + * Created on July 30, 2007 + * + * Copyright © 2007 Roan Kattouw .@home.nl * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,13 +18,15 @@ * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * http://www.gnu.org/copyleft/gpl.html + * + * @file */ if ( !defined( 'MEDIAWIKI' ) ) { // Eclipse helper - will be ignored in production - require_once ( 'ApiQueryBase.php' ); + require_once( 'ApiQueryBase.php' ); } /** @@ -35,24 +36,28 @@ if ( !defined( 'MEDIAWIKI' ) ) { */ class ApiQueryUsers extends ApiQueryBase { + private $tokenFunctions, $prop; + public function __construct( $query, $moduleName ) { - parent :: __construct( $query, $moduleName, 'us' ); + parent::__construct( $query, $moduleName, 'us' ); } - + /** * Get an array mapping token names to their handler functions. * The prototype for a token function is func($user) * it should return a token or false (permission denied) - * @return array(tokenname => function) + * @return Array tokenname => function */ protected function getTokenFunctions() { // Don't call the hooks twice - if ( isset( $this->tokenFunctions ) ) + if ( isset( $this->tokenFunctions ) ) { return $this->tokenFunctions; + } // If we're in JSON callback mode, no tokens can be obtained - if ( !is_null( $this->getMain()->getRequest()->getVal( 'callback' ) ) ) + if ( !is_null( $this->getMain()->getRequest()->getVal( 'callback' ) ) ) { return array(); + } $this->tokenFunctions = array( 'userrights' => array( 'ApiQueryUsers', 'getUserrightsToken' ), @@ -60,9 +65,8 @@ if ( !defined( 'MEDIAWIKI' ) ) { wfRunHooks( 'APIQueryUsersTokens', array( &$this->tokenFunctions ) ); return $this->tokenFunctions; } - - public static function getUserrightsToken( $user ) - { + + public static function getUserrightsToken( $user ) { global $wgUser; // Since the permissions check for userrights is non-trivial, // don't bother with it here @@ -71,8 +75,6 @@ if ( !defined( 'MEDIAWIKI' ) ) { public function execute() { $params = $this->extractRequestParams(); - $result = $this->getResult(); - $r = array(); if ( !is_null( $params['prop'] ) ) { $this->prop = array_flip( $params['prop'] ); @@ -86,27 +88,23 @@ if ( !defined( 'MEDIAWIKI' ) ) { // Canonicalize user names foreach ( $users as $u ) { $n = User::getCanonicalName( $u ); - if ( $n === false || $n === '' ) - { + if ( $n === false || $n === '' ) { $vals = array( 'name' => $u, 'invalid' => '' ); $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals ); - if ( !$fit ) - { + if ( !$fit ) { $this->setContinueEnumParameter( 'users', implode( '|', array_diff( $users, $done ) ) ); $goodNames = array(); break; } $done[] = $u; - } - else + } else { $goodNames[] = $n; + } } - if ( count( $goodNames ) ) - { - $db = $this->getDb(); + if ( count( $goodNames ) ) { $this->addTables( 'user', 'u1' ); $this->addFields( 'u1.*' ); $this->addWhereFld( 'u1.user_name', $goodNames ); @@ -116,35 +114,50 @@ if ( !defined( 'MEDIAWIKI' ) ) { $this->addJoinConds( array( 'user_groups' => array( 'LEFT JOIN', 'ug_user=u1.user_id' ) ) ); $this->addFields( 'ug_group' ); } - if ( isset( $this->prop['blockinfo'] ) ) { - $this->addTables( 'ipblocks' ); - $this->addTables( 'user', 'u2' ); - $u2 = $this->getAliasedName( 'user', 'u2' ); - $this->addJoinConds( array( - 'ipblocks' => array( 'LEFT JOIN', 'ipb_user=u1.user_id' ), - $u2 => array( 'LEFT JOIN', 'ipb_by=u2.user_id' ) ) ); - $this->addFields( array( 'ipb_reason', 'u2.user_name AS blocker_name' ) ); - } + + $this->showHiddenUsersAddBlockInfo( isset( $this->prop['blockinfo'] ) ); $data = array(); $res = $this->select( __METHOD__ ); - while ( ( $r = $db->fetchObject( $res ) ) ) { - $user = User::newFromRow( $r ); + foreach ( $res as $row ) { + $user = User::newFromRow( $row ); $name = $user->getName(); $data[$name]['name'] = $name; - if ( isset( $this->prop['editcount'] ) ) + + if ( isset( $this->prop['editcount'] ) ) { $data[$name]['editcount'] = intval( $user->getEditCount() ); - if ( isset( $this->prop['registration'] ) ) + } + + if ( isset( $this->prop['registration'] ) ) { $data[$name]['registration'] = wfTimestampOrNull( TS_ISO_8601, $user->getRegistration() ); - if ( isset( $this->prop['groups'] ) && !is_null( $r->ug_group ) ) + } + + if ( isset( $this->prop['groups'] ) && !is_null( $row->ug_group ) ) { // This row contains only one group, others will be added from other rows - $data[$name]['groups'][] = $r->ug_group; - if ( isset( $this->prop['blockinfo'] ) && !is_null( $r->blocker_name ) ) { - $data[$name]['blockedby'] = $r->blocker_name; - $data[$name]['blockreason'] = $r->ipb_reason; + $data[$name]['groups'][] = $row->ug_group; } - if ( isset( $this->prop['emailable'] ) && $user->canReceiveEmail() ) + + if ( isset( $this->prop['rights'] ) && !is_null( $row->ug_group ) ) { + if ( !isset( $data[$name]['rights'] ) ) { + $data[$name]['rights'] = User::getGroupPermissions( User::getImplicitGroups() ); + } + + $data[$name]['rights'] = array_unique( array_merge( $data[$name]['rights'], + User::getGroupPermissions( array( $row->ug_group ) ) ) ); + $result->setIndexedTagName( $data[$name]['rights'], 'r' ); + } + if ( $row->ipb_deleted ) { + $data[$name]['hidden'] = ''; + } + if ( isset( $this->prop['blockinfo'] ) && !is_null( $row->ipb_by_text ) ) { + $data[$name]['blockedby'] = $row->ipb_by_text; + $data[$name]['blockreason'] = $row->ipb_reason; + $data[$name]['blockexpiry'] = $row->ipb_expiry; + } + + if ( isset( $this->prop['emailable'] ) && $user->canReceiveEmail() ) { $data[$name]['emailable'] = ''; + } if ( isset( $this->prop['gender'] ) ) { $gender = $user->getOption( 'gender' ); @@ -154,16 +167,15 @@ if ( !defined( 'MEDIAWIKI' ) ) { $data[$name]['gender'] = $gender; } - if ( !is_null( $params['token'] ) ) - { + if ( !is_null( $params['token'] ) ) { $tokenFunctions = $this->getTokenFunctions(); - foreach ( $params['token'] as $t ) - { + foreach ( $params['token'] as $t ) { $val = call_user_func( $tokenFunctions[$t], $user ); - if ( $val === false ) + if ( $val === false ) { $this->setWarning( "Action '$t' is not allowed for the current user" ); - else + } else { $data[$name][$t . 'token'] = $val; + } } } } @@ -174,30 +186,37 @@ if ( !defined( 'MEDIAWIKI' ) ) { $data[$u] = array( 'name' => $u ); $urPage = new UserrightsPage; $iwUser = $urPage->fetchUser( $u ); + if ( $iwUser instanceof UserRightsProxy ) { $data[$u]['interwiki'] = ''; - if ( !is_null( $params['token'] ) ) - { + + if ( !is_null( $params['token'] ) ) { $tokenFunctions = $this->getTokenFunctions(); - foreach ( $params['token'] as $t ) - { + + foreach ( $params['token'] as $t ) { $val = call_user_func( $tokenFunctions[$t], $iwUser ); - if ( $val === false ) + if ( $val === false ) { $this->setWarning( "Action '$t' is not allowed for the current user" ); - else + } else { $data[$u][$t . 'token'] = $val; + } } } - } else + } else { $data[$u]['missing'] = ''; + } } else { - if ( isset( $this->prop['groups'] ) && isset( $data[$u]['groups'] ) ) + if ( isset( $this->prop['groups'] ) && isset( $data[$u]['groups'] ) ) { + $autolist = ApiQueryUsers::getAutoGroups( User::newFromName( $u ) ); + + $data[$u]['groups'] = array_merge( $autolist, $data[$u]['groups'] ); + $this->getResult()->setIndexedTagName( $data[$u]['groups'], 'g' ); + } } $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $data[$u] ); - if ( !$fit ) - { + if ( !$fit ) { $this->setContinueEnumParameter( 'users', implode( '|', array_diff( $users, $done ) ) ); break; @@ -207,20 +226,34 @@ if ( !defined( 'MEDIAWIKI' ) ) { return $this->getResult()->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'user' ); } + /** + * Gets all the groups that a user is automatically a member of + * @return array + */ + public static function getAutoGroups( $user ) { + $groups = array( '*' ); + + if ( !$user->isAnon() ) { + $groups[] = 'user'; + } + + return array_merge( $groups, Autopromote::getAutopromoteGroups( $user ) ); + } + public function getCacheMode( $params ) { if ( isset( $params['token'] ) ) { return 'private'; } else { - return 'public'; + return 'anon-public-user-private'; } } public function getAllowedParams() { - return array ( - 'prop' => array ( - ApiBase :: PARAM_DFLT => null, - ApiBase :: PARAM_ISMULTI => true, - ApiBase :: PARAM_TYPE => array ( + return array( + 'prop' => array( + ApiBase::PARAM_DFLT => null, + ApiBase::PARAM_ISMULTI => true, + ApiBase::PARAM_TYPE => array( 'blockinfo', 'groups', 'editcount', @@ -230,25 +263,26 @@ if ( !defined( 'MEDIAWIKI' ) ) { ) ), 'users' => array( - ApiBase :: PARAM_ISMULTI => true + ApiBase::PARAM_ISMULTI => true ), 'token' => array( - ApiBase :: PARAM_TYPE => array_keys( $this->getTokenFunctions() ), - ApiBase :: PARAM_ISMULTI => true + ApiBase::PARAM_TYPE => array_keys( $this->getTokenFunctions() ), + ApiBase::PARAM_ISMULTI => true ), ); } public function getParamDescription() { - return array ( + return array( 'prop' => array( 'What pieces of information to include', - ' blockinfo - tags if the user is blocked, by whom, and for what reason', - ' groups - lists all the groups the user belongs to', - ' editcount - adds the user\'s edit count', - ' registration - adds the user\'s registration timestamp', - ' emailable - tags if the user can and wants to receive e-mail through [[Special:Emailuser]]', - ' gender - tags the gender of the user. Returns "male", "female", or "unknown"', + ' blockinfo - Tags if the user is blocked, by whom, and for what reason', + ' groups - Lists all the groups the user(s) belongs to', + ' rights - Lists all the rights the user(s) has', + ' editcount - Adds the user\'s edit count', + ' registration - Adds the user\'s registration timestamp', + ' emailable - Tags if the user can and wants to receive e-mail through [[Special:Emailuser]]', + ' gender - Tags the gender of the user. Returns "male", "female", or "unknown"', ), 'users' => 'A list of users to obtain the same information for', 'token' => 'Which tokens to obtain for each user', @@ -264,6 +298,6 @@ if ( !defined( 'MEDIAWIKI' ) ) { } public function getVersion() { - return __CLASS__ . ': $Id: ApiQueryUsers.php 69932 2010-07-26 08:03:21Z tstarling $'; + return __CLASS__ . ': $Id: ApiQueryUsers.php 85354 2011-04-04 18:25:31Z demon $'; } } -- cgit v1.2.3-54-g00ecf