MediaWiki REL1_32
ApiQueryUserInfo.php
Go to the documentation of this file.
1<?php
24
31
32 const WL_UNREAD_LIMIT = 1000;
33
34 private $params = [];
35 private $prop = [];
36
37 public function __construct( ApiQuery $query, $moduleName ) {
38 parent::__construct( $query, $moduleName, 'ui' );
39 }
40
41 public function execute() {
42 $this->params = $this->extractRequestParams();
43 $result = $this->getResult();
44
45 if ( !is_null( $this->params['prop'] ) ) {
46 $this->prop = array_flip( $this->params['prop'] );
47 }
48
49 $r = $this->getCurrentUserInfo();
50 $result->addValue( 'query', $this->getModuleName(), $r );
51 }
52
65 public static function getBlockInfo( Block $block ) {
66 $vals = [];
67 $vals['blockid'] = $block->getId();
68 $vals['blockedby'] = $block->getByName();
69 $vals['blockedbyid'] = $block->getBy();
70 $vals['blockreason'] = $block->mReason;
71 $vals['blockedtimestamp'] = wfTimestamp( TS_ISO_8601, $block->mTimestamp );
72 $vals['blockexpiry'] = ApiResult::formatExpiry( $block->getExpiry(), 'infinite' );
73 if ( $block->getSystemBlockType() !== null ) {
74 $vals['systemblocktype'] = $block->getSystemBlockType();
75 }
76 return $vals;
77 }
78
91 public static function getCentralUserInfo( Config $config, User $user, $attachedWiki = null ) {
92 $providerIds = array_keys( $config->get( 'CentralIdLookupProviders' ) );
93
94 $ret = [
95 'centralids' => [],
96 'attachedlocal' => [],
97 ];
98 ApiResult::setArrayType( $ret['centralids'], 'assoc' );
99 ApiResult::setArrayType( $ret['attachedlocal'], 'assoc' );
100 if ( $attachedWiki ) {
101 $ret['attachedwiki'] = [];
102 ApiResult::setArrayType( $ret['attachedwiki'], 'assoc' );
103 }
104
105 $name = $user->getName();
106 foreach ( $providerIds as $providerId ) {
107 $provider = CentralIdLookup::factory( $providerId );
108 $ret['centralids'][$providerId] = $provider->centralIdFromName( $name );
109 $ret['attachedlocal'][$providerId] = $provider->isAttached( $user );
110 if ( $attachedWiki ) {
111 $ret['attachedwiki'][$providerId] = $provider->isAttached( $user, $attachedWiki );
112 }
113 }
114
115 return $ret;
116 }
117
118 protected function getCurrentUserInfo() {
119 $user = $this->getUser();
120 $vals = [];
121 $vals['id'] = intval( $user->getId() );
122 $vals['name'] = $user->getName();
123
124 if ( $user->isAnon() ) {
125 $vals['anon'] = true;
126 }
127
128 if ( isset( $this->prop['blockinfo'] ) && $user->isBlocked() ) {
129 $vals = array_merge( $vals, self::getBlockInfo( $user->getBlock() ) );
130 }
131
132 if ( isset( $this->prop['hasmsg'] ) ) {
133 $vals['messages'] = $user->getNewtalk();
134 }
135
136 if ( isset( $this->prop['groups'] ) ) {
137 $vals['groups'] = $user->getEffectiveGroups();
138 ApiResult::setArrayType( $vals['groups'], 'array' ); // even if empty
139 ApiResult::setIndexedTagName( $vals['groups'], 'g' ); // even if empty
140 }
141
142 if ( isset( $this->prop['groupmemberships'] ) ) {
143 $ugms = $user->getGroupMemberships();
144 $vals['groupmemberships'] = [];
145 foreach ( $ugms as $group => $ugm ) {
146 $vals['groupmemberships'][] = [
147 'group' => $group,
148 'expiry' => ApiResult::formatExpiry( $ugm->getExpiry() ),
149 ];
150 }
151 ApiResult::setArrayType( $vals['groupmemberships'], 'array' ); // even if empty
152 ApiResult::setIndexedTagName( $vals['groupmemberships'], 'groupmembership' ); // even if empty
153 }
154
155 if ( isset( $this->prop['implicitgroups'] ) ) {
156 $vals['implicitgroups'] = $user->getAutomaticGroups();
157 ApiResult::setArrayType( $vals['implicitgroups'], 'array' ); // even if empty
158 ApiResult::setIndexedTagName( $vals['implicitgroups'], 'g' ); // even if empty
159 }
160
161 if ( isset( $this->prop['rights'] ) ) {
162 // User::getRights() may return duplicate values, strip them
163 $vals['rights'] = array_values( array_unique( $user->getRights() ) );
164 ApiResult::setArrayType( $vals['rights'], 'array' ); // even if empty
165 ApiResult::setIndexedTagName( $vals['rights'], 'r' ); // even if empty
166 }
167
168 if ( isset( $this->prop['changeablegroups'] ) ) {
169 $vals['changeablegroups'] = $user->changeableGroups();
170 ApiResult::setIndexedTagName( $vals['changeablegroups']['add'], 'g' );
171 ApiResult::setIndexedTagName( $vals['changeablegroups']['remove'], 'g' );
172 ApiResult::setIndexedTagName( $vals['changeablegroups']['add-self'], 'g' );
173 ApiResult::setIndexedTagName( $vals['changeablegroups']['remove-self'], 'g' );
174 }
175
176 if ( isset( $this->prop['options'] ) ) {
177 $vals['options'] = $user->getOptions();
178 $vals['options'][ApiResult::META_BC_BOOLS] = array_keys( $vals['options'] );
179 }
180
181 if ( isset( $this->prop['preferencestoken'] ) &&
182 !$this->lacksSameOriginSecurity() &&
183 $user->isAllowed( 'editmyoptions' )
184 ) {
185 $vals['preferencestoken'] = $user->getEditToken( '', $this->getMain()->getRequest() );
186 }
187
188 if ( isset( $this->prop['editcount'] ) ) {
189 // use intval to prevent null if a non-logged-in user calls
190 // api.php?format=jsonfm&action=query&meta=userinfo&uiprop=editcount
191 $vals['editcount'] = intval( $user->getEditCount() );
192 }
193
194 if ( isset( $this->prop['ratelimits'] ) ) {
195 $vals['ratelimits'] = $this->getRateLimits();
196 }
197
198 if ( isset( $this->prop['realname'] ) &&
199 !in_array( 'realname', $this->getConfig()->get( 'HiddenPrefs' ) )
200 ) {
201 $vals['realname'] = $user->getRealName();
202 }
203
204 if ( $user->isAllowed( 'viewmyprivateinfo' ) ) {
205 if ( isset( $this->prop['email'] ) ) {
206 $vals['email'] = $user->getEmail();
207 $auth = $user->getEmailAuthenticationTimestamp();
208 if ( !is_null( $auth ) ) {
209 $vals['emailauthenticated'] = wfTimestamp( TS_ISO_8601, $auth );
210 }
211 }
212 }
213
214 if ( isset( $this->prop['registrationdate'] ) ) {
215 $regDate = $user->getRegistration();
216 if ( $regDate !== false ) {
217 $vals['registrationdate'] = wfTimestamp( TS_ISO_8601, $regDate );
218 }
219 }
220
221 if ( isset( $this->prop['acceptlang'] ) ) {
222 $langs = $this->getRequest()->getAcceptLang();
223 $acceptLang = [];
224 foreach ( $langs as $lang => $val ) {
225 $r = [ 'q' => $val ];
226 ApiResult::setContentValue( $r, 'code', $lang );
227 $acceptLang[] = $r;
228 }
229 ApiResult::setIndexedTagName( $acceptLang, 'lang' );
230 $vals['acceptlang'] = $acceptLang;
231 }
232
233 if ( isset( $this->prop['unreadcount'] ) ) {
234 $store = MediaWikiServices::getInstance()->getWatchedItemStore();
235 $unreadNotifications = $store->countUnreadNotifications(
236 $user,
237 self::WL_UNREAD_LIMIT
238 );
239
240 if ( $unreadNotifications === true ) {
241 $vals['unreadcount'] = self::WL_UNREAD_LIMIT . '+';
242 } else {
243 $vals['unreadcount'] = $unreadNotifications;
244 }
245 }
246
247 if ( isset( $this->prop['centralids'] ) ) {
249 $this->getConfig(), $this->getUser(), $this->params['attachedwiki']
250 );
251 }
252
253 return $vals;
254 }
255
256 protected function getRateLimits() {
257 $retval = [
258 ApiResult::META_TYPE => 'assoc',
259 ];
260
261 $user = $this->getUser();
262 if ( !$user->isPingLimitable() ) {
263 return $retval; // No limits
264 }
265
266 // Find out which categories we belong to
267 $categories = [];
268 if ( $user->isAnon() ) {
269 $categories[] = 'anon';
270 } else {
271 $categories[] = 'user';
272 }
273 if ( $user->isNewbie() ) {
274 $categories[] = 'ip';
275 $categories[] = 'subnet';
276 if ( !$user->isAnon() ) {
277 $categories[] = 'newbie';
278 }
279 }
280 $categories = array_merge( $categories, $user->getGroups() );
281
282 // Now get the actual limits
283 foreach ( $this->getConfig()->get( 'RateLimits' ) as $action => $limits ) {
284 foreach ( $categories as $cat ) {
285 if ( isset( $limits[$cat] ) && !is_null( $limits[$cat] ) ) {
286 $retval[$action][$cat]['hits'] = intval( $limits[$cat][0] );
287 $retval[$action][$cat]['seconds'] = intval( $limits[$cat][1] );
288 }
289 }
290 }
291
292 return $retval;
293 }
294
295 public function getAllowedParams() {
296 return [
297 'prop' => [
300 'blockinfo',
301 'hasmsg',
302 'groups',
303 'groupmemberships',
304 'implicitgroups',
305 'rights',
306 'changeablegroups',
307 'options',
308 'editcount',
309 'ratelimits',
310 'email',
311 'realname',
312 'acceptlang',
313 'registrationdate',
314 'unreadcount',
315 'centralids',
316 'preferencestoken',
317 ],
319 'unreadcount' => [
320 'apihelp-query+userinfo-paramvalue-prop-unreadcount',
321 self::WL_UNREAD_LIMIT - 1,
322 self::WL_UNREAD_LIMIT . '+',
323 ],
324 ],
326 'preferencestoken' => [
327 'apiwarn-deprecation-withreplacement',
328 $this->getModulePrefix() . "prop=preferencestoken",
329 'action=query&meta=tokens',
330 ]
331 ],
332 ],
333 'attachedwiki' => null,
334 ];
335 }
336
337 protected function getExamplesMessages() {
338 return [
339 'action=query&meta=userinfo'
340 => 'apihelp-query+userinfo-example-simple',
341 'action=query&meta=userinfo&uiprop=blockinfo|groups|rights|hasmsg'
342 => 'apihelp-query+userinfo-example-data',
343 ];
344 }
345
346 public function getHelpUrls() {
347 return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Userinfo';
348 }
349}
wfTimestamp( $outputtype=TS_UNIX, $ts=0)
Get a timestamp string in one of various formats.
getModulePrefix()
Get parameter prefix (usually two letters or an empty string).
Definition ApiBase.php:547
const PARAM_DEPRECATED_VALUES
(array) When PARAM_TYPE is an array, this indicates which of the values are deprecated.
Definition ApiBase.php:202
getMain()
Get the main module.
Definition ApiBase.php:555
const PARAM_TYPE
(string|string[]) Either an array of allowed value strings, or a string type as described below.
Definition ApiBase.php:87
const PARAM_HELP_MSG_PER_VALUE
((string|array|Message)[]) When PARAM_TYPE is an array, this is an array mapping those values to $msg...
Definition ApiBase.php:157
getResult()
Get the result object.
Definition ApiBase.php:659
extractRequestParams( $options=[])
Using getAllowedParams(), this function makes an array of the values provided by the user,...
Definition ApiBase.php:770
getModuleName()
Get the name of the module being executed by this instance.
Definition ApiBase.php:539
const PARAM_ISMULTI
(boolean) Accept multiple pipe-separated values for this parameter (e.g.
Definition ApiBase.php:51
lacksSameOriginSecurity()
Returns true if the current request breaks the same-origin policy.
Definition ApiBase.php:587
This is a base class for all Query modules.
Query module to get information about the currently logged-in user.
getExamplesMessages()
Returns usage examples for this module.
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...
static getBlockInfo(Block $block)
Get basic info about a given block.
execute()
Evaluates the parameters, performs the requested query, and sets up the result.
static getCentralUserInfo(Config $config, User $user, $attachedWiki=null)
Get central user info.
__construct(ApiQuery $query, $moduleName)
This is the main query class.
Definition ApiQuery.php:36
const META_TYPE
Key for the 'type' metadata item.
static setArrayType(array &$arr, $type, $kvpKeyName=null)
Set the array data type.
const META_BC_BOOLS
Key for the 'BC bools' metadata item.
static setIndexedTagName(array &$arr, $tag)
Set the tag name for numeric-keyed values in XML format.
static setContentValue(array &$arr, $name, $value, $flags=0)
Add an output value to the array by name and mark as META_CONTENT.
static formatExpiry( $expiry, $infinity='infinity')
Format an expiry timestamp for API output.
getSystemBlockType()
Get the system block type, if any.
Definition Block.php:1022
getId()
Get the block ID.
Definition Block.php:1013
getExpiry()
Definition Block.php:1483
getBy()
Get the user id of the blocking sysop.
Definition Block.php:990
getByName()
Get the username of the blocking sysop.
Definition Block.php:1002
MediaWikiServices is the service locator for the application scope of MediaWiki.
The User object encapsulates all of the user-specific settings (user_id, name, rights,...
Definition User.php:47
please add to it if you re going to add events to the MediaWiki code where normally authentication against an external auth plugin would be creating a local account incomplete not yet checked for validity & $retval
Definition hooks.txt:266
null means default in associative array with keys and values unescaped Should be merged with default with a value of false meaning to suppress the attribute in associative array with keys and values unescaped noclasses & $ret
Definition hooks.txt:2054
null for the local wiki Added should default to null in handler for backwards compatibility add a value to it if you want to add a cookie that have to vary cache options can modify $query
Definition hooks.txt:1656
Interface for configuration instances.
Definition Config.php:28
get( $name)
Get a configuration variable such as "Sitename" or "UploadMaintenance.".
if(!isset( $args[0])) $lang