* (bug 12195) Introducing 'undelete' right, which is required for restoring deleted...
authorRoan Kattouw <catrope@users.mediawiki.org>
Tue, 4 Dec 2007 20:32:04 +0000 (20:32 +0000)
committerRoan Kattouw <catrope@users.mediawiki.org>
Tue, 4 Dec 2007 20:32:04 +0000 (20:32 +0000)
* Fixing whacky indentation in ApiQueryDeletedrevs.php introduced in r28148

RELEASE-NOTES
includes/DefaultSettings.php
includes/SpecialUndelete.php
includes/api/ApiQueryDeletedrevs.php
includes/api/ApiUndelete.php

index 02253ca..4b59dc7 100644 (file)
@@ -87,6 +87,7 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN
   does not exists
 * (bug 8396) Ignore out-of-date serialised message caches
 * Add descriptive <title> to revision difference page
+* (bug 12195) Undeleting pages now requires 'undelete' permission
 
 === Bug fixes in 1.12 ===
 
index b45d271..4f64314 100644 (file)
@@ -1085,6 +1085,7 @@ $wgGroupPermissions['sysop']['block']           = true;
 $wgGroupPermissions['sysop']['createaccount']   = true;
 $wgGroupPermissions['sysop']['delete']          = true;
 $wgGroupPermissions['sysop']['deletedhistory']         = true; // can view deleted history entries, but not see or restore the text
+$wgGroupPermissions['sysop']['undelete']       = true;
 $wgGroupPermissions['sysop']['editinterface']   = true;
 $wgGroupPermissions['sysop']['editusercssjs']   = true;
 $wgGroupPermissions['sysop']['import']          = true;
