MediaWiki  1.23.2
RawAction.php
Go to the documentation of this file.
1 <?php
35 class RawAction extends FormlessAction {
36  private $mGen;
37 
38  public function getName() {
39  return 'raw';
40  }
41 
42  public function requiresWrite() {
43  return false;
44  }
45 
46  public function requiresUnblock() {
47  return false;
48  }
49 
50  function onView() {
51  global $wgSquidMaxage, $wgForcedRawSMaxage;
52 
53  $this->getOutput()->disable();
54  $request = $this->getRequest();
55 
56  if ( !$request->checkUrlExtension() ) {
57  return;
58  }
59 
60  if ( $this->getOutput()->checkLastModified( $this->page->getTouched() ) ) {
61  return; // Client cache fresh and headers sent, nothing more to do.
62  }
63 
64  # special case for 'generated' raw things: user css/js
65  # This is deprecated and will only return empty content
66  $gen = $request->getVal( 'gen' );
67  $smaxage = $request->getIntOrNull( 'smaxage' );
68 
69  if ( $gen == 'css' || $gen == 'js' ) {
70  $this->mGen = $gen;
71  if ( $smaxage === null ) {
72  $smaxage = $wgSquidMaxage;
73  }
74  } else {
75  $this->mGen = false;
76  }
77 
78  $contentType = $this->getContentType();
79 
80  # Force caching for CSS and JS raw content, default: 5 minutes.
81  # Note: If using a canonical url for userpage css/js, we send an HTCP purge.
82  if ( $smaxage === null ) {
83  if ( $contentType == 'text/css' || $contentType == 'text/javascript' ) {
84  $smaxage = intval( $wgForcedRawSMaxage );
85  } else {
86  $smaxage = 0;
87  }
88  }
89 
90  $maxage = $request->getInt( 'maxage', $wgSquidMaxage );
91 
92  $response = $request->response();
93 
94  $response->header( 'Content-type: ' . $contentType . '; charset=UTF-8' );
95  # Output may contain user-specific data;
96  # vary generated content for open sessions on private wikis
97  $privateCache = !User::isEveryoneAllowed( 'read' ) && ( $smaxage == 0 || session_id() != '' );
98  // Bug 53032 - make this private if user is logged in,
99  // so we don't accidentally cache cookies
100  $privateCache = $privateCache ?: $this->getUser()->isLoggedIn();
101  # allow the client to cache this for 24 hours
102  $mode = $privateCache ? 'private' : 'public';
103  $response->header(
104  'Cache-Control: ' . $mode . ', s-maxage=' . $smaxage . ', max-age=' . $maxage
105  );
106 
107  $text = $this->getRawText();
108 
109  if ( $text === false && $contentType == 'text/x-wiki' ) {
110  # Don't return a 404 response for CSS or JavaScript;
111  # 404s aren't generally cached and it would create
112  # extra hits when user CSS/JS are on and the user doesn't
113  # have the pages.
114  $response->header( 'HTTP/1.x 404 Not Found' );
115  }
116 
117  if ( !wfRunHooks( 'RawPageViewBeforeOutput', array( &$this, &$text ) ) ) {
118  wfDebug( __METHOD__ . ": RawPageViewBeforeOutput hook broke raw page output.\n" );
119  }
120 
121  echo $text;
122  }
123 
130  public function getRawText() {
132 
133  # No longer used
134  if ( $this->mGen ) {
135  return '';
136  }
137 
138  $text = false;
139  $title = $this->getTitle();
140  $request = $this->getRequest();
141 
142  // If it's a MediaWiki message we can just hit the message cache
143  if ( $request->getBool( 'usemsgcache' ) && $title->getNamespace() == NS_MEDIAWIKI ) {
144  // The first "true" is to use the database, the second is to use
145  // the content langue and the last one is to specify the message
146  // key already contains the language in it ("/de", etc.).
147  $text = MessageCache::singleton()->get( $title->getDBkey(), true, true, true );
148  // If the message doesn't exist, return a blank
149  if ( $text === false ) {
150  $text = '';
151  }
152  } else {
153  // Get it from the DB
155  if ( $rev ) {
156  $lastmod = wfTimestamp( TS_RFC2822, $rev->getTimestamp() );
157  $request->response()->header( "Last-modified: $lastmod" );
158 
159  // Public-only due to cache headers
160  $content = $rev->getContent();
161 
162  if ( $content === null ) {
163  // revision not found (or suppressed)
164  $text = false;
165  } elseif ( !$content instanceof TextContent ) {
166  // non-text content
167  wfHttpError( 415, "Unsupported Media Type", "The requested page uses the content model `"
168  . $content->getModel() . "` which is not supported via this interface." );
169  die();
170  } else {
171  // want a section?
172  $section = $request->getIntOrNull( 'section' );
173  if ( $section !== null ) {
174  $content = $content->getSection( $section );
175  }
176 
177  if ( $content === null || $content === false ) {
178  // section not found (or section not supported, e.g. for JS and CSS)
179  $text = false;
180  } else {
181  $text = $content->getNativeData();
182  }
183  }
184  }
185  }
186 
187  if ( $text !== false && $text !== '' && $request->getVal( 'templates' ) === 'expand' ) {
188  $text = $wgParser->preprocess(
189  $text,
190  $title,
192  );
193  }
194 
195  return $text;
196  }
197 
203  public function getOldId() {
204  $oldid = $this->getRequest()->getInt( 'oldid' );
205  switch ( $this->getRequest()->getText( 'direction' ) ) {
206  case 'next':
207  # output next revision, or nothing if there isn't one
208  if ( $oldid ) {
209  $oldid = $this->getTitle()->getNextRevisionID( $oldid );
210  }
211  $oldid = $oldid ? $oldid : -1;
212  break;
213  case 'prev':
214  # output previous revision, or nothing if there isn't one
215  if ( !$oldid ) {
216  # get the current revision so we can get the penultimate one
217  $oldid = $this->page->getLatest();
218  }
219  $prev = $this->getTitle()->getPreviousRevisionID( $oldid );
220  $oldid = $prev ? $prev : -1;
221  break;
222  case 'cur':
223  $oldid = 0;
224  break;
225  }
226 
227  return $oldid;
228  }
229 
235  public function getContentType() {
236  $ctype = $this->getRequest()->getVal( 'ctype' );
237 
238  if ( $ctype == '' ) {
239  $gen = $this->getRequest()->getVal( 'gen' );
240  if ( $gen == 'js' ) {
241  $ctype = 'text/javascript';
242  } elseif ( $gen == 'css' ) {
243  $ctype = 'text/css';
244  }
245  }
246 
247  $allowedCTypes = array( 'text/x-wiki', 'text/javascript', 'text/css', 'application/x-zope-edit' );
248  if ( $ctype == '' || !in_array( $ctype, $allowedCTypes ) ) {
249  $ctype = 'text/x-wiki';
250  }
251 
252  return $ctype;
253  }
254 }
255 
261 class RawPage extends RawAction {
262  public $mOldId;
263 
268  function __construct( Page $page, $request = false ) {
269  wfDeprecated( __CLASS__, '1.19' );
270  parent::__construct( $page );
271 
272  if ( $request !== false ) {
273  $context = new DerivativeContext( $this->getContext() );
274  $context->setRequest( $request );
275  $this->context = $context;
276  }
277  }
278 
279  public function view() {
280  $this->onView();
281  }
282 
283  public function getOldId() {
284  # Some extensions like to set $mOldId
285  if ( $this->mOldId !== null ) {
286  return $this->mOldId;
287  }
288 
289  return parent::getOldId();
290  }
291 }
RawAction
A simple method to retrieve the plain source of an article, using "action=raw" in the GET request str...
Definition: RawAction.php:35
Page
Abstract class for type hinting (accepts WikiPage, Article, ImagePage, CategoryPage)
Definition: WikiPage.php:26
RawPage\getOldId
getOldId()
Get the ID of the revision that should used to get the text.
Definition: RawAction.php:283
php
skin txt MediaWiki includes four core it has been set as the default in MediaWiki since the replacing Monobook it had been been the default skin since before being replaced by Vector largely rewritten in while keeping its appearance Several legacy skins were removed in the as the burden of supporting them became too heavy to bear Those in etc for skin dependent CSS etc for skin dependent JavaScript These can also be customised on a per user by etc This feature has led to a wide variety of user styles becoming that gallery is a good place to ending in php
Definition: skin.txt:62
RawAction\getOldId
getOldId()
Get the ID of the revision that should used to get the text.
Definition: RawAction.php:203
RawAction\getName
getName()
Return the name of the action this object responds to.
Definition: RawAction.php:38
$response
$response
Definition: opensearch_desc.php:32
FormlessAction
An action which just does something, without showing a form first.
Definition: FormlessAction.php:29
Action\getRequest
getRequest()
Get the WebRequest being used for this instance.
Definition: Action.php:182
RawPage\__construct
__construct(Page $page, $request=false)
Definition: RawAction.php:268
wfTimestamp
wfTimestamp( $outputtype=TS_UNIX, $ts=0)
Get a timestamp string in one of various formats.
Definition: GlobalFunctions.php:2483
RawPage\$mOldId
$mOldId
Definition: RawAction.php:262
RawAction\getRawText
getRawText()
Get the text that should be returned, or false if the page or revision was not found.
Definition: RawAction.php:130
true
null means default in associative array with keys and values unescaped Should be merged with default with a value of false meaning to suppress the attribute in associative array with keys and values unescaped noclasses just before the function returns a value If you return true
Definition: hooks.txt:1530
RawAction\$mGen
$mGen
Definition: RawAction.php:36
Action\getContext
getContext()
Get the IContextSource in use here.
Definition: Action.php:164
DerivativeContext
An IContextSource implementation which will inherit context from another source but allow individual ...
Definition: DerivativeContext.php:32
RawAction\getContentType
getContentType()
Get the content type to use for the response.
Definition: RawAction.php:235
wfDeprecated
wfDeprecated( $function, $version=false, $component=false, $callerOffset=2)
Throws a warning that $function is deprecated.
Definition: GlobalFunctions.php:1127
RawAction\requiresUnblock
requiresUnblock()
Whether this action can still be executed by a blocked user.
Definition: RawAction.php:46
wfRunHooks
wfRunHooks( $event, array $args=array(), $deprecatedVersion=null)
Call hook functions defined in $wgHooks.
Definition: GlobalFunctions.php:4001
array
the array() calling protocol came about after MediaWiki 1.4rc1.
List of Api Query prop modules.
RawPage\view
view()
Definition: RawAction.php:279
global
when a variable name is used in a it is silently declared as a new masking the global
Definition: design.txt:93
MessageCache\singleton
static singleton()
Get the signleton instance of this class.
Definition: MessageCache.php:101
RawAction\onView
onView()
Show something on GET request.
Definition: RawAction.php:50
$section
$section
Definition: Utf8Test.php:88
Revision\newFromTitle
static newFromTitle( $title, $id=0, $flags=0)
Load either the current, or a specified, revision that's attached to a given title.
Definition: Revision.php:106
wfDebug
wfDebug( $text, $dest='all')
Sends a line to the debug log if enabled or, optionally, to a comment in output.
Definition: GlobalFunctions.php:933
Action\getUser
getUser()
Shortcut to get the User being used for this instance.
Definition: Action.php:200
Action\$context
IContextSource $context
IContextSource if specified; otherwise we'll use the Context from the Page $context.
Definition: Action.php:47
$title
presenting them properly to the user as errors is done by the caller $title
Definition: hooks.txt:1324
ParserOptions\newFromContext
static newFromContext(IContextSource $context)
Get a ParserOptions object from a IContextSource object.
Definition: ParserOptions.php:396
Action\getTitle
getTitle()
Shortcut to get the Title object from the page.
Definition: Action.php:237
TextContent
Content object implementation for representing flat text.
Definition: TextContent.php:35
$rev
presenting them properly to the user as errors is done by the caller return true use this to change the list i e etc $rev
Definition: hooks.txt:1337
RawPage
Backward compatibility for extensions.
Definition: RawAction.php:261
User\isEveryoneAllowed
static isEveryoneAllowed( $right)
Check if all users have the given permission.
Definition: User.php:4159
wfHttpError
wfHttpError( $code, $label, $desc)
Provide a simple HTTP error.
Definition: GlobalFunctions.php:2191
$wgParser
$wgParser
Definition: Setup.php:567
Action\$page
WikiPage Article ImagePage CategoryPage Page $page
Page on which we're performing the action $page.
Definition: Action.php:42
Action\getOutput
getOutput()
Get the OutputPage being used for this instance.
Definition: Action.php:191
NS_MEDIAWIKI
const NS_MEDIAWIKI
Definition: Defines.php:87
TS_RFC2822
const TS_RFC2822
RFC 2822 format, for E-mail and HTTP headers.
Definition: GlobalFunctions.php:2441
RawAction\requiresWrite
requiresWrite()
Whether this action requires the wiki not to be locked.
Definition: RawAction.php:42
page
do that in ParserLimitReportFormat instead use this to modify the parameters of the image and a DIV can begin in one section and end in another Make sure your code can handle that case gracefully See the EditSectionClearerLink extension for an example zero but section is usually empty its values are the globals values my talk page
Definition: hooks.txt:1956