Prepare 1.31.4
[lhc/web/wiklou.git] / includes / DefaultSettings.php
index ab01c5f..8c20bd5 100644 (file)
@@ -71,7 +71,7 @@ $wgConfigRegistry = [
  * MediaWiki version number
  * @since 1.2
  */
-$wgVersion = '1.31.0-alpha';
+$wgVersion = '1.31.4';
 
 /**
  * Name of the site. It must be changed in LocalSettings.php
@@ -157,19 +157,6 @@ $wgUsePathInfo = ( strpos( PHP_SAPI, 'cgi' ) === false ) &&
        ( strpos( PHP_SAPI, 'apache2filter' ) === false ) &&
        ( strpos( PHP_SAPI, 'isapi' ) === false );
 
-/**
- * The extension to append to script names by default.
- *
- * Some hosting providers used PHP 4 for *.php files, and PHP 5 for *.php5.
- * This variable was provided to support those providers.
- *
- * @since 1.11
- * @deprecated since 1.25; support for '.php5' has been phased out of MediaWiki
- *  proper. Backward-compatibility can be maintained by configuring your web
- *  server to rewrite URLs. See RELEASE-NOTES for details.
- */
-$wgScriptExtension = '.php';
-
 /**@}*/
 
 /************************************************************************//**
@@ -503,9 +490,6 @@ $wgImgAuthUrlPathMap = [];
  *   - descBaseUrl       URL of image description pages, e.g. https://en.wikipedia.org/wiki/File:
  *   - scriptDirUrl      URL of the MediaWiki installation, equivalent to $wgScriptPath, e.g.
  *                       https://en.wikipedia.org/w
- *   - scriptExtension   Script extension of the MediaWiki installation, equivalent to
- *                       $wgScriptExtension, e.g. ".php5". Defaults to ".php".
- *
  *   - articleUrl        Equivalent to $wgArticlePath, e.g. https://en.wikipedia.org/wiki/$1
  *   - fetchDescription  Fetch the text of the remote file description page. Equivalent to
  *                       $wgFetchCommonsDescriptions.
@@ -1004,15 +988,15 @@ $wgParserTestMediaHandlers = [
  */
 $wgContentHandlers = [
        // the usual case
-       CONTENT_MODEL_WIKITEXT => 'WikitextContentHandler',
+       CONTENT_MODEL_WIKITEXT => WikitextContentHandler::class,
        // dumb version, no syntax highlighting
-       CONTENT_MODEL_JAVASCRIPT => 'JavaScriptContentHandler',
+       CONTENT_MODEL_JAVASCRIPT => JavaScriptContentHandler::class,
        // simple implementation, for use by extensions, etc.
-       CONTENT_MODEL_JSON => 'JsonContentHandler',
+       CONTENT_MODEL_JSON => JsonContentHandler::class,
        // dumb version, no syntax highlighting
-       CONTENT_MODEL_CSS => 'CssContentHandler',
+       CONTENT_MODEL_CSS => CssContentHandler::class,
        // plain text, for use by extensions, etc.
-       CONTENT_MODEL_TEXT => 'TextContentHandler',
+       CONTENT_MODEL_TEXT => TextContentHandler::class,
 ];
 
 /**
@@ -1817,7 +1801,7 @@ $wgDBtype = 'mysql';
  * Whether to use SSL in DB connection.
  *
  * This setting is only used if $wgLBFactoryConf['class'] is set to
- * 'LBFactorySimple' and $wgDBservers is an empty array; otherwise
+ * '\Wikimedia\Rdbms\LBFactorySimple' and $wgDBservers is an empty array; otherwise
  * the DBO_SSL flag must be set in the 'flags' option of the database
  * connection to achieve the same functionality.
  */
@@ -1827,7 +1811,7 @@ $wgDBssl = false;
  * Whether to use compression in DB connection.
  *
  * This setting is only used $wgLBFactoryConf['class'] is set to
- * 'LBFactorySimple' and $wgDBservers is an empty array; otherwise
+ * '\Wikimedia\Rdbms\LBFactorySimple' and $wgDBservers is an empty array; otherwise
  * the DBO_COMPRESS flag must be set in the 'flags' option of the database
  * connection to achieve the same functionality.
  */
@@ -1940,6 +1924,7 @@ $wgSharedSchema = false;
  *   - user:        DB user
  *   - password:    DB password
  *   - type:        DB type
+ *   - driver:      DB driver (when there are multiple drivers)
  *
  *   - load:        Ratio of DB_REPLICA load, must be >=0, the sum of all loads must be >0.
  *                  If this is zero for any given server, no normal query traffic will be
@@ -1997,7 +1982,7 @@ $wgDBservers = false;
  * The LBFactoryMulti class is provided for this purpose, please see
  * includes/db/LBFactoryMulti.php for configuration information.
  */
-$wgLBFactoryConf = [ 'class' => 'LBFactorySimple' ];
+$wgLBFactoryConf = [ 'class' => \Wikimedia\Rdbms\LBFactorySimple::class ];
 
 /**
  * After a state-changing request is done by a client, this determines
@@ -2047,6 +2032,8 @@ $wgDBerrorLogTZ = false;
  * Even correct usage may cause failures with Unicode supplementary
  * characters (those not in the Basic Multilingual Plane) unless MySQL
  * has enhanced their Unicode support.
+ *
+ * @deprecated since 1.31
  */
 $wgDBmysql5 = false;
 
@@ -2141,7 +2128,7 @@ $wgExternalStores = [];
  * ];
  * @endcode
  *
