* @file
*/
use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\LBFactory;
+use Wikimedia\Rdbms\ChronologyProtector;
/**
* This file is not a valid entry point, perform no further processing unless
];
/**
- * Initialise $wgLocalFileRepo from backwards-compatible settings
+ * Shortcuts for $wgLocalFileRepo
*/
if ( !$wgLocalFileRepo ) {
$wgLocalFileRepo = [
'name' => 'local',
'directory' => $wgUploadDirectory,
'scriptDirUrl' => $wgScriptPath,
- 'scriptExtension' => '.php',
'url' => $wgUploadBaseUrl ? $wgUploadBaseUrl . $wgUploadPath : $wgUploadPath,
'hashLevels' => $wgHashedUploadDirectory ? 2 : 0,
'thumbScriptUrl' => $wgThumbnailScriptPath,
'deletedHashLevels' => $wgHashedUploadDirectory ? 3 : 0
];
}
+
+if ( !isset( $wgLocalFileRepo['backend'] ) ) {
+ // Create a default FileBackend name.
+ // FileBackendGroup will register a default, if absent from $wgFileBackends.
+ $wgLocalFileRepo['backend'] = $wgLocalFileRepo['name'] . '-backend';
+}
+
/**
- * Initialise shared repo from backwards-compatible settings
+ * Shortcuts for $wgForeignFileRepos
*/
if ( $wgUseSharedUploads ) {
if ( $wgSharedUploadDBname ) {
'apiThumbCacheExpiry' => 0,
];
}
-/*
- * Add on default file backend config for file repos.
- * FileBackendGroup will handle initializing the backends.
- */
-if ( !isset( $wgLocalFileRepo['backend'] ) ) {
- $wgLocalFileRepo['backend'] = $wgLocalFileRepo['name'] . '-backend';
-}
foreach ( $wgForeignFileRepos as &$repo ) {
if ( !isset( $repo['directory'] ) && $repo['class'] === ForeignAPIRepo::class ) {
$repo['directory'] = $wgUploadDirectory; // b/c
}
unset( $repo ); // no global pollution; destroy reference
-// Convert this deprecated setting to modern system
-if ( $wgExperimentalHtmlIds ) {
- wfDeprecated( '$wgExperimentalHtmlIds', '1.30' );
- $wgFragmentMode = [ 'html5-legacy', 'html5' ];
-}
-
$rcMaxAgeDays = $wgRCMaxAge / ( 3600 * 24 );
if ( $wgRCFilterByAge ) {
// Trim down $wgRCLinkDays so that it only lists links which are valid
}
if ( $wgNewUserLog ) {
- // Add a new log type
+ // Add new user log type
$wgLogTypes[] = 'newusers';
$wgLogNames['newusers'] = 'newuserlogpage';
$wgLogHeaders['newusers'] = 'newuserlogpagetext';
$wgLogActionsHandlers['newusers/autocreate'] = NewUsersLogFormatter::class;
}
+if ( $wgPageCreationLog ) {
+ // Add page creation log type
+ $wgLogTypes[] = 'create';
+ $wgLogActionsHandlers['create/create'] = LogFormatter::class;
+}
+
if ( $wgPageLanguageUseDB ) {
$wgLogTypes[] = 'pagelang';
$wgLogActionsHandlers['pagelang/pagelang'] = PageLangLogFormatter::class;
MWExceptionHandler::installHandler();
-require_once "$IP/includes/compat/normal/UtfNormalUtil.php";
-
-$ps_validation = Profiler::instance()->scopedProfileIn( $fname . '-validation' );
-
// T48998: Bail out early if $wgArticlePath is non-absolute
foreach ( [ 'wgArticlePath', 'wgVariantArticlePath' ] as $varName ) {
if ( $$varName && !preg_match( '/^(https?:\/\/|\/)/', $$varName ) ) {
}
}
-Profiler::instance()->scopedProfileOut( $ps_validation );
-
$ps_default2 = Profiler::instance()->scopedProfileIn( $fname . '-defaults2' );
if ( $wgCanonicalServer === false ) {
Profiler::instance()->scopedProfileOut( $ps_default2 );
-$ps_misc = Profiler::instance()->scopedProfileIn( $fname . '-misc1' );
+$ps_misc = Profiler::instance()->scopedProfileIn( $fname . '-misc' );
// Raise the memory limit if it's too low
wfMemoryLimit();
// Initialize the request object in $wgRequest
$wgRequest = RequestContext::getMain()->getRequest(); // BackCompat
// Set user IP/agent information for agent session consistency purposes
+$cpPosInfo = LBFactory::getCPInfoFromCookieValue(
+ // The cookie has no prefix and is set by MediaWiki::preOutputCommit()
+ $wgRequest->getCookie( 'cpPosIndex', '' ),
+ // Mitigate broken client-side cookie expiration handling (T190082)
+ time() - ChronologyProtector::POSITION_COOKIE_TTL
+);
MediaWikiServices::getInstance()->getDBLoadBalancerFactory()->setRequestInfo( [
'IPAddress' => $wgRequest->getIP(),
'UserAgent' => $wgRequest->getHeader( 'User-Agent' ),
'ChronologyProtection' => $wgRequest->getHeader( 'ChronologyProtection' ),
- // The cpPosIndex cookie has no prefix and is set by MediaWiki::preOutputCommit()
- 'ChronologyPositionIndex' =>
- $wgRequest->getInt( 'cpPosIndex', (int)$wgRequest->getCookie( 'cpPosIndex', '' ) )
+ 'ChronologyPositionIndex' => $wgRequest->getInt( 'cpPosIndex', $cpPosInfo['index'] ),
+ 'ChronologyClientId' => $cpPosInfo['clientId']
] );
+unset( $cpPosInfo );
// Make sure that object caching does not undermine the ChronologyProtector improvements
if ( $wgRequest->getCookie( 'UseDC', '' ) === 'master' ) {
// The user is pinned to the primary DC, meaning that they made recent changes which should
wfDebug( $debug );
}
-Profiler::instance()->scopedProfileOut( $ps_misc );
-$ps_memcached = Profiler::instance()->scopedProfileIn( $fname . '-memcached' );
-
$wgMemc = wfGetMainCache();
$messageMemc = wfGetMessageCacheStorage();
-/**
- * @deprecated since 1.30
- */
-$parserMemc = new DeprecatedGlobal( 'parserMemc', function () {
- return MediaWikiServices::getInstance()->getParserCache()->getCacheStorage();
-}, '1.30' );
-
wfDebugLog( 'caches',
'cluster: ' . get_class( $wgMemc ) .
', WAN: ' . ( $wgMainWANCache === CACHE_NONE ? 'CACHE_NONE' : $wgMainWANCache ) .
', session: ' . get_class( ObjectCache::getInstance( $wgSessionCacheType ) )
);
-Profiler::instance()->scopedProfileOut( $ps_memcached );
+Profiler::instance()->scopedProfileOut( $ps_misc );
// Most of the config is out, some might want to run hooks here.
Hooks::run( 'SetupAfterCache' );
], '$wgAuth is ' . get_class( $wgAuth ) );
}
-// Set up the session
-$ps_session = Profiler::instance()->scopedProfileIn( $fname . '-session' );
/**
* @var MediaWiki\Session\SessionId|null $wgInitialSessionId The persistent
* session ID (if any) loaded at startup
if ( !defined( 'MW_NO_SESSION' ) && !$wgCommandLineMode ) {
// If session.auto_start is there, we can't touch session name
if ( $wgPHPSessionHandling !== 'disable' && !wfIniGetBool( 'session.auto_start' ) ) {
- session_name( $wgSessionName ? $wgSessionName : $wgCookiePrefix . '_session' );
+ session_name( $wgSessionName ?: $wgCookiePrefix . '_session' );
}
// Create the SessionManager singleton and set up our session handler,
);
}
}
-Profiler::instance()->scopedProfileOut( $ps_session );
/**
* @var User $wgUser
// 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+
- if ( is_object( $func ) && $func instanceof Closure ) {
- $profName = $fname . '-extensions-closure';
- } elseif ( is_array( $func ) ) {
- if ( is_object( $func[0] ) ) {
- $profName = $fname . '-extensions-' . get_class( $func[0] ) . '::' . $func[1];
- } else {
- $profName = $fname . '-extensions-' . implode( '::', $func );
- }
- } else {
- $profName = $fname . '-extensions-' . strval( $func );
- }
-
- $ps_ext_func = Profiler::instance()->scopedProfileIn( $profName );
call_user_func( $func );
- Profiler::instance()->scopedProfileOut( $ps_ext_func );
}
// If the session user has a 0 id but a valid name, that means we need to
if ( !defined( 'MW_NO_SESSION' ) && !$wgCommandLineMode ) {
$sessionUser = MediaWiki\Session\SessionManager::getGlobalSession()->getUser();
if ( $sessionUser->getId() === 0 && User::isValidUserName( $sessionUser->getName() ) ) {
- $ps_autocreate = Profiler::instance()->scopedProfileIn( $fname . '-autocreate' );
$res = MediaWiki\Auth\AuthManager::singleton()->autoCreateUser(
$sessionUser,
MediaWiki\Auth\AuthManager::AUTOCREATE_SOURCE_SESSION,
true
);
- Profiler::instance()->scopedProfileOut( $ps_autocreate );
\MediaWiki\Logger\LoggerFactory::getInstance( 'authevents' )->info( 'Autocreation attempt', [
'event' => 'autocreate',
'status' => $res,