MediaWiki  master
Setup.php
Go to the documentation of this file.
1 <?php
29 
34 if ( !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';
40 if ( !isset( $GLOBALS['wgScopeTest'] ) || $GLOBALS['wgScopeTest'] !== $wgScopeTest ) {
41  echo "Error, Setup.php must be included from the file scope.\n";
42  die( 1 );
43 }
44 unset( $wgScopeTest );
45 
50 // Sanity check (T5782, T122807)
51 if ( 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()
57 if ( !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
67 require_once "$IP/includes/AutoLoader.php";
68 
69 // Load global constants
70 require_once "$IP/includes/Defines.php";
71 
72 // Load default settings
73 require_once "$IP/includes/DefaultSettings.php";
74 
75 // Load global functions
76 require_once "$IP/includes/GlobalFunctions.php";
77 
78 // Load composer's autoloader if present
79 if ( 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
89 if ( !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
109 
110 // Set the encoding used by PHP for reading HTTP input, and writing output.
111 // This is also the default for mbstring functions.
112 mb_internal_encoding( 'UTF-8' );
113 
118 if ( 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 
134 if ( defined( 'MW_SETUP_CALLBACK' ) ) {
135  call_user_func( MW_SETUP_CALLBACK );
136 }
137 
142 // Load queued extensions
143 ExtensionRegistry::getInstance()->loadFromQueue();
144 // Don't let any other extensions load
146 
147 // Set the configured locale on all requests for consisteny
148 putenv( "LC_ALL=$wgShellLocale" );
149 setlocale( LC_ALL, $wgShellLocale );
150 
151 // Set various default paths sensibly...
152 if ( $wgScript === false ) {
153  $wgScript = "$wgScriptPath/index.php";
154 }
155 if ( $wgLoadScript === false ) {
156  $wgLoadScript = "$wgScriptPath/load.php";
157 }
158 if ( $wgRestPath === false ) {
159  $wgRestPath = "$wgScriptPath/rest.php";
160 }
161 
162 if ( $wgArticlePath === false ) {
163  if ( $wgUsePathInfo ) {
164  $wgArticlePath = "$wgScript/$1";
165  } else {
166  $wgArticlePath = "$wgScript?title=$1";
167  }
168 }
169 
170 if ( $wgResourceBasePath === null ) {
172 }
173 if ( $wgStylePath === false ) {
174  $wgStylePath = "$wgResourceBasePath/skins";
175 }
176 if ( $wgLocalStylePath === false ) {
177  // Avoid wgResourceBasePath here since that may point to a different domain (e.g. CDN)
178  $wgLocalStylePath = "$wgScriptPath/skins";
179 }
180 if ( $wgExtensionAssetsPath === false ) {
181  $wgExtensionAssetsPath = "$wgResourceBasePath/extensions";
182 }
183 
184 if ( $wgLogo === false ) {
185  $wgLogo = "$wgResourceBasePath/resources/assets/wiki.png";
186 }
187 
188 if ( $wgUploadPath === false ) {
189  $wgUploadPath = "$wgScriptPath/images";
190 }
191 if ( $wgUploadDirectory === false ) {
192  $wgUploadDirectory = "$IP/images";
193 }
194 if ( $wgReadOnlyFile === false ) {
195  $wgReadOnlyFile = "{$wgUploadDirectory}/lock_yBgMBwiR";
196 }
197 if ( $wgFileCacheDirectory === false ) {
198  $wgFileCacheDirectory = "{$wgUploadDirectory}/cache";
199 }
200 if ( $wgDeletedDirectory === false ) {
201  $wgDeletedDirectory = "{$wgUploadDirectory}/deleted";
202 }
203 
204 if ( $wgGitInfoCacheDirectory === false && $wgCacheDirectory !== false ) {
205  $wgGitInfoCacheDirectory = "{$wgCacheDirectory}/gitinfo";
206 }
207 
208 // Fix path to icon images after they were moved in 1.24
209 if ( $wgRightsIcon ) {
210  $wgRightsIcon = str_replace(
211  "{$wgStylePath}/common/images/",
212  "{$wgResourceBasePath}/resources/assets/licenses/",
214  );
215 }
216 
217 if ( 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 
229 if ( 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 
287 if ( !$wgLocalFileRepo ) {
288  $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 
302 if ( !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 
311 if ( $wgUseSharedUploads ) {
312  if ( $wgSharedUploadDBname ) {
313  $wgForeignFileRepos[] = [
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 {
333  $wgForeignFileRepos[] = [
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 }
346 if ( $wgUseInstantCommons ) {
347  $wgForeignFileRepos[] = [
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 }
360 foreach ( $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 }
368 unset( $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 );
380 unset( $rcMaxAgeDays );
381 
382 if ( $wgSkipSkin ) {
383  // Hard deprecated in 1.34.
384  wfDeprecated( '$wgSkipSkin – use $wgSkipSkins instead', '1.23' );
386 }
387 
388 $wgSkipSkins[] = 'fallback';
389 $wgSkipSkins[] = 'apioutput';
390 
391 if ( $wgLocalInterwiki ) {
392  // Hard deprecated in 1.34.
393  wfDeprecated( '$wgLocalInterwiki – use $wgLocalInterwikis instead', '1.23' );
394  // @phan-suppress-next-line PhanUndeclaredVariableDim
395  array_unshift( $wgLocalInterwikis, $wgLocalInterwiki );
396 }
397 
398 // Set default shared prefix
399 if ( $wgSharedPrefix === false ) {
401 }
402 
403 // Set default shared schema
404 if ( $wgSharedSchema === false ) {
406 }
407 
408 if ( !$wgCookiePrefix ) {
409  if ( $wgSharedDB && $wgSharedPrefix && in_array( 'user', $wgSharedTables ) ) {
411  } elseif ( $wgSharedDB && in_array( 'user', $wgSharedTables ) ) {
413  } elseif ( $wgDBprefix ) {
415  } else {
417  }
418 }
419 $wgCookiePrefix = strtr( $wgCookiePrefix, '=,; +."\'\\[', '__________' );
420 
421 if ( $wgEnableEmail ) {
423 } else {
424  // Disable all other email settings automatically if $wgEnableEmail
425  // is set to false. - T65678
426  $wgAllowHTMLEmail = false;
427  $wgEmailAuthentication = false; // do not require auth if you're not sending email anyway
437  unset( $wgGroupPermissions['user']['sendemail'] );
438  $wgUseEnotif = false;
441 }
442 
443 // $wgSysopEmailBans deprecated in 1.34
444 if ( isset( $wgSysopEmailBans ) && $wgSysopEmailBans === false ) {
445  foreach ( $wgGroupPermissions as $group => $_ ) {
446  unset( $wgGroupPermissions[$group]['blockemail'] );
447  }
448 }
449 
450 if ( $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 
471 
473 if ( is_array( $wgExtraNamespaces ) ) {
475 }
476 
477 // Hard-deprecate setting $wgDummyLanguageCodes in LocalSettings.php
478 if ( 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
488 // Merge in (inverted) BCP 47 mappings
489 foreach ( 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 
503 if ( 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 
515 if ( 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 
527 if ( 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 
540 if ( 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 
561 if ( $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 
573 if ( $wgPageCreationLog ) {
574  // Add page creation log type
575  $wgLogTypes[] = 'create';
576  $wgLogActionsHandlers['create/create'] = LogFormatter::class;
577 }
578 
579 if ( $wgPageLanguageUseDB ) {
580  $wgLogTypes[] = 'pagelang';
581  $wgLogActionsHandlers['pagelang/pagelang'] = PageLangLogFormatter::class;
582 }
583 
584 if ( $wgCookieSecure === 'detect' ) {
585  $wgCookieSecure = ( WebRequest::detectProtocol() === 'https' );
586 }
587 
588 if ( $wgProfileOnly ) {
589  // Hard deprecated in 1.34.
590  wfDeprecated(
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
599 if ( $wgMinimalPasswordLength !== false ) {
600  $wgPasswordPolicy['policies']['default']['MinimalPasswordLength'] = $wgMinimalPasswordLength;
601 }
602 
603 if ( $wgMaximalPasswordLength !== false ) {
604  $wgPasswordPolicy['policies']['default']['MaximalPasswordLength'] = $wgMaximalPasswordLength;
605 }
606 
607 if ( $wgPHPSessionHandling !== 'enable' &&
608  $wgPHPSessionHandling !== 'warn' &&
609  $wgPHPSessionHandling !== 'disable'
610 ) {
611  $wgPHPSessionHandling = 'warn';
612 }
613 if ( 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.
624 MediaWikiServices::resetGlobalInstance( new GlobalVarConfig(), 'quick' );
625 
626 // Define a constant that indicates that the bootstrapping of the service locator
627 // is complete.
628 define( 'MW_SERVICE_BOOTSTRAP_COMPLETE', 1 );
629 
631 
632 // T48998: Bail out early if $wgArticlePath is non-absolute
633 foreach ( [ 'wgArticlePath', 'wgVariantArticlePath' ] as $varName ) {
634  if ( $$varName && !preg_match( '/^(https?:\/\/|\/)/', $$varName ) ) {
635  throw new FatalError(
636  "If you use a relative URL for \$$varName, it must start " .
637  'with a slash (<code>/</code>).<br><br>See ' .
638  "<a href=\"https://www.mediawiki.org/wiki/Manual:\$$varName\">" .
639  "https://www.mediawiki.org/wiki/Manual:\$$varName</a>."
640  );
641  }
642 }
643 
644 if ( $wgCanonicalServer === false ) {
646 }
647 
648 // Set server name
650 if ( $wgServerName !== false ) {
651  wfWarn( '$wgServerName should be derived from $wgCanonicalServer, '
652  . 'not customized. Overwriting $wgServerName.' );
653 }
655 unset( $serverParts );
656 
657 // Set defaults for configuration variables
658 // that are derived from the server name by default
659 // Note: $wgEmergencyContact and $wgPasswordSender may be false or empty string (T104142)
660 if ( !$wgEmergencyContact ) {
661  $wgEmergencyContact = 'wikiadmin@' . $wgServerName;
662 }
663 if ( !$wgPasswordSender ) {
664  $wgPasswordSender = 'apache@' . $wgServerName;
665 }
666 if ( !$wgNoReplyAddress ) {
668 }
669 
670 if ( $wgSecureLogin && substr( $wgServer, 0, 2 ) !== '//' ) {
671  $wgSecureLogin = false;
672  wfWarn( 'Secure login was enabled on a server that only supports '
673  . 'HTTP or HTTPS. Disabling secure login.' );
674 }
675 
677 
678 // Now that GlobalFunctions is loaded, set defaults that depend on it.
679 if ( $wgTmpDirectory === false ) {
681 }
682 
683 // We don't use counters anymore. Left here for extensions still
684 // expecting this to exist. Should be removed sometime 1.26 or later.
685 if ( !isset( $wgDisableCounters ) ) {
686  $wgDisableCounters = true;
687 }
688 
689 if ( $wgMainWANCache === false ) {
690  // Setup a WAN cache from $wgMainCacheType with no relayer.
691  // Sites using multiple datacenters can configure a relayer.
692  $wgMainWANCache = 'mediawiki-main-default';
694  'class' => WANObjectCache::class,
695  'cacheId' => $wgMainCacheType
696  ];
697 }
698 
699 if ( $wgSharedDB && $wgSharedTables ) {
700  // Apply $wgSharedDB table aliases for the local LB (all non-foreign DB connections)
701  MediaWikiServices::getInstance()->getDBLoadBalancer()->setTableAliases(
702  array_fill_keys(
704  [
705  'dbname' => $wgSharedDB,
706  'schema' => $wgSharedSchema,
707  'prefix' => $wgSharedPrefix
708  ]
709  )
710  );
711 }
712 
713 // Raise the memory limit if it's too low
714 // Note, this makes use of wfDebug, and thus should not be before
715 // MWDebug::init() is called.
717 
723 if ( is_null( $wgLocaltimezone ) ) {
724  Wikimedia\suppressWarnings();
725  $wgLocaltimezone = date_default_timezone_get();
726  Wikimedia\restoreWarnings();
727 }
728 
729 date_default_timezone_set( $wgLocaltimezone );
730 if ( is_null( $wgLocalTZoffset ) ) {
731  $wgLocalTZoffset = (int)date( 'Z' ) / 60;
732 }
733 // The part after the System| is ignored, but rest of MW fills it
734 // out as the local offset.
735 $wgDefaultUserOptions['timecorrection'] = "System|$wgLocalTZoffset";
736 
737 if ( !$wgDBerrorLogTZ ) {
739 }
740 
741 // Initialize the request object in $wgRequest
742 $wgRequest = RequestContext::getMain()->getRequest(); // BackCompat
743 // Set user IP/agent information for agent session consistency purposes
744 $cpPosInfo = LBFactory::getCPInfoFromCookieValue(
745  // The cookie has no prefix and is set by MediaWiki::preOutputCommit()
746  $wgRequest->getCookie( 'cpPosIndex', '' ),
747  // Mitigate broken client-side cookie expiration handling (T190082)
748  time() - ChronologyProtector::POSITION_COOKIE_TTL
749 );
750 MediaWikiServices::getInstance()->getDBLoadBalancerFactory()->setRequestInfo( [
751  'IPAddress' => $wgRequest->getIP(),
752  'UserAgent' => $wgRequest->getHeader( 'User-Agent' ),
753  'ChronologyProtection' => $wgRequest->getHeader( 'MediaWiki-Chronology-Protection' ),
754  'ChronologyPositionIndex' => $wgRequest->getInt( 'cpPosIndex', $cpPosInfo['index'] ),
755  'ChronologyClientId' => $cpPosInfo['clientId']
756  ?? $wgRequest->getHeader( 'MediaWiki-Chronology-Client-Id' )
757 ] );
758 unset( $cpPosInfo );
759 // Make sure that object caching does not undermine the ChronologyProtector improvements
760 if ( $wgRequest->getCookie( 'UseDC', '' ) === 'master' ) {
761  // The user is pinned to the primary DC, meaning that they made recent changes which should
762  // be reflected in their subsequent web requests. Avoid the use of interim cache keys because
763  // they use a blind TTL and could be stale if an object changes twice in a short time span.
764  MediaWikiServices::getInstance()->getMainWANObjectCache()->useInterimHoldOffCaching( false );
765 }
766 
767 // Useful debug output
768 if ( $wgCommandLineMode ) {
769  if ( isset( $self ) ) {
770  wfDebug( "\n\nStart command line script $self\n" );
771  }
772 } else {
773  $debug = "\n\nStart request {$wgRequest->getMethod()} {$wgRequest->getRequestURL()}\n";
774  $debug .= "HTTP HEADERS:\n";
775  foreach ( $wgRequest->getAllHeaders() as $name => $value ) {
776  $debug .= "$name: $value\n";
777  }
778  wfDebug( $debug );
779 }
780 
783 
784 // Most of the config is out, some might want to run hooks here.
785 Hooks::run( 'SetupAfterCache' );
786 
791 $wgContLang = MediaWikiServices::getInstance()->getContentLanguage();
792 
793 // Now that variant lists may be available...
794 $wgRequest->interpolateTitle();
795 
801 if ( !defined( 'MW_NO_SESSION' ) && !$wgCommandLineMode ) {
802  // If session.auto_start is there, we can't touch session name
803  if ( $wgPHPSessionHandling !== 'disable' && !wfIniGetBool( 'session.auto_start' ) ) {
804  session_name( $wgSessionName ?: $wgCookiePrefix . '_session' );
805  }
806 
807  // Create the SessionManager singleton and set up our session handler,
808  // unless we're specifically asked not to.
809  if ( !defined( 'MW_NO_SESSION_HANDLER' ) ) {
811  MediaWiki\Session\SessionManager::singleton()
812  );
813  }
814 
815  // Initialize the session
816  try {
818  } catch ( MediaWiki\Session\SessionOverflowException $ex ) {
819  // The exception is because the request had multiple possible
820  // sessions tied for top priority. Report this to the user.
821  $list = [];
822  foreach ( $ex->getSessionInfos() as $info ) {
823  $list[] = $info->getProvider()->describe( $wgContLang );
824  }
825  $list = $wgContLang->listToText( $list );
826  throw new HttpError( 400,
827  Message::newFromKey( 'sessionmanager-tie', $list )->inLanguage( $wgContLang )->plain()
828  );
829  }
830 
831  if ( $session->isPersistent() ) {
832  $wgInitialSessionId = $session->getSessionId();
833  }
834 
835  $session->renew();
836  if ( MediaWiki\Session\PHPSessionHandler::isEnabled() &&
837  ( $session->isPersistent() || $session->shouldRememberUser() ) &&
838  session_id() !== $session->getId()
839  ) {
840  // Start the PHP-session for backwards compatibility
841  if ( session_id() !== '' ) {
842  wfDebugLog( 'session', 'PHP session {old_id} was already started, changing to {new_id}', 'all', [
843  'old_id' => session_id(),
844  'new_id' => $session->getId(),
845  ] );
846  session_write_close();
847  }
848  session_id( $session->getId() );
849  session_start();
850  }
851 
852  unset( $session );
853 } else {
854  // Even if we didn't set up a global Session, still install our session
855  // handler unless specifically requested not to.
856  if ( !defined( 'MW_NO_SESSION_HANDLER' ) ) {
858  MediaWiki\Session\SessionManager::singleton()
859  );
860  }
861 }
862 
866 $wgUser = RequestContext::getMain()->getUser(); // BackCompat
867 
872 
876 $wgOut = RequestContext::getMain()->getOutput(); // BackCompat
877 
882 $wgParser = new StubObject( 'wgParser', function () {
883  return MediaWikiServices::getInstance()->getParser();
884 } );
885 
889 $wgTitle = null;
890 
891 // Extension setup functions
892 // Entries should be added to this variable during the inclusion
893 // of the extension file. This allows the extension to perform
894 // any necessary initialisation in the fully initialised environment
895 foreach ( $wgExtensionFunctions as $func ) {
896  call_user_func( $func );
897 }
898 
899 // If the session user has a 0 id but a valid name, that means we need to
900 // autocreate it.
901 if ( !defined( 'MW_NO_SESSION' ) && !$wgCommandLineMode ) {
902  $sessionUser = MediaWiki\Session\SessionManager::getGlobalSession()->getUser();
903  if ( $sessionUser->getId() === 0 && User::isValidUserName( $sessionUser->getName() ) ) {
904  $res = MediaWiki\Auth\AuthManager::singleton()->autoCreateUser(
905  $sessionUser,
906  MediaWiki\Auth\AuthManager::AUTOCREATE_SOURCE_SESSION,
907  true
908  );
909  \MediaWiki\Logger\LoggerFactory::getInstance( 'authevents' )->info( 'Autocreation attempt', [
910  'event' => 'autocreate',
911  'status' => $res,
912  ] );
913  unset( $res );
914  }
915  unset( $sessionUser );
916 }
917 
918 if ( !$wgCommandLineMode ) {
920 }
921 
$wgInitialSessionId
Definition: Setup.php:800
$wgForeignFileRepos
Enable the use of files from one or more other wikis.
$wgUseInstantCommons
Use Wikimedia Commons as a foreign file repository.
$wgFooterIcons
Abstract list of footer icons for skins in place of old copyrightico and poweredbyico code You can ad...
$wgNewUserLog
Maintain a log of newusers at Special:Log/newusers?
wfWarn( $msg, $callerOffset=1, $level=E_USER_NOTICE)
Send a warning either to the debug log or in a PHP error depending on $wgDevelopmentWarnings.
$wgCanonicalNamespaceNames
Definitions of the NS_ constants are in Defines.php.
Definition: Setup.php:470
$wgEnotifWatchlist
Definition: Setup.php:436
$wgScript
The URL path to index.php.
$wgRightsUrl
Set this to specify an external URL containing details about the content license used on your wiki...
$wgDBerrorLogTZ
Timezone to use in the error log.
static getNonstandardLanguageCodeMapping()
Returns a mapping of non-standard language codes used by (current and previous version of) MediaWiki...
$wgSitename
Name of the site.
$wgUserEmailUseReplyTo
Definition: Setup.php:439
$wgUsersNotifiedOnAllChanges
Definition: Setup.php:440
$wgSysopEmailBans
Allow sysops to ban users from accessing Emailuser.
$wgDebugLogGroups
Map of string log group names to log destinations.
if( $wgLocalInterwiki) if( $wgSharedPrefix===false) if( $wgSharedSchema===false) if(! $wgCookiePrefix) $wgCookiePrefix
Definition: Setup.php:419
$wgEnotifFromEditor
Definition: Setup.php:429
$wgParser
Definition: Setup.php:882
$wgGalleryOptions
Default parameters for the "<gallery>" tag.
Definition: Setup.php:274
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&#39;s too easy for a sysadmin to set $wgName...
Definition: Setup.php:247
$wgDBpassword
Database user&#39;s password.
wfExpandUrl( $url, $defaultProto=PROTO_CURRENT)
Expand a potentially local URL to a fully-qualified URL.
$wgThumbnailScriptPath
Give a path here to use thumb.php for thumbnail generation on client request, instead of generating t...
$wgRepositoryBaseUrl
Shortcut for the &#39;descBaseUrl&#39; setting of $wgForeignFileRepos.
bool string $wgSharedUploadDBname
Shortcut for the ForeignDBRepo &#39;dbName&#39; setting in $wgForeignFileRepos.
$wgDefaultUserOptions['rcdays']
Definition: Setup.php:372
wfParseUrl( $url)
parse_url() work-alike, but non-broken.
$wgDBtype
Database type.
$wgFileExtensions
Definition: Setup.php:553
bool $wgCacheSharedUploads
Shortcut for the ForeignDBRepo &#39;hasSharedCache&#39; setting in $wgForeignFileRepos.
$wgLocalFileRepo
File repository structures.
$wgSecureLogin
This is to let user authenticate using https when they come from http.
$wgDBmwschema
Current wiki database schema name.
$wgMetaNamespace
Name of the project namespace.
$wgSharedTables
$wgDBserver
Database host name or IP address.
static getLocalClusterInstance()
Get the main cluster-local cache object.
static getInstance( $channel)
Get a named logger instance from the currently configured logger factory.
$wgDBuser
Database username.
$wgMainWANCache
Main Wide-Area-Network cache type.
if(! $wgEmergencyContact) if(! $wgPasswordSender) if(! $wgNoReplyAddress) if( $wgSecureLogin &&substr( $wgServer, 0, 2) !=='//') $wgVirtualRestConfig['global']['domain']
Definition: Setup.php:676
$wgCookieSecure
Whether the "secure" flag should be set on the cookie.
$wgCdnServers
List of proxy servers to purge on changes; default port is 80.
A helper class for throttling authentication attempts.
$wgTmpDirectory
The local filesystem path to a temporary directory.
$wgEnableUserEmail
Definition: Setup.php:428
$wgCdnServersNoPurge
As with $wgCdnServers, except these servers aren&#39;t purged on page changes; use to set a list of trust...
static getMaxUploadSize( $forType=null)
Get the MediaWiki maximum uploaded file size for given type of upload, based on $wgMaxUploadSize.
$wgArticlePath
Definition: img_auth.php:47
$wgWANObjectCaches
Advanced WAN object cache configuration.
string $wgSharedUploadDBprefix
Shortcut for the ForeignDBRepo &#39;tablePrefix&#39; setting in $wgForeignFileRepos.
$wgMemc
Definition: Setup.php:781
$wgLogNames
Lists the message key string for each log type.
wfGetMessageCacheStorage()
Get the cache object used by the message cache.
$wgDebugLogFile
Filename for debug logging.
$wgGenerateThumbnailOnParse
Allow thumbnail rendering on page view.
$wgRCMaxAge
Recentchanges items are periodically purged; entries older than this many seconds will go...
$wgEnableEmail
Set to true to enable the e-mail basic features: Password reminders, etc.
if(!defined( 'MEDIAWIKI')) $wgScopeTest
This file is not a valid entry point, perform no further processing unless MEDIAWIKI is defined...
Definition: Setup.php:39
const MW_NO_SESSION
Definition: load.php:29
$wgCacheDirectory
Directory for caching data in the local filesystem.
$wgDebugDumpSql
Write SQL queries to the debug log.
$wgInvalidateCacheOnLocalSettingsChange
Invalidate various caches when LocalSettings.php changes.
$wgGroupPermissions
Permission keys given to users in each group.
$wgExtraLanguageCodes
List of mappings from one language code to another.
Show an error that looks like an HTTP server error.
Definition: HttpError.php:30
$wgLanguageCode
Site language code.
string $wgSharedUploadPath
Shortcut for the &#39;url&#39; setting of $wgForeignFileRepos.
string $wgSharedThumbnailScriptPath
Shortcut for the &#39;thumbScriptUrl&#39; setting of $wgForeignFileRepos.
$rcMaxAgeDays
Definition: Setup.php:370
$wgStylePath
The URL path of the skins directory.
foreach([ 'wgArticlePath', 'wgVariantArticlePath'] as $varName) if( $wgCanonicalServer===false) $serverParts
Definition: Setup.php:649
$wgPasswordPolicy
Password policy for the wiki.
if(isset( $wgSysopEmailBans) && $wgSysopEmailBans===false) if( $wgMetaNamespace===false) $wgMinUploadChunkSize
Definition: Setup.php:456
$wgLang
Definition: Setup.php:871
wfTempDir()
Tries to get the system directory for temporary files.
static getMain()
Get the RequestContext object associated with the main request.
static array $canonicalNames
Definitions of the NS_ constants are in Defines.php.
const DBO_DEBUG
Definition: defines.php:9
$wgMainCacheType
Main cache type.
$wgDeletedDirectory
What directory to place deleted uploads in.
$wgEnotifMaxRecips
Definition: Setup.php:431
static install(SessionManager $manager)
Install a session handler for the current web request.
$wgEnotifUseRealName
Definition: Setup.php:434
$wgLocalInterwikis
Array for multiple $wgLocalInterwiki values, in case there are several interwiki prefixes that point ...
static singleton()
Get the global AuthManager.
$self
wfDebug( $text, $dest='all', array $context=[])
Sends a line to the debug log if enabled or, optionally, to a comment in output.
bool $wgUseSharedUploads
Shortcut for adding an entry to $wgForeignFileRepos.
$wgEnotifRevealEditorAddress
Definition: Setup.php:433
if(is_array( $wgExtraNamespaces)) if(count( $wgDummyLanguageCodes) !==0) $wgDummyLanguageCodes
Definition: Setup.php:482
$wgEnotifUserTalk
Definition: Setup.php:435
$wgUsePathInfo
Whether to support URLs like index.php/Page_title These often break when PHP is set up in CGI mode...
$wgResourceBasePath
The default &#39;remoteBasePath&#39; value for instances of ResourceLoaderFileModule.
$wgRestPath
The URL path to the REST API Defaults to "{$wgScriptPath}/rest.php".
$wgMaximalPasswordLength
Specifies the maximal length of a user password (T64685).
static newFromKey( $key)
Factory function that is just wrapper for the real constructor.
Definition: Message.php:413
static register()
Register a callback to be called when headers are sent.
$wgProfileOnly
Don&#39;t put non-profiling info into log file.
$wgEnotifMinorEdits
Definition: Setup.php:432
$wgSharedDB
Shared database for multiple wikis.
wfMemoryLimit( $newLimit)
Raise PHP&#39;s memory limit (if needed).
$wgTitle
Definition: Setup.php:889
Class to implement stub globals, which are globals that delay loading the their associated module cod...
Definition: StubObject.php:45
$wgCdnMaxAge
Cache TTL for the CDN sent as s-maxage (without ESI) or Surrogate-Control (with ESI).
$messageMemc
Definition: Setup.php:782
$wgRightsText
If either $wgRightsUrl or $wgRightsPage is specified then this variable gives the text for the link...
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
$wgSessionName
Override to customise the session name.
const NS_FILE
Definition: Defines.php:66
$GLOBALS['IP']
const NS_FILE_TALK
Definition: Defines.php:67
static detectProtocol()
Detect the protocol from $_SERVER.
Definition: WebRequest.php:274
$wgLocaltimezone
Fake out the timezone that the server thinks it&#39;s in.
static array static array static getDeprecatedCodeMapping()
Returns a mapping of deprecated language codes that were used in previous versions of MediaWiki to up...
$wgLockManagers[]
Initialise $wgLockManagers to include basic FS version.
Definition: Setup.php:260
static setup()
Definition: MWDebug.php:73
const NS_MEDIAWIKI
Definition: Defines.php:68
const PROTO_HTTP
Definition: Defines.php:199
$wgLogActionsHandlers
The same as above, but here values are names of classes, not messages.
foreach( $wgExtensionFunctions as $func) if(!defined( 'MW_NO_SESSION') &&! $wgCommandLineMode) if(! $wgCommandLineMode) $wgFullyInitialised
Definition: Setup.php:922
$wgPasswordSender
Sender email address for e-mail notifications.
$wgEmailAuthentication
Definition: Setup.php:427
const MW_CONFIG_CALLBACK
Definition: install.php:26
$wgDBname
Current wiki database name.
Exception class which takes an HTML error message, and does not produce a backtrace.
Definition: FatalError.php:28
bool $wgPageLanguageUseDB
Enable page language feature Allows setting page language in database.
string $wgSharedUploadDirectory
Shortcut for the &#39;directory&#39; setting of $wgForeignFileRepos.
$wgPageCreationLog
Maintain a log of page creations at Special:Log/create?
$wgShellLocale
Locale for LC_ALL, to provide a known environment for locale-sensitive operations.
$wgUploadPath
The URL path for the images directory.
$wgMemoryLimit
The minimum amount of memory that MediaWiki "needs"; MediaWiki will try to raise PHP&#39;s memory limit i...
$wgEmergencyContact
Site admin email address.
$wgNamespaceAliases['Image']
The canonical names of namespaces 6 and 7 are, as of v1.14, "File" and "File_talk".
Definition: Setup.php:254
$wgExtraNamespaces
Additional namespaces.
static getGlobalSession()
Get the "global" session.
$wgReadOnlyFile
If this lock file exists (size > 0), the wiki will be forced into read-only mode. ...
const DBO_DEFAULT
Definition: defines.php:13
$wgLocalStylePath
The URL path of the skins directory.
$wgUseEnotif
Definition: Setup.php:438
$debug
Definition: Setup.php:774
$wgMinimalPasswordLength
Specifies the minimal length of a user password.
static installHandler()
Install handlers with PHP.
static isValidUserName( $name)
Is the input a valid username?
Definition: User.php:917
if( $wgSkipSkin) $wgSkipSkins[]
Definition: Setup.php:388
bool $wgHashedSharedUploadDirectory
Shortcut for the &#39;hashLevels&#39; setting of $wgForeignFileRepos.
$wgScriptPath
The path we should point to.
$wgLocalInterwiki
The interwiki prefix of the current wiki, or false if it doesn&#39;t have one.
wfDebugLog( $logGroup, $text, $dest='all', array $context=[])
Send a line to a supplementary debug log file, if configured, or main debug log if not...
Stub object for the user language.
$wgExtensionAssetsPath
The URL path of the extensions directory.
wfDeprecated( $function, $version=false, $component=false, $callerOffset=2)
Throws a warning that $function is deprecated.
global $wgCommandLineMode
$wgDBprefix
Current wiki database table name prefix.
$cpPosInfo
Definition: Setup.php:744
$wgAllowHTMLEmail
For parts of the system that have been updated to provide HTML email content, send both text and HTML...
$wgLogHeaders
Lists the message key string for descriptive text to be shown at the top of each log type...
$wgCanonicalServer
Canonical URL of the server, to use in IRC feeds and notification e-mails.
$wgHashedUploadDirectory
Set this to false if you do not want MediaWiki to divide your images directory into many subdirectori...
$wgLogo
The URL path of the wiki logo.
$wgLocalTZoffset
Set an offset from UTC in minutes to use for the default timezone setting for anonymous users and new...
static getMaxPhpUploadSize()
Get the PHP maximum uploaded file size, based on ini settings.
if(! $wgDBerrorLogTZ) $wgRequest
Definition: Setup.php:742
$wgServer
URL of the server.
$wgGitInfoCacheDirectory
Directory where GitInfo will look for pre-computed cache files.
if( $wgServerName !==false) $wgServerName
Definition: Setup.php:654
$wgOut
Definition: Setup.php:876
$wgSharedPrefix
$wgEnotifImpersonal
Definition: Setup.php:430
$wgExtensionFunctions
A list of callback functions which are called once MediaWiki is fully initialised.
$wgUploadBaseUrl
If set, this URL is added to the start of $wgUploadPath to form a complete upload URL...
$wgLogTypes
The logging system has two levels: an event type, which describes the general category and can be vie...
wfIniGetBool( $setting)
Safety wrapper around ini_get() for boolean settings.
string $wgPHPSessionHandling
Whether to use PHP session handling ($_SESSION and session_*() functions)
$wgRightsIcon
Override for copyright metadata.
$wgFileBlacklist
Files with these extensions will never be allowed as uploads.
$wgSharedSchema
$wgLoadScript
The URL path to load.php.
$wgNoReplyAddress
Reply-To address for e-mail notifications.
$wgCacheEpoch
Set this to current time to invalidate all prior cached pages.
$wgFileCacheDirectory
Directory where the cached page will be saved.
bool $wgFetchCommonsDescriptions
Shortcut for the &#39;fetchDescription&#39; setting of $wgForeignFileRepos.
$wgUseCdn
Enable/disable CDN.
wfShorthandToInteger( $string='', $default=-1)
Converts shorthand byte notation to integer form.
if(is_array( $wgExtraNamespaces)) if(count( $wgDummyLanguageCodes) !==0) foreach(LanguageCode::getNonstandardLanguageCodeMapping() as $code=> $bcp47) $wgContLanguageCode
Definition: Setup.php:498
$wgUploadDirectory
The filesystem path of the images directory.
static run( $event, array $args=[], $deprecatedVersion=null)
Call hook functions defined in Hooks::register and $wgHooks.
Definition: Hooks.php:200
$wgContLang
Definition: Setup.php:791