41 private $userNameUtils;
47 private $userGroupManager;
93 parent::__construct( $query, $moduleName,
'us' );
94 $this->userNameUtils = $userNameUtils;
95 $this->userFactory = $userFactory;
96 $this->userGroupManager = $userGroupManager;
97 $this->genderCache = $genderCache;
98 $this->authManager = $authManager;
102 $db = $this->
getDB();
106 if ( $params[
'prop'] !==
null ) {
107 $this->prop = array_fill_keys( $params[
'prop'],
true );
111 $useNames = $params[
'users'] !==
null;
113 $users = (array)$params[
'users'];
114 $userids = (array)$params[
'userids'];
116 $goodNames = $done = [];
119 foreach ( $users as $u ) {
120 $n = $this->userNameUtils->getCanonical( $u );
121 if ( $n ===
false || $n ===
'' ) {
122 $vals = [
'name' => $u,
'invalid' =>
true ];
123 $fit = $result->addValue( [
'query', $this->
getModuleName() ],
127 implode(
'|', array_diff( $users, $done ) ) );
138 $parameters = &$goodNames;
140 $parameters = &$userids;
145 if ( count( $parameters ) ) {
147 $this->
addTables( $userQuery[
'tables'] );
148 $this->
addFields( $userQuery[
'fields'] );
156 $this->addBlockInfoToQuery( isset( $this->prop[
'blockinfo'] ) );
163 if ( isset( $this->prop[
'groups'] ) || isset( $this->prop[
'rights'] ) ) {
174 $this->
addJoinConds( [
'user_groups' => [
'JOIN',
'ug_user=user_id' ] ] );
176 $this->
addFields( $this->userGroupManager->getQueryInfo()[
'fields'] );
177 $this->
addWhere(
'ug_expiry IS NULL OR ug_expiry >= ' .
178 $db->addQuotes( $db->timestamp() ) );
179 $userGroupsRes = $this->
select( __METHOD__ );
181 foreach ( $userGroupsRes as $row ) {
182 $userGroups[$row->user_name][] = $row;
185 if ( isset( $this->prop[
'gender'] ) ) {
187 foreach (
$res as $row ) {
188 $userNames[] = $row->user_name;
190 $this->genderCache->doQuery( $userNames, __METHOD__ );
193 foreach (
$res as $row ) {
196 if ( !isset( $userGroups ) ) {
197 $user = $this->userFactory->newFromRow( $row );
199 if ( !isset( $userGroups[$row->user_name] ) || !is_array( $userGroups[$row->user_name] ) ) {
200 $userGroups[$row->user_name] = [];
202 $user = $this->userFactory->newFromRow( $row, [
'user_groups' => $userGroups[$row->user_name] ] );
205 $key = $user->getName();
207 $key = $user->getId();
209 $data[$key][
'userid'] = $user->getId();
210 $data[$key][
'name'] = $user->getName();
212 if ( isset( $this->prop[
'editcount'] ) ) {
213 $data[$key][
'editcount'] = $user->getEditCount();
216 if ( isset( $this->prop[
'registration'] ) ) {
217 $data[$key][
'registration'] =
wfTimestampOrNull( TS_ISO_8601, $user->getRegistration() );
220 if ( isset( $this->prop[
'groups'] ) ) {
221 $data[$key][
'groups'] = $this->userGroupManager->getUserEffectiveGroups( $user );
224 if ( isset( $this->prop[
'groupmemberships'] ) ) {
225 $data[$key][
'groupmemberships'] = array_map(
static function ( $ugm ) {
227 'group' => $ugm->getGroup(),
230 }, $this->userGroupManager->getUserGroupMemberships( $user ) );
233 if ( isset( $this->prop[
'implicitgroups'] ) ) {
234 $data[$key][
'implicitgroups'] = $this->userGroupManager->getUserImplicitGroups( $user );
237 if ( isset( $this->prop[
'rights'] ) ) {
239 ->getUserPermissions( $user );
241 if ( $row->ipb_deleted ) {
242 $data[$key][
'hidden'] =
true;
244 if ( isset( $this->prop[
'blockinfo'] ) && $row->ipb_by_text !==
null ) {
245 $data[$key] += $this->getBlockDetails( DatabaseBlock::newFromRow( $row ) );
248 if ( isset( $this->prop[
'emailable'] ) ) {
249 $data[$key][
'emailable'] = $user->canReceiveEmail();
252 if ( isset( $this->prop[
'gender'] ) ) {
253 $data[$key][
'gender'] = $this->genderCache->getGenderOf( $user, __METHOD__ );
256 if ( isset( $this->prop[
'centralids'] ) ) {
258 $this->
getConfig(), $user, $params[
'attachedwiki']
266 foreach ( $parameters as $u ) {
267 if ( !isset( $data[$u] ) ) {
269 $data[$u] = [
'name' => $u ];
273 $iwUser = $urPage->fetchUser( $u );
276 $data[$u][
'interwiki'] =
true;
278 $data[$u][
'missing'] =
true;
279 if ( isset( $this->prop[
'cancreate'] ) ) {
280 $status = $this->authManager->canCreateAccount( $u );
281 $data[$u][
'cancreate'] = $status->isGood();
282 if ( !$status->isGood() ) {
283 $data[$u][
'cancreateerror'] = $this->
getErrorFormatter()->arrayFromStatus( $status );
288 $data[$u] = [
'userid' => $u,
'missing' =>
true ];
292 if ( isset( $this->prop[
'groups'] ) && isset( $data[$u][
'groups'] ) ) {
296 if ( isset( $this->prop[
'groupmemberships'] ) && isset( $data[$u][
'groupmemberships'] ) ) {
300 if ( isset( $this->prop[
'implicitgroups'] ) && isset( $data[$u][
'implicitgroups'] ) ) {
304 if ( isset( $this->prop[
'rights'] ) && isset( $data[$u][
'rights'] ) ) {
310 $fit = $result->addValue( [
'query', $this->
getModuleName() ],
null, $data[$u] );
314 implode(
'|', array_diff( $users, $done ) ) );
317 implode(
'|', array_diff( $userids, $done ) ) );
323 $result->addIndexedTagName( [
'query', $this->
getModuleName() ],
'user' );
327 if ( array_diff( (array)$params[
'prop'], static::$publicProps ) ) {
328 return 'anon-public-user-private';
337 ParamValidator::PARAM_ISMULTI =>
true,
338 ParamValidator::PARAM_TYPE => [
355 'attachedwiki' =>
null,
357 ParamValidator::PARAM_ISMULTI =>
true
360 ParamValidator::PARAM_ISMULTI =>
true,
361 ParamValidator::PARAM_TYPE =>
'integer'
368 'action=query&list=users&ususers=Example&usprop=groups|editcount|gender'
369 =>
'apihelp-query+users-example-simple',
374 return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Users';
wfTimestampOrNull( $outputtype=TS_UNIX, $ts=null)
Return a formatted timestamp, or null if input is null.
getPermissionManager()
Obtain a PermissionManager instance that subclasses may use in their authorization checks.
const PARAM_HELP_MSG_PER_VALUE
((string|array|Message)[]) When PARAM_TYPE is an array, this is an array mapping those values to $msg...
requireMaxOneParameter( $params,... $required)
Die if more than one of a certain set of parameters is set and not false.
getResult()
Get the result object.
extractRequestParams( $options=[])
Using getAllowedParams(), this function makes an array of the values provided by the user,...
getModuleName()
Get the name of the module being executed by this instance.
This is a base class for all Query modules.
setContinueEnumParameter( $paramName, $paramValue)
Set a query-continue value.
resetQueryParams()
Blank the internal arrays with query parameters.
addFields( $value)
Add a set of fields to select to the internal array.
addTables( $tables, $alias=null)
Add a set of tables to the internal array.
getDB()
Get the Query database connection (read-only)
select( $method, $extraQuery=[], array &$hookData=null)
Execute a SELECT query based on the values in the internal arrays.
addJoinConds( $join_conds)
Add a set of JOIN conditions to the internal array.
addWhereFld( $field, $value)
Equivalent to addWhere( [ $field => $value ] )
addWhere( $value)
Add a set of WHERE clauses to the internal array.
static getCentralUserInfo(Config $config, UserIdentity $user, $attachedWiki=UserIdentity::LOCAL)
Get central user info.
Query module to get information about a list of users.
execute()
Evaluates the parameters, performs the requested query, and sets up the result.
static array $publicProps
Properties whose contents does not depend on who is looking at them.
getHelpUrls()
Return links to more detailed help pages about the module.
getAllowedParams()
Returns an array of allowed parameters (parameter name) => (default value) or (parameter name) => (ar...
getExamplesMessages()
Returns usage examples for this module.
__construct(ApiQuery $query, $moduleName, UserNameUtils $userNameUtils, UserFactory $userFactory, UserGroupManager $userGroupManager, GenderCache $genderCache, AuthManager $authManager)
getCacheMode( $params)
Get the cache mode for the data generated by this module.
This is the main query class.
static setArrayType(array &$arr, $type, $kvpKeyName=null)
Set the array data type.
static setIndexedTagName(array &$arr, $tag)
Set the tag name for numeric-keyed values in XML format.
static formatExpiry( $expiry, $infinity='infinity')
Format an expiry timestamp for API output.
getContext()
Get the base IContextSource object.
Caches user genders when needed to use correct namespace aliases.
setContext( $context)
Sets the context this SpecialPage is executed in.
Cut-down copy of User interface for local-interwiki-database user rights manipulation.
static getQueryInfo()
Return the tables, fields, and join conditions to be selected to create a new user object.
Special page to allow managing user group membership.
trait ApiQueryBlockInfoTrait