diff options
Diffstat (limited to 'includes/Setup.php')
-rw-r--r-- | includes/Setup.php | 307 |
1 files changed, 187 insertions, 120 deletions
diff --git a/includes/Setup.php b/includes/Setup.php index 2e083d83..7a89c7a3 100644 --- a/includes/Setup.php +++ b/includes/Setup.php @@ -1,6 +1,10 @@ <?php /** - * Include most things that's need to customize the site. + * Include most things that are needed to make %MediaWiki work. + * + * This file is included by WebStart.php and doMaintenance.php so that both + * web and maintenance scripts share a final set up phase to include necessary + * files and create global object variables. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,14 +32,9 @@ if ( !defined( 'MEDIAWIKI' ) ) { exit( 1 ); } -# The main wiki script and things like database -# conversion and maintenance scripts all share a -# common setup of including lots of classes and -# setting up a few globals. -# - $fname = 'Setup.php'; wfProfileIn( $fname ); +wfProfileIn( $fname . '-defaults' ); // Check to see if we are at the file scope if ( !isset( $wgVersion ) ) { @@ -44,6 +43,7 @@ if ( !isset( $wgVersion ) ) { } // Set various default paths sensibly... + if ( $wgScript === false ) { $wgScript = "$wgScriptPath/index$wgScriptExtension"; } @@ -60,8 +60,8 @@ if ( $wgArticlePath === false ) { } if ( !empty( $wgActionPaths ) && !isset( $wgActionPaths['view'] ) ) { - # 'view' is assumed the default action path everywhere in the code - # but is rarely filled in $wgActionPaths + // 'view' is assumed the default action path everywhere in the code + // but is rarely filled in $wgActionPaths $wgActionPaths['view'] = $wgArticlePath; } @@ -77,9 +77,12 @@ if ( $wgStyleDirectory === false ) { if ( $wgExtensionAssetsPath === false ) { $wgExtensionAssetsPath = "$wgScriptPath/extensions"; } +if ( $wgResourceBasePath === null ) { + $wgResourceBasePath = $wgScriptPath; +} if ( $wgLogo === false ) { - $wgLogo = "$wgStylePath/common/images/wiki.png"; + $wgLogo = "$wgResourceBasePath/resources/assets/wiki.png"; } if ( $wgUploadPath === false ) { @@ -98,15 +101,24 @@ if ( $wgDeletedDirectory === false ) { $wgDeletedDirectory = "{$wgUploadDirectory}/deleted"; } -if ( isset( $wgFileStore['deleted']['directory'] ) ) { - $wgDeletedDirectory = $wgFileStore['deleted']['directory']; +if ( $wgGitInfoCacheDirectory === false && $wgCacheDirectory !== false ) { + $wgGitInfoCacheDirectory = "{$wgCacheDirectory}/gitinfo"; } -if ( isset( $wgFooterIcons['copyright'] ) && - isset( $wgFooterIcons['copyright']['copyright'] ) && - $wgFooterIcons['copyright']['copyright'] === array() ) -{ - if ( isset( $wgCopyrightIcon ) && $wgCopyrightIcon ) { +// Fix path to icon images after they were moved in 1.24 +if ( $wgRightsIcon ) { + $wgRightsIcon = str_replace( + "{$wgStylePath}/common/images/", + "{$wgResourceBasePath}/resources/assets/licenses/", + $wgRightsIcon + ); +} + +if ( isset( $wgFooterIcons['copyright'] ) + && isset( $wgFooterIcons['copyright']['copyright'] ) + && $wgFooterIcons['copyright']['copyright'] === array() +) { + if ( $wgCopyrightIcon ) { $wgFooterIcons['copyright']['copyright'] = $wgCopyrightIcon; } elseif ( $wgRightsIcon || $wgRightsText ) { $wgFooterIcons['copyright']['copyright'] = array( @@ -119,11 +131,12 @@ if ( isset( $wgFooterIcons['copyright'] ) && } } -if ( isset( $wgFooterIcons['poweredby'] ) && - isset( $wgFooterIcons['poweredby']['mediawiki'] ) && - $wgFooterIcons['poweredby']['mediawiki']['src'] === null ) -{ - $wgFooterIcons['poweredby']['mediawiki']['src'] = "$wgStylePath/common/images/poweredby_mediawiki_88x31.png"; +if ( isset( $wgFooterIcons['poweredby'] ) + && isset( $wgFooterIcons['poweredby']['mediawiki'] ) + && $wgFooterIcons['poweredby']['mediawiki']['src'] === null +) { + $wgFooterIcons['poweredby']['mediawiki']['src'] = + "$wgResourceBasePath/resources/assets/poweredby_mediawiki_88x31.png"; } /** @@ -160,11 +173,6 @@ $wgLockManagers[] = array( * Initialise $wgLocalFileRepo from backwards-compatible settings */ if ( !$wgLocalFileRepo ) { - if ( isset( $wgFileStore['deleted']['hash'] ) ) { - $deletedHashLevel = $wgFileStore['deleted']['hash']; - } else { - $deletedHashLevel = $wgHashedUploadDirectory ? 3 : 0; - } $wgLocalFileRepo = array( 'class' => 'LocalRepo', 'name' => 'local', @@ -176,7 +184,7 @@ if ( !$wgLocalFileRepo ) { 'thumbScriptUrl' => $wgThumbnailScriptPath, 'transformVia404' => !$wgGenerateThumbnailOnParse, 'deletedDir' => $wgDeletedDirectory, - 'deletedHashLevels' => $deletedHashLevel + 'deletedHashLevels' => $wgHashedUploadDirectory ? 3 : 0 ); } /** @@ -247,17 +255,15 @@ foreach ( $wgForeignFileRepos as &$repo ) { } unset( $repo ); // no global pollution; destroy reference -if ( is_null( $wgEnableAutoRotation ) ) { - // Only enable auto-rotation when the bitmap handler can rotate - $wgEnableAutoRotation = BitmapHandler::canRotate(); -} - if ( $wgRCFilterByAge ) { - # # Trim down $wgRCLinkDays so that it only lists links which are valid - # # as determined by $wgRCMaxAge. - # # Note that we allow 1 link higher than the max for things like 56 days but a 60 day link. + // Trim down $wgRCLinkDays so that it only lists links which are valid + // as determined by $wgRCMaxAge. + // Note that we allow 1 link higher than the max for things like 56 days but a 60 day link. sort( $wgRCLinkDays ); + + // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed for ( $i = 0; $i < count( $wgRCLinkDays ); $i++ ) { + // @codingStandardsIgnoreEnd if ( $wgRCLinkDays[$i] >= $wgRCMaxAge / ( 3600 * 24 ) ) { $wgRCLinkDays = array_slice( $wgRCLinkDays, 0, $i + 1, false ); break; @@ -269,7 +275,28 @@ if ( $wgSkipSkin ) { $wgSkipSkins[] = $wgSkipSkin; } -# Set default shared prefix +// Register skins +// Use a closure to avoid leaking into global state +call_user_func( function () use ( $wgValidSkinNames ) { + $factory = SkinFactory::getDefaultInstance(); + foreach ( $wgValidSkinNames as $name => $skin ) { + $factory->register( $name, $skin, function () use ( $name, $skin ) { + $class = "Skin$skin"; + return new $class( $name ); + } ); + } + // Register a hidden "fallback" skin + $factory->register( 'fallback', 'Fallback', function () { + return new SkinFallback; + } ); +} ); +$wgSkipSkins[] = 'fallback'; + +if ( $wgLocalInterwiki ) { + array_unshift( $wgLocalInterwikis, $wgLocalInterwiki ); +} + +// Set default shared prefix if ( $wgSharedPrefix === false ) { $wgSharedPrefix = $wgDBprefix; } @@ -287,13 +314,38 @@ if ( !$wgCookiePrefix ) { } $wgCookiePrefix = strtr( $wgCookiePrefix, '=,; +."\'\\[', '__________' ); -$wgUseEnotif = $wgEnotifUserTalk || $wgEnotifWatchlist; +if ( $wgEnableEmail ) { + $wgUseEnotif = $wgEnotifUserTalk || $wgEnotifWatchlist; +} else { + // Disable all other email settings automatically if $wgEnableEmail + // is set to false. - bug 63678 + $wgAllowHTMLEmail = false; + $wgEmailAuthentication = false; // do not require auth if you're not sending email anyway + $wgEnableUserEmail = false; + $wgEnotifFromEditor = false; + $wgEnotifImpersonal = false; + $wgEnotifMaxRecips = 0; + $wgEnotifMinorEdits = false; + $wgEnotifRevealEditorAddress = false; + $wgEnotifUseJobQ = false; + $wgEnotifUseRealName = false; + $wgEnotifUserTalk = false; + $wgEnotifWatchlist = false; + unset( $wgGroupPermissions['user']['sendemail'] ); + $wgUseEnotif = false; + $wgUserEmailUseReplyTo = false; + $wgUsersNotifiedOnAllChanges = array(); +} + +// Doesn't make sense to have if disabled. +if ( !$wgEnotifMinorEdits ) { + $wgHiddenPrefs[] = 'enotifminoredits'; +} if ( $wgMetaNamespace === false ) { $wgMetaNamespace = str_replace( ' ', '_', $wgSitename ); } - // Default value is either the suhosin limit or -1 for unlimited if ( $wgResourceLoaderMaxQueryLength === false ) { $maxValueLength = ini_get( 'suhosin.get.max_value_length' ); @@ -329,36 +381,26 @@ if ( is_array( $wgExtraNamespaces ) ) { $wgCanonicalNamespaceNames = $wgCanonicalNamespaceNames + $wgExtraNamespaces; } -# These are now the same, always -# To determine the user language, use $wgLang->getCode() +// These are now the same, always +// To determine the user language, use $wgLang->getCode() $wgContLanguageCode = $wgLanguageCode; -# Easy to forget to falsify $wgShowIPinHeader for static caches. -# If file cache or squid cache is on, just disable this (DWIMD). -# Do the same for $wgDebugToolbar. +// Easy to forget to falsify $wgShowIPinHeader for static caches. +// If file cache or squid cache is on, just disable this (DWIMD). +// Do the same for $wgDebugToolbar. if ( $wgUseFileCache || $wgUseSquid ) { $wgShowIPinHeader = false; $wgDebugToolbar = false; } -# Doesn't make sense to have if disabled. -if ( !$wgEnotifMinorEdits ) { - $wgHiddenPrefs[] = 'enotifminoredits'; -} - -# $wgDisabledActions is deprecated as of 1.18 -foreach ( $wgDisabledActions as $action ) { - $wgActions[$action] = false; -} - -# We always output HTML5 since 1.22, overriding these is no longer supported -# we set them here for extensions that depend on its value. +// We always output HTML5 since 1.22, overriding these is no longer supported +// we set them here for extensions that depend on its value. $wgHtml5 = true; $wgXhtmlDefaultNamespace = 'http://www.w3.org/1999/xhtml'; $wgJsMimeType = 'text/javascript'; if ( !$wgHtml5Version && $wgAllowRdfaAttributes ) { - # see http://www.w3.org/TR/rdfa-in-html/#document-conformance + // see http://www.w3.org/TR/rdfa-in-html/#document-conformance if ( $wgMimeType == 'application/xhtml+xml' ) { $wgHtml5Version = 'XHTML+RDFa 1.0'; } else { @@ -366,19 +408,17 @@ if ( !$wgHtml5Version && $wgAllowRdfaAttributes ) { } } -# Blacklisted file extensions shouldn't appear on the "allowed" list +// Blacklisted file extensions shouldn't appear on the "allowed" list $wgFileExtensions = array_values( array_diff ( $wgFileExtensions, $wgFileBlacklist ) ); -if ( $wgArticleCountMethod === null ) { - $wgArticleCountMethod = $wgUseCommaCount ? 'comma' : 'link'; -} - if ( $wgInvalidateCacheOnLocalSettingsChange ) { + // @codingStandardsIgnoreStart Generic.PHP.NoSilencedErrors.Discouraged - No GlobalFunction here yet. $wgCacheEpoch = max( $wgCacheEpoch, gmdate( 'YmdHis', @filemtime( "$IP/LocalSettings.php" ) ) ); + // @codingStandardsIgnoreEnd } if ( $wgNewUserLog ) { - # Add a new log type + // Add a new log type $wgLogTypes[] = 'newusers'; $wgLogNames['newusers'] = 'newuserlogpage'; $wgLogHeaders['newusers'] = 'newuserlogpagetext'; @@ -389,24 +429,34 @@ if ( $wgNewUserLog ) { $wgLogActionsHandlers['newusers/autocreate'] = 'NewUsersLogFormatter'; } +if ( $wgPageLanguageUseDB ) { + $wgLogTypes[] = 'pagelang'; + $wgLogActionsHandlers['pagelang/pagelang'] = 'PageLangLogFormatter'; +} + if ( $wgCookieSecure === 'detect' ) { $wgCookieSecure = ( WebRequest::detectProtocol() === 'https' ); } -if ( $wgRC2UDPAddress ) { - $wgRCFeeds['default'] = array( - 'formatter' => 'IRCColourfulRCFeedFormatter', - 'uri' => "udp://$wgRC2UDPAddress:$wgRC2UDPPort/$wgRC2UDPPrefix", - 'add_interwiki_prefix' => &$wgRC2UDPInterwikiPrefix, - 'omit_bots' => &$wgRC2UDPOmitBots, - ); +// Back compatibility for $wgRateLimitLog deprecated with 1.23 +if ( $wgRateLimitLog && !array_key_exists( 'ratelimit', $wgDebugLogGroups ) ) { + $wgDebugLogGroups['ratelimit'] = $wgRateLimitLog; } +if ( $wgProfileOnly ) { + $wgDebugLogGroups['profileoutput'] = $wgDebugLogFile; + $wgDebugLogFile = ''; +} + +wfProfileOut( $fname . '-defaults' ); + // Disable MWDebug for command line mode, this prevents MWDebug from eating up // all the memory from logging SQL queries on maintenance scripts global $wgCommandLineMode; if ( $wgDebugToolbar && !$wgCommandLineMode ) { + wfProfileIn( $fname . '-debugtoolbar' ); MWDebug::init(); + wfProfileOut( $fname . '-debugtoolbar' ); } if ( !class_exists( 'AutoLoader' ) ) { @@ -420,45 +470,52 @@ wfProfileOut( $fname . '-exception' ); wfProfileIn( $fname . '-includes' ); require_once "$IP/includes/normal/UtfNormalUtil.php"; require_once "$IP/includes/GlobalFunctions.php"; -require_once "$IP/includes/ProxyTools.php"; require_once "$IP/includes/normal/UtfNormalDefines.php"; wfProfileOut( $fname . '-includes' ); -if ( $wgSecureLogin && substr( $wgServer, 0, 2 ) !== '//' ) { - $wgSecureLogin = false; - wfWarn( 'Secure login was enabled on a server that only supports HTTP or HTTPS. Disabling secure login.' ); +wfProfileIn( $fname . '-defaults2' ); + +if ( $wgCanonicalServer === false ) { + $wgCanonicalServer = wfExpandUrl( $wgServer, PROTO_HTTP ); } -# Now that GlobalFunctions is loaded, set defaults that depend -# on it. -if ( $wgTmpDirectory === false ) { - $wgTmpDirectory = wfTempDir(); +// Set server name +$serverParts = wfParseUrl( $wgCanonicalServer ); +if ( $wgServerName !== false ) { + wfWarn( '$wgServerName should be derived from $wgCanonicalServer, ' + . 'not customized. Overwriting $wgServerName.' ); } +$wgServerName = $serverParts['host']; +unset( $serverParts ); -if ( $wgCanonicalServer === false ) { - $wgCanonicalServer = wfExpandUrl( $wgServer, PROTO_HTTP ); +// Set defaults for configuration variables +// that are derived from the server name by default +if ( $wgEmergencyContact === false ) { + $wgEmergencyContact = 'wikiadmin@' . $wgServerName; } -// $wgHTCPMulticastRouting got renamed to $wgHTCPRouting in MediaWiki 1.22 -// ensure back compatibility. -if ( !$wgHTCPRouting && $wgHTCPMulticastRouting ) { - $wgHTCPRouting = $wgHTCPMulticastRouting; +if ( $wgPasswordSender === false ) { + $wgPasswordSender = 'apache@' . $wgServerName; } -// Initialize $wgHTCPRouting from backwards-compatible settings that -// comes from pre 1.20 version. -if ( !$wgHTCPRouting && $wgHTCPMulticastAddress ) { - $wgHTCPRouting = array( - '' => array( - 'host' => $wgHTCPMulticastAddress, - 'port' => $wgHTCPPort, - ) - ); +if ( $wgSecureLogin && substr( $wgServer, 0, 2 ) !== '//' ) { + $wgSecureLogin = false; + wfWarn( 'Secure login was enabled on a server that only supports ' + . 'HTTP or HTTPS. Disabling secure login.' ); +} + +// Now that GlobalFunctions is loaded, set defaults that depend +// on it. +if ( $wgTmpDirectory === false ) { + wfProfileIn( $fname . '-tempDir' ); + $wgTmpDirectory = wfTempDir(); + wfProfileOut( $fname . '-tempDir' ); } +wfProfileOut( $fname . '-defaults2' ); wfProfileIn( $fname . '-misc1' ); -# Raise the memory limit if it's too low +// Raise the memory limit if it's too low wfMemoryLimit(); /** @@ -477,13 +534,13 @@ if ( is_null( $wgLocalTZoffset ) ) { $wgLocalTZoffset = date( 'Z' ) / 60; } -# Useful debug output +// Useful debug output if ( $wgCommandLineMode ) { $wgRequest = new FauxRequest( array() ); wfDebug( "\n\nStart command line script $self\n" ); } else { - # Can't stub this one, it sets up $_GET and $_REQUEST in its constructor + // Can't stub this one, it sets up $_GET and $_REQUEST in its constructor $wgRequest = new WebRequest; $debug = "\n\nStart request {$wgRequest->getMethod()} {$wgRequest->getRequestURL()}\n"; @@ -506,76 +563,86 @@ $messageMemc = wfGetMessageCacheStorage(); $parserMemc = wfGetParserCacheStorage(); $wgLangConvMemc = wfGetLangConverterCacheStorage(); -wfDebug( 'CACHES: ' . get_class( $wgMemc ) . '[main] ' . - get_class( $messageMemc ) . '[message] ' . - get_class( $parserMemc ) . "[parser]\n" ); +wfDebugLog( 'caches', 'main: ' . get_class( $wgMemc ) . + ', message: ' . get_class( $messageMemc ) . + ', parser: ' . get_class( $parserMemc ) ); wfProfileOut( $fname . '-memcached' ); -# # Most of the config is out, some might want to run hooks here. +// Most of the config is out, some might want to run hooks here. wfRunHooks( 'SetupAfterCache' ); wfProfileIn( $fname . '-session' ); -# If session.auto_start is there, we can't touch session name -if ( !wfIniGetBool( 'session.auto_start' ) ) { - session_name( $wgSessionName ? $wgSessionName : $wgCookiePrefix . '_session' ); -} - if ( !defined( 'MW_NO_SESSION' ) && !$wgCommandLineMode ) { + // If session.auto_start is there, we can't touch session name + if ( !wfIniGetBool( 'session.auto_start' ) ) { + session_name( $wgSessionName ? $wgSessionName : $wgCookiePrefix . '_session' ); + } + if ( $wgRequest->checkSessionCookie() || isset( $_COOKIE[$wgCookiePrefix . 'Token'] ) ) { wfSetupSession(); - $wgSessionStarted = true; - } else { - $wgSessionStarted = false; } } wfProfileOut( $fname . '-session' ); wfProfileIn( $fname . '-globals' ); +/** + * @var Language $wgContLang + */ $wgContLang = Language::factory( $wgLanguageCode ); $wgContLang->initEncoding(); $wgContLang->initContLang(); // Now that variant lists may be available... $wgRequest->interpolateTitle(); -$wgUser = RequestContext::getMain()->getUser(); # BackCompat /** - * @var $wgLang Language + * @var User $wgUser + */ +$wgUser = RequestContext::getMain()->getUser(); // BackCompat + +/** + * @var Language $wgLang */ $wgLang = new StubUserLang; /** - * @var OutputPage + * @var OutputPage $wgOut */ -$wgOut = RequestContext::getMain()->getOutput(); # BackCompat +$wgOut = RequestContext::getMain()->getOutput(); // BackCompat /** - * @var $wgParser Parser + * @var Parser $wgParser */ $wgParser = new StubObject( 'wgParser', $wgParserConf['class'], array( $wgParserConf ) ); if ( !is_object( $wgAuth ) ) { - $wgAuth = new StubObject( 'wgAuth', 'AuthPlugin' ); + $wgAuth = new AuthPlugin; wfRunHooks( 'AuthPluginSetup', array( &$wgAuth ) ); } -# Placeholders in case of DB error +/** + * @var Title $wgTitle + */ $wgTitle = null; +/** + * @deprecated since 1.24 Use DeferredUpdates::addUpdate instead + * @var array + */ $wgDeferredUpdateList = array(); wfProfileOut( $fname . '-globals' ); wfProfileIn( $fname . '-extensions' ); -# Extension setup functions for extensions other than skins -# Entries should be added to this variable during the inclusion -# of the extension file. This allows the extension to perform -# any necessary initialisation in the fully initialised environment +// Extension setup functions for extensions other than skins +// Entries should be added to this variable during the inclusion +// of the extension file. This allows the extension to perform +// any necessary initialisation in the fully initialised environment foreach ( $wgExtensionFunctions as $func ) { - # Allow closures in PHP 5.3+ + // Allow closures in PHP 5.3+ if ( is_object( $func ) && $func instanceof Closure ) { $profName = $fname . '-extensions-closure'; } elseif ( is_array( $func ) ) { |