public function execute()
 {
     global $wgUser, $wgRequest;
     $this->getMain()->requestWriteMode();
     if (wfReadOnly()) {
         $this->dieUsage('The wiki is in read-only mode', 'readonly');
     }
     $params = $this->extractRequestParams();
     $ur = new UserrightsPage($wgRequest);
     $allowed = $ur->changeableGroups();
     $res = array();
     $u = $ur->fetchUser_real($params['user']);
     if (is_array($u)) {
         switch ($u[0]) {
             case UserrightsPage::FETCHUSER_NO_INTERWIKI:
                 $this->dieUsage("You don't have permission to change users' rights on other wikis", 'nointerwiki');
             case UserrightsPage::FETCHUSER_NO_DATABASE:
                 $this->dieUsage("Database ``{$u[1]}'' does not exist or is not local", 'nosuchdatabase');
             case UserrightsPage::FETCHUSER_NO_USER:
                 $this->dieUsage("You specified an empty username, or none at all", 'emptyuser');
             case UserrightsPage::FETCHUSER_NOSUCH_USERID:
                 $this->dieUsage("There is no user with ID ``{$u[1]}''", 'nosuchuserid');
             case UserrightsPage::FETCHUSER_NOSUCH_USERNAME:
                 $this->dieUsage("There is no user with username ``{$u[1]}''", 'nosuchusername');
             default:
                 $this->dieDebug(__METHOD__, "UserrightsPage::fetchUser_real() returned an unknown error ({$u[0]})");
         }
     }
     $curgroups = $u->getGroups();
     if ($params['listgroups']) {
         $res['user'] = $u->getName();
         $res['allowedgroups'] = $allowed;
         $res['ingroups'] = $curgroups;
         $this->getResult()->setIndexedTagName($res['ingroups'], 'group');
         $this->getResult()->setIndexedTagName($res['allowedgroups']['add'], 'group');
         $this->getResult()->setIndexedTagName($res['allowedgroups']['remove'], 'group');
     }
     if ($params['gettoken']) {
         $res['changerightstoken'] = $wgUser->editToken($u->getName());
         $this->getResult()->addValue(null, $this->getModuleName(), $res);
         return;
     }
     if (empty($params['addto']) && empty($params['rmfrom'])) {
         $this->dieUsage('At least one of the addto and rmfrom parameters must be set', 'noaddrm');
     }
     if (is_null($params['token'])) {
         $this->dieUsage('The token parameter must be set', 'notoken');
     }
     if (!$wgUser->matchEditToken($params['token'], $u->getName())) {
         $this->dieUsage('Invalid token', 'badtoken');
     }
     $dbw = wfGetDb(DB_MASTER);
     $dbw->begin();
     $ur->saveUserGroups($u, $params['rmfrom'], $params['addto'], $params['reason']);
     $dbw->commit();
     $res['user'] = $u->getName();
     $res['addedto'] = (array) $params['addto'];
     $res['removedfrom'] = (array) $params['rmfrom'];
     $res['reason'] = $params['reason'];
     $this->getResult()->setIndexedTagName($res['addedto'], 'group');
     $this->getResult()->setIndexedTagName($res['removedfrom'], 'group');
     $this->getResult()->addValue(null, $this->getModuleName(), $res);
 }