Exemple #1
0
 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;
 }