function useOutputPage() {
return $this->useMessageCache() &&
!empty( $GLOBALS['wgFullyInitialised'] ) &&
- ( !empty( $GLOBALS['wgArticle'] ) || ( !empty( $GLOBALS['wgOut'] ) && !$GLOBALS['wgOut']->isArticle() ) ) &&
+ !empty( $GLOBALS['wgOut'] ) &&
+ !$GLOBALS['wgOut']->isArticleRelated() &&
!empty( $GLOBALS['wgTitle'] );
}
}
}
- return is_object( $wgLang );
+ return $wgLang instanceof Language;
}
/**
$args = array_slice( func_get_args(), 2 );
if ( $this->useMessageCache() ) {
- return wfMsgReal( $key, $args );
+ return wfMsgNoTrans( $key, $args );
} else {
return wfMsgReplaceArgs( $fallback, $args );
}
/* Return titles of this error page */
function getPageTitle() {
- if ( $this->useMessageCache() ) {
- return wfMsg( 'internalerror' );
- } else {
- global $wgSitename;
-
- return "$wgSitename error";
- }
+ global $wgSitename;
+ return $this->msg( 'internalerror', "$wgSitename error" );
}
/**
$wgOut->redirect( '' );
$wgOut->clearHTML();
- if ( $hookResult = $this->runHooks( get_class( $this ) ) ) {
+ $hookResult = $this->runHooks( get_class( $this ) );
+ if ( $hookResult ) {
$wgOut->addHTML( $hookResult );
} else {
$wgOut->addHTML( $this->getHTML() );
$wgOut->output();
} else {
- if ( $hookResult = $this->runHooks( get_class( $this ) . "Raw" ) ) {
+ $hookResult = $this->runHooks( get_class( $this ) . "Raw" );
+ if ( $hookResult ) {
die( $hookResult );
}
- if ( defined( 'MEDIAWIKI_INSTALL' ) || $this->htmlBodyOnly() ) {
- echo $this->getHTML();
+ $html = $this->getHTML();
+ if ( defined( 'MEDIAWIKI_INSTALL' ) ) {
+ echo $html;
} else {
- echo $this->htmlHeader();
- echo $this->getHTML();
- echo $this->htmlFooter();
+ wfDie( $html );
}
}
}
/**
* Send headers and output the beginning of the html page if not using
* $wgOut to output the exception.
+ * @deprecated since 1.18 call wfDie() if you need to die immediately
*/
function htmlHeader() {
- global $wgLogo, $wgOutputEncoding;
+ global $wgLogo, $wgLang;
if ( !headers_sent() ) {
header( 'HTTP/1.0 500 Internal Server Error' );
- header( 'Content-type: text/html; charset=' . $wgOutputEncoding );
+ header( 'Content-type: text/html; charset=UTF-8' );
/* Don't cache error pages! They cause no end of trouble... */
header( 'Cache-control: none' );
header( 'Pragma: nocache' );
}
- $title = $this->getPageTitle();
- return "<html>
- <head>
- <title>$title</title>
- </head>
- <body>
- <h1><img src='$wgLogo' style='float:left;margin-right:1em' alt=''/>$title</h1>
- ";
+ $head = Html::element( 'title', null, $this->getPageTitle() ) . "\n";
+ $head .= Html::inlineStyle( <<<ENDL
+ body {
+ color: #000;
+ background-color: #fff;
+ font-family: sans-serif;
+ padding: 2em;
+ text-align: center;
}
+ p, img, h1 {
+ text-align: left;
+ margin: 0.5em 0;
+ }
+ h1 {
+ font-size: 120%;
+ }
+ENDL
+ );
- /**
- * print the end of the html page if not using $wgOut.
- */
- function htmlFooter() {
- return "</body></html>";
+ $dir = 'ltr';
+ $code = 'en';
+
+ if ( $wgLang instanceof Language ) {
+ $dir = $wgLang->getDir();
+ $code = $wgLang->getCode();
+ }
+
+ $header = Html::element( 'img', array(
+ 'src' => $wgLogo,
+ 'alt' => '' ) );
+
+ $attribs = array( 'dir' => $dir, 'lang' => $code );
+
+ return
+ Html::htmlHeader( $attribs ) .
+ Html::rawElement( 'head', null, $head ) . "\n".
+ Html::openElement( 'body' ) . "\n" .
+ $header . "\n";
}
/**
- * headers handled by subclass?
+ * print the end of the html page if not using $wgOut.
+ * @deprecated since 1.18
*/
- function htmlBodyOnly() {
- return false;
+ function htmlFooter() {
+ return Html::closeElement( 'body' ) . Html::closeElement( 'html' );
}
static function isCommandLine() {
}
/**
+ * An error page which can definitely be safely rendered using the OutputPage
* @ingroup Exception
*/
class ErrorPageError extends MWException {
- public $title, $msg;
+ public $title, $msg, $params;
/**
* Note: these arguments are keys into wfMsg(), not text!
*/
- function __construct( $title, $msg ) {
+ function __construct( $title, $msg, $params = null ) {
$this->title = $title;
$this->msg = $msg;
- parent::__construct( wfMsg( $msg ) );
+ $this->params = $params;
+
+ if( $msg instanceof Message ){
+ parent::__construct( $msg );
+ } else {
+ parent::__construct( wfMsg( $msg ) );
+ }
}
function report() {
global $wgOut;
- $wgOut->showErrorPage( $this->title, $this->msg );
+ if ( $wgOut->getTitle() ) {
+ $wgOut->debug( 'Original title: ' . $wgOut->getTitle()->getPrefixedText() . "\n" );
+ }
+ $wgOut->setPageTitle( wfMsg( $this->title ) );
+ $wgOut->setHTMLTitle( wfMsg( 'errorpagetitle' ) );
+ $wgOut->setRobotPolicy( 'noindex,nofollow' );
+ $wgOut->setArticleRelated( false );
+ $wgOut->enableClientCache( false );
+ $wgOut->mRedirect = '';
+ $wgOut->clearHTML();
+
+ if( $this->msg instanceof Message ){
+ $wgOut->addHTML( $this->msg->parse() );
+ } else {
+ $wgOut->addWikiMsgArray( $this->msg, $this->params );
+ }
+
+ $wgOut->returnToMain();
$wgOut->output();
}
}
+/**
+ * Show an error when a user tries to do something they do not have the necessary
+ * permissions for.
+ */
+class PermissionsError extends ErrorPageError {
+ public $permission;
+
+ function __construct( $permission ) {
+ global $wgLang;
+
+ $this->permission = $permission;
+
+ $groups = array_map(
+ array( 'User', 'makeGroupLinkWiki' ),
+ User::getGroupsWithPermission( $this->permission )
+ );
+
+ if( $groups ) {
+ parent::__construct(
+ 'badaccess',
+ 'badaccess-groups',
+ array(
+ $wgLang->commaList( $groups ),
+ count( $groups )
+ )
+ );
+ } else {
+ parent::__construct(
+ 'badaccess',
+ 'badaccess-group0'
+ );
+ }
+ }
+}
+
+/**
+ * Show an error when the wiki is locked/read-only and the user tries to do
+ * something that requires write access
+ */
+class ReadOnlyError extends ErrorPageError {
+ public function __construct(){
+ parent::__construct(
+ 'readonly',
+ 'readonlytext',
+ wfReadOnlyReason()
+ );
+ }
+}
+
+/**
+ * Show an error when the user hits a rate limit
+ */
+class ThrottledError extends ErrorPageError {
+ public function __construct(){
+ parent::__construct(
+ 'actionthrottled',
+ 'actionthrottledtext'
+ );
+ }
+ public function report(){
+ global $wgOut;
+ $wgOut->setStatusCode( 503 );
+ return parent::report();
+ }
+}
+
+/**
+ * Show an error when the user tries to do something whilst blocked
+ */
+class UserBlockedError extends ErrorPageError {
+ public function __construct( Block $block ){
+ global $wgLang;
+
+ $blockerUserpage = $block->getBlocker()->getUserPage();
+ $link = "[[{$blockerUserpage->getPrefixedText()}|{$blockerUserpage->getText()}]]";
+
+ $reason = $block->mReason;
+ if( $reason == '' ) {
+ $reason = wfMsg( 'blockednoreason' );
+ }
+
+ /* $ip returns who *is* being blocked, $intended contains who was meant to be blocked.
+ * This could be a username, an IP range, or a single IP. */
+ $intended = $block->getTarget();
+
+ parent::__construct(
+ 'blockedtitle',
+ $block->mAuto ? 'autoblocketext' : 'blockedtext',
+ array(
+ $link,
+ $reason,
+ wfGetIP(),
+ $block->getBlocker()->getName(),
+ $block->getId(),
+ $wgLang->formatExpiry( $block->mExpiry ),
+ $intended,
+ $wgLang->timeanddate( wfTimestamp( TS_MW, $block->mTimestamp ), true )
+ )
+ );
+ }
+}
+
/**
* Install an exception handler for MediaWiki exception types.
*/
if ( $e instanceof MWException ) {
try {
+ // Try and show the exception prettily, with the normal skin infrastructure
$e->report();
} catch ( Exception $e2 ) {
// Exception occurred from within exception handler
if ( $cmdLine ) {
wfPrintError( $message );
} else {
- echo nl2br( htmlspecialchars( $message ) ) . "\n";
+ wfDie( nl2br( htmlspecialchars( $message ) ) ) . "\n";
}
}
} else {
if ( $cmdLine ) {
wfPrintError( $message );
} else {
- echo nl2br( htmlspecialchars( $message ) ) . "\n";
+ wfDie( nl2br( htmlspecialchars( $message ) ) ) . "\n";
}
}
}