- * Used by LBFactorySimple, may be ignored if $wgLBFactoryConf is set to
+ * Used by \Wikimedia\Rdbms\LBFactorySimple, may be ignored if $wgLBFactoryConf is set to
  * another class.
  */
 $wgExternalServers = [];
@@ -2254,7 +2241,7 @@ $wgCacheDirectory = false;
  *   - CACHE_NONE:       Do not cache
  *   - CACHE_DB:         Store cache objects in the DB
  *   - CACHE_MEMCACHED:  MemCached, must specify servers in $wgMemCachedServers
- *   - CACHE_ACCEL:      APC, APCU, XCache or WinCache
+ *   - CACHE_ACCEL:      APC, APCU or WinCache
  *   - (other):          A string may be used which identifies a cache
  *                       configuration in $wgObjectCaches.
  *
@@ -2309,34 +2296,33 @@ $wgLanguageConverterCacheType = CACHE_ANYTHING;
  * given, giving a callable function which will generate a suitable cache object.
  */
 $wgObjectCaches = [
-       CACHE_NONE => [ 'class' => 'EmptyBagOStuff', 'reportDupes' => false ],
-       CACHE_DB => [ 'class' => 'SqlBagOStuff', 'loggroup' => 'SQLBagOStuff' ],
+       CACHE_NONE => [ 'class' => EmptyBagOStuff::class, 'reportDupes' => false ],
+       CACHE_DB => [ 'class' => SqlBagOStuff::class, 'loggroup' => 'SQLBagOStuff' ],
 
        CACHE_ANYTHING => [ 'factory' => 'ObjectCache::newAnything' ],
        CACHE_ACCEL => [ 'factory' => 'ObjectCache::getLocalServerInstance' ],
-       CACHE_MEMCACHED => [ 'class' => 'MemcachedPhpBagOStuff', 'loggroup' => 'memcached' ],
+       CACHE_MEMCACHED => [ 'class' => MemcachedPhpBagOStuff::class, 'loggroup' => 'memcached' ],
 
        'db-replicated' => [
-               'class'       => 'ReplicatedBagOStuff',
+               'class'       => ReplicatedBagOStuff::class,
                'readFactory' => [
-                       'class' => 'SqlBagOStuff',
+                       'class' => SqlBagOStuff::class,
                        'args'  => [ [ 'slaveOnly' => true ] ]
                ],
                'writeFactory' => [
-                       'class' => 'SqlBagOStuff',
+                       'class' => SqlBagOStuff::class,
                        'args'  => [ [ 'slaveOnly' => false ] ]
                ],
                'loggroup'  => 'SQLBagOStuff',
                'reportDupes' => false
        ],
 
-       'apc' => [ 'class' => 'APCBagOStuff', 'reportDupes' => false ],
-       'apcu' => [ 'class' => 'APCUBagOStuff', 'reportDupes' => false ],
-       'xcache' => [ 'class' => 'XCacheBagOStuff', 'reportDupes' => false ],
-       'wincache' => [ 'class' => 'WinCacheBagOStuff', 'reportDupes' => false ],
-       'memcached-php' => [ 'class' => 'MemcachedPhpBagOStuff', 'loggroup' => 'memcached' ],
-       'memcached-pecl' => [ 'class' => 'MemcachedPeclBagOStuff', 'loggroup' => 'memcached' ],
-       'hash' => [ 'class' => 'HashBagOStuff', 'reportDupes' => false ],
+       'apc' => [ 'class' => APCBagOStuff::class, 'reportDupes' => false ],
+       'apcu' => [ 'class' => APCUBagOStuff::class, 'reportDupes' => false ],
+       'wincache' => [ 'class' => WinCacheBagOStuff::class, 'reportDupes' => false ],
+       'memcached-php' => [ 'class' => MemcachedPhpBagOStuff::class, 'loggroup' => 'memcached' ],
+       'memcached-pecl' => [ 'class' => MemcachedPeclBagOStuff::class, 'loggroup' => 'memcached' ],
+       'hash' => [ 'class' => HashBagOStuff::class, 'reportDupes' => false ],
 ];
 
 /**
@@ -2373,13 +2359,13 @@ $wgMainWANCache = false;
  */
 $wgWANObjectCaches = [
        CACHE_NONE => [
-               'class'    => 'WANObjectCache',
+               'class'    => WANObjectCache::class,
                'cacheId'  => CACHE_NONE,
                'channels' => []
        ]
        /* Example of a simple single data-center cache:
        'memcached-php' => [
-               'class'    => 'WANObjectCache',
+               'class'    => WANObjectCache::class,
                'cacheId'  => 'memcached-php',
                'channels' => [ 'purge' => 'wancache-main-memcached-purge' ]
        ]
@@ -2526,7 +2512,7 @@ $wgAdaptiveMessageCache = false;
  *                  Use maintenance/rebuildLocalisationCache.php instead.
  */
 $wgLocalisationCacheConf = [
-       'class' => 'LocalisationCache',
+       'class' => LocalisationCache::class,
        'store' => 'detect',
        'storeClass' => false,
        'storeDirectory' => false,
@@ -3265,12 +3251,6 @@ $wgSiteNotice = '';
  */
 $wgSiteSupportPage = '';
 
-/**
- * Validate the overall output using tidy and refuse
- * to display the page if it's not valid.
- */
-$wgValidateAllHtml = false;
-
 /**
  * Default skin, for new users and anonymous visitors. Registered users may
  * change this to any one of the other available skins in their preferences.
@@ -3311,9 +3291,10 @@ $wgAllowUserJs = false;
 $wgAllowUserCss = false;
 
 /**
- * Allow user-preferences implemented in CSS?
- * This allows users to customise the site appearance to a greater
- * degree; disabling it will improve page load times.
+ * Allow style-related user-preferences?
+ *
+ * This controls whether the `editfont` and `underline` preferences
+ * are availabe to users.
  */
 $wgAllowUserCssPrefs = true;
 
@@ -3410,7 +3391,7 @@ $wgExperimentalHtmlIds = false;
  *
  * @since 1.30
  */
-$wgFragmentMode = [ 'legacy' ];
+$wgFragmentMode = [ 'legacy', 'html5' ];
 
 /**
  * Which ID escaping mode should be used for external interwiki links? See documentation
@@ -3782,10 +3763,11 @@ $wgResourceLoaderValidateStaticJS = false;
  */
 $wgResourceLoaderLESSVars = [
        /**
-        * Minimum available screen width at which a device can be considered a tablet/desktop
+        * Minimum available screen width at which a device can be considered a tablet
         * The number is currently based on the device width of a Samsung Galaxy S5 mini and is low
         * enough to cover iPad (768px). Number is prone to change with new information.
         * @since 1.27
+        * @deprecated 1.31 Use mediawiki.ui/variables instead
         */
        'deviceWidthTablet' => '720px',
 ];
@@ -3935,9 +3917,6 @@ $wgNamespaceAliases = [];
  * because articles can be created such that they are hard to view or edit.
  *
  * In some rare cases you may wish to remove + for compatibility with old links.
- *
- * Theoretically 0x80-0x9F of ISO 8859-1 should be disallowed, but
- * this breaks interlanguage links
  */
 $wgLegalTitleChars = " %!\"$&'()*,\\-.\\/0-9:;=?@A-Z\\\\^_`a-z~\\x80-\\xFF+";
 
@@ -4168,8 +4147,8 @@ $wgInvalidRedirectTargets = [ 'Filepath', 'Mypage', 'Mytalk', 'Redirect' ];
  * an extension setup function.
  */
 $wgParserConf = [
-       'class' => 'Parser',
-       # 'preprocessorClass' => 'Preprocessor_Hash',
+       'class' => Parser::class,
+       # 'preprocessorClass' => Preprocessor_Hash::class,
 ];
 
 /**
@@ -4271,8 +4250,9 @@ $wgAllowImageTag = false;
 
 /**
  * Configuration for HTML postprocessing tool. Set this to a configuration
- * array to enable an external tool. Dave Raggett's "HTML Tidy" is typically
- * used. See https://www.w3.org/People/Raggett/tidy/
+ * array to enable an external tool. By default, we now use the RemexHtml
+ * library; historically, Dave Raggett's "HTML Tidy" was typically used.
+ * See https://www.w3.org/People/Raggett/tidy/
  *
  * If this is null and $wgUseTidy is true, the deprecated configuration
  * parameters will be used instead.
@@ -4293,7 +4273,7 @@ $wgAllowImageTag = false;
  *  - tidyBin: For RaggettExternal, the path to the tidy binary.
  *  - tidyCommandLine: For RaggettExternal, additional command line options.
  */
-$wgTidyConfig = null;
+$wgTidyConfig = [ 'driver' => 'RemexHtml' ];
 
 /**
  * Set this to true to use the deprecated tidy configuration parameters.
@@ -4440,7 +4420,6 @@ $wgEnableMagicLinks = [
  *
  * This variable can have the following values:
  * - 'any': all pages as considered as valid articles
- * - 'comma': the page must contain a comma to be considered valid
  * - 'link': the page must contain a [[wiki link]] to be considered valid
  *
  * See also See https://www.mediawiki.org/wiki/Manual:Article_count
@@ -4473,7 +4452,7 @@ $wgActiveUserDays = 30;
  * @since 1.27
  */
 $wgCentralIdLookupProviders = [
-       'local' => [ 'class' => 'LocalIdLookup' ],
+       'local' => [ 'class' => LocalIdLookup::class ],
 ];
 
 /**
@@ -4493,7 +4472,8 @@ $wgCentralIdLookupProvider = 'local';
  * Statements:
  *     - MinimalPasswordLength - minimum length a user can set
  *     - MinimumPasswordLengthToLogin - passwords shorter than this will
- *             not be allowed to login, regardless if it is correct.
+ *             not be allowed to login, or offered a chance to reset their password
+ *             as part of the login workflow, regardless if it is correct.
  *     - MaximalPasswordLength - maximum length password a user is allowed
  *             to attempt. Prevents DoS attacks with pbkdf2.
  *     - PasswordCannotMatchUsername - Password cannot match username to
@@ -4761,7 +4741,7 @@ $wgPasswordDefault = 'pbkdf2';
  * An advanced example:
  * @code
  * $wgPasswordConfig['bcrypt-peppered'] = [
- *     'class' => 'EncryptedPassword',
+ *     'class' => EncryptedPassword::class,
  *     'underlying' => 'bcrypt',
  *     'secrets' => [],
  *     'cipher' => MCRYPT_RIJNDAEL_256,
@@ -4774,31 +4754,31 @@ $wgPasswordDefault = 'pbkdf2';
  */
 $wgPasswordConfig = [
        'A' => [
-               'class' => 'MWOldPassword',
+               'class' => MWOldPassword::class,
        ],
        'B' => [
-               'class' => 'MWSaltedPassword',
+               'class' => MWSaltedPassword::class,
        ],
        'pbkdf2-legacyA' => [
-               'class' => 'LayeredParameterizedPassword',
+               'class' => LayeredParameterizedPassword::class,
                'types' => [
                        'A',
                        'pbkdf2',
                ],
        ],
        'pbkdf2-legacyB' => [
-               'class' => 'LayeredParameterizedPassword',
+               'class' => LayeredParameterizedPassword::class,
                'types' => [
                        'B',
                        'pbkdf2',
                ],
        ],
        'bcrypt' => [
-               'class' => 'BcryptPassword',
+               'class' => BcryptPassword::class,
                'cost' => 9,
        ],
        'pbkdf2' => [
-               'class' => 'Pbkdf2Password',
+               'class' => Pbkdf2Password::class,
                'algo' => 'sha512',
                'cost' => '30000',
                'length' => '64',
@@ -5129,8 +5109,6 @@ $wgGroupPermissions['*']['edit'] = true;
 $wgGroupPermissions['*']['createpage'] = true;
 $wgGroupPermissions['*']['createtalk'] = true;
 $wgGroupPermissions['*']['writeapi'] = true;
-$wgGroupPermissions['*']['editmyusercss'] = true;
-$wgGroupPermissions['*']['editmyuserjs'] = true;
 $wgGroupPermissions['*']['viewmywatchlist'] = true;
 $wgGroupPermissions['*']['editmywatchlist'] = true;
 $wgGroupPermissions['*']['viewmyprivateinfo'] = true;
@@ -5153,6 +5131,9 @@ $wgGroupPermissions['user']['upload'] = true;
 $wgGroupPermissions['user']['reupload'] = true;
 $wgGroupPermissions['user']['reupload-shared'] = true;
 $wgGroupPermissions['user']['minoredit'] = true;
+$wgGroupPermissions['user']['editmyusercss'] = true;
+$wgGroupPermissions['user']['editmyuserjson'] = true;
+$wgGroupPermissions['user']['editmyuserjs'] = true;
 $wgGroupPermissions['user']['purge'] = true;
 $wgGroupPermissions['user']['sendemail'] = true;
 $wgGroupPermissions['user']['applychangetags'] = true;
@@ -5187,6 +5168,7 @@ $wgGroupPermissions['sysop']['deletedtext'] = true;
 $wgGroupPermissions['sysop']['undelete'] = true;
 $wgGroupPermissions['sysop']['editinterface'] = true;
 $wgGroupPermissions['sysop']['editusercss'] = true;
+$wgGroupPermissions['sysop']['edituserjson'] = true;
 $wgGroupPermissions['sysop']['edituserjs'] = true;
 $wgGroupPermissions['sysop']['import'] = true;
 $wgGroupPermissions['sysop']['importupload'] = true;
@@ -5673,6 +5655,7 @@ $wgRateLimits = [
        'edit' => [
                'ip' => [ 8, 60 ],
                'newbie' => [ 8, 60 ],
+               'user' => [ 90, 60 ],
        ],
        // Page moves
        'move' => [
@@ -5699,6 +5682,10 @@ $wgRateLimits = [
                'newbie' => [ 5, 86400 ],
                'user' => [ 20, 86400 ],
        ],
+       'changeemail' => [
+               'ip-all' => [ 10, 3600 ],
+               'user' => [ 4, 86400 ]
+       ],
        // Purging pages
        'purge' => [
                'ip' => [ 30, 60 ],
@@ -5815,8 +5802,10 @@ $wgGrantPermissions['editpage']['changetags'] = true;
 $wgGrantPermissions['editprotected'] = $wgGrantPermissions['editpage'];
 $wgGrantPermissions['editprotected']['editprotected'] = true;
 
+// FIXME: Rename editmycssjs to editmyconfig
 $wgGrantPermissions['editmycssjs'] = $wgGrantPermissions['editpage'];
 $wgGrantPermissions['editmycssjs']['editmyusercss'] = true;
+$wgGrantPermissions['editmycssjs']['editmyuserjson'] = true;
 $wgGrantPermissions['editmycssjs']['editmyuserjs'] = true;
 
 $wgGrantPermissions['editmyoptions']['editmyoptions'] = true;
@@ -5824,6 +5813,7 @@ $wgGrantPermissions['editmyoptions']['editmyoptions'] = true;
 $wgGrantPermissions['editinterface'] = $wgGrantPermissions['editpage'];
 $wgGrantPermissions['editinterface']['editinterface'] = true;
 $wgGrantPermissions['editinterface']['editusercss'] = true;
+$wgGrantPermissions['editinterface']['edituserjson'] = true;
 $wgGrantPermissions['editinterface']['edituserjs'] = true;
 
 $wgGrantPermissions['createeditmovepage'] = $wgGrantPermissions['editpage'];
@@ -6108,7 +6098,7 @@ $wgDebugComments = false;
  * Write SQL queries to the debug log.
  *
  * This setting is only used $wgLBFactoryConf['class'] is set to
- * 'LBFactorySimple' and $wgDBservers is an empty array; otherwise
+ * '\Wikimedia\Rdbms\LBFactorySimple' and $wgDBservers is an empty array; otherwise
  * the DBO_DEBUG flag must be set in the 'flags' option of the database
  * connection to achieve the same functionality.
  */
@@ -6213,7 +6203,7 @@ $wgDebugLogGroups = [];
  *
  * @par To completely disable logging:
  * @code
- * $wgMWLoggerDefaultSpi = [ 'class' => '\\MediaWiki\\Logger\\NullSpi' ];
+ * $wgMWLoggerDefaultSpi = [ 'class' => \MediaWiki\Logger\NullSpi::class ];
  * @endcode
  *
  * @since 1.25
@@ -6221,7 +6211,7 @@ $wgDebugLogGroups = [];
  * @see MwLogger
  */
 $wgMWLoggerDefaultSpi = [
-       'class' => '\\MediaWiki\\Logger\\LegacySpi',
+       'class' => \MediaWiki\Logger\LegacySpi::class,
 ];
 
 /**
@@ -6277,6 +6267,12 @@ $wgShowDBErrorBacktrace = false;
  */
 $wgLogExceptionBacktrace = true;
 
+/**
+ * If true, the MediaWiki error handler passes errors/warnings to the default error handler
+ * after logging them. The setting is ignored when the track_errors php.ini flag is true.
+ */
+$wgPropagateErrors = true;
+
 /**
  * Expose backend server host names through the API and various HTML comments
  */
@@ -6669,9 +6665,9 @@ $wgGitBin = '/usr/bin/git';
  */
 $wgGitRepositoryViewers = [
        'https://(?:[a-z0-9_]+@)?gerrit.wikimedia.org/r/(?:p/)?(.*)' =>
-               'https://phabricator.wikimedia.org/r/revision/%R;%H',
+               'https://gerrit.wikimedia.org/g/%R/+/%H',
        'ssh://(?:[a-z0-9_]+@)?gerrit.wikimedia.org:29418/(.*)' =>
-               'https://phabricator.wikimedia.org/r/revision/%R;%H',
+               'https://gerrit.wikimedia.org/g/%R/+/%H',
 ];
 
 /** @} */ # End of maintenance }
@@ -6773,7 +6769,7 @@ $wgRCLinkDays = [ 1, 3, 7, 14, 30 ];
  *             'omit_bots' => true,
  *     ];
  * @example $wgRCFeeds['example'] = [
- *             'class' => 'ExampleRCFeed',
+ *             'class' => ExampleRCFeed::class,
  *     ];
  * @since 1.22
  */
@@ -6785,8 +6781,8 @@ $wgRCFeeds = [];
  * @since 1.22
  */
 $wgRCEngines = [
-       'redis' => 'RedisPubSubFeedEngine',
-       'udp' => 'UDPRCFeedEngine',
+       'redis' => RedisPubSubFeedEngine::class,
+       'udp' => UDPRCFeedEngine::class,
 ];
 
 /**
@@ -6858,11 +6854,6 @@ $wgUseNPPatrol = true;
  */
 $wgUseFilePatrol = true;
 
-/**
- * Log autopatrol actions to the log table
- */
-$wgLogAutopatrol = true;
-
 /**
  * Provide syndication feeds (RSS, Atom) for, e.g., Recentchanges, Newpages
  */
@@ -6910,8 +6901,8 @@ $wgOverrideSiteFeed = [];
  * $wgOut->isSyndicated() is true.
  */
 $wgFeedClasses = [
-       'rss' => 'RSSFeed',
-       'atom' => 'AtomFeed',
+       'rss' => RSSFeed::class,
+       'atom' => AtomFeed::class,
 ];
 
 /**
@@ -6949,11 +6940,6 @@ $wgShowUpdatedMarker = true;
  */
 $wgDisableAnonTalk = false;
 
-/**
- * Enable filtering of categories in Recentchanges
- */
-$wgAllowCategorizedRecentChanges = false;
-
 /**
  * Allow filtering by change tag in recentchanges, history, etc
  * Has no effect if no tags are defined in valid_tag.
@@ -7335,7 +7321,7 @@ $wgAutoloadAttemptLowercase = true;
  *     'version' => '1.9.0',
  *     'url' => 'https://example.org/example-extension/',
  *     'descriptionmsg' => 'exampleextension-desc',
- *     'license-name' => 'GPL-2.0+',
+ *     'license-name' => 'GPL-2.0-or-later',
  * ];
  * @endcode
  *
@@ -7369,7 +7355,7 @@ $wgAutoloadAttemptLowercase = true;
  *    localizable message (omit in favour of 'descriptionmsg').
  *
  * - license-name: Short name of the license (used as label for the link), such
- *   as "GPL-2.0+" or "MIT" (https://spdx.org/licenses/ for a list of identifiers).
+ *   as "GPL-2.0-or-later" or "MIT" (https://spdx.org/licenses/ for a list of identifiers).
  */
 $wgExtensionCredits = [];
 
@@ -7438,24 +7424,26 @@ $wgServiceWiringFiles = [
  * or (since 1.30) a callback to use for creating the job object.
  */
 $wgJobClasses = [
-       'refreshLinks' => 'RefreshLinksJob',
-       'deleteLinks' => 'DeleteLinksJob',
-       'htmlCacheUpdate' => 'HTMLCacheUpdateJob',
-       'sendMail' => 'EmaillingJob',
-       'enotifNotify' => 'EnotifNotifyJob',
-       'fixDoubleRedirect' => 'DoubleRedirectJob',
-       'AssembleUploadChunks' => 'AssembleUploadChunksJob',
-       'PublishStashedFile' => 'PublishStashedFileJob',
-       'ThumbnailRender' => 'ThumbnailRenderJob',
-       'recentChangesUpdate' => 'RecentChangesUpdateJob',
-       'refreshLinksPrioritized' => 'RefreshLinksJob',
-       'refreshLinksDynamic' => 'RefreshLinksJob',
-       'activityUpdateJob' => 'ActivityUpdateJob',
-       'categoryMembershipChange' => 'CategoryMembershipChangeJob',
-       'clearUserWatchlist' => 'ClearUserWatchlistJob',
-       'cdnPurge' => 'CdnPurgeJob',
-       'enqueue' => 'EnqueueJob', // local queue for multi-DC setups
-       'null' => 'NullJob'
+       'refreshLinks' => RefreshLinksJob::class,
+       'deleteLinks' => DeleteLinksJob::class,
+       'htmlCacheUpdate' => HTMLCacheUpdateJob::class,
+       'sendMail' => EmaillingJob::class,
+       'enotifNotify' => EnotifNotifyJob::class,
+       'fixDoubleRedirect' => DoubleRedirectJob::class,
+       'AssembleUploadChunks' => AssembleUploadChunksJob::class,
+       'PublishStashedFile' => PublishStashedFileJob::class,
+       'ThumbnailRender' => ThumbnailRenderJob::class,
+       'recentChangesUpdate' => RecentChangesUpdateJob::class,
+       'refreshLinksPrioritized' => RefreshLinksJob::class,
+       'refreshLinksDynamic' => RefreshLinksJob::class,
+       'activityUpdateJob' => ActivityUpdateJob::class,
+       'categoryMembershipChange' => CategoryMembershipChangeJob::class,
+       'clearUserWatchlist' => ClearUserWatchlistJob::class,
+       'cdnPurge' => CdnPurgeJob::class,
+       'userGroupExpiry' => UserGroupExpiryJob::class,
+       'clearWatchlistNotifications' => ClearWatchlistNotificationsJob::class,
+       'enqueue' => EnqueueJob::class, // local queue for multi-DC setups
+       'null' => NullJob::class,
 ];
 
 /**
@@ -7504,7 +7492,7 @@ $wgJobSerialCommitThreshold = false;
  * These settings should be global to all wikis.
  */
 $wgJobTypeConf = [
-       'default' => [ 'class' => 'JobQueueDB', 'order' => 'random', 'claimTTL' => 3600 ],
+       'default' => [ 'class' => JobQueueDB::class, 'order' => 'random', 'claimTTL' => 3600 ],
 ];
 
 /**
@@ -7512,7 +7500,7 @@ $wgJobTypeConf = [
  * These settings should be global to all wikis.
  */
 $wgJobQueueAggregator = [
-       'class' => 'JobQueueAggregatorNull'
+       'class' => JobQueueAggregatorNull::class
 ];
 
 /**
@@ -7533,7 +7521,7 @@ $wgJobQueueIncludeInMaxLagFactor = false;
  * Expensive Querypages are already updated.
  */
 $wgSpecialPageCacheUpdates = [
-       'Statistics' => [ 'SiteStatsUpdate', 'cacheUpdate' ]
+       'Statistics' => [ SiteStatsUpdate::class, 'cacheUpdate' ]
 ];
 
 /**
@@ -7723,42 +7711,42 @@ $wgLogActions = [];
  * @see LogFormatter
  */
 $wgLogActionsHandlers = [
-       'block/block' => 'BlockLogFormatter',
-       'block/reblock' => 'BlockLogFormatter',
-       'block/unblock' => 'BlockLogFormatter',
-       'contentmodel/change' => 'ContentModelLogFormatter',
-       'contentmodel/new' => 'ContentModelLogFormatter',
-       'delete/delete' => 'DeleteLogFormatter',
-       'delete/delete_redir' => 'DeleteLogFormatter',
-       'delete/event' => 'DeleteLogFormatter',
-       'delete/restore' => 'DeleteLogFormatter',
-       'delete/revision' => 'DeleteLogFormatter',
-       'import/interwiki' => 'ImportLogFormatter',
-       'import/upload' => 'ImportLogFormatter',
-       'managetags/activate' => 'LogFormatter',
-       'managetags/create' => 'LogFormatter',
-       'managetags/deactivate' => 'LogFormatter',
-       'managetags/delete' => 'LogFormatter',
-       'merge/merge' => 'MergeLogFormatter',
-       'move/move' => 'MoveLogFormatter',
-       'move/move_redir' => 'MoveLogFormatter',
-       'patrol/patrol' => 'PatrolLogFormatter',
-       'patrol/autopatrol' => 'PatrolLogFormatter',
-       'protect/modify' => 'ProtectLogFormatter',
-       'protect/move_prot' => 'ProtectLogFormatter',
-       'protect/protect' => 'ProtectLogFormatter',
-       'protect/unprotect' => 'ProtectLogFormatter',
-       'rights/autopromote' => 'RightsLogFormatter',
-       'rights/rights' => 'RightsLogFormatter',
-       'suppress/block' => 'BlockLogFormatter',
-       'suppress/delete' => 'DeleteLogFormatter',
-       'suppress/event' => 'DeleteLogFormatter',
-       'suppress/reblock' => 'BlockLogFormatter',
-       'suppress/revision' => 'DeleteLogFormatter',
-       'tag/update' => 'TagLogFormatter',
-       'upload/overwrite' => 'UploadLogFormatter',
-       'upload/revert' => 'UploadLogFormatter',
-       'upload/upload' => 'UploadLogFormatter',
+       'block/block' => BlockLogFormatter::class,
+       'block/reblock' => BlockLogFormatter::class,
+       'block/unblock' => BlockLogFormatter::class,
+       'contentmodel/change' => ContentModelLogFormatter::class,
+       'contentmodel/new' => ContentModelLogFormatter::class,
+       'delete/delete' => DeleteLogFormatter::class,
+       'delete/delete_redir' => DeleteLogFormatter::class,
+       'delete/event' => DeleteLogFormatter::class,
+       'delete/restore' => DeleteLogFormatter::class,
+       'delete/revision' => DeleteLogFormatter::class,
+       'import/interwiki' => ImportLogFormatter::class,
+       'import/upload' => ImportLogFormatter::class,
+       'managetags/activate' => LogFormatter::class,
+       'managetags/create' => LogFormatter::class,
+       'managetags/deactivate' => LogFormatter::class,
+       'managetags/delete' => LogFormatter::class,
+       'merge/merge' => MergeLogFormatter::class,
+       'move/move' => MoveLogFormatter::class,
+       'move/move_redir' => MoveLogFormatter::class,
+       'patrol/patrol' => PatrolLogFormatter::class,
+       'patrol/autopatrol' => PatrolLogFormatter::class,
+       'protect/modify' => ProtectLogFormatter::class,
+       'protect/move_prot' => ProtectLogFormatter::class,
+       'protect/protect' => ProtectLogFormatter::class,
+       'protect/unprotect' => ProtectLogFormatter::class,
+       'rights/autopromote' => RightsLogFormatter::class,
+       'rights/rights' => RightsLogFormatter::class,
+       'suppress/block' => BlockLogFormatter::class,
+       'suppress/delete' => DeleteLogFormatter::class,
+       'suppress/event' => DeleteLogFormatter::class,
+       'suppress/reblock' => BlockLogFormatter::class,
+       'suppress/revision' => DeleteLogFormatter::class,
+       'tag/update' => TagLogFormatter::class,
+       'upload/overwrite' => UploadLogFormatter::class,
+       'upload/revert' => UploadLogFormatter::class,
+       'upload/upload' => UploadLogFormatter::class,
 ];
 
 /**
@@ -7889,7 +7877,7 @@ $wgActions = [
        'credits' => true,
        'delete' => true,
        'edit' => true,
-       'editchangetags' => 'SpecialPageAction',
+       'editchangetags' => SpecialPageAction::class,
        'history' => true,
        'info' => true,
        'markpatrolled' => true,
@@ -7898,7 +7886,7 @@ $wgActions = [
        'raw' => true,
        'render' => true,
        'revert' => true,
-       'revisiondelete' => 'SpecialPageAction',
+       'revisiondelete' => SpecialPageAction::class,
        'rollback' => true,
        'submit' => true,
        'unprotect' => true,
@@ -8047,12 +8035,12 @@ $wgDebugAPI = false;
  * @code
  *  $wgAPIModules['foo'] = 'ApiFoo';
  *  $wgAPIModules['bar'] = [
- *    'class' => 'ApiBar',
+ *    'class' => ApiBar::class,
  *    'factory' => function( $main, $name ) { ... }
  *  ];
  *  $wgAPIModules['xyzzy'] = [
- *    'class' => 'ApiXyzzy',
- *    'factory' => [ 'XyzzyFactory', 'newApiModule' ]
+ *    'class' => ApiXyzzy::class,
+ *    'factory' => [ XyzzyFactory::class, 'newApiModule' ]
  *  ];
  * @endcode
  *
@@ -8145,6 +8133,8 @@ $wgAPIUselessQueryPages = [
 
 /**
  * Enable AJAX framework
+ *
+ * @deprecated (officially) since MediaWiki 1.31
  */
 $wgUseAjax = true;
 
@@ -8255,7 +8245,7 @@ $wgMaxShellWallClockTime = 180;
 $wgShellCgroup = false;
 
 /**
- * Executable path of the PHP cli binary (php/php5). Should be set up on install.
+ * Executable path of the PHP cli binary. Should be set up on install.
  */
 $wgPhpCli = '/usr/bin/php';
 
@@ -8475,7 +8465,7 @@ $wgRedirectOnLogin = null;
  * @par Example using local redis instance:
  * @code
  *   $wgPoolCounterConf = [ 'ArticleView' => [
- *     'class' => 'PoolCounterRedis',
+ *     'class' => PoolCounterRedis::class,
  *     'timeout' => 15, // wait timeout in seconds
  *     'workers' => 1, // maximum number of active threads in each pool
  *     'maxqueue' => 5, // maximum number of total threads in each pool
@@ -8487,7 +8477,7 @@ $wgRedirectOnLogin = null;
  * @par Example using C daemon from https://www.mediawiki.org/wiki/Extension:PoolCounter:
  * @code
  *   $wgPoolCounterConf = [ 'ArticleView' => [
- *     'class' => 'PoolCounter_Client',
+ *     'class' => PoolCounter_Client::class,
  *     'timeout' => 15, // wait timeout in seconds
  *     'workers' => 5, // maximum number of active threads in each pool
  *     'maxqueue' => 50, // maximum number of total threads in each pool
@@ -8561,7 +8551,7 @@ $wgTextModelsToParse = [
  * @since 1.20
  */
 $wgSiteTypes = [
-       'mediawiki' => 'MediaWikiSite',
+       'mediawiki' => MediaWikiSite::class,
 ];
 
 /**
@@ -8635,7 +8625,7 @@ $wgPageLanguageUseDB = false;
  * Auto-mounting example for Parsoid:
  *
  * $wgVirtualRestConfig['paths']['/parsoid/'] = [
- *     'class' => 'ParsoidVirtualRESTService',
+ *     'class' => ParsoidVirtualRESTService::class,
  *     'options' => [
  *         'url' => 'http://localhost:8000',
  *         'prefix' => 'enwiki',
@@ -8732,7 +8722,7 @@ $wgMaxJobDBWriteDuration = false;
  */
 $wgEventRelayerConfig = [
        'default' => [
-               'class' => 'EventRelayerNull',
+               'class' => EventRelayerNull::class,
        ]
 ];
 
@@ -8829,6 +8819,13 @@ $wgInterwikiPrefixDisplayTypes = [];
  */
 $wgCommentTableSchemaMigrationStage = MIGRATION_OLD;
 
+/**
+ * Actor table schema migration stage.
+ * @since 1.31
+ * @var int One of the MIGRATION_* constants
+ */
+$wgActorTableSchemaMigrationStage = MIGRATION_OLD;
+
 /**
  * For really cool vim folding this needs to be at the end:
  * vim: foldmarker=@{,@} foldmethod=marker