* Changed action=raw to use an Action subclass
authorAlexandre Emsenhuber <ialex@users.mediawiki.org>
Thu, 20 Oct 2011 08:10:25 +0000 (08:10 +0000)
committerAlexandre Emsenhuber <ialex@users.mediawiki.org>
Thu, 20 Oct 2011 08:10:25 +0000 (08:10 +0000)
* Left RawPage with back compat code for extensions that use it
* Removed calls to Skin for gen=(css|js). Calling action=raw&gen=(css|js) will now unconditionally return empty content
* Removed Skin::generateUserJs() and Skin::generateUserStylesheet() since they were only used in RawPage

includes/AutoLoader.php
includes/DefaultSettings.php
includes/RawPage.php [deleted file]
includes/Skin.php
includes/Wiki.php
includes/actions/RawAction.php [new file with mode: 0644]

index 8f12ee2..99f79af 100644 (file)
@@ -176,7 +176,6 @@ $wgAutoloadLocalClasses = array(
        'ProtectionForm' => 'includes/ProtectionForm.php',
        'QueryPage' => 'includes/QueryPage.php',
        'QuickTemplate' => 'includes/SkinTemplate.php',
-       'RawPage' => 'includes/RawPage.php',
        'RCCacheEntry' => 'includes/ChangesList.php',
        'RdfMetaData' => 'includes/Metadata.php',
        'ReadOnlyError' => 'includes/Exception.php',
@@ -261,6 +260,8 @@ $wgAutoloadLocalClasses = array(
        'InfoAction' => 'includes/actions/InfoAction.php',
        'MarkpatrolledAction' => 'includes/actions/MarkpatrolledAction.php',
        'PurgeAction' => 'includes/actions/PurgeAction.php',
+       'RawAction' => 'includes/actions/RawAction.php',
+       'RawPage' => 'includes/actions/RawAction.php',
        'RevertAction' => 'includes/actions/RevertAction.php',
        'RevertFileAction' => 'includes/actions/RevertAction.php',
        'RevisiondeleteAction' => 'includes/actions/RevisiondeleteAction.php',
index a888c3a..025de01 100644 (file)
@@ -5244,6 +5244,7 @@ $wgActions = array(
        'info' => true,
        'markpatrolled' => true,
        'purge' => true,
+       'raw' => true,
        'revert' => true,
        'revisiondelete' => true,
        'rollback' => true,
diff --git a/includes/RawPage.php b/includes/RawPage.php
deleted file mode 100644 (file)
index 35b6fb3..0000000
+++ /dev/null
@@ -1,217 +0,0 @@
-<?php
-/**
- * Raw page text accessor
- *
- * Copyright © 2004 Gabriel Wicke <wicke@wikidev.net>
- * http://wikidev.net/
- *
- * Based on HistoryPage and SpecialExport
- *
- * License: GPL (http://www.gnu.org/copyleft/gpl.html)
- *
- * @author Gabriel Wicke <wicke@wikidev.net>
- * @file
- */
-
-/**
- * A simple method to retrieve the plain source of an article,
- * using "action=raw" in the GET request string.
- */
-class RawPage {
-       var $mArticle, $mTitle, $mRequest;
-       var $mOldId, $mGen, $mCharset, $mSection;
-       var $mSmaxage, $mMaxage;
-       var $mContentType, $mExpandTemplates;
-
-       function __construct( Page $article, $request = false ) {
-               global $wgRequest, $wgSquidMaxage, $wgJsMimeType, $wgGroupPermissions;
-
-               $allowedCTypes = array( 'text/x-wiki', $wgJsMimeType, 'text/css', 'application/x-zope-edit' );
-               $this->mArticle = $article;
-               $this->mTitle = $article->getTitle();
-
-               if( $request === false ) {
-                       $this->mRequest = $wgRequest;
-               } else {
-                       $this->mRequest = $request;
-               }
-
-               $ctype = $this->mRequest->getVal( 'ctype' );
-               $smaxage = $this->mRequest->getIntOrNull( 'smaxage' );
-               $maxage = $this->mRequest->getInt( 'maxage', $wgSquidMaxage );
-
-               $this->mExpandTemplates = $this->mRequest->getVal( 'templates' ) === 'expand';
-               $this->mUseMessageCache = $this->mRequest->getBool( 'usemsgcache' );
-
-               $this->mSection = $this->mRequest->getIntOrNull( 'section' );
-
-               $oldid = $this->mRequest->getInt( 'oldid' );
-
-               switch( $wgRequest->getText( 'direction' ) ) {
-                       case 'next':
-                               # output next revision, or nothing if there isn't one
-                               if( $oldid ) {
-                                       $oldid = $this->mTitle->getNextRevisionId( $oldid );
-                               }
-                               $oldid = $oldid ? $oldid : -1;
-                               break;
-                       case 'prev':
-                               # output previous revision, or nothing if there isn't one
-                               if( !$oldid ) {
-                                       # get the current revision so we can get the penultimate one
-                                       $this->mArticle->getTouched();
-                                       $oldid = $this->mArticle->getLatest();
-                               }
-                               $prev = $this->mTitle->getPreviousRevisionId( $oldid );
-                               $oldid = $prev ? $prev : -1 ;
-                               break;
-                       case 'cur':
-                               $oldid = 0;
-                               break;
-               }
-               $this->mOldId = $oldid;
-
-               # special case for 'generated' raw things: user css/js
-               $gen = $this->mRequest->getVal( 'gen' );
-
-               if( $gen == 'css' ) {
-                       $this->mGen = $gen;
-                       if( is_null( $smaxage ) ) {
-                               $smaxage = $wgSquidMaxage;
-                       }
-                       if( $ctype == '' ) {
-                               $ctype = 'text/css';
-                       }
-               } elseif( $gen == 'js' ) {
-                       $this->mGen = $gen;
-                       if( is_null( $smaxage ) ) $smaxage = $wgSquidMaxage;
-                       if($ctype == '') $ctype = $wgJsMimeType;
-               } else {
-                       $this->mGen = false;
-               }
-               $this->mCharset = 'UTF-8';
-
-               # Force caching for CSS and JS raw content, default: 5 minutes
-               if( is_null( $smaxage ) && ( $ctype == 'text/css' || $ctype == $wgJsMimeType ) ) {
-                       global $wgForcedRawSMaxage;
-                       $this->mSmaxage = intval( $wgForcedRawSMaxage );
-               } else {
-                       $this->mSmaxage = intval( $smaxage );
-               }
-               $this->mMaxage = $maxage;
-
-               # Output may contain user-specific data;
-               # vary generated content for open sessions and private wikis
-               if( $this->mGen || !$wgGroupPermissions['*']['read'] ) {
-                       $this->mPrivateCache = $this->mSmaxage == 0 || session_id() != '';
-               } else {
-                       $this->mPrivateCache = false;
-               }
-
-               if( $ctype == '' || !in_array( $ctype, $allowedCTypes ) ) {
-                       $this->mContentType = 'text/x-wiki';
-               } else {
-                       $this->mContentType = $ctype;
-               }
-       }
-
-       function view() {
-               global $wgOut, $wgRequest;
-
-               if( !$wgRequest->checkUrlExtension() ) {
-                       $wgOut->disable();
-                       return;
-               }
-
-               header( 'Content-type: ' . $this->mContentType . '; charset=' . $this->mCharset );
-               # allow the client to cache this for 24 hours
-               $mode = $this->mPrivateCache ? 'private' : 'public';
-               header( 'Cache-Control: ' . $mode . ', s-maxage=' . $this->mSmaxage . ', max-age=' . $this->mMaxage );
-
-               $text = $this->getRawText();
-
-               if( !wfRunHooks( 'RawPageViewBeforeOutput', array( &$this, &$text ) ) ) {
-                       wfDebug( __METHOD__ . ": RawPageViewBeforeOutput hook broke raw page output.\n" );
-               }
-
-               echo $text;
-               $wgOut->disable();
-       }
-
-       function getRawText() {
-               global $wgOut, $wgUser;
-               if( $this->mGen ) {
-                       $sk = $wgUser->getSkin();
-                       if( !StubObject::isRealObject( $wgOut ) ) {
-                               $wgOut->_unstub( 2 );
-                       }
-                       $sk->initPage( $wgOut );
-                       if( $this->mGen == 'css' ) {
-                               return $sk->generateUserStylesheet();
-                       } elseif( $this->mGen == 'js' ) {
-                               return $sk->generateUserJs();
-                       }
-               } else {
-                       return $this->getArticleText();
-               }
-               return '';
-       }
-
-       function getArticleText() {
-               $found = false;
-               $text = '';
-               if( $this->mTitle ) {
-                       // If it's a MediaWiki message we can just hit the message cache
-                       if( $this->mUseMessageCache && $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
-                               $key = $this->mTitle->getDBkey();
-                               $msg = wfMessage( $key )->inContentLanguage();
-                               # If the message doesn't exist, return a blank
-                               $text = !$msg->exists() ? '' : $msg->plain();
-                               $found = true;
-                       } else {
-                               // Get it from the DB
-                               $rev = Revision::newFromTitle( $this->mTitle, $this->mOldId );
-                               if( $rev ) {
-                                       $lastmod = wfTimestamp( TS_RFC2822, $rev->getTimestamp() );
-                                       header( "Last-modified: $lastmod" );
-
-                                       if( !is_null( $this->mSection ) ) {
-                                               global $wgParser;
-                                               $text = $wgParser->getSection( $rev->getText(), $this->mSection );
-                                       } else {
-                                               $text = $rev->getText();
-                                       }
-                                       $found = true;
-                               }
-                       }
-               }
-
-               # Bad title or page does not exist
-               if( !$found && $this->mContentType == 'text/x-wiki' ) {
-                       # Don't return a 404 response for CSS or JavaScript;
-                       # 404s aren't generally cached and it would create
-                       # extra hits when user CSS/JS are on and the user doesn't
-                       # have the pages.
-                       header( 'HTTP/1.0 404 Not Found' );
-               }
-
-               return $this->parseArticleText( $text );
-       }
-
-       /**
-        * @param $text
-        * @return string
-        */
-       function parseArticleText( $text ) {
-               if( $text === '' ) {
-                       return '';
-               } else {
-                       if( $this->mExpandTemplates ) {
-                               global $wgParser;
-                               return $wgParser->preprocess( $text, $this->mTitle, new ParserOptions() );
-                       } else {
-                               return $text;
-                       }
-               }
-       }
-}
index ca020d3..9eabc97 100644 (file)
@@ -294,31 +294,6 @@ abstract class Skin extends ContextSource {
                }
        }
 
-       /**
-        * Generated JavaScript action=raw&gen=js
-        * This used to load MediaWiki:Common.js and the skin-specific style
-        * before the ResourceLoader.
-        *
-        * @deprecated since 1.18 Use the ResourceLoader instead. This may be removed at some
-        * point.
-        * @param $skinName String: If set, overrides the skin name
-        * @return String
-        */
-       public function generateUserJs( $skinName = null ) {
-               return '';
-       }
-
-       /**
-        * Generate user stylesheet for action=raw&gen=css
-        *
-        * @deprecated since 1.18 Use the ResourceLoader instead. This may be removed at some
-        * point.
-        * @return String
-        */
-       public function generateUserStylesheet() {
-               return '';
-       }
-
        /**
         * Get the query to generate a dynamic stylesheet
         *
index 0755a09..1a6f4f5 100644 (file)
@@ -468,12 +468,6 @@ class MediaWiki {
                                $output->setSquidMaxage( $wgSquidMaxage );
                                $article->view();
                                break;
-                       case 'raw': // includes JS/CSS
-                               wfProfileIn( __METHOD__ . '-raw' );
-                               $raw = new RawPage( $article );
-                               $raw->view();
-                               wfProfileOut( __METHOD__ . '-raw' );
-                               break;
                        case 'delete':
                        case 'protect':
                        case 'unprotect':
diff --git a/includes/actions/RawAction.php b/includes/actions/RawAction.php
new file mode 100644 (file)
index 0000000..5b9d7dd
--- /dev/null
@@ -0,0 +1,229 @@
+<?php
+/**
+ * Raw page text accessor
+ *
+ * Copyright © 2004 Gabriel Wicke <wicke@wikidev.net>
+ * http://wikidev.net/
+ *
+ * Based on HistoryPage and SpecialExport
+ *
+ * License: GPL (http://www.gnu.org/copyleft/gpl.html)
+ *
+ * @author Gabriel Wicke <wicke@wikidev.net>
+ * @file
+ */
+
+/**
+ * A simple method to retrieve the plain source of an article,
+ * using "action=raw" in the GET request string.
+ */
+class RawAction extends FormlessAction {
+       private $mGen;
+
+       public function getName() {
+               return 'raw';
+       }
+
+       public function getRestriction() {
+               return 'read';
+       }
+
+       function onView() {
+               global $wgGroupPermissions, $wgSquidMaxage, $wgForcedRawSMaxage, $wgJsMimeType;
+
+               $this->getOutput()->disable();
+               $request = $this->getRequest();
+
+               if ( !$request->checkUrlExtension() ) {
+                       return;
+               }
+
+               # special case for 'generated' raw things: user css/js
+               # This is deprecated and will only return empty content
+               $gen = $request->getVal( 'gen' );
+               $smaxage = $request->getIntOrNull( 'smaxage' );
+
+               if ( $gen == 'css' || $gen == 'js' ) {
+                       $this->mGen = $gen;
+                       if ( $smaxage === null ) {
+                               $smaxage = $wgSquidMaxage;
+                       }
+               } else {
+                       $this->mGen = false;
+               }
+
+               $contentType = $this->getContentType();
+
+               # Force caching for CSS and JS raw content, default: 5 minutes
+               if ( $smaxage === null ) {
+                       if ( $contentType == 'text/css' || $contentType == $wgJsMimeType ) {
+                               $smaxage = intval( $wgForcedRawSMaxage );
+                       } else {
+                               $smaxage = 0;
+                       }
+               }
+
+               $maxage = $request->getInt( 'maxage', $wgSquidMaxage );
+
+               $response = $request->response();
+
+               $response->header( 'Content-type: ' . $contentType . '; charset=UTF-8' );
+               # Output may contain user-specific data;
+               # vary generated content for open sessions on private wikis
+               $privateCache = !$wgGroupPermissions['*']['read'] && ( $smaxage == 0 || session_id() != '' );
+               # allow the client to cache this for 24 hours
+               $mode = $privateCache ? 'private' : 'public';
+               $response->header( 'Cache-Control: ' . $mode . ', s-maxage=' . $smaxage . ', max-age=' . $maxage );
+
+               $text = $this->getRawText();
+
+               if ( $text === false && $contentType == 'text/x-wiki' ) {
+                       # Don't return a 404 response for CSS or JavaScript;
+                       # 404s aren't generally cached and it would create
+                       # extra hits when user CSS/JS are on and the user doesn't
+                       # have the pages.
+                       $response->header( 'HTTP/1.x 404 Not Found' );
+               }
+
+               if ( !wfRunHooks( 'RawPageViewBeforeOutput', array( &$this, &$text ) ) ) {
+                       wfDebug( __METHOD__ . ": RawPageViewBeforeOutput hook broke raw page output.\n" );
+               }
+
+               echo $text;
+       }
+
+       /**
+        * Get the text that should be returned, or false if the page or revision
+        * was not found.
+        *
+        * @return String|Bool
+        */
+       public function getRawText() {
+               global $wgParser;
+
+               # No longer used
+               if( $this->mGen ) {
+                       return '';
+               }
+
+               $text = false;
+               $title = $this->getTitle();
+               $request = $this->getRequest();
+
+               // If it's a MediaWiki message we can just hit the message cache
+               if ( $request->getBool( 'usemsgcache' ) && $title->getNamespace() == NS_MEDIAWIKI ) {
+                       $key = $title->getDBkey();
+                       $msg = wfMessage( $key )->inContentLanguage();
+                       # If the message doesn't exist, return a blank
+                       $text = !$msg->exists() ? '' : $msg->plain();
+               } else {
+                       // Get it from the DB
+                       $rev = Revision::newFromTitle( $title, $this->getOldId() );
+                       if ( $rev ) {
+                               $lastmod = wfTimestamp( TS_RFC2822, $rev->getTimestamp() );
+                               $request->response()->header( "Last-modified: $lastmod" );
+
+                               $text = $rev->getText();
+                               $section = $request->getIntOrNull( 'section' );
+                               if ( $section !== null ) {
+                                       $text = $wgParser->getSection( $text, $section );
+                               }
+                       }
+               }
+
+               if ( $text !== false && $text !== '' && $request->getVal( 'templates' ) === 'expand' ) {
+                       $text = $wgParser->preprocess( $text, $title, ParserOptions::newFromContext( $this->getContext() ) );
+               }
+
+               return $text;
+       }
+
+       /**
+        * Get the ID of the revision that should used to get the text.
+        *
+        * @return Integer
+        */
+       public function getOldId() {
+               $oldid = $this->getRequest()->getInt( 'oldid' );
+               switch ( $this->getRequest()->getText( 'direction' ) ) {
+                       case 'next':
+                               # output next revision, or nothing if there isn't one
+                               if( $oldid ) {
+                                       $oldid = $this->getTitle()->getNextRevisionId( $oldid );
+                               }
+                               $oldid = $oldid ? $oldid : -1;
+                               break;
+                       case 'prev':
+                               # output previous revision, or nothing if there isn't one
+                               if( !$oldid ) {
+                                       # get the current revision so we can get the penultimate one
+                                       $oldid = $this->getTitle()->getLatestRevID();
+                               }
+                               $prev = $this->getTitle()->getPreviousRevisionId( $oldid );
+                               $oldid = $prev ? $prev : -1 ;
+                               break;
+                       case 'cur':
+                               $oldid = 0;
+                               break;
+               }
+               return $oldid;
+       }
+
+       /**
+        * Get the content type to use for the response
+        *
+        * @return String
+        */
+       public function getContentType() {
+               global $wgJsMimeType;
+
+               $ctype = $this->getRequest()->getVal( 'ctype' );
+
+               if ( $ctype == '' ) {
+                       $gen = $this->getRequest()->getVal( 'gen' );
+                       if ( $gen == 'js' ) {
+                               $ctype = $wgJsMimeType;
+                       } elseif ( $gen == 'css' ) {
+                               $ctype = 'text/css';
+                       }
+               }
+
+               $allowedCTypes = array( 'text/x-wiki', $wgJsMimeType, 'text/css', 'application/x-zope-edit' );
+               if ( $ctype == '' || !in_array( $ctype, $allowedCTypes ) ) {
+                       $ctype = 'text/x-wiki';
+               }
+
+               return $ctype;
+       }
+}
+
+/**
+ * Backward compatibility for extensions
+ *
+ * @deprecated in 1.19
+ */
+class RawPage extends RawAction {
+       public $mOldId;
+
+       function __construct( Page $page, $request = false ) {
+               parent::__construct( $page );
+
+               if ( $request !== false ) {
+                       $context = new DerivativeContext( $this->getContext() );
+                       $context->setRequest( $request );
+                       $this->context = $context;
+               }
+       }
+
+       public function view() {
+               $this->onView();
+       }
+
+       public function getOldId() {
+               # Some extensions like to set $mOldId
+               if ( $this->mOldId !== null ) {
+                       return $this->mOldId;
+               }
+               return parent::getOldId();
+       }
+}