MediaWiki REL1_34
Setup.php
Go to the documentation of this file.
1<?php
29
34if ( !defined( 'MEDIAWIKI' ) ) {
35 exit( 1 );
36}
37
38// Check to see if we are at the file scope
39$wgScopeTest = 'MediaWiki Setup.php scope test';
40if ( !isset( $GLOBALS['wgScopeTest'] ) || $GLOBALS['wgScopeTest'] !== $wgScopeTest ) {
41 echo "Error, Setup.php must be included from the file scope.\n";
42 die( 1 );
43}
44unset( $wgScopeTest );
45
50// Sanity check (T5782, T122807)
51if ( ini_get( 'mbstring.func_overload' ) ) {
52 die( 'MediaWiki does not support installations where mbstring.func_overload is non-zero.' );
53}
54
55// Define MW_ENTRY_POINT if it's not already, so that config code can check the
56// value without using defined()
57if ( !defined( 'MW_ENTRY_POINT' ) ) {
63 define( 'MW_ENTRY_POINT', 'unknown' );
64}
65
66// Start the autoloader, so that extensions can derive classes from core files
67require_once "$IP/includes/AutoLoader.php";
68
69// Load global constants
70require_once "$IP/includes/Defines.php";
71
72// Load default settings
73require_once "$IP/includes/DefaultSettings.php";
74
75// Load global functions
76require_once "$IP/includes/GlobalFunctions.php";
77
78// Load composer's autoloader if present
79if ( is_readable( "$IP/vendor/autoload.php" ) ) {
80 require_once "$IP/vendor/autoload.php";
81} elseif ( file_exists( "$IP/vendor/autoload.php" ) ) {
82 die( "$IP/vendor/autoload.php exists but is not readable" );
83}
84
85// Assert that composer dependencies were successfully loaded
86// Purposely no leading \ due to it breaking HHVM RepoAuthorative mode
87// PHP works fine with both versions
88// See https://github.com/facebook/hhvm/issues/5833
89if ( !interface_exists( 'Psr\Log\LoggerInterface' ) ) {
90 $message = (
91 'MediaWiki requires the <a href="https://github.com/php-fig/log">PSR-3 logging ' .
92 "library</a> to be present. This library is not embedded directly in MediaWiki's " .
93 "git repository and must be installed separately by the end user.\n\n" .
94 'Please see <a href="https://www.mediawiki.org/wiki/Download_from_Git' .
95 '#Fetch_external_libraries">mediawiki.org</a> for help on installing ' .
96 'the required components.'
97 );
98 echo $message;
99 trigger_error( $message, E_USER_ERROR );
100 die( 1 );
101}
102
107// Install a header callback
108MediaWiki\HeaderCallback::register();
109
110// Set the encoding used by PHP for reading HTTP input, and writing output.
111// This is also the default for mbstring functions.
112mb_internal_encoding( 'UTF-8' );
113
118if ( defined( 'MW_CONFIG_CALLBACK' ) ) {
119 call_user_func( MW_CONFIG_CALLBACK );
120} else {
121 if ( !defined( 'MW_CONFIG_FILE' ) ) {
122 define( 'MW_CONFIG_FILE', "$IP/LocalSettings.php" );
123 }
124 require_once MW_CONFIG_FILE;
125}
126
134if ( defined( 'MW_SETUP_CALLBACK' ) ) {
135 call_user_func( MW_SETUP_CALLBACK );
136}
137
142// Load queued extensions
143ExtensionRegistry::getInstance()->loadFromQueue();
144// Don't let any other extensions load
146
147// Set the configured locale on all requests for consisteny
148putenv( "LC_ALL=$wgShellLocale" );
149setlocale( LC_ALL, $wgShellLocale );
150
151// Set various default paths sensibly...
152if ( $wgScript === false ) {
153 $wgScript = "$wgScriptPath/index.php";
154}
155if ( $wgLoadScript === false ) {
156 $wgLoadScript = "$wgScriptPath/load.php";
157}
158if ( $wgRestPath === false ) {
159 $wgRestPath = "$wgScriptPath/rest.php";
160}
161
162if ( $wgArticlePath === false ) {
163 if ( $wgUsePathInfo ) {
164 $wgArticlePath = "$wgScript/$1";
165 } else {
166 $wgArticlePath = "$wgScript?title=$1";
167 }
168}
169
170if ( $wgResourceBasePath === null ) {
172}
173if ( $wgStylePath === false ) {
174 $wgStylePath = "$wgResourceBasePath/skins";
175}
176if ( $wgLocalStylePath === false ) {
177 // Avoid wgResourceBasePath here since that may point to a different domain (e.g. CDN)
178 $wgLocalStylePath = "$wgScriptPath/skins";
179}
180if ( $wgExtensionAssetsPath === false ) {
181 $wgExtensionAssetsPath = "$wgResourceBasePath/extensions";
182}
183
184if ( $wgLogo === false ) {
185 $wgLogo = "$wgResourceBasePath/resources/assets/wiki.png";
186}
187
188if ( $wgUploadPath === false ) {
189 $wgUploadPath = "$wgScriptPath/images";
190}
191if ( $wgUploadDirectory === false ) {
192 $wgUploadDirectory = "$IP/images";
193}
194if ( $wgReadOnlyFile === false ) {
195 $wgReadOnlyFile = "{$wgUploadDirectory}/lock_yBgMBwiR";
196}
197if ( $wgFileCacheDirectory === false ) {
198 $wgFileCacheDirectory = "{$wgUploadDirectory}/cache";
199}
200if ( $wgDeletedDirectory === false ) {
201 $wgDeletedDirectory = "{$wgUploadDirectory}/deleted";
202}
203
204if ( $wgGitInfoCacheDirectory === false && $wgCacheDirectory !== false ) {
205 $wgGitInfoCacheDirectory = "{$wgCacheDirectory}/gitinfo";
206}
207
208// Fix path to icon images after they were moved in 1.24
209if ( $wgRightsIcon ) {
210 $wgRightsIcon = str_replace(
211 "{$wgStylePath}/common/images/",
212 "{$wgResourceBasePath}/resources/assets/licenses/",
214 );
215}
216
217if ( isset( $wgFooterIcons['copyright']['copyright'] )
218 && $wgFooterIcons['copyright']['copyright'] === []
219) {
220 if ( $wgRightsIcon || $wgRightsText ) {
221 $wgFooterIcons['copyright']['copyright'] = [
222 'url' => $wgRightsUrl,
223 'src' => $wgRightsIcon,
224 'alt' => $wgRightsText,
225 ];
226 }
227}
228
229if ( isset( $wgFooterIcons['poweredby'] )
230 && isset( $wgFooterIcons['poweredby']['mediawiki'] )
231 && $wgFooterIcons['poweredby']['mediawiki']['src'] === null
232) {
233 $wgFooterIcons['poweredby']['mediawiki']['src'] =
234 "$wgResourceBasePath/resources/assets/poweredby_mediawiki_88x31.png";
235 $wgFooterIcons['poweredby']['mediawiki']['srcset'] =
236 "$wgResourceBasePath/resources/assets/poweredby_mediawiki_132x47.png 1.5x, " .
237 "$wgResourceBasePath/resources/assets/poweredby_mediawiki_176x62.png 2x";
238}
239
248
256
261 'name' => 'fsLockManager',
262 'class' => FSLockManager::class,
263 'lockDirectory' => "{$wgUploadDirectory}/lockdir",
264];
265$wgLockManagers[] = [
266 'name' => 'nullLockManager',
267 'class' => NullLockManager::class,
268];
269
275 'imagesPerRow' => 0,
276 'imageWidth' => 120,
277 'imageHeight' => 120,
278 'captionLength' => true,
279 'showBytes' => true,
280 'showDimensions' => true,
281 'mode' => 'traditional',
282];
283
287if ( !$wgLocalFileRepo ) {
289 'class' => LocalRepo::class,
290 'name' => 'local',
291 'directory' => $wgUploadDirectory,
292 'scriptDirUrl' => $wgScriptPath,
294 'hashLevels' => $wgHashedUploadDirectory ? 2 : 0,
295 'thumbScriptUrl' => $wgThumbnailScriptPath,
296 'transformVia404' => !$wgGenerateThumbnailOnParse,
297 'deletedDir' => $wgDeletedDirectory,
298 'deletedHashLevels' => $wgHashedUploadDirectory ? 3 : 0
299 ];
300}
301
302if ( !isset( $wgLocalFileRepo['backend'] ) ) {
303 // Create a default FileBackend name.
304 // FileBackendGroup will register a default, if absent from $wgFileBackends.
305 $wgLocalFileRepo['backend'] = $wgLocalFileRepo['name'] . '-backend';
306}
307
311if ( $wgUseSharedUploads ) {
312 if ( $wgSharedUploadDBname ) {
314 'class' => ForeignDBRepo::class,
315 'name' => 'shared',
316 'directory' => $wgSharedUploadDirectory,
317 'url' => $wgSharedUploadPath,
318 'hashLevels' => $wgHashedSharedUploadDirectory ? 2 : 0,
319 'thumbScriptUrl' => $wgSharedThumbnailScriptPath,
320 'transformVia404' => !$wgGenerateThumbnailOnParse,
321 'dbType' => $wgDBtype,
322 'dbServer' => $wgDBserver,
323 'dbUser' => $wgDBuser,
324 'dbPassword' => $wgDBpassword,
325 'dbName' => $wgSharedUploadDBname,
326 'dbFlags' => ( $wgDebugDumpSql ? DBO_DEBUG : 0 ) | DBO_DEFAULT,
327 'tablePrefix' => $wgSharedUploadDBprefix,
328 'hasSharedCache' => $wgCacheSharedUploads,
329 'descBaseUrl' => $wgRepositoryBaseUrl,
330 'fetchDescription' => $wgFetchCommonsDescriptions,
331 ];
332 } else {
334 'class' => FileRepo::class,
335 'name' => 'shared',
336 'directory' => $wgSharedUploadDirectory,
337 'url' => $wgSharedUploadPath,
338 'hashLevels' => $wgHashedSharedUploadDirectory ? 2 : 0,
339 'thumbScriptUrl' => $wgSharedThumbnailScriptPath,
340 'transformVia404' => !$wgGenerateThumbnailOnParse,
341 'descBaseUrl' => $wgRepositoryBaseUrl,
342 'fetchDescription' => $wgFetchCommonsDescriptions,
343 ];
344 }
345}
348 'class' => ForeignAPIRepo::class,
349 'name' => 'wikimediacommons',
350 'apibase' => 'https://commons.wikimedia.org/w/api.php',
351 'url' => 'https://upload.wikimedia.org/wikipedia/commons',
352 'thumbUrl' => 'https://upload.wikimedia.org/wikipedia/commons/thumb',
353 'hashLevels' => 2,
354 'transformVia404' => true,
355 'fetchDescription' => true,
356 'descriptionCacheExpiry' => 43200,
357 'apiThumbCacheExpiry' => 0,
358 ];
359}
360foreach ( $wgForeignFileRepos as &$repo ) {
361 if ( !isset( $repo['directory'] ) && $repo['class'] === ForeignAPIRepo::class ) {
362 $repo['directory'] = $wgUploadDirectory; // b/c
363 }
364 if ( !isset( $repo['backend'] ) ) {
365 $repo['backend'] = $repo['name'] . '-backend';
366 }
367}
368unset( $repo ); // no global pollution; destroy reference
369
370$rcMaxAgeDays = $wgRCMaxAge / ( 3600 * 24 );
371// Ensure that default user options are not invalid, since that breaks Special:Preferences
372$wgDefaultUserOptions['rcdays'] = min(
373 $wgDefaultUserOptions['rcdays'],
374 ceil( $rcMaxAgeDays )
375);
376$wgDefaultUserOptions['watchlistdays'] = min(
377 $wgDefaultUserOptions['watchlistdays'],
378 ceil( $rcMaxAgeDays )
379);
380unset( $rcMaxAgeDays );
381
382if ( $wgSkipSkin ) {
383 // Hard deprecated in 1.34.
384 wfDeprecated( '$wgSkipSkin – use $wgSkipSkins instead', '1.23' );
386}
387
388$wgSkipSkins[] = 'fallback';
389$wgSkipSkins[] = 'apioutput';
390
391if ( $wgLocalInterwiki ) {
392 // Hard deprecated in 1.34.
393 wfDeprecated( '$wgLocalInterwiki – use $wgLocalInterwikis instead', '1.23' );
394 array_unshift( $wgLocalInterwikis, $wgLocalInterwiki );
395}
396
397// Set default shared prefix
398if ( $wgSharedPrefix === false ) {
400}
401
402// Set default shared schema
403if ( $wgSharedSchema === false ) {
405}
406
407if ( !$wgCookiePrefix ) {
408 if ( $wgSharedDB && $wgSharedPrefix && in_array( 'user', $wgSharedTables ) ) {
410 } elseif ( $wgSharedDB && in_array( 'user', $wgSharedTables ) ) {
412 } elseif ( $wgDBprefix ) {
414 } else {
416 }
417}
418$wgCookiePrefix = strtr( $wgCookiePrefix, '=,; +."\'\\[', '__________' );
419
420if ( $wgEnableEmail ) {
422} else {
423 // Disable all other email settings automatically if $wgEnableEmail
424 // is set to false. - T65678
425 $wgAllowHTMLEmail = false;
426 $wgEmailAuthentication = false; // do not require auth if you're not sending email anyway
436 unset( $wgGroupPermissions['user']['sendemail'] );
440}
441
442// $wgSysopEmailBans deprecated in 1.34
443if ( isset( $wgSysopEmailBans ) && $wgSysopEmailBans === false ) {
444 wfDeprecated( 'wgSysopEmailBans', '1.34' );
445 foreach ( $wgGroupPermissions as $group => $_ ) {
446 unset( $wgGroupPermissions[$group]['blockemail'] );
447 }
448}
449
450if ( $wgMetaNamespace === false ) {
451 $wgMetaNamespace = str_replace( ' ', '_', $wgSitename );
452}
453
454// Ensure the minimum chunk size is less than PHP upload limits or the maximum
455// upload size.
461 ini_get( 'post_max_size' ) ?: ini_get( 'hhvm.server.max_post_size' ),
462 PHP_INT_MAX
463 ) ?: PHP_INT_MAX ) - 1024 // Leave some room for other POST parameters
464);
465
470$wgCanonicalNamespaceNames = NamespaceInfo::$canonicalNames;
471
473if ( is_array( $wgExtraNamespaces ) ) {
475}
476
477// Hard-deprecate setting $wgDummyLanguageCodes in LocalSettings.php
478if ( count( $wgDummyLanguageCodes ) !== 0 ) {
479 wfDeprecated( '$wgDummyLanguageCodes', '1.29' );
480}
481// Merge in the legacy language codes, incorporating overrides from the config
483 // Internal language codes of the private-use area which get mapped to
484 // themselves.
485 'qqq' => 'qqq', // Used for message documentation
486 'qqx' => 'qqx', // Used for viewing message keys
487] + $wgExtraLanguageCodes + LanguageCode::getDeprecatedCodeMapping();
488// Merge in (inverted) BCP 47 mappings
489foreach ( LanguageCode::getNonstandardLanguageCodeMapping() as $code => $bcp47 ) {
490 $bcp47 = strtolower( $bcp47 ); // force case-insensitivity
491 if ( !isset( $wgDummyLanguageCodes[$bcp47] ) ) {
492 $wgDummyLanguageCodes[$bcp47] = $wgDummyLanguageCodes[$code] ?? $code;
493 }
494}
495
496// These are now the same, always
497// To determine the user language, use $wgLang->getCode()
499
500// Temporary backwards-compatibility reading of old Squid-named CDN settings as of MediaWiki 1.34,
501// to support sysadmins who fail to update their settings immediately:
502
503if ( isset( $wgUseSquid ) ) {
504 // If the sysadmin is still setting a value of $wgUseSquid to true but $wgUseCdn is the default of
505 // false, to be safe, assume they do want this still, so enable it.
506 if ( !$wgUseCdn && $wgUseSquid ) {
507 $wgUseCdn = $wgUseSquid;
508 wfDeprecated( '$wgUseSquid enabled but $wgUseCdn disabled; enabling CDN functions', '1.34' );
509 }
510} else {
511 // Backwards-compatibility for extensions that read this value.
512 $wgUseSquid = $wgUseCdn;
513}
514
515if ( isset( $wgSquidServers ) ) {
516 // If the sysadmin is still setting a value of $wgSquidServers but $wgCdnServers is the default of
517 // empty, to be safe, assume they do want these servers to be still used, so use them.
518 if ( !empty( $wgSquidServers ) && empty( $wgCdnServers ) ) {
519 $wgCdnServers = $wgSquidServers;
520 wfDeprecated( '$wgSquidServers set, $wgCdnServers empty; using them', '1.34' );
521 }
522} else {
523 // Backwards-compatibility for extensions that read this value.
524 $wgSquidServers = $wgCdnServers;
525}
526
527if ( isset( $wgSquidServersNoPurge ) ) {
528 // If the sysadmin is still setting values in $wgSquidServersNoPurge but $wgCdnServersNoPurge is
529 // the default of empty, to be safe, assume they do want these servers to be still used, so use
530 // them.
531 if ( !empty( $wgSquidServersNoPurge ) && empty( $wgCdnServersNoPurge ) ) {
532 $wgCdnServersNoPurge = $wgSquidServersNoPurge;
533 wfDeprecated( '$wgSquidServersNoPurge set, $wgCdnServersNoPurge empty; using them', '1.34' );
534 }
535} else {
536 // Backwards-compatibility for extensions that read this value.
537 $wgSquidServersNoPurge = $wgCdnServersNoPurge;
538}
539
540if ( isset( $wgSquidMaxage ) ) {
541 // If the sysadmin is still setting a value of $wgSquidMaxage and it's higher than $wgCdnMaxAge,
542 // to be safe, assume they want the higher (lower performance requirement) value, so use that.
543 if ( $wgCdnMaxAge < $wgSquidMaxage ) {
544 $wgCdnMaxAge = $wgSquidMaxage;
545 wfDeprecated( '$wgSquidMaxage set higher than $wgCdnMaxAge; using the higher value', '1.34' );
546 }
547} else {
548 // Backwards-compatibility for extensions that read this value.
549 $wgSquidMaxage = $wgCdnMaxAge;
550}
551
552// Blacklisted file extensions shouldn't appear on the "allowed" list
553$wgFileExtensions = array_values( array_diff( $wgFileExtensions, $wgFileBlacklist ) );
554
556 Wikimedia\suppressWarnings();
557 $wgCacheEpoch = max( $wgCacheEpoch, gmdate( 'YmdHis', filemtime( "$IP/LocalSettings.php" ) ) );
558 Wikimedia\restoreWarnings();
559}
560
561if ( $wgNewUserLog ) {
562 // Add new user log type
563 $wgLogTypes[] = 'newusers';
564 $wgLogNames['newusers'] = 'newuserlogpage';
565 $wgLogHeaders['newusers'] = 'newuserlogpagetext';
566 $wgLogActionsHandlers['newusers/newusers'] = NewUsersLogFormatter::class;
567 $wgLogActionsHandlers['newusers/create'] = NewUsersLogFormatter::class;
568 $wgLogActionsHandlers['newusers/create2'] = NewUsersLogFormatter::class;
569 $wgLogActionsHandlers['newusers/byemail'] = NewUsersLogFormatter::class;
570 $wgLogActionsHandlers['newusers/autocreate'] = NewUsersLogFormatter::class;
571}
572
573if ( $wgPageCreationLog ) {
574 // Add page creation log type
575 $wgLogTypes[] = 'create';
576 $wgLogActionsHandlers['create/create'] = LogFormatter::class;
577}
578
580 $wgLogTypes[] = 'pagelang';
581 $wgLogActionsHandlers['pagelang/pagelang'] = PageLangLogFormatter::class;
582}
583
584if ( $wgCookieSecure === 'detect' ) {
586}
587
588if ( $wgProfileOnly ) {
589 // Hard deprecated in 1.34.
591 '$wgProfileOnly set the log file in $wgDebugLogGroups[\'profileoutput\'] instead',
592 '1.23'
593 );
594 $wgDebugLogGroups['profileoutput'] = $wgDebugLogFile;
595 $wgDebugLogFile = '';
596}
597
598// Backwards compatibility with old password limits
599if ( $wgMinimalPasswordLength !== false ) {
600 $wgPasswordPolicy['policies']['default']['MinimalPasswordLength'] = $wgMinimalPasswordLength;
601}
602
603if ( $wgMaximalPasswordLength !== false ) {
604 $wgPasswordPolicy['policies']['default']['MaximalPasswordLength'] = $wgMaximalPasswordLength;
605}
606
607if ( $wgPHPSessionHandling !== 'enable' &&
608 $wgPHPSessionHandling !== 'warn' &&
609 $wgPHPSessionHandling !== 'disable'
610) {
611 $wgPHPSessionHandling = 'warn';
612}
613if ( defined( 'MW_NO_SESSION' ) ) {
614 // If the entry point wants no session, force 'disable' here unless they
615 // specifically set it to the (undocumented) 'warn'.
616 // @phan-suppress-next-line PhanUndeclaredConstant
617 $wgPHPSessionHandling = MW_NO_SESSION === 'warn' ? 'warn' : 'disable';
618}
619
621
622// Reset the global service locator, so any services that have already been created will be
623// re-created while taking into account any custom settings and extensions.
624MediaWikiServices::resetGlobalInstance( new GlobalVarConfig(), 'quick' );
625
626// Define a constant that indicates that the bootstrapping of the service locator
627// is complete.
628define( 'MW_SERVICE_BOOTSTRAP_COMPLETE', 1 );
629
630MWExceptionHandler::installHandler();
631
632// T30798: $wgServer must be explicitly set
633if ( $wgServer === false ) {
634 throw new FatalError(
635 '$wgServer must be set in LocalSettings.php. ' .
636 'See <a href="https://www.mediawiki.org/wiki/Manual:$wgServer">' .
637 'https://www.mediawiki.org/wiki/Manual:$wgServer</a>.'
638 );
639}
640
641// T48998: Bail out early if $wgArticlePath is non-absolute
642foreach ( [ 'wgArticlePath', 'wgVariantArticlePath' ] as $varName ) {
643 if ( $$varName && !preg_match( '/^(https?:\/\/|\/)/', $$varName ) ) {
644 throw new FatalError(
645 "If you use a relative URL for \$$varName, it must start " .
646 'with a slash (<code>/</code>).<br><br>See ' .
647 "<a href=\"https://www.mediawiki.org/wiki/Manual:\$$varName\">" .
648 "https://www.mediawiki.org/wiki/Manual:\$$varName</a>."
649 );
650 }
651}
652
653if ( $wgCanonicalServer === false ) {
655}
656
657// Set server name
659if ( $wgServerName !== false ) {
660 wfWarn( '$wgServerName should be derived from $wgCanonicalServer, '
661 . 'not customized. Overwriting $wgServerName.' );
662}
664unset( $serverParts );
665
666// Set defaults for configuration variables
667// that are derived from the server name by default
668// Note: $wgEmergencyContact and $wgPasswordSender may be false or empty string (T104142)
669if ( !$wgEmergencyContact ) {
670 $wgEmergencyContact = 'wikiadmin@' . $wgServerName;
671}
672if ( !$wgPasswordSender ) {
673 $wgPasswordSender = 'apache@' . $wgServerName;
674}
675if ( !$wgNoReplyAddress ) {
677}
678
679if ( $wgSecureLogin && substr( $wgServer, 0, 2 ) !== '//' ) {
680 $wgSecureLogin = false;
681 wfWarn( 'Secure login was enabled on a server that only supports '
682 . 'HTTP or HTTPS. Disabling secure login.' );
683}
684
686
687// Now that GlobalFunctions is loaded, set defaults that depend on it.
688if ( $wgTmpDirectory === false ) {
690}
691
692// We don't use counters anymore. Left here for extensions still
693// expecting this to exist. Should be removed sometime 1.26 or later.
694if ( !isset( $wgDisableCounters ) ) {
695 $wgDisableCounters = true;
696}
697
698if ( $wgMainWANCache === false ) {
699 // Setup a WAN cache from $wgMainCacheType with no relayer.
700 // Sites using multiple datacenters can configure a relayer.
701 $wgMainWANCache = 'mediawiki-main-default';
703 'class' => WANObjectCache::class,
704 'cacheId' => $wgMainCacheType
705 ];
706}
707
709 // Apply $wgSharedDB table aliases for the local LB (all non-foreign DB connections)
710 MediaWikiServices::getInstance()->getDBLoadBalancer()->setTableAliases(
711 array_fill_keys(
713 [
714 'dbname' => $wgSharedDB,
715 'schema' => $wgSharedSchema,
716 'prefix' => $wgSharedPrefix
717 ]
718 )
719 );
720}
721
722// Raise the memory limit if it's too low
723// Note, this makes use of wfDebug, and thus should not be before
724// MWDebug::init() is called.
726
732if ( is_null( $wgLocaltimezone ) ) {
733 Wikimedia\suppressWarnings();
734 $wgLocaltimezone = date_default_timezone_get();
735 Wikimedia\restoreWarnings();
736}
737
738date_default_timezone_set( $wgLocaltimezone );
739if ( is_null( $wgLocalTZoffset ) ) {
740 $wgLocalTZoffset = (int)date( 'Z' ) / 60;
741}
742// The part after the System| is ignored, but rest of MW fills it
743// out as the local offset.
744$wgDefaultUserOptions['timecorrection'] = "System|$wgLocalTZoffset";
745
746if ( !$wgDBerrorLogTZ ) {
748}
749
750// Initialize the request object in $wgRequest
751$wgRequest = RequestContext::getMain()->getRequest(); // BackCompat
752// Set user IP/agent information for agent session consistency purposes
753$cpPosInfo = LBFactory::getCPInfoFromCookieValue(
754 // The cookie has no prefix and is set by MediaWiki::preOutputCommit()
755 $wgRequest->getCookie( 'cpPosIndex', '' ),
756 // Mitigate broken client-side cookie expiration handling (T190082)
757 time() - ChronologyProtector::POSITION_COOKIE_TTL
758);
759MediaWikiServices::getInstance()->getDBLoadBalancerFactory()->setRequestInfo( [
760 'IPAddress' => $wgRequest->getIP(),
761 'UserAgent' => $wgRequest->getHeader( 'User-Agent' ),
762 'ChronologyProtection' => $wgRequest->getHeader( 'MediaWiki-Chronology-Protection' ),
763 'ChronologyPositionIndex' => $wgRequest->getInt( 'cpPosIndex', $cpPosInfo['index'] ),
764 'ChronologyClientId' => $cpPosInfo['clientId']
765 ?? $wgRequest->getHeader( 'MediaWiki-Chronology-Client-Id' )
766] );
767unset( $cpPosInfo );
768// Make sure that object caching does not undermine the ChronologyProtector improvements
769if ( $wgRequest->getCookie( 'UseDC', '' ) === 'master' ) {
770 // The user is pinned to the primary DC, meaning that they made recent changes which should
771 // be reflected in their subsequent web requests. Avoid the use of interim cache keys because
772 // they use a blind TTL and could be stale if an object changes twice in a short time span.
773 MediaWikiServices::getInstance()->getMainWANObjectCache()->useInterimHoldOffCaching( false );
774}
775
776// Useful debug output
777if ( $wgCommandLineMode ) {
778 if ( isset( $self ) ) {
779 wfDebug( "\n\nStart command line script $self\n" );
780 }
781} else {
782 $debug = "\n\nStart request {$wgRequest->getMethod()} {$wgRequest->getRequestURL()}\n";
783 $debug .= "HTTP HEADERS:\n";
784 foreach ( $wgRequest->getAllHeaders() as $name => $value ) {
785 $debug .= "$name: $value\n";
786 }
787 wfDebug( $debug );
788}
789
790$wgMemc = ObjectCache::getLocalClusterInstance();
792
793// Most of the config is out, some might want to run hooks here.
794Hooks::run( 'SetupAfterCache' );
795
800$wgContLang = MediaWikiServices::getInstance()->getContentLanguage();
801
802// Now that variant lists may be available...
803$wgRequest->interpolateTitle();
804
810if ( !defined( 'MW_NO_SESSION' ) && !$wgCommandLineMode ) {
811 // If session.auto_start is there, we can't touch session name
812 if ( $wgPHPSessionHandling !== 'disable' && !wfIniGetBool( 'session.auto_start' ) ) {
813 session_name( $wgSessionName ?: $wgCookiePrefix . '_session' );
814 }
815
816 // Create the SessionManager singleton and set up our session handler,
817 // unless we're specifically asked not to.
818 if ( !defined( 'MW_NO_SESSION_HANDLER' ) ) {
819 MediaWiki\Session\PHPSessionHandler::install(
820 MediaWiki\Session\SessionManager::singleton()
821 );
822 }
823
824 // Initialize the session
825 try {
826 $session = MediaWiki\Session\SessionManager::getGlobalSession();
827 } catch ( MediaWiki\Session\SessionOverflowException $ex ) {
828 // The exception is because the request had multiple possible
829 // sessions tied for top priority. Report this to the user.
830 $list = [];
831 foreach ( $ex->getSessionInfos() as $info ) {
832 $list[] = $info->getProvider()->describe( $wgContLang );
833 }
834 $list = $wgContLang->listToText( $list );
835 throw new HttpError( 400,
836 Message::newFromKey( 'sessionmanager-tie', $list )->inLanguage( $wgContLang )->plain()
837 );
838 }
839
840 if ( $session->isPersistent() ) {
841 $wgInitialSessionId = $session->getSessionId();
842 }
843
844 $session->renew();
845 if ( MediaWiki\Session\PHPSessionHandler::isEnabled() &&
846 ( $session->isPersistent() || $session->shouldRememberUser() ) &&
847 session_id() !== $session->getId()
848 ) {
849 // Start the PHP-session for backwards compatibility
850 if ( session_id() !== '' ) {
851 wfDebugLog( 'session', 'PHP session {old_id} was already started, changing to {new_id}', 'all', [
852 'old_id' => session_id(),
853 'new_id' => $session->getId(),
854 ] );
855 session_write_close();
856 }
857 session_id( $session->getId() );
858 session_start();
859 }
860
861 unset( $session );
862} else {
863 // Even if we didn't set up a global Session, still install our session
864 // handler unless specifically requested not to.
865 if ( !defined( 'MW_NO_SESSION_HANDLER' ) ) {
866 MediaWiki\Session\PHPSessionHandler::install(
867 MediaWiki\Session\SessionManager::singleton()
868 );
869 }
870}
871
875$wgUser = RequestContext::getMain()->getUser(); // BackCompat
876
881
885$wgOut = RequestContext::getMain()->getOutput(); // BackCompat
886
891$wgParser = new StubObject( 'wgParser', function () {
892 return MediaWikiServices::getInstance()->getParser();
893} );
894
898$wgTitle = null;
899
900// Extension setup functions
901// Entries should be added to this variable during the inclusion
902// of the extension file. This allows the extension to perform
903// any necessary initialisation in the fully initialised environment
904foreach ( $wgExtensionFunctions as $func ) {
905 call_user_func( $func );
906}
907
908// If the session user has a 0 id but a valid name, that means we need to
909// autocreate it.
910if ( !defined( 'MW_NO_SESSION' ) && !$wgCommandLineMode ) {
911 $sessionUser = MediaWiki\Session\SessionManager::getGlobalSession()->getUser();
912 if ( $sessionUser->getId() === 0 && User::isValidUserName( $sessionUser->getName() ) ) {
913 $res = MediaWiki\Auth\AuthManager::singleton()->autoCreateUser(
914 $sessionUser,
915 MediaWiki\Auth\AuthManager::AUTOCREATE_SOURCE_SESSION,
916 true
917 );
918 \MediaWiki\Logger\LoggerFactory::getInstance( 'authevents' )->info( 'Autocreation attempt', [
919 'event' => 'autocreate',
920 'status' => $res,
921 ] );
922 unset( $res );
923 }
924 unset( $sessionUser );
925}
926
927if ( !$wgCommandLineMode ) {
929}
930
$GLOBALS['IP']
$wgRightsIcon
Override for copyright metadata.
$wgCacheEpoch
Set this to current time to invalidate all prior cached pages.
bool $wgPageLanguageUseDB
Enable page language feature Allows setting page language in database.
string $wgSharedUploadDirectory
Shortcut for the 'directory' setting of $wgForeignFileRepos.
$wgUsePathInfo
Whether to support URLs like index.php/Page_title These often break when PHP is set up in CGI mode.
$wgLanguageCode
Site language code.
$wgUseCdn
Enable/disable CDN.
$wgMemoryLimit
The minimum amount of memory that MediaWiki "needs"; MediaWiki will try to raise PHP's memory limit i...
$wgEmergencyContact
Site admin email address.
$wgDBprefix
Current wiki database table name prefix.
$wgDBuser
Database username.
string $wgPHPSessionHandling
Whether to use PHP session handling ($_SESSION and session_*() functions)
bool $wgCacheSharedUploads
Shortcut for the ForeignDBRepo 'hasSharedCache' setting in $wgForeignFileRepos.
bool string $wgSharedUploadDBname
Shortcut for the ForeignDBRepo 'dbName' setting in $wgForeignFileRepos.
$wgScript
The URL path to index.php.
$wgUseInstantCommons
Use Wikimedia Commons as a foreign file repository.
bool $wgHashedSharedUploadDirectory
Shortcut for the 'hashLevels' setting of $wgForeignFileRepos.
$wgCacheDirectory
Directory for caching data in the local filesystem.
$wgGenerateThumbnailOnParse
Allow thumbnail rendering on page view.
$wgRightsUrl
Set this to specify an external URL containing details about the content license used on your wiki.
$wgSharedTables
$wgSessionName
Override to customise the session name.
$wgMainCacheType
Main cache type.
$wgLocalInterwiki
The interwiki prefix of the current wiki, or false if it doesn't have one.
$wgPasswordPolicy
Password policy for the wiki.
$wgLogNames
Lists the message key string for each log type.
$wgHashedUploadDirectory
Set this to false if you do not want MediaWiki to divide your images directory into many subdirectori...
$wgInvalidateCacheOnLocalSettingsChange
Invalidate various caches when LocalSettings.php changes.
$wgLocalStylePath
The URL path of the skins directory.
$wgThumbnailScriptPath
Give a path here to use thumb.php for thumbnail generation on client request, instead of generating t...
$wgExtraNamespaces
Additional namespaces.
$wgTmpDirectory
The local filesystem path to a temporary directory.
bool $wgUseSharedUploads
Shortcut for adding an entry to $wgForeignFileRepos.
string $wgSharedUploadDBprefix
Shortcut for the ForeignDBRepo 'tablePrefix' setting in $wgForeignFileRepos.
$wgDBtype
Database type.
$wgDBmwschema
Current wiki database schema name.
$wgNoReplyAddress
Reply-To address for e-mail notifications.
$wgDBname
Current wiki database name.
$wgDBerrorLogTZ
Timezone to use in the error log.
$wgUploadDirectory
The filesystem path of the images directory.
$wgLogTypes
The logging system has two levels: an event type, which describes the general category and can be vie...
$wgMaximalPasswordLength
Specifies the maximal length of a user password (T64685).
$wgSitename
Name of the site.
$wgReadOnlyFile
If this lock file exists (size > 0), the wiki will be forced into read-only mode.
$wgFileCacheDirectory
Directory where the cached page will be saved.
$wgRightsText
If either $wgRightsUrl or $wgRightsPage is specified then this variable gives the text for the link.
$wgGitInfoCacheDirectory
Directory where GitInfo will look for pre-computed cache files.
$wgPageCreationLog
Maintain a log of page creations at Special:Log/create?
$wgResourceBasePath
The default 'remoteBasePath' value for instances of ResourceLoaderFileModule.
$wgProfileOnly
Don't put non-profiling info into log file.
$wgFooterIcons
Abstract list of footer icons for skins in place of old copyrightico and poweredbyico code You can ad...
$wgUploadPath
The URL path for the images directory.
$wgFileBlacklist
Files with these extensions will never be allowed as uploads.
$wgEnableEmail
Set to true to enable the e-mail basic features: Password reminders, etc.
$wgExtensionFunctions
A list of callback functions which are called once MediaWiki is fully initialised.
$wgShellLocale
Locale for LC_ALL, to provide a known environment for locale-sensitive operations.
$wgSecureLogin
This is to let user authenticate using https when they come from http.
$wgRCMaxAge
Recentchanges items are periodically purged; entries older than this many seconds will go.
$wgLocaltimezone
Fake out the timezone that the server thinks it's in.
$wgUploadBaseUrl
If set, this URL is added to the start of $wgUploadPath to form a complete upload URL.
bool $wgFetchCommonsDescriptions
Shortcut for the 'fetchDescription' setting of $wgForeignFileRepos.
$wgGroupPermissions
Permission keys given to users in each group.
$wgRestPath
The URL path to the REST API Defaults to "{$wgScriptPath}/rest.php".
string $wgSharedThumbnailScriptPath
Shortcut for the 'thumbScriptUrl' setting of $wgForeignFileRepos.
$wgLocalInterwikis
Array for multiple $wgLocalInterwiki values, in case there are several interwiki prefixes that point ...
$wgLocalFileRepo
File repository structures.
$wgDeletedDirectory
What directory to place deleted uploads in.
$wgScriptPath
The path we should point to.
$wgWANObjectCaches
Advanced WAN object cache configuration.
$wgAllowHTMLEmail
For parts of the system that have been updated to provide HTML email content, send both text and HTML...
$wgExtensionAssetsPath
The URL path of the extensions directory.
$wgForeignFileRepos
Enable the use of files from one or more other wikis.
$wgRepositoryBaseUrl
Shortcut for the 'descBaseUrl' setting of $wgForeignFileRepos.
$wgLogHeaders
Lists the message key string for descriptive text to be shown at the top of each log type.
$wgCdnMaxAge
Cache TTL for the CDN sent as s-maxage (without ESI) or Surrogate-Control (with ESI).
$wgDebugLogGroups
Map of string log group names to log destinations.
$wgSharedDB
Shared database for multiple wikis.
$wgDebugDumpSql
Write SQL queries to the debug log.
$wgDBserver
Database host name or IP address.
bool $wgForceHTTPS
If this is true, when an insecure HTTP request is received, always redirect to HTTPS.
$wgLoadScript
The URL path to load.php.
$wgCookieSecure
Whether the "secure" flag should be set on the cookie.
$wgExtraLanguageCodes
List of mappings from one language code to another.
$wgCanonicalServer
Canonical URL of the server, to use in IRC feeds and notification e-mails.
$wgStylePath
The URL path of the skins directory.
$wgServer
URL of the server.
$wgMinimalPasswordLength
Specifies the minimal length of a user password.
$wgMetaNamespace
Name of the project namespace.
$wgLogo
The URL path of the wiki logo.
$wgCdnServersNoPurge
As with $wgCdnServers, except these servers aren't purged on page changes; use to set a list of trust...
$wgSharedSchema
$wgSysopEmailBans
Allow sysops to ban users from accessing Emailuser.
$wgDebugLogFile
Filename for debug logging.
$wgPasswordSender
Sender email address for e-mail notifications.
$wgLogActionsHandlers
The same as above, but here values are names of classes, not messages.
$wgCdnServers
List of proxy servers to purge on changes; default port is 80.
string $wgSharedUploadPath
Shortcut for the 'url' setting of $wgForeignFileRepos.
$wgLocalTZoffset
Set an offset from UTC in minutes to use for the default timezone setting for anonymous users and new...
$wgSharedPrefix
$wgMainWANCache
Main Wide-Area-Network cache type.
$wgDBpassword
Database user's password.
$wgNewUserLog
Maintain a log of newusers at Special:Log/newusers?
global $wgCommandLineMode
wfDebug( $text, $dest='all', array $context=[])
Sends a line to the debug log if enabled or, optionally, to a comment in output.
wfParseUrl( $url)
parse_url() work-alike, but non-broken.
wfTempDir()
Tries to get the system directory for temporary files.
wfWarn( $msg, $callerOffset=1, $level=E_USER_NOTICE)
Send a warning either to the debug log or in a PHP error depending on $wgDevelopmentWarnings.
wfMemoryLimit( $newLimit)
Raise PHP's memory limit (if needed).
wfIniGetBool( $setting)
Safety wrapper around ini_get() for boolean settings.
wfGetMessageCacheStorage()
Get the cache object used by the message cache.
wfExpandUrl( $url, $defaultProto=PROTO_CURRENT)
Expand a potentially local URL to a fully-qualified URL.
wfDebugLog( $logGroup, $text, $dest='all', array $context=[])
Send a line to a supplementary debug log file, if configured, or main debug log if not.
wfShorthandToInteger( $string='', $default=-1)
Converts shorthand byte notation to integer form.
wfDeprecated( $function, $version=false, $component=false, $callerOffset=2)
Throws a warning that $function is deprecated.
$wgGalleryOptions
Default parameters for the "<gallery>" tag.
Definition Setup.php:274
$messageMemc
Definition Setup.php:791
$wgFileExtensions
Definition Setup.php:553
if(is_array($wgExtraNamespaces)) if(count( $wgDummyLanguageCodes) !==0) $wgDummyLanguageCodes
Definition Setup.php:482
$wgEnotifWatchlist
Definition Setup.php:435
$wgContLang
Definition Setup.php:800
$wgEnotifMaxRecips
Definition Setup.php:430
$wgEnotifUserTalk
Definition Setup.php:434
$cpPosInfo
Definition Setup.php:753
if($wgScript===false) if( $wgLoadScript===false) if($wgRestPath===false) if( $wgArticlePath===false) if($wgResourceBasePath===null) if( $wgStylePath===false) if($wgLocalStylePath===false) if( $wgExtensionAssetsPath===false) if($wgLogo===false) if( $wgUploadPath===false) if($wgUploadDirectory===false) if( $wgReadOnlyFile===false) if($wgFileCacheDirectory===false) if( $wgDeletedDirectory===false) if($wgGitInfoCacheDirectory===false &&$wgCacheDirectory !==false) if( $wgRightsIcon) if(isset($wgFooterIcons[ 'copyright'][ 'copyright']) &&$wgFooterIcons[ 'copyright'][ 'copyright']===[]) if(isset( $wgFooterIcons['poweredby']) &&isset( $wgFooterIcons['poweredby']['mediawiki']) && $wgFooterIcons['poweredby']['mediawiki']['src']===null) $wgNamespaceProtection[NS_MEDIAWIKI]
Unconditional protection for NS_MEDIAWIKI since otherwise it's too easy for a sysadmin to set $wgName...
Definition Setup.php:247
$wgEnableUserEmail
Definition Setup.php:427
$rcMaxAgeDays
Definition Setup.php:370
foreach(LanguageCode::getNonstandardLanguageCodeMapping() as $code=> $bcp47) $wgContLanguageCode
Definition Setup.php:498
$wgOut
Definition Setup.php:885
if(isset($wgSysopEmailBans) &&$wgSysopEmailBans===false) if( $wgMetaNamespace===false) $wgMinUploadChunkSize
Definition Setup.php:456
$wgCanonicalNamespaceNames
Definitions of the NS_ constants are in Defines.php.
Definition Setup.php:470
$wgMemc
Definition Setup.php:790
$wgParser
Definition Setup.php:891
foreach( $wgExtensionFunctions as $func) if(!defined('MW_NO_SESSION') &&! $wgCommandLineMode) if(! $wgCommandLineMode) $wgFullyInitialised
Definition Setup.php:931
$wgTitle
Definition Setup.php:898
$wgEnotifFromEditor
Definition Setup.php:428
$wgUseEnotif
Definition Setup.php:437
$wgEnotifRevealEditorAddress
Definition Setup.php:432
if(!defined( 'MEDIAWIKI')) $wgScopeTest
This file is not a valid entry point, perform no further processing unless MEDIAWIKI is defined.
Definition Setup.php:39
$debug
Definition Setup.php:783
$wgInitialSessionId
Definition Setup.php:809
$wgEnotifImpersonal
Definition Setup.php:429
$wgUsersNotifiedOnAllChanges
Definition Setup.php:439
$wgUserEmailUseReplyTo
Definition Setup.php:438
if(! $wgDBerrorLogTZ) $wgRequest
Definition Setup.php:751
if( $wgServer===false) foreach(['wgArticlePath', 'wgVariantArticlePath'] as $varName) if( $wgCanonicalServer===false) $serverParts
Definition Setup.php:658
if($wgLocalInterwiki) if( $wgSharedPrefix===false) if($wgSharedSchema===false) if(! $wgCookiePrefix) $wgCookiePrefix
Definition Setup.php:418
if( $wgServerName !==false) $wgServerName
Definition Setup.php:663
$wgEnotifMinorEdits
Definition Setup.php:431
$wgLockManagers[]
Initialise $wgLockManagers to include basic FS version.
Definition Setup.php:260
$wgDefaultUserOptions['rcdays']
Definition Setup.php:372
$wgEmailAuthentication
Definition Setup.php:426
$wgNamespaceAliases['Image']
The canonical names of namespaces 6 and 7 are, as of v1.14, "File" and "File_talk".
Definition Setup.php:254
if(! $wgEmergencyContact) if(! $wgPasswordSender) if(! $wgNoReplyAddress) if( $wgSecureLogin &&substr( $wgServer, 0, 2) !=='//') $wgVirtualRestConfig['global']['domain']
Definition Setup.php:685
$wgLang
Definition Setup.php:880
if( $wgSkipSkin) $wgSkipSkins[]
Definition Setup.php:388
$wgEnotifUseRealName
Definition Setup.php:433
Exception class which takes an HTML error message, and does not produce a backtrace.
Accesses configuration settings from $GLOBALS.
Show an error that looks like an HTTP server error.
Definition HttpError.php:30
static setup()
Definition MWDebug.php:73
MediaWikiServices is the service locator for the application scope of MediaWiki.
static newFromKey( $key,... $params)
Factory function that is just wrapper for the real constructor.
Definition Message.php:410
static schedulePingback()
Schedule a deferred callable that will check if a pingback should be sent and (if so) proceed to send...
Definition Pingback.php:272
static getMain()
Get the RequestContext object associated with the main request.
Class to implement stub globals, which are globals that delay loading the their associated module cod...
Stub object for the user language.
static getMaxUploadSize( $forType=null)
Get the MediaWiki maximum uploaded file size for given type of upload, based on $wgMaxUploadSize.
static getMaxPhpUploadSize()
Get the PHP maximum uploaded file size, based on ini settings.
static isValidUserName( $name)
Is the input a valid username?
Definition User.php:959
static detectProtocol()
Detect the protocol from $_SERVER.
Helper class for mitigating DB replication lag in order to provide "session consistency".
An interface for generating database load balancers.
Definition LBFactory.php:40
const NS_FILE
Definition Defines.php:75
const NS_MEDIAWIKI
Definition Defines.php:77
const NS_FILE_TALK
Definition Defines.php:76
const PROTO_HTTP
Definition Defines.php:208
$wgArticlePath
Definition img_auth.php:47
const MW_CONFIG_CALLBACK
Definition install.php:26
const MW_NO_SESSION
Definition load.php:29
A helper class for throttling authentication attempts.
const DBO_DEFAULT
Definition defines.php:13
const DBO_DEBUG
Definition defines.php:9