Page Menu
Home
WickedGov Phorge
Search
Configure Global Search
Log In
Files
F4162972
SpecialPageExecutor.php
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
3 KB
Referenced Files
None
Subscribers
None
SpecialPageExecutor.php
View Options
<?php
use
MediaWiki\Context\DerivativeContext
;
use
MediaWiki\Context\RequestContext
;
use
MediaWiki\Language\Language
;
use
MediaWiki\Output\OutputPage
;
use
MediaWiki\Permissions\Authority
;
use
MediaWiki\Request\FauxRequest
;
use
MediaWiki\Request\FauxResponse
;
use
MediaWiki\Request\WebRequest
;
use
MediaWiki\SpecialPage\SpecialPage
;
/**
* @author Addshore
*
* @since 1.27
*/
class
SpecialPageExecutor
{
/**
* @param SpecialPage $page The special page to execute
* @param string|null $subPage The subpage parameter to call the page with
* @param WebRequest|null $request Web request that may contain URL parameters, etc
* @param Language|string|null $language The language which should be used in the context;
* if not specified, the pseudo-code 'qqx' is used
* @param Authority|null $performer The user which should be used in the context of this special page
* @param bool $fullHtml if true, the entirety of the generated HTML will be returned, this
* includes the opening <!DOCTYPE> declaration and closing </html> tag. If false, only value
* of OutputPage::getHTML() will be returned except if the page is redirect or where OutputPage
* is completely disabled.
*
* @return array [ string, WebResponse ] A two-elements array containing the HTML output
* generated by the special page as well as the response object.
*/
public
function
executeSpecialPage
(
SpecialPage
$page
,
$subPage
=
''
,
?
WebRequest
$request
=
null
,
$language
=
null
,
?
Authority
$performer
=
null
,
$fullHtml
=
false
)
{
$context
=
$this
->
newContext
(
$request
,
$language
,
$performer
);
$output
=
new
OutputPage
(
$context
);
$context
->
setOutput
(
$output
);
$page
->
setContext
(
$context
);
$output
->
setTitle
(
$page
->
getPageTitle
()
);
$html
=
$this
->
getHTMLFromSpecialPage
(
$page
,
$subPage
,
$fullHtml
);
$response
=
$context
->
getRequest
()->
response
();
if
(
$response
instanceof
FauxResponse
)
{
$code
=
$response
->
getStatusCode
();
if
(
$code
>
0
)
{
$response
->
header
(
'Status: '
.
$code
.
' '
.
HttpStatus
::
getMessage
(
$code
)
);
}
}
return
[
$html
,
$response
];
}
/**
* @param WebRequest|null $request
* @param Language|string|null $language Defaults to 'qqx'
* @param Authority|null $performer
*
* @return DerivativeContext
*/
private
function
newContext
(
?
WebRequest
$request
=
null
,
$language
=
null
,
?
Authority
$performer
=
null
)
{
$context
=
new
DerivativeContext
(
RequestContext
::
getMain
()
);
$context
->
setRequest
(
$request
?:
new
FauxRequest
()
);
$context
->
setLanguage
(
$language
?:
'qqx'
);
if
(
$performer
!==
null
)
{
$context
->
setAuthority
(
$performer
);
}
$this
->
setEditTokenFromUser
(
$context
);
// Make sure the skin context is correctly set https://phabricator.wikimedia.org/T200771
$context
->
getSkin
()->
setContext
(
$context
);
return
$context
;
}
/**
* If we are trying to edit and no token is set, supply one.
*
* @param DerivativeContext $context
*/
private
function
setEditTokenFromUser
(
DerivativeContext
$context
)
{
$request
=
$context
->
getRequest
();
// Edits via GET are a security issue and should not succeed. On the other hand, not all
// POST requests are edits, but should ignore unused parameters.
if
(
!
$request
->
getCheck
(
'wpEditToken'
)
&&
$request
->
wasPosted
()
)
{
$request
->
setVal
(
'wpEditToken'
,
$context
->
getUser
()->
getEditToken
()
);
}
}
/**
* @param SpecialPage $page
* @param string|null $subPage
* @param bool $fullHtml
*
* @return string HTML
*/
private
function
getHTMLFromSpecialPage
(
SpecialPage
$page
,
$subPage
,
$fullHtml
)
{
ob_start
();
try
{
$page
->
execute
(
$subPage
);
$output
=
$page
->
getOutput
();
if
(
$output
->
getRedirect
()
!==
''
)
{
$output
->
output
();
$html
=
ob_get_contents
();
}
elseif
(
$output
->
isDisabled
()
)
{
$html
=
ob_get_contents
();
}
elseif
(
$fullHtml
)
{
$html
=
$output
->
output
(
true
);
}
else
{
$html
=
$output
->
getHTML
();
}
}
finally
{
ob_end_clean
();
}
return
$html
;
}
}
File Metadata
Details
Attached
Mime Type
text/x-php
Expires
Aug 20 2026, 01:48 (10 w, 2 d ago)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
59/d8/fe5e08358d4e52a28ca015868b03
Default Alt Text
SpecialPageExecutor.php (3 KB)
Attached To
Mode
rMWPROD MediaWiki Production
Attached
Detach File
Event Timeline
Log In to Comment