summaryrefslogtreecommitdiff
path: root/includes/api/ApiQueryUsers.php
diff options
context:
space:
mode:
Diffstat (limited to 'includes/api/ApiQueryUsers.php')
-rw-r--r--includes/api/ApiQueryUsers.php202
1 files changed, 141 insertions, 61 deletions
diff --git a/includes/api/ApiQueryUsers.php b/includes/api/ApiQueryUsers.php
index 1e50c59a..5dc0e4a6 100644
--- a/includes/api/ApiQueryUsers.php
+++ b/includes/api/ApiQueryUsers.php
@@ -23,9 +23,9 @@
* http://www.gnu.org/copyleft/gpl.html
*/
-if (!defined('MEDIAWIKI')) {
+if ( !defined( 'MEDIAWIKI' ) ) {
// Eclipse helper - will be ignored in production
- require_once ('ApiQueryBase.php');
+ require_once ( 'ApiQueryBase.php' );
}
/**
@@ -33,11 +33,40 @@ if (!defined('MEDIAWIKI')) {
*
* @ingroup API
*/
-
class ApiQueryUsers extends ApiQueryBase {
- public function __construct($query, $moduleName) {
- parent :: __construct($query, $moduleName, 'us');
+ public function __construct( $query, $moduleName ) {
+ 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)
+ */
+ protected function getTokenFunctions() {
+ // Don't call the hooks twice
+ 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' ) ) )
+ return array();
+
+ $this->tokenFunctions = array(
+ 'userrights' => array( 'ApiQueryUsers', 'getUserrightsToken' ),
+ );
+ wfRunHooks( 'APIQueryUsersTokens', array( &$this->tokenFunctions ) );
+ return $this->tokenFunctions;
+ }
+
+ public static function getUserrightsToken( $user )
+ {
+ global $wgUser;
+ // Since the permissions check for userrights is non-trivial,
+ // don't bother with it here
+ return $wgUser->editToken( $user->getName() );
}
public function execute() {
@@ -45,8 +74,8 @@ if (!defined('MEDIAWIKI')) {
$result = $this->getResult();
$r = array();
- if (!is_null($params['prop'])) {
- $this->prop = array_flip($params['prop']);
+ if ( !is_null( $params['prop'] ) ) {
+ $this->prop = array_flip( $params['prop'] );
} else {
$this->prop = array();
}
@@ -55,17 +84,17 @@ if (!defined('MEDIAWIKI')) {
$goodNames = $done = array();
$result = $this->getResult();
// Canonicalize user names
- foreach($users as $u) {
- $n = User::getCanonicalName($u);
- if($n === false || $n === '')
+ foreach ( $users as $u ) {
+ $n = User::getCanonicalName( $u );
+ if ( $n === false || $n === '' )
{
- $vals = array('name' => $u, 'invalid' => '');
- $fit = $result->addValue(array('query', $this->getModuleName()),
- null, $vals);
- if(!$fit)
+ $vals = array( 'name' => $u, 'invalid' => '' );
+ $fit = $result->addValue( array( 'query', $this->getModuleName() ),
+ null, $vals );
+ if ( !$fit )
{
- $this->setContinueEnumParameter('users',
- implode('|', array_diff($users, $done)));
+ $this->setContinueEnumParameter( 'users',
+ implode( '|', array_diff( $users, $done ) ) );
$goodNames = array();
break;
}
@@ -74,78 +103,122 @@ if (!defined('MEDIAWIKI')) {
else
$goodNames[] = $n;
}
- if(count($goodNames))
+
+ if ( count( $goodNames ) )
{
$db = $this->getDb();
- $this->addTables('user', 'u1');
- $this->addFields('u1.*');
- $this->addWhereFld('u1.user_name', $goodNames);
-
- if(isset($this->prop['groups'])) {
- $this->addTables('user_groups');
- $this->addJoinConds(array('user_groups' => array('LEFT JOIN', 'ug_user=u1.user_id')));
- $this->addFields('ug_group');
+ $this->addTables( 'user', 'u1' );
+ $this->addFields( 'u1.*' );
+ $this->addWhereFld( 'u1.user_name', $goodNames );
+
+ if ( isset( $this->prop['groups'] ) ) {
+ $this->addTables( 'user_groups' );
+ $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'));
+ 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' ) );
}
$data = array();
- $res = $this->select(__METHOD__);
- while(($r = $db->fetchObject($res))) {
- $user = User::newFromRow($r);
+ $res = $this->select( __METHOD__ );
+ while ( ( $r = $db->fetchObject( $res ) ) ) {
+ $user = User::newFromRow( $r );
$name = $user->getName();
$data[$name]['name'] = $name;
- if(isset($this->prop['editcount']))
- $data[$name]['editcount'] = intval($user->getEditCount());
- 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['editcount'] ) )
+ $data[$name]['editcount'] = intval( $user->getEditCount() );
+ if ( isset( $this->prop['registration'] ) )
+ $data[$name]['registration'] = wfTimestampOrNull( TS_ISO_8601, $user->getRegistration() );
+ if ( isset( $this->prop['groups'] ) && !is_null( $r->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)) {
+ if ( isset( $this->prop['blockinfo'] ) && !is_null( $r->blocker_name ) ) {
$data[$name]['blockedby'] = $r->blocker_name;
$data[$name]['blockreason'] = $r->ipb_reason;
}
- if(isset($this->prop['emailable']) && $user->canReceiveEmail())
+ if ( isset( $this->prop['emailable'] ) && $user->canReceiveEmail() )
$data[$name]['emailable'] = '';
+
+ if ( isset( $this->prop['gender'] ) ) {
+ $gender = $user->getOption( 'gender' );
+ if ( strval( $gender ) === '' ) {
+ $gender = 'unknown';
+ }
+ $data[$name]['gender'] = $gender;
+ }
+
+ if ( !is_null( $params['token'] ) )
+ {
+ $tokenFunctions = $this->getTokenFunctions();
+ foreach ( $params['token'] as $t )
+ {
+ $val = call_user_func( $tokenFunctions[$t], $user );
+ if ( $val === false )
+ $this->setWarning( "Action '$t' is not allowed for the current user" );
+ else
+ $data[$name][$t . 'token'] = $val;
+ }
+ }
}
}
// Second pass: add result data to $retval
- foreach($goodNames as $u) {
- if(!isset($data[$u]))
- $data[$u] = array('name' => $u, 'missing' => '');
- else {
- if(isset($this->prop['groups']) && isset($data[$u]['groups']))
- $this->getResult()->setIndexedTagName($data[$u]['groups'], 'g');
+ foreach ( $goodNames as $u ) {
+ if ( !isset( $data[$u] ) ) {
+ $data[$u] = array( 'name' => $u );
+ $urPage = new UserrightsPage;
+ $iwUser = $urPage->fetchUser( $u );
+ if ( $iwUser instanceof UserRightsProxy ) {
+ $data[$u]['interwiki'] = '';
+ if ( !is_null( $params['token'] ) )
+ {
+ $tokenFunctions = $this->getTokenFunctions();
+ foreach ( $params['token'] as $t )
+ {
+ $val = call_user_func( $tokenFunctions[$t], $iwUser );
+ if ( $val === false )
+ $this->setWarning( "Action '$t' is not allowed for the current user" );
+ else
+ $data[$u][$t . 'token'] = $val;
+ }
+ }
+ } else
+ $data[$u]['missing'] = '';
+ } else {
+ if ( isset( $this->prop['groups'] ) && isset( $data[$u]['groups'] ) )
+ $this->getResult()->setIndexedTagName( $data[$u]['groups'], 'g' );
}
- $fit = $result->addValue(array('query', $this->getModuleName()),
- null, $data[$u]);
- if(!$fit)
+ $fit = $result->addValue( array( 'query', $this->getModuleName() ),
+ null, $data[$u] );
+ if ( !$fit )
{
- $this->setContinueEnumParameter('users',
- implode('|', array_diff($users, $done)));
+ $this->setContinueEnumParameter( 'users',
+ implode( '|', array_diff( $users, $done ) ) );
break;
}
$done[] = $u;
}
- return $this->getResult()->setIndexedTagName_internal(array('query', $this->getModuleName()), 'user');
+ return $this->getResult()->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'user' );
}
public function getCacheMode( $params ) {
- return 'public';
+ if ( isset( $params['token'] ) ) {
+ return 'private';
+ } else {
+ return 'public';
+ }
}
public function getAllowedParams() {
return array (
'prop' => array (
- ApiBase :: PARAM_DFLT => NULL,
+ ApiBase :: PARAM_DFLT => null,
ApiBase :: PARAM_ISMULTI => true,
ApiBase :: PARAM_TYPE => array (
'blockinfo',
@@ -153,11 +226,16 @@ if (!defined('MEDIAWIKI')) {
'editcount',
'registration',
'emailable',
+ 'gender',
)
),
'users' => array(
ApiBase :: PARAM_ISMULTI => true
- )
+ ),
+ 'token' => array(
+ ApiBase :: PARAM_TYPE => array_keys( $this->getTokenFunctions() ),
+ ApiBase :: PARAM_ISMULTI => true
+ ),
);
}
@@ -170,8 +248,10 @@ if (!defined('MEDIAWIKI')) {
' 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'
+ 'users' => 'A list of users to obtain the same information for',
+ 'token' => 'Which tokens to obtain for each user',
);
}
@@ -180,10 +260,10 @@ if (!defined('MEDIAWIKI')) {
}
protected function getExamples() {
- return 'api.php?action=query&list=users&ususers=brion|TimStarling&usprop=groups|editcount';
+ return 'api.php?action=query&list=users&ususers=brion|TimStarling&usprop=groups|editcount|gender';
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQueryUsers.php 69986 2010-07-27 03:57:39Z tstarling $';
+ return __CLASS__ . ': $Id: ApiQueryUsers.php 69932 2010-07-26 08:03:21Z tstarling $';
}
}