MediaWiki  1.23.14
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  // Set standard Vary headers so cache varies on cookies and such (T125283)
95  $response->header( $this->getOutput()->getVaryHeader() );
96  if ( $wgUseXVO ) {
97  $response->header( $this->getOutput()->getXVO() );
98  }
99 
100  $response->header( 'Content-type: ' . $contentType . '; charset=UTF-8' );
101  # Output may contain user-specific data;
102  # vary generated content for open sessions on private wikis
103  $privateCache = !User::isEveryoneAllowed( 'read' ) && ( $smaxage == 0 || session_id() != '' );
104  // Bug 53032 - make this private if user is logged in,
105  // so we don't accidentally cache cookies
106  $privateCache = $privateCache ?: $this->getUser()->isLoggedIn();
107  # allow the client to cache this for 24 hours
108  $mode = $privateCache ? 'private' : 'public';
109  $response->header(
110  'Cache-Control: ' . $mode . ', s-maxage=' . $smaxage . ', max-age=' . $maxage
111  );
112 
113  $text = $this->getRawText();
114 
115  if ( $text === false && $contentType == 'text/x-wiki' ) {
116  # Don't return a 404 response for CSS or JavaScript;
117  # 404s aren't generally cached and it would create
118  # extra hits when user CSS/JS are on and the user doesn't
119  # have the pages.
120  $response->header( 'HTTP/1.x 404 Not Found' );
121  }
122 
123  if ( !wfRunHooks( 'RawPageViewBeforeOutput', array( &$this, &$text ) ) ) {
124  wfDebug( __METHOD__ . ": RawPageViewBeforeOutput hook broke raw page output.\n" );
125  }
126 
127  echo $text;
128  }
129 
136  public function getRawText() {
138 
139  # No longer used
140  if ( $this->mGen ) {
141  return '';
142  }
143 
144  $text = false;
145  $title = $this->getTitle();
146  $request = $this->getRequest();
147 
148  // If it's a MediaWiki message we can just hit the message cache
149  if ( $request->getBool( 'usemsgcache' ) && $title->getNamespace() == NS_MEDIAWIKI ) {
150  // The first "true" is to use the database, the second is to use
151  // the content langue and the last one is to specify the message
152  // key already contains the language in it ("/de", etc.).
153  $text = MessageCache::singleton()->get( $title->getDBkey(), true, true, true );
154  // If the message doesn't exist, return a blank
155  if ( $text === false ) {
156  $text = '';
157  }
158  } else {
159  // Get it from the DB
161  if ( $rev ) {
162  $lastmod = wfTimestamp( TS_RFC2822, $rev->getTimestamp() );
163  $request->response()->header( "Last-modified: $lastmod" );
164 
165  // Public-only due to cache headers
166  $content = $rev->getContent();
167 
168  if ( $content === null ) {
169  // revision not found (or suppressed)
170  $text = false;
171  } elseif ( !$content instanceof TextContent ) {
172  // non-text content
173  wfHttpError( 415, "Unsupported Media Type", "The requested page uses the content model `"
174  . $content->getModel() . "` which is not supported via this interface." );
175  die();
176  } else {
177  // want a section?
178  $section = $request->getIntOrNull( 'section' );
179  if ( $section !== null ) {
180  $content = $content->getSection( $section );
181  }
182 
183  if ( $content === null || $content === false ) {
184  // section not found (or section not supported, e.g. for JS and CSS)
185  $text = false;
186  } else {
187  $text = $content->getNativeData();
188  }
189  }
190  }
191  }
192 
193  if ( $text !== false && $text !== '' && $request->getVal( 'templates' ) === 'expand' ) {
194  $text = $wgParser->preprocess(
195  $text,
196  $title,
198  );
199  }
200 
201  return $text;
202  }
203 
209  public function getOldId() {
210  $oldid = $this->getRequest()->getInt( 'oldid' );
211  switch ( $this->getRequest()->getText( 'direction' ) ) {
212  case 'next':
213  # output next revision, or nothing if there isn't one
214  if ( $oldid ) {
215  $oldid = $this->getTitle()->getNextRevisionID( $oldid );
216  }
217  $oldid = $oldid ? $oldid : -1;
218  break;
219  case 'prev':
220  # output previous revision, or nothing if there isn't one
221  if ( !$oldid ) {
222  # get the current revision so we can get the penultimate one
223  $oldid = $this->page->getLatest();
224  }
225  $prev = $this->getTitle()->getPreviousRevisionID( $oldid );
226  $oldid = $prev ? $prev : -1;
227  break;
228  case 'cur':
229  $oldid = 0;
230  break;
231  }
232 
233  return $oldid;
234  }
235 
241  public function getContentType() {
242  $ctype = $this->getRequest()->getVal( 'ctype' );
243 
244  if ( $ctype == '' ) {
245  $gen = $this->getRequest()->getVal( 'gen' );
246  if ( $gen == 'js' ) {
247  $ctype = 'text/javascript';
248  } elseif ( $gen == 'css' ) {
249  $ctype = 'text/css';
250  }
251  }
252 
253  $allowedCTypes = array( 'text/x-wiki', 'text/javascript', 'text/css', 'application/x-zope-edit' );
254  if ( $ctype == '' || !in_array( $ctype, $allowedCTypes ) ) {
255  $ctype = 'text/x-wiki';
256  }
257 
258  return $ctype;
259  }
260 }
261 
267 class RawPage extends RawAction {
268  public $mOldId;
269 
274  function __construct( Page $page, $request = false ) {
275  wfDeprecated( __CLASS__, '1.19' );
276  parent::__construct( $page );
277 
278  if ( $request !== false ) {
279  $context = new DerivativeContext( $this->getContext() );
280  $context->setRequest( $request );
281  $this->context = $context;
282  }
283  }
284 
285  public function view() {
286  $this->onView();
287  }
288 
289  public function getOldId() {
290  # Some extensions like to set $mOldId
291  if ( $this->mOldId !== null ) {
292  return $this->mOldId;
293  }
294 
295  return parent::getOldId();
296  }
297 }
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
$request
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 my contributions etc etc otherwise the built in rate limiting checks are if enabled also a ContextSource error or success you ll probably need to make sure the header is varied on WebRequest $request
Definition: hooks.txt:1961
RawPage\getOldId
getOldId()
Get the ID of the revision that should used to get the text.
Definition: RawAction.php:289
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:209
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:274
wfTimestamp
wfTimestamp( $outputtype=TS_UNIX, $ts=0)
Get a timestamp string in one of various formats.
Definition: GlobalFunctions.php:2530
RawPage\$mOldId
$mOldId
Definition: RawAction.php:268
RawAction\getRawText
getRawText()
Get the text that should be returned, or false if the page or revision was not found.
Definition: RawAction.php:136
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:241
wfDeprecated
wfDeprecated( $function, $version=false, $component=false, $callerOffset=2)
Throws a warning that $function is deprecated.
Definition: GlobalFunctions.php:1174
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:4066
array
the array() calling protocol came about after MediaWiki 1.4rc1.
List of Api Query prop modules.
RawPage\view
view()
Definition: RawAction.php:285
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:980
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:267
User\isEveryoneAllowed
static isEveryoneAllowed( $right)
Check if all users have the given permission.
Definition: User.php:4163
wfHttpError
wfHttpError( $code, $label, $desc)
Provide a simple HTTP error.
Definition: GlobalFunctions.php:2238
$wgParser
$wgParser
Definition: Setup.php:587
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:2488
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:1961