public function execute() { $params = $this->extractRequestParams(); if (!is_null($params['prop'])) { $this->prop = array_flip($params['prop']); } else { $this->prop = array(); } $users = (array) $params['users']; $goodNames = $done = array(); $result = $this->getResult(); // Canonicalize user names 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) { $this->setContinueEnumParameter('users', implode('|', array_diff($users, $done))); $goodNames = array(); break; } $done[] = $u; } else { $goodNames[] = $n; } } if (count($goodNames)) { $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->showHiddenUsersAddBlockInfo(isset($this->prop['blockinfo'])); $data = array(); $res = $this->select(__METHOD__); foreach ($res as $row) { $user = User::newFromRow($row); $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($row->ug_group)) { // This row contains only one group, others will be added from other rows $data[$name]['groups'][] = $row->ug_group; } 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'); 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); $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'])) { $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) { $this->setContinueEnumParameter('users', implode('|', array_diff($users, $done))); break; } $done[] = $u; } return $this->getResult()->setIndexedTagName_internal(array('query', $this->getModuleName()), 'user'); }
public function execute() { $db = $this->getDB(); $params = $this->extractRequestParams(); $prop = $params['prop']; if (!is_null($prop)) { $prop = array_flip($prop); $fld_blockinfo = isset($prop['blockinfo']); $fld_editcount = isset($prop['editcount']); $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 = $fld_implicitgroups = false; } $limit = $params['limit']; $this->addTables('user'); $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']); $this->addWhereRange('user_name', $dir, $from, $to); if (!is_null($params['prefix'])) { $this->addWhere('user_name' . $db->buildLike($this->keyToTitle($params['prefix']), $db->anyString())); } if (!is_null($params['rights'])) { $groups = array(); foreach ($params['rights'] as $r) { $groups = array_merge($groups, User::getGroupsWithPermission($r)); } $groups = array_unique($groups); if (is_null($params['group'])) { $params['group'] = $groups; } else { $params['group'] = array_unique(array_merge($params['group'], $groups)); } } if (!is_null($params['group']) && !is_null($params['excludegroup'])) { $this->dieUsage('group and excludegroup cannot be used together', 'group-excludegroup'); } if (!is_null($params['group']) && count($params['group'])) { $useIndex = false; // Filter only users that belong to a given group $this->addTables('user_groups', 'ug1'); $this->addJoinConds(array('ug1' => array('INNER JOIN', array('ug1.ug_user=user_id', 'ug1.ug_group' => $params['group'])))); } if (!is_null($params['excludegroup']) && count($params['excludegroup'])) { $useIndex = false; // Filter only users don't belong to a given group $this->addTables('user_groups', 'ug1'); if (count($params['excludegroup']) == 1) { $exclude = array('ug1.ug_group' => $params['excludegroup'][0]); } else { $exclude = array($db->makeList(array('ug1.ug_group' => $params['excludegroup']), LIST_OR)); } $this->addJoinConds(array('ug1' => array('LEFT OUTER JOIN', array_merge(array('ug1.ug_user=user_id'), $exclude)))); $this->addWhere('ug1.ug_user IS NULL'); } if ($params['witheditsonly']) { $this->addWhere('user_editcount > 0'); } $this->showHiddenUsersAddBlockInfo($fld_blockinfo); if ($fld_groups || $fld_rights) { // Show the groups the given users belong to // request more than needed to avoid not getting all rows that belong to one user $groupCount = count(User::getAllGroups()); $sqlLimit = $limit + $groupCount + 1; $this->addTables('user_groups', 'ug2'); $this->addJoinConds(array('ug2' => array('LEFT JOIN', 'ug2.ug_user=user_id'))); $this->addFields('ug2.ug_group ug_group2'); } else { $sqlLimit = $limit + 1; } if ($params['activeusers']) { global $wgActiveUserDays; $this->addTables('recentchanges'); $this->addJoinConds(array('recentchanges' => array('INNER JOIN', 'rc_user_text=user_name'))); $this->addFields('COUNT(*) AS recentedits'); $this->addWhere("rc_log_type IS NULL OR rc_log_type != 'newusers'"); $timestamp = $db->timestamp(wfTimestamp(TS_UNIX) - $wgActiveUserDays * 24 * 3600); $this->addWhere("rc_timestamp >= {$db->addQuotes($timestamp)}"); $this->addOption('GROUP BY', 'user_name'); } $this->addOption('LIMIT', $sqlLimit); $this->addFields(array('user_name', 'user_id')); $this->addFieldsIf('user_editcount', $fld_editcount); $this->addFieldsIf('user_registration', $fld_registration); if ($useIndex) { $this->addOption('USE INDEX', array('user' => 'user_name')); } $res = $this->select(__METHOD__); $count = 0; $lastUserData = false; $lastUser = false; $result = $this->getResult(); // // This loop keeps track of the last entry. // For each new row, if the new row is for different user then the last, the last entry is added to results. // Otherwise, the group of the new row is appended to the last entry. // The setContinue... is more complex because of this, and takes into account the higher sql limit // to make sure all rows that belong to the same user are received. foreach ($res as $row) { $count++; if ($lastUser !== $row->user_name) { // Save the last pass's user data if (is_array($lastUserData)) { $fit = $result->addValue(array('query', $this->getModuleName()), null, $lastUserData); $lastUserData = null; if (!$fit) { $this->setContinueEnumParameter('from', $this->keyToTitle($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)); break; } // Record new user's data $lastUser = $row->user_name; $lastUserData = array('userid' => $row->user_id, 'name' => $lastUser); if ($fld_blockinfo && !is_null($row->ipb_by_text)) { $lastUserData['blockedby'] = $row->ipb_by_text; $lastUserData['blockreason'] = $row->ipb_reason; $lastUserData['blockexpiry'] = $row->ipb_expiry; } if ($row->ipb_deleted) { $lastUserData['hidden'] = ''; } if ($fld_editcount) { $lastUserData['editcount'] = intval($row->user_editcount); } if ($params['activeusers']) { $lastUserData['recenteditcount'] = intval($row->recentedits); } if ($fld_registration) { $lastUserData['registration'] = $row->user_registration ? wfTimestamp(TS_ISO_8601, $row->user_registration) : ''; } } if ($sqlLimit == $count) { // BUG! database contains group name that User::getAllGroups() does not return // TODO: should handle this more gracefully ApiBase::dieDebug(__METHOD__, 'MediaWiki configuration error: the database contains more user groups than known to User::getAllGroups() function'); } // Add user's group info if ($fld_groups) { if (!isset($lastUserData['groups'])) { $lastUserData['groups'] = ApiQueryUsers::getAutoGroups(User::newFromName($lastUser)); } if (!is_null($row->ug_group2)) { $lastUserData['groups'][] = $row->ug_group2; } $result->setIndexedTagName($lastUserData['groups'], 'g'); } if ($fld_implicitgroups && !isset($lastUserData['implicitgroups'])) { $lastUserData['implicitgroups'] = ApiQueryUsers::getAutoGroups(User::newFromName($lastUser)); $result->setIndexedTagName($lastUserData['implicitgroups'], 'g'); } if ($fld_rights) { if (!isset($lastUserData['rights'])) { $lastUserData['rights'] = User::getGroupPermissions(User::newFromName($lastUser)->getAutomaticGroups()); } if (!is_null($row->ug_group2)) { $lastUserData['rights'] = array_unique(array_merge($lastUserData['rights'], User::getGroupPermissions(array($row->ug_group2)))); } $result->setIndexedTagName($lastUserData['rights'], 'r'); } } if (is_array($lastUserData)) { $fit = $result->addValue(array('query', $this->getModuleName()), null, $lastUserData); if (!$fit) { $this->setContinueEnumParameter('from', $this->keyToTitle($lastUserData['name'])); } } $result->setIndexedTagName_internal(array('query', $this->getModuleName()), 'u'); }
protected function getCurrentUserInfo() { global $wgUser, $wgRequest; $result = $this->getResult(); $vals = array(); $vals['id'] = intval($wgUser->getId()); $vals['name'] = $wgUser->getName(); if ($wgUser->isAnon()) { $vals['anon'] = ''; } if (isset($this->prop['blockinfo'])) { if ($wgUser->isBlocked()) { $vals['blockedby'] = User::whoIs($wgUser->blockedBy()); $vals['blockreason'] = $wgUser->blockedFor(); } } if (isset($this->prop['hasmsg']) && $wgUser->getNewtalk()) { $vals['messages'] = ''; } if (isset($this->prop['groups'])) { $autolist = ApiQueryUsers::getAutoGroups($wgUser); $vals['groups'] = array_merge($autolist, $wgUser->getGroups()); $result->setIndexedTagName($vals['groups'], 'g'); // even if empty } if (isset($this->prop['rights'])) { // User::getRights() may return duplicate values, strip them $vals['rights'] = array_values(array_unique($wgUser->getRights())); $result->setIndexedTagName($vals['rights'], 'r'); // even if empty } if (isset($this->prop['changeablegroups'])) { $vals['changeablegroups'] = $wgUser->changeableGroups(); $result->setIndexedTagName($vals['changeablegroups']['add'], 'g'); $result->setIndexedTagName($vals['changeablegroups']['remove'], 'g'); $result->setIndexedTagName($vals['changeablegroups']['add-self'], 'g'); $result->setIndexedTagName($vals['changeablegroups']['remove-self'], 'g'); } if (isset($this->prop['options'])) { $vals['options'] = $wgUser->getOptions(); } if (isset($this->prop['preferencestoken']) && is_null($this->getMain()->getRequest()->getVal('callback'))) { $vals['preferencestoken'] = $wgUser->editToken(); } if (isset($this->prop['editcount'])) { $vals['editcount'] = intval($wgUser->getEditCount()); } if (isset($this->prop['ratelimits'])) { $vals['ratelimits'] = $this->getRateLimits(); } if (isset($this->prop['email'])) { $vals['email'] = $wgUser->getEmail(); $auth = $wgUser->getEmailAuthenticationTimestamp(); if (!is_null($auth)) { $vals['emailauthenticated'] = wfTimestamp(TS_ISO_8601, $auth); } } if (isset($this->prop['acceptlang'])) { $langs = $wgRequest->getAcceptLang(); $acceptLang = array(); foreach ($langs as $lang => $val) { $r = array('q' => $val); ApiResult::setContent($r, $lang); $acceptLang[] = $r; } $result->setIndexedTagName($acceptLang, 'lang'); $vals['acceptlang'] = $acceptLang; } return $vals; }