index 22ad961..06d66a2 100644 (file)
@@ -544,7 +544,7 @@ class UndeleteForm {
                if( $par != "" ) {
                        $this->mTarget = $par;
                }
-               if ( $wgUser->isAllowed( 'delete' ) && !$wgUser->isBlocked() ) {
+               if ( $wgUser->isAllowed( 'undelete' ) && !$wgUser->isBlocked() ) {
                        $this->mAllowed = true;
                } else {
                        $this->mAllowed = false;
index f799e4d..fd80823 100644 (file)
@@ -39,194 +39,192 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                parent :: __construct($query, $moduleName, 'dr');\r
        }\r
 \r
-       public function execute() {\r
-               $this->run();\r
-       }\r
-\r
-       private function run() {\r
+       private function execute() {\r
 \r
                global $wgUser;\r
                // Before doing anything at all, let's check permissions\r
                if(!$wgUser->isAllowed('deletedhistory'))\r
-               $this->dieUsage('You don\'t have permission to view deleted revisions', 'permissiondenied');\r
-\r
-       $db = $this->getDB();\r
-       $params = $this->extractRequestParams();\r
-       $prop = array_flip($params['prop']);\r
-       $fld_revid = isset($prop['revid']);\r
-       $fld_user = isset($prop['user']);\r
-       $fld_comment = isset($prop['comment']);\r
-       $fld_minor = isset($prop['minor']);\r
-       $fld_len = isset($prop['len']);\r
-       $fld_content = isset($prop['content']);\r
-       $fld_token = isset($prop['token']);\r
-\r
-       $result = $this->getResult();\r
-       $pageSet = $this->getPageSet();\r
-       $titles = $pageSet->getTitles();\r
-       $data = array();\r
-\r
-       $this->addTables('archive');\r
-       $this->addFields(array('ar_title', 'ar_namespace', 'ar_timestamp'));\r
-       if($fld_revid)\r
-               $this->addFields('ar_rev_id');\r
-       if($fld_user)\r
-               $this->addFields('ar_user_text');\r
-       if($fld_comment)\r
-               $this->addFields('ar_comment');\r
-       if($fld_minor)\r
-               $this->addFields('ar_minor_edit');\r
-       if($fld_len)\r
-               $this->addFields('ar_len');\r
-       if($fld_content)\r
-       {\r
-               $this->addTables('text');\r
-               $this->addFields(array('ar_text', 'ar_text_id', 'old_text', 'old_flags'));\r
-               $this->addWhere('ar_text_id = old_id');\r
-\r
-               // This also means stricter limits\r
-               $userMax = 50;\r
-               $botMax = 200;\r
-               $this->validateLimit('limit', $params['limit'], 1, $userMax, $botMax);\r
-       }\r
-       if($fld_token)\r
-               // Undelete tokens are identical for all pages, so we cache one here\r
-               $token = $wgUser->editToken();\r
-\r
-       // We need a custom WHERE clause that matches all titles.\r
-       if(count($titles) > 0)\r
-       {\r
-               $lb = new LinkBatch($titles);\r
-               $where = $lb->constructSet('ar', $db);\r
-               $this->addWhere($where);\r
-       }\r
-\r
-       $this->addOption('LIMIT', $params['limit'] + 1);\r
-       $this->addWhereRange('ar_timestamp', $params['dir'], $params['start'], $params['end']);\r
-       if(isset($params['namespace']))\r
-               $this->addWhereFld('ar_namespace', $params['namespace']);\r
-       $res = $this->select(__METHOD__);\r
-       $pages = array();\r
-       $count = 0;\r
-       // First populate the $pages array\r
-       while($row = $db->fetchObject($res))\r
-       {\r
-               if($count++ == $params['limit'])\r
-               {\r
-               // We've had enough\r
-               $this->setContinueEnumParameter('start', wfTimestamp(TS_ISO_8601, $row->ar_timestamp));\r
-               break;\r
-               }\r
-\r
-               $rev = array();\r
-               $rev['timestamp'] = wfTimestamp(TS_ISO_8601, $row->ar_timestamp);\r
+                       $this->dieUsage('You don\'t have permission to view deleted revision information', 'permissiondenied');\r
+\r
+               $db = $this->getDB();\r
+               $params = $this->extractRequestParams();\r
+               $prop = array_flip($params['prop']);\r
+               $fld_revid = isset($prop['revid']);\r
+               $fld_user = isset($prop['user']);\r
+               $fld_comment = isset($prop['comment']);\r
+               $fld_minor = isset($prop['minor']);\r
+               $fld_len = isset($prop['len']);\r
+               $fld_content = isset($prop['content']);\r
+               $fld_token = isset($prop['token']);\r
+\r
+               $result = $this->getResult();\r
+               $pageSet = $this->getPageSet();\r
+               $titles = $pageSet->getTitles();\r
+               $data = array();\r
+\r
+               $this->addTables('archive');\r
+               $this->addFields(array('ar_title', 'ar_namespace', 'ar_timestamp'));\r
                if($fld_revid)\r
-               $rev['revid'] = $row->ar_rev_id;\r
+                       $this->addFields('ar_rev_id');\r
                if($fld_user)\r
-               $rev['user'] = $row->ar_user_text;\r
+                       $this->addFields('ar_user_text');\r
                if($fld_comment)\r
-               $rev['comment'] = $row->ar_comment;\r
+                       $this->addFields('ar_comment');\r
                if($fld_minor)\r
-               if($row->ar_minor_edit == 1)\r
-                       $rev['minor'] = '';\r
+                       $this->addFields('ar_minor_edit');\r
                if($fld_len)\r
-               $rev['len'] = $row->ar_len;\r
+                       $this->addFields('ar_len');\r
                if($fld_content)\r
-               ApiResult::setContent($rev, Revision::getRevisionText($row));\r
-\r
-               $t = Title::makeTitle($row->ar_namespace, $row->ar_title);\r
-               if(!isset($pages[$t->getPrefixedText()]))\r
                {\r
-               $pages[$t->getPrefixedText()] = array(\r
-                       'title' => $t->getPrefixedText(),\r
-                       'ns' => intval($row->ar_namespace),\r
-                       'revisions' => array($rev)\r
-               );\r
+                       $this->addTables('text');\r
+                       $this->addFields(array('ar_text', 'ar_text_id', 'old_text', 'old_flags'));\r
+                       $this->addWhere('ar_text_id = old_id');\r
+\r
+                       // This also means stricter limits and stricter restrictions\r
+                       if(!$wgUser->isAllowed('undelete'))\r
+                               $this->dieUsage('You don\'t have permission to view deleted revision content', 'permissiondenied');\r
+                       $userMax = 50;\r
+                       $botMax = 200;\r
+                       $this->validateLimit('limit', $params['limit'], 1, $userMax, $botMax);\r
+               }\r
                if($fld_token)\r
-                       $pages[$t->getPrefixedText()]['token'] = $token;\r
+                       // Undelete tokens are identical for all pages, so we cache one here\r
+                       $token = $wgUser->editToken();\r
+\r
+               // We need a custom WHERE clause that matches all titles.\r
+               if(count($titles) > 0)\r
+               {\r
+                       $lb = new LinkBatch($titles);\r
+                       $where = $lb->constructSet('ar', $db);\r
+                       $this->addWhere($where);\r
                }\r
-               else\r
-               $pages[$t->getPrefixedText()]['revisions'][] = $rev;\r
-       }\r
-       $db->freeResult($res);\r
 \r
-       // We don't want entire pagenames as keys, so let's make this array indexed\r
-       foreach($pages as $page)\r
-       {\r
-               $result->setIndexedTagName($page['revisions'], 'rev');\r
-               $data[] = $page;\r
-       }\r
-       $result->setIndexedTagName($data, 'page');\r
-       $result->addValue('query', $this->getModuleName(), $data);\r
-       }\r
+               $this->addOption('LIMIT', $params['limit'] + 1);\r
+               $this->addWhereRange('ar_timestamp', $params['dir'], $params['start'], $params['end']);\r
+               if(isset($params['namespace']))\r
+                       $this->addWhereFld('ar_namespace', $params['namespace']);\r
+               $res = $this->select(__METHOD__);\r
+               $pages = array();\r
+               $count = 0;\r
+               // First populate the $pages array\r
+               while($row = $db->fetchObject($res))\r
+               {\r
+                       if($count++ == $params['limit'])\r
+                       {\r
+                               // We've had enough\r
+                               $this->setContinueEnumParameter('start', wfTimestamp(TS_ISO_8601, $row->ar_timestamp));\r
+                               break;\r
+                       }\r
+\r
+                       $rev = array();\r
+                       $rev['timestamp'] = wfTimestamp(TS_ISO_8601, $row->ar_timestamp);\r
+                       if($fld_revid)\r
+                               $rev['revid'] = $row->ar_rev_id;\r
+                       if($fld_user)\r
+                               $rev['user'] = $row->ar_user_text;\r
+                       if($fld_comment)\r
+                               $rev['comment'] = $row->ar_comment;\r
+                       if($fld_minor)\r
+                               if($row->ar_minor_edit == 1)\r
+                                       $rev['minor'] = '';\r
+                       if($fld_len)\r
+                               $rev['len'] = $row->ar_len;\r
+                       if($fld_content)\r
+                               ApiResult::setContent($rev, Revision::getRevisionText($row));\r
+\r
+                       $t = Title::makeTitle($row->ar_namespace, $row->ar_title);\r
+                       if(!isset($pages[$t->getPrefixedText()]))\r
+                       {\r
+                               $pages[$t->getPrefixedText()] = array(\r
+                                       'title' => $t->getPrefixedText(),\r
+                                       'ns' => intval($row->ar_namespace),\r
+                                       'revisions' => array($rev)\r
+                               );\r
+                               if($fld_token)\r
+                                       $pages[$t->getPrefixedText()]['token'] = $token;\r
+                       }\r
+                       else\r
+                               $pages[$t->getPrefixedText()]['revisions'][] = $rev;\r
+               }\r
+               $db->freeResult($res);\r
+\r
+               // We don't want entire pagenames as keys, so let's make this array indexed\r
+               foreach($pages as $page)\r
+               {\r
+                       $result->setIndexedTagName($page['revisions'], 'rev');\r
+                       $data[] = $page;\r
+               }\r
+               $result->setIndexedTagName($data, 'page');\r
+               $result->addValue('query', $this->getModuleName(), $data);\r
+               }\r
 \r
        protected function getAllowedParams() {\r
-       return array (\r
-               'start' => array(\r
-               ApiBase :: PARAM_TYPE => 'timestamp'\r
-               ),\r
-               'end' => array(\r
-               ApiBase :: PARAM_TYPE => 'timestamp',\r
-               ),\r
-               'dir' => array(\r
-               ApiBase :: PARAM_TYPE => array(\r
-                       'newer',\r
-                       'older'\r
-               ),\r
-               ApiBase :: PARAM_DFLT => 'older'\r
-               ),\r
-               'namespace' => array(\r
-               ApiBase :: PARAM_ISMULTI => true,\r
-               ApiBase :: PARAM_TYPE => 'namespace'\r
-               ),\r
-               'limit' => array(\r
-               ApiBase :: PARAM_DFLT => 10,\r
-               ApiBase :: PARAM_TYPE => 'limit',\r
-               ApiBase :: PARAM_MIN => 1,\r
-               ApiBase :: PARAM_MAX => ApiBase :: LIMIT_BIG1,\r
-               ApiBase :: PARAM_MAX2 => ApiBase :: LIMIT_BIG2\r
-               ),\r
-               'prop' => array(\r
-               ApiBase :: PARAM_DFLT => 'user|comment',\r
-               ApiBase :: PARAM_TYPE => array(\r
-                       'revid',\r
-                       'user',\r
-                       'comment',\r
-                       'minor',\r
-                       'len',\r
-                       'content',\r
-                       'token'\r
+               return array (\r
+                       'start' => array(\r
+                               ApiBase :: PARAM_TYPE => 'timestamp'\r
                        ),\r
-               ApiBase :: PARAM_ISMULTI => true\r
-               )\r
-       );\r
+                       'end' => array(\r
+                               ApiBase :: PARAM_TYPE => 'timestamp',\r
+                       ),\r
+                       'dir' => array(\r
+                               ApiBase :: PARAM_TYPE => array(\r
+                                       'newer',\r
+                                       'older'\r
+                               ),\r
+                               ApiBase :: PARAM_DFLT => 'older'\r
+                       ),\r
+                       'namespace' => array(\r
+                               ApiBase :: PARAM_ISMULTI => true,\r
+                               ApiBase :: PARAM_TYPE => 'namespace'\r
+                       ),\r
+                       'limit' => array(\r
+                               ApiBase :: PARAM_DFLT => 10,\r
+                               ApiBase :: PARAM_TYPE => 'limit',\r
+                               ApiBase :: PARAM_MIN => 1,\r
+                               ApiBase :: PARAM_MAX => ApiBase :: LIMIT_BIG1,\r
+                               ApiBase :: PARAM_MAX2 => ApiBase :: LIMIT_BIG2\r
+                       ),\r
+                       'prop' => array(\r
+                               ApiBase :: PARAM_DFLT => 'user|comment',\r
+                               ApiBase :: PARAM_TYPE => array(\r
+                                       'revid',\r
+                                       'user',\r
+                                       'comment',\r
+                                       'minor',\r
+                                       'len',\r
+                                       'content',\r
+                                       'token'\r
+                               ),\r
+                               ApiBase :: PARAM_ISMULTI => true\r
+                       )\r
+               );\r
        }\r
 \r
        protected function getParamDescription() {\r
-       return array (\r
-               'start' => 'The timestamp to start enumerating from',\r
-               'end' => 'The timestamp to stop enumerating at',\r
-               'dir' => 'The direction in which to enumerate',\r
-               'namespace' => 'The namespaces to search in',\r
-               'limit' => 'The maximum amount of revisions to list',\r
-               'prop' => 'Which properties to get'\r
-       );\r
+               return array (\r
+                       'start' => 'The timestamp to start enumerating from',\r
+                       'end' => 'The timestamp to stop enumerating at',\r
+                       'dir' => 'The direction in which to enumerate',\r
+                       'namespace' => 'The namespaces to search in',\r
+                       'limit' => 'The maximum amount of revisions to list',\r
+                       'prop' => 'Which properties to get'\r
+               );\r
        }\r
 \r
        protected function getDescription() {\r
-       return 'List deleted revisions.';\r
+               return 'List deleted revisions.';\r
        }\r
 \r
        protected function getExamples() {\r
-       return array (\r
-               'List the first 50 deleted revisions in the Category and Category talk namespaces',\r
-               '  api.php?action=query&list=deletedrevs&drdir=newer&drlimit=50&drnamespace=14|15',\r
-               'List the last deleted revisions of Main Page and Talk:Main Page, with content:',\r
-               '  api.php?action=query&list=deletedrevs&titles=Main%20Page|Talk:Main%20Page&drprop=user|comment|content'\r
-       );\r
+               return array (\r
+                       'List the first 50 deleted revisions in the Category and Category talk namespaces',\r
+                       '  api.php?action=query&list=deletedrevs&drdir=newer&drlimit=50&drnamespace=14|15',\r
+                       'List the last deleted revisions of Main Page and Talk:Main Page, with content:',\r
+                       '  api.php?action=query&list=deletedrevs&titles=Main%20Page|Talk:Main%20Page&drprop=user|comment|content'\r
+               );\r
        }\r
 \r
        public function getVersion() {\r
-       return __CLASS__ . ': $Id: ApiQueryDeletedrevs.php 23531 2007-06-30 01:19:14Z simetrical $';\r
+               return __CLASS__ . ': $Id: ApiQueryDeletedrevs.php 23531 2007-06-30 01:19:14Z simetrical $';\r
        }\r
 }\r
index 1e7609e..62497cc 100644 (file)
@@ -47,7 +47,7 @@ class ApiUndelete extends ApiBase {
                if(!isset($params['token']))\r
                        $this->dieUsage('The token parameter must be set', 'notoken');\r
 \r
-               if(!$wgUser->isAllowed('delete'))\r
+               if(!$wgUser->isAllowed('undelete'))\r
                        $this->dieUsage('You don\'t have permission to restore deleted revisions', 'permissiondenied');\r
                if($wgUser->isBlocked())\r
                        $this->dieUsage('You have been blocked from editing', 'blocked');\r