MediaWiki master
MainConfigSchema.php
Go to the documentation of this file.
1<?php
10// phpcs:disable Generic.NamingConventions.UpperCaseConstantName.ClassConstantNotUpperCase
11// phpcs:disable Generic.Files.LineLength.TooLong
12namespace MediaWiki;
13
14use DateTime;
15use DateTimeZone;
16use Generator;
17use InvalidArgumentException;
85use MediaWiki\Settings\Source\JsonSchemaTrait;
98use ReflectionClass;
105
137class MainConfigSchema {
138 use JsonSchemaTrait;
139
161 public static function listDefaultValues( string $prefix = '' ): Generator {
162 $class = new ReflectionClass( self::class );
163 foreach ( $class->getReflectionConstants() as $const ) {
164 if ( !$const->isPublic() ) {
165 continue;
166 }
167
168 $value = $const->getValue();
169
170 if ( !is_array( $value ) ) {
171 // Just in case we end up having some other kind of constant on this class.
172 continue;
173 }
174
175 if ( isset( $value['obsolete'] ) ) {
176 continue;
177 }
178
179 $name = $const->getName();
180 yield "$prefix$name" => self::getDefaultFromJsonSchema( $value );
181 }
182 }
183
196 public static function getDefaultValue( string $name ) {
197 $class = new ReflectionClass( self::class );
198 if ( !$class->hasConstant( $name ) ) {
199 throw new InvalidArgumentException( "Unknown setting: $name" );
200 }
201 $value = $class->getConstant( $name );
202
203 if ( !is_array( $value ) ) {
204 // Might happen if we end up having other kinds of constants on this class.
205 throw new InvalidArgumentException( "Unknown setting: $name" );
206 }
207
208 return self::getDefaultFromJsonSchema( $value );
209 }
210
211 /***************************************************************************/
219 public const ConfigRegistry = [
220 'default' => [
221 'main' => 'MediaWiki\\Config\\GlobalVarConfig::newInstance',
222 ],
223 'type' => 'map',
224 ];
225
229 public const Sitename = [
230 'default' => 'MediaWiki',
231 ];
232
233 /***************************************************************************/
234 // region Server URLs and file paths
259 public const Server = [
260 'default' => false,
261 ];
262
272 public const CanonicalServer = [
273 'default' => false,
274 ];
275
282 public const ServerName = [
283 'default' => false,
284 ];
285
292 public const AssumeProxiesUseDefaultProtocolPorts = [
293 'default' => true,
294 'type' => 'boolean',
295 ];
296
307 public const HttpsPort = [
308 'default' => 443,
309 ];
310
328 public const ForceHTTPS = [
329 'default' => false,
330 'type' => 'boolean',
331 ];
332
343 public const ScriptPath = [
344 'default' => '/wiki',
345 ];
346
361 public const UsePathInfo = [
362 'dynamicDefault' => true,
363 ];
364
365 public static function getDefaultUsePathInfo(): bool {
366 // These often break when PHP is set up in CGI mode.
367 // PATH_INFO *may* be correct if cgi.fix_pathinfo is set, but then again it may not;
368 // lighttpd converts incoming path data to lowercase on systems
369 // with case-insensitive filesystems, and there have been reports of
370 // problems on Apache as well.
371 return !str_contains( PHP_SAPI, 'cgi' ) && !str_contains( PHP_SAPI, 'apache2filter' ) &&
372 !str_contains( PHP_SAPI, 'isapi' );
373 }
374
380 public const Script = [
381 'default' => false,
382 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
383 ];
384
389 public static function getDefaultScript( $scriptPath ): string {
390 return "$scriptPath/index.php";
391 }
392
400 public const LoadScript = [
401 'default' => false,
402 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
403 ];
404
409 public static function getDefaultLoadScript( $scriptPath ): string {
410 return "$scriptPath/load.php";
411 }
412
419 public const RestPath = [
420 'default' => false,
421 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
422 ];
423
428 public static function getDefaultRestPath( $scriptPath ): string {
429 return "$scriptPath/rest.php";
430 }
431
439 public const StylePath = [
440 'default' => false,
441 'dynamicDefault' => [ 'use' => [ 'ResourceBasePath' ] ]
442 ];
443
448 public static function getDefaultStylePath( $resourceBasePath ): string {
449 return "$resourceBasePath/skins";
450 }
451
459 public const LocalStylePath = [
460 'default' => false,
461 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
462 ];
463
468 public static function getDefaultLocalStylePath( $scriptPath ): string {
469 // Avoid ResourceBasePath here since that may point to a different domain (e.g. CDN)
470 return "$scriptPath/skins";
471 }
472
480 public const ExtensionAssetsPath = [
481 'default' => false,
482 'dynamicDefault' => [ 'use' => [ 'ResourceBasePath' ] ]
483 ];
484
489 public static function getDefaultExtensionAssetsPath( $resourceBasePath ): string {
490 return "$resourceBasePath/extensions";
491 }
492
501 public const ExtensionDirectory = [
502 'default' => null,
503 'type' => '?string',
504 ];
505
514 public const StyleDirectory = [
515 'default' => null,
516 'type' => '?string',
517 ];
518
526 public const ArticlePath = [
527 'default' => false,
528 'dynamicDefault' => [ 'use' => [ 'Script', 'UsePathInfo' ] ]
529 ];
530
536 public static function getDefaultArticlePath( string $script, $usePathInfo ): string {
537 if ( $usePathInfo ) {
538 return "$script/$1";
539 }
540 return "$script?title=$1";
541 }
542
548 public const UploadPath = [
549 'default' => false,
550 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
551 ];
552
557 public static function getDefaultUploadPath( $scriptPath ): string {
558 return "$scriptPath/images";
559 }
560
573 public const ImgAuthPath = [
574 'default' => false,
575 ];
576
583 public const ThumbPath = [
584 'default' => false,
585 ];
586
592 public const UploadDirectory = [
593 'default' => false,
594 'type' => '?string|false',
595 ];
596
602 public const FileCacheDirectory = [
603 'default' => false,
604 'dynamicDefault' => [ 'use' => [ 'UploadDirectory' ] ]
605 ];
606
611 public static function getDefaultFileCacheDirectory( $uploadDirectory ): string {
612 return "$uploadDirectory/cache";
613 }
614
623 public const Logo = [
624 'default' => false,
625 'dynamicDefault' => [ 'use' => [ 'ResourceBasePath' ] ]
626 ];
627
632 public static function getDefaultLogo( $resourceBasePath ): string {
633 return "$resourceBasePath/resources/assets/change-your-logo.svg";
634 }
635
683 public const Logos = [
684 'default' => false,
685 'type' => 'map|false',
686 ];
687
693 public const Favicon = [
694 'default' => '/favicon.ico',
695 ];
696
704 public const AppleTouchIcon = [
705 'default' => false,
706 ];
707
726 public const ReferrerPolicy = [
727 'default' => false,
728 'type' => 'list|string|false',
729 ];
730
752 public const TmpDirectory = [
753 'default' => false,
754 ];
755
768 public const UploadBaseUrl = [
769 'default' => '',
770 ];
771
784 public const UploadStashScalerBaseUrl = [
785 'default' => false,
786 'deprecated' => 'since 1.36 Use thumbProxyUrl in $wgLocalFileRepo',
787 ];
788
803 public const ActionPaths = [
804 'default' => [],
805 'type' => 'map',
806 ];
807
814 public const MainPageIsDomainRoot = [
815 'default' => false,
816 'type' => 'boolean',
817 ];
818
819 // endregion -- end of server URLs and file paths
820
821 /***************************************************************************/
822 // region Files and file uploads
834 public const EnableUploads = [
835 'default' => false,
836 ];
837
841 public const UploadStashMaxAge = [
842 'default' => 6 * 3600, // 6 hours
843 ];
844
851 public const EnableAsyncUploads = [
852 'default' => false,
853 ];
854
860 public const EnableAsyncUploadsByURL = [
861 'default' => false,
862 ];
863
867 public const UploadMaintenance = [
868 'default' => false,
869 ];
870
880 public const IllegalFileChars = [
881 'default' => ':\\/\\\\',
882 'deprecated' => 'since 1.41; no longer customizable',
883 ];
884
890 public const DeletedDirectory = [
891 'default' => false,
892 'dynamicDefault' => [ 'use' => [ 'UploadDirectory' ] ]
893 ];
894
899 public static function getDefaultDeletedDirectory( $uploadDirectory ): string {
900 return "$uploadDirectory/deleted";
901 }
902
906 public const ImgAuthDetails = [
907 'default' => false,
908 ];
909
925 public const ImgAuthUrlPathMap = [
926 'default' => [],
927 'type' => 'map',
928 ];
929
1064 public const LocalFileRepo = [
1065 'default' => [
1066 'class' => LocalRepo::class,
1067 'name' => 'local',
1068 'directory' => null, // $wgUploadDirectory
1069 'scriptDirUrl' => null, // $wgScriptPath
1070 'favicon' => null, // $wgFavicon
1071 'url' => null, // $wgUploadBaseUrl . $wgUploadPath
1072 'hashLevels' => null, // $wgHashedUploadDirectory
1073 'thumbScriptUrl' => null, // $wgThumbnailScriptPath
1074 'transformVia404' => null, // $wgGenerateThumbnailOnParse
1075 'deletedDir' => null, // $wgDeletedDirectory
1076 'deletedHashLevels' => null, // $wgHashedUploadDirectory
1077 'updateCompatibleMetadata' => null, // $wgUpdateCompatibleMetadata
1078 'reserializeMetadata' => null, // $wgUpdateCompatibleMetadata
1079 ],
1080 'type' => 'map',
1081 ];
1082
1100 public const ForeignFileRepos = [
1101 'default' => [],
1102 'type' => 'list',
1103 ];
1104
1114 public const UseInstantCommons = [
1115 'default' => false,
1116 ];
1117
1145 public const UseSharedUploads = [
1146 'default' => false,
1147 'type' => 'boolean',
1148 ];
1149
1157 public const SharedUploadDirectory = [
1158 'default' => null,
1159 'type' => '?string',
1160 ];
1161
1169 public const SharedUploadPath = [
1170 'default' => null,
1171 'type' => '?string',
1172 ];
1173
1181 public const HashedSharedUploadDirectory = [
1182 'default' => true,
1183 'type' => 'boolean',
1184 ];
1185
1193 public const RepositoryBaseUrl = [
1194 'default' => 'https://commons.wikimedia.org/wiki/File:',
1195 ];
1196
1204 public const FetchCommonsDescriptions = [
1205 'default' => false,
1206 'type' => 'boolean',
1207 ];
1208
1217 public const SharedUploadDBname = [
1218 'default' => false,
1219 'type' => 'false|string',
1220 ];
1221
1229 public const SharedUploadDBprefix = [
1230 'default' => '',
1231 'type' => 'string',
1232 ];
1233
1241 public const CacheSharedUploads = [
1242 'default' => true,
1243 'type' => 'boolean',
1244 ];
1245
1256 public const ForeignUploadTargets = [
1257 'default' => [ 'local', ],
1258 'type' => 'list',
1259 ];
1260
1270 public const UploadDialog = [
1271 'default' =>
1272 [
1273 'fields' =>
1274 [
1275 'description' => true,
1276 'date' => false,
1277 'categories' => false,
1278 ],
1279 'licensemessages' =>
1280 [
1281 'local' => 'generic-local',
1282 'foreign' => 'generic-foreign',
1283 ],
1284 'comment' =>
1285 [
1286 'local' => '',
1287 'foreign' => '',
1288 ],
1289 'format' =>
1290 [
1291 'filepage' => '$DESCRIPTION',
1292 'description' => '$TEXT',
1293 'ownwork' => '',
1294 'license' => '',
1295 'uncategorized' => '',
1296 ],
1297 ],
1298 'type' => 'map',
1299 ];
1300
1338 public const FileBackends = [
1339 'default' => [],
1340 'type' => 'map',
1341 ];
1342
1366 public const LockManagers = [
1367 'default' => [],
1368 'type' => 'list',
1369 ];
1370
1386 public const ShowEXIF = [
1387 'dynamicDefault' => [ 'callback' => [ self::class, 'getDefaultShowEXIF' ] ],
1388 ];
1389
1390 public static function getDefaultShowEXIF(): bool {
1391 return function_exists( 'exif_read_data' );
1392 }
1393
1397 public const UpdateCompatibleMetadata = [
1398 'default' => false,
1399 ];
1400
1407 public const AllowCopyUploads = [
1408 'default' => false,
1409 ];
1410
1416 public const CopyUploadsDomains = [
1417 'default' => [],
1418 'type' => 'list',
1419 ];
1420
1426 public const CopyUploadsFromSpecialUpload = [
1427 'default' => false,
1428 ];
1429
1435 public const CopyUploadProxy = [
1436 'default' => false,
1437 ];
1438
1447 public const CopyUploadTimeout = [
1448 'default' => false,
1449 'type' => 'false|integer',
1450 ];
1451
1458 public const CopyUploadAllowOnWikiDomainConfig = [
1459 'default' => false,
1460 ];
1461
1482 public const MaxUploadSize = [
1483 'default' => 1024 * 1024 * 100,
1484 ];
1485
1500 public const MinUploadChunkSize = [
1501 'default' => 1024,
1502 ];
1503
1515 public const UploadNavigationUrl = [
1516 'default' => false,
1517 ];
1518
1524 public const UploadMissingFileUrl = [
1525 'default' => false,
1526 ];
1527
1541 public const ThumbnailScriptPath = [
1542 'default' => false,
1543 ];
1544
1552 public const SharedThumbnailScriptPath = [
1553 'default' => false,
1554 'type' => 'string|false',
1555 ];
1556
1562 public const HashedUploadDirectory = [
1563 'default' => true,
1564 'type' => 'boolean',
1565 ];
1566
1576 public const CSPUploadEntryPoint = [
1577 'default' => true,
1578 'type' => 'boolean',
1579 ];
1580
1589 public const FileExtensions = [
1590 'default' => [ 'png', 'gif', 'jpg', 'jpeg', 'webp', ],
1591 'type' => 'list',
1592 ];
1593
1602 public const ProhibitedFileExtensions = [
1603 'default' => [
1604 # HTML may contain cookie-stealing JavaScript and web bugs
1605 'html', 'htm', 'js', 'jsb', 'mhtml', 'mht', 'xhtml', 'xht',
1606 # PHP scripts may execute arbitrary code on the server
1607 'php', 'phtml', 'php3', 'php4', 'php5', 'phps', 'phar',
1608 # Other types that may be interpreted by some servers
1609 'shtml', 'jhtml', 'pl', 'py', 'cgi',
1610 # May contain harmful executables for Windows victims
1611 'exe', 'scr', 'dll', 'msi', 'vbs', 'bat', 'com', 'pif', 'cmd', 'vxd', 'cpl',
1612 # T341565
1613 'xml',
1614 ],
1615 'type' => 'list',
1616 ];
1617
1624 public const MimeTypeExclusions = [
1625 'default' => [
1626 # HTML may contain cookie-stealing JavaScript and web bugs
1627 'text/html',
1628 # Similarly with JavaScript itself
1629 'application/javascript', 'text/javascript', 'text/x-javascript', 'application/x-shellscript',
1630 # PHP scripts may execute arbitrary code on the server
1631 'application/x-php', 'text/x-php',
1632 # Other types that may be interpreted by some servers
1633 'text/x-python', 'text/x-perl', 'text/x-bash', 'text/x-sh', 'text/x-csh',
1634 # Client-side hazards on Internet Explorer
1635 'text/scriptlet', 'application/x-msdownload',
1636 # Windows metafile, client-side vulnerability on some systems
1637 'application/x-msmetafile',
1638 # Files that look like java files
1639 'application/java',
1640 # XML files generally - T341565
1641 'application/xml', 'text/xml',
1642 ],
1643 'type' => 'list',
1644 ];
1645
1651 public const CheckFileExtensions = [
1652 'default' => true,
1653 ];
1654
1661 public const StrictFileExtensions = [
1662 'default' => true,
1663 ];
1664
1671 public const DisableUploadScriptChecks = [
1672 'default' => false,
1673 ];
1674
1678 public const UploadSizeWarning = [
1679 'default' => false,
1680 ];
1681
1693 public const TrustedMediaFormats = [
1694 'default' => [
1695 MEDIATYPE_BITMAP, // all bitmap formats
1696 MEDIATYPE_AUDIO, // all audio formats
1697 MEDIATYPE_VIDEO, // all plain video formats
1698 "image/svg+xml", // svg (only needed if inline rendering of svg is not supported)
1699 "application/pdf", // PDF files
1700 # "application/x-shockwave-flash", //flash/shockwave movie
1701 ],
1702 'type' => 'list',
1703 ];
1704
1713 public const MediaHandlers = [
1714 'default' => [],
1715 'type' => 'map',
1716 ];
1717
1724 public const NativeImageLazyLoading = [
1725 'default' => false,
1726 'type' => 'boolean',
1727 ];
1728
1733 public const ParserTestMediaHandlers = [
1734 'default' => [
1735 'image/jpeg' => 'MockBitmapHandler',
1736 'image/png' => 'MockBitmapHandler',
1737 'image/gif' => 'MockBitmapHandler',
1738 'image/tiff' => 'MockBitmapHandler',
1739 'image/webp' => 'MockBitmapHandler',
1740 'image/x-ms-bmp' => 'MockBitmapHandler',
1741 'image/x-bmp' => 'MockBitmapHandler',
1742 'image/x-xcf' => 'MockBitmapHandler',
1743 'image/svg+xml' => 'MockSvgHandler',
1744 'image/vnd.djvu' => 'MockDjVuHandler',
1745 ],
1746 'type' => 'map',
1747 ];
1748
1754 public const UseImageResize = [
1755 'default' => true,
1756 ];
1757
1767 public const UseImageMagick = [
1768 'default' => false,
1769 ];
1770
1774 public const ImageMagickConvertCommand = [
1775 'default' => '/usr/bin/convert',
1776 ];
1777
1783 public const MaxInterlacingAreas = [
1784 'default' => [],
1785 'type' => 'map',
1786 ];
1787
1791 public const SharpenParameter = [
1792 'default' => '0x0.4',
1793 ];
1794
1798 public const SharpenReductionThreshold = [
1799 'default' => 0.85,
1800 ];
1801
1806 public const ImageMagickTempDir = [
1807 'default' => false,
1808 ];
1809
1822 public const CustomConvertCommand = [
1823 'default' => false,
1824 ];
1825
1831 public const JpegTran = [
1832 'default' => '/usr/bin/jpegtran',
1833 ];
1834
1854 public const JpegPixelFormat = [
1855 'default' => 'yuv420',
1856 ];
1857
1865 public const JpegQuality = [
1866 'default' => 80,
1867 ];
1868
1873 public const Exiv2Command = [
1874 'default' => '/usr/bin/exiv2',
1875 ];
1876
1882 public const Exiftool = [
1883 'default' => '/usr/bin/exiftool',
1884 ];
1885
1896 public const SVGConverters = [
1897 'default' => [
1898 'ImageMagick' => '$path/convert -background "#ffffff00" -thumbnail $widthx$height\\! $input PNG:$output',
1899 'inkscape' => '$path/inkscape -w $width -o $output $input',
1900 'batik' => 'java -Djava.awt.headless=true -jar $path/batik-rasterizer.jar -w $width -d $output $input',
1901 'rsvg' => '$path/rsvg-convert -w $width -h $height -o $output $input',
1902 'ImagickExt' => [ 'SvgHandler::rasterizeImagickExt', ],
1903 ],
1904 'type' => 'map',
1905 ];
1906
1910 public const SVGConverter = [
1911 'default' => 'ImageMagick',
1912 ];
1913
1917 public const SVGConverterPath = [
1918 'default' => '',
1919 ];
1920
1924 public const SVGMaxSize = [
1925 'default' => 5120,
1926 ];
1927
1933 public const SVGMetadataCutoff = [
1934 'default' => 1024 * 1024 * 5,
1935 ];
1936
1947 public const SVGNativeRendering = [
1948 'default' => true,
1949 'type' => 'string|boolean',
1950 ];
1951
1959 public const SVGNativeRenderingSizeLimit = [
1960 'default' => 50 * 1024,
1961 ];
1962
1972 public const MediaInTargetLanguage = [
1973 'default' => true,
1974 ];
1975
1993 public const MaxImageArea = [
1994 'default' => 12_500_000,
1995 'type' => 'string|integer|false',
1996 ];
1997
2006 public const MaxAnimatedGifArea = [
2007 'default' => 12_500_000,
2008 ];
2009
2025 public const TiffThumbnailType = [
2026 'default' => [],
2027 'type' => 'list',
2028 'mergeStrategy' => 'replace',
2029 ];
2030
2038 public const ThumbnailEpoch = [
2039 'default' => '20030516000000',
2040 ];
2041
2049 public const AttemptFailureEpoch = [
2050 'default' => 1,
2051 ];
2052
2064 public const IgnoreImageErrors = [
2065 'default' => false,
2066 ];
2067
2088 public const GenerateThumbnailOnParse = [
2089 'default' => true,
2090 'type' => 'boolean',
2091 ];
2092
2096 public const ShowArchiveThumbnails = [
2097 'default' => true,
2098 ];
2099
2105 public const EnableAutoRotation = [
2106 'default' => null,
2107 'type' => '?boolean',
2108 ];
2109
2115 public const Antivirus = [
2116 'default' => null,
2117 'type' => '?string',
2118 ];
2119
2155 public const AntivirusSetup = [
2156 'default' => [
2157 # setup for clamav
2158 'clamav' => [
2159 'command' => 'clamscan --no-summary ',
2160 'codemap' => [
2161 "0" => AV_NO_VIRUS, # no virus
2162 "1" => AV_VIRUS_FOUND, # virus found
2163 "52" => AV_SCAN_ABORTED, # unsupported file format (probably immune)
2164 "*" => AV_SCAN_FAILED, # else scan failed
2165 ],
2166 'messagepattern' => '/.*?:(.*)/sim',
2167 ],
2168 ],
2169 'type' => 'map',
2170 ];
2171
2175 public const AntivirusRequired = [
2176 'default' => true,
2177 ];
2178
2182 public const VerifyMimeType = [
2183 'default' => true,
2184 ];
2185
2196 public const MimeTypeFile = [
2197 'default' => 'internal',
2198 ];
2199
2205 public const MimeInfoFile = [
2206 'default' => 'internal',
2207 ];
2208
2222 public const MimeDetectorCommand = [
2223 'default' => null,
2224 'type' => '?string',
2225 ];
2226
2232 public const TrivialMimeDetection = [
2233 'default' => false,
2234 ];
2235
2241 public const XMLMimeTypes = [
2242 'default' => [
2243 'http://www.w3.org/2000/svg:svg' => 'image/svg+xml',
2244 'svg' => 'image/svg+xml',
2245 'http://www.lysator.liu.se/~alla/dia/:diagram' => 'application/x-dia-diagram',
2246 'http://www.w3.org/1999/xhtml:html' => 'text/html',
2247 'html' => 'text/html',
2248 ],
2249 'type' => 'map',
2250 ];
2251
2262 public const ImageLimits = [
2263 'default' => [
2264 [ 320, 240 ],
2265 [ 640, 480 ],
2266 [ 800, 600 ],
2267 [ 1024, 768 ],
2268 [ 1280, 1024 ],
2269 [ 2560, 2048 ],
2270 ],
2271 'type' => 'list',
2272 ];
2273
2279 public const ThumbLimits = [
2280 'default' => [
2281 120,
2282 150,
2283 180,
2284 200,
2285 220,
2286 250,
2287 300,
2288 400,
2289 ],
2290 'type' => 'list',
2291 ];
2292
2298 public const ThumbnailNamespaces = [
2299 'default' => [ NS_FILE ],
2300 'type' => 'list',
2301 'items' => [ 'type' => 'integer', ],
2302 ];
2303
2320 public const ThumbnailSteps = [
2321 'default' => null,
2322 'type' => '?list',
2323 ];
2324
2345 public const ThumbnailBuckets = [
2346 'default' => null,
2347 'type' => '?list',
2348 ];
2349
2370 public const ThumbnailMinimumBucketDistance = [
2371 'default' => 50,
2372 ];
2373
2383 public const UploadThumbnailRenderMap = [
2384 'default' => [],
2385 'type' => 'map',
2386 ];
2387
2399 public const UploadThumbnailRenderMethod = [
2400 'default' => 'jobqueue',
2401 ];
2402
2409 public const UploadThumbnailRenderHttpCustomHost = [
2410 'default' => false,
2411 ];
2412
2419 public const UploadThumbnailRenderHttpCustomDomain = [
2420 'default' => false,
2421 ];
2422
2430 public const UseTinyRGBForJPGThumbnails = [
2431 'default' => false,
2432 ];
2433
2449 public const GalleryOptions = [
2450 'default' => [],
2451 'type' => 'map',
2452 ];
2453
2459 public const ThumbUpright = [
2460 'default' => 0.75,
2461 ];
2462
2466 public const DirectoryMode = [
2467 'default' => 0o777,
2468 ];
2469
2479 public const ResponsiveImages = [
2480 'default' => true,
2481 ];
2482
2499 public const ImagePreconnect = [
2500 'default' => false,
2501 ];
2502
2516 public const TrackMediaRequestProvenance = [
2517 'default' => false,
2518 ];
2519
2520 /***************************************************************************/
2521 // region DJVU settings
2530 public const DjvuUseBoxedCommand = [
2531 'default' => false,
2532 ];
2533
2542 public const DjvuDump = [
2543 'default' => null,
2544 'type' => '?string',
2545 ];
2546
2552 public const DjvuRenderer = [
2553 'default' => null,
2554 'type' => '?string',
2555 ];
2556
2565 public const DjvuTxt = [
2566 'default' => null,
2567 'type' => '?string',
2568 ];
2569
2575 public const DjvuPostProcessor = [
2576 'default' => 'pnmtojpeg',
2577 'type' => '?string',
2578 ];
2579
2583 public const DjvuOutputExtension = [
2584 'default' => 'jpg',
2585 ];
2586
2587 // endregion -- end of DJvu
2588
2589 // endregion -- end of file uploads
2590
2591 /***************************************************************************/
2592 // region Email settings
2600 public const EmergencyContact = [
2601 'default' => false,
2602 ];
2603
2612 public const PasswordSender = [
2613 'default' => false,
2614 ];
2615
2621 public const NoReplyAddress = [
2622 'default' => false,
2623 ];
2624
2630 public const EnableEmail = [
2631 'default' => true,
2632 ];
2633
2639 public const EnableUserEmail = [
2640 'default' => true,
2641 ];
2642
2652 public const UserEmailUseReplyTo = [
2653 'default' => true,
2654 ];
2655
2660 public const PasswordReminderResendTime = [
2661 'default' => 24,
2662 ];
2663
2667 public const NewPasswordExpiry = [
2668 'default' => 3600 * 24 * 7,
2669 ];
2670
2674 public const UserEmailConfirmationTokenExpiry = [
2675 'default' => 7 * 24 * 60 * 60,
2676 ];
2677
2682 public const PasswordExpirationDays = [
2683 'default' => false,
2684 ];
2685
2690 public const PasswordExpireGrace = [
2691 'default' => 3600 * 24 * 7,
2692 ];
2693
2711 public const SMTP = [
2712 'default' => false,
2713 'type' => 'false|map',
2714 ];
2715
2719 public const AdditionalMailParams = [
2720 'default' => null,
2721 ];
2722
2727 public const AllowHTMLEmail = [
2728 'default' => false,
2729 ];
2730
2740 public const EnotifFromEditor = [
2741 'default' => false,
2742 'type' => 'boolean',
2743 ];
2744
2751 public const EmailAuthentication = [
2752 'default' => true,
2753 ];
2754
2760 public const EmailConfirmationBanner = [
2761 'default' => false,
2762 'type' => 'boolean',
2763 ];
2764
2768 public const EnotifWatchlist = [
2769 'default' => false,
2770 ];
2771
2779 public const EnotifUserTalk = [
2780 'default' => false,
2781 ];
2782
2795 public const EnotifRevealEditorAddress = [
2796 'default' => false,
2797 'type' => 'boolean',
2798 ];
2799
2813 public const EnotifMinorEdits = [
2814 'default' => true,
2815 ];
2816
2820 public const EnotifUseRealName = [
2821 'default' => false,
2822 ];
2823
2828 public const UsersNotifiedOnAllChanges = [
2829 'default' => [],
2830 'type' => 'map',
2831 ];
2832
2833 // endregion -- end of email settings
2834
2835 /***************************************************************************/
2836 // region Database settings
2849 public const DBname = [
2850 'default' => 'my_wiki',
2851 ];
2852
2863 public const DBmwschema = [
2864 'default' => null,
2865 'type' => '?string',
2866 ];
2867
2879 public const DBprefix = [
2880 'default' => '',
2881 ];
2882
2886 public const DBserver = [
2887 'default' => 'localhost',
2888 ];
2889
2893 public const DBport = [
2894 'default' => 5432,
2895 ];
2896
2900 public const DBuser = [
2901 'default' => 'wikiuser',
2902 ];
2903
2907 public const DBpassword = [
2908 'default' => '',
2909 ];
2910
2914 public const DBtype = [
2915 'default' => 'mysql',
2916 ];
2917
2925 public const DBssl = [
2926 'default' => false,
2927 ];
2928
2937 public const DBcompress = [
2938 'default' => false,
2939 ];
2940
2952 public const DBStrictWarnings = [
2953 'default' => false,
2954 ];
2955
2959 public const DBadminuser = [
2960 'default' => null,
2961 ];
2962
2966 public const DBadminpassword = [
2967 'default' => null,
2968 ];
2969
2981 public const SearchType = [
2982 'default' => null,
2983 ];
2984
2997 public const SearchTypeAlternatives = [
2998 'default' => null,
2999 ];
3000
3004 public const DBTableOptions = [
3005 'default' => 'ENGINE=InnoDB, DEFAULT CHARSET=binary',
3006 ];
3007
3015 public const SQLMode = [
3016 'default' => '',
3017 ];
3018
3022 public const SQLiteDataDir = [
3023 'default' => '',
3024 ];
3025
3046 public const SharedDB = [
3047 'default' => null,
3048 ];
3049
3053 public const SharedPrefix = [
3054 'default' => false,
3055 'dynamicDefault' => [ 'use' => [ 'DBprefix' ] ]
3056 ];
3057
3062 public static function getDefaultSharedPrefix( $dbPrefix ) {
3063 return $dbPrefix;
3064 }
3065
3070 public const SharedTables = [
3071 'default' => [
3072 'user',
3073 'user_properties',
3074 'user_autocreate_serial',
3075 ],
3076 'type' => 'list',
3077 ];
3078
3083 public const SharedSchema = [
3084 'default' => false,
3085 'dynamicDefault' => [ 'use' => [ 'DBmwschema' ] ]
3086 ];
3087
3092 public static function getDefaultSharedSchema( $dbMwschema ) {
3093 return $dbMwschema;
3094 }
3095
3147 public const DBservers = [
3148 'default' => false,
3149 'type' => 'false|list',
3150 ];
3151
3162 public const LBFactoryConf = [
3163 'default' => [
3164 'class' => 'Wikimedia\\Rdbms\\LBFactorySimple',
3165 ],
3166 'type' => 'map',
3167 'mergeStrategy' => 'replace',
3168 ];
3169
3181 public const DataCenterUpdateStickTTL = [
3182 'default' => 10,
3183 ];
3184
3188 public const DBerrorLog = [
3189 'default' => false,
3190 ];
3191
3212 public const DBerrorLogTZ = [
3213 'default' => false,
3214 'dynamicDefault' => [ 'use' => [ 'Localtimezone' ] ]
3215 ];
3216
3217 public static function getDefaultDBerrorLogTZ( ?string $localtimezone ): string {
3218 // NOTE: Extra fallback, in case $localtimezone is ''.
3219 // Many extsing LocalSettings files have $wgLocaltimezone = ''
3220 // in them, erroneously generated by the installer.
3221 return $localtimezone ?: self::getDefaultLocaltimezone();
3222 }
3223
3259 public const LocalDatabases = [
3260 'default' => [],
3261 'type' => 'list',
3262 'items' => [ 'type' => 'string', ],
3263 ];
3264
3272 public const DatabaseReplicaLagWarning = [
3273 'default' => 10,
3274 ];
3275
3280 public const DatabaseReplicaLagCritical = [
3281 'default' => 30,
3282 ];
3283
3290 public const MaxExecutionTimeForExpensiveQueries = [
3291 'default' => 0,
3292 ];
3293
3309 public const VirtualDomainsMapping = [
3310 'default' => [],
3311 'type' => 'map',
3312 ];
3313
3325 public const FileSchemaMigrationStage = [
3326 'default' => SCHEMA_COMPAT_OLD,
3327 'type' => 'integer',
3328 ];
3329
3348 public const ExternalLinksDomainGaps = [
3349 'default' => [],
3350 'type' => 'map',
3351 ];
3352
3353 // endregion -- End of DB settings
3354
3355 /***************************************************************************/
3356 // region Content handlers and storage
3367 public const ContentHandlers = [
3368 'default' =>
3369 [
3370 // the usual case
3372 'class' => WikitextContentHandler::class,
3373 'services' => [
3374 'TitleFactory',
3375 'ParserFactory',
3376 'GlobalIdGenerator',
3377 'LanguageNameUtils',
3378 'LinkRenderer',
3379 'MagicWordFactory',
3380 'ParsoidParserFactory',
3381 ],
3382 ],
3383 // dumb version, no syntax highlighting
3385 'class' => JavaScriptContentHandler::class,
3386 'services' => [
3387 'MainConfig',
3388 'ParserFactory',
3389 'UserOptionsLookup',
3390 ],
3391 ],
3392 // simple implementation, for use by extensions, etc.
3394 'class' => JsonContentHandler::class,
3395 'services' => [
3396 'ParsoidParserFactory',
3397 'TitleFactory',
3398 ],
3399 ],
3400 // dumb version, no syntax highlighting
3402 'class' => CssContentHandler::class,
3403 'services' => [
3404 'MainConfig',
3405 'ParserFactory',
3406 'UserOptionsLookup',
3407 ],
3408 ],
3410 'class' => VueContentHandler::class,
3411 'services' => [
3412 'MainConfig',
3413 'ParserFactory',
3414 ]
3415 ],
3416 // plain text, for use by extensions, etc.
3417 CONTENT_MODEL_TEXT => TextContentHandler::class,
3418 // fallback for unknown models, from imports or extensions that were removed
3419 CONTENT_MODEL_UNKNOWN => FallbackContentHandler::class,
3420 ],
3421 'type' => 'map',
3422 ];
3423
3435 public const NamespaceContentModels = [
3436 'default' => [],
3437 'type' => 'map',
3438 ];
3439
3455 public const TextModelsToParse = [
3456 'default' => [
3457 CONTENT_MODEL_WIKITEXT, // Just for completeness, wikitext will always be parsed.
3458 CONTENT_MODEL_JAVASCRIPT, // Make categories etc work, people put them into comments.
3459 CONTENT_MODEL_CSS, // Make categories etc work, people put them into comments.
3460 ],
3461 'type' => 'list',
3462 ];
3463
3470 public const CompressRevisions = [
3471 'default' => false,
3472 ];
3473
3483 public const ExternalStores = [
3484 'default' => [],
3485 'type' => 'list',
3486 ];
3487
3507 public const ExternalServers = [
3508 'default' => [],
3509 'type' => 'map',
3510 ];
3511
3524 public const DefaultExternalStore = [
3525 'default' => false,
3526 'type' => 'list|false',
3527 ];
3528
3535 public const RevisionCacheExpiry = [
3536 'default' => SqlBlobStore::DEFAULT_TTL,
3537 'type' => 'integer',
3538 ];
3539
3546 public const PageLanguageUseDB = [
3547 'default' => false,
3548 'type' => 'boolean',
3549 ];
3550
3563 public const DiffEngine = [
3564 'default' => null,
3565 'type' => '?string',
3566 ];
3567
3571 public const ExternalDiffEngine = [
3572 'default' => false,
3573 'type' => 'string|false',
3574 ];
3575
3600 public const Wikidiff2Options = [
3601 'default' => [],
3602 'type' => 'map'
3603 ];
3604
3605 // endregion -- end of Content handlers and storage
3606
3607 /***************************************************************************/
3608 // region Performance hacks and limits
3620 public const RequestTimeLimit = [
3621 'default' => null,
3622 'type' => '?integer',
3623 ];
3624
3634 public const TransactionalTimeLimit = [
3635 'default' => 120,
3636 ];
3637
3652 public const CriticalSectionTimeLimit = [
3653 'default' => 180.0,
3654 'type' => 'float',
3655 ];
3656
3660 public const MiserMode = [
3661 'default' => false,
3662 ];
3663
3667 public const DisableQueryPages = [
3668 'default' => false,
3669 ];
3670
3674 public const QueryCacheLimit = [
3675 'default' => 1000,
3676 ];
3677
3681 public const WantedPagesThreshold = [
3682 'default' => 1,
3683 ];
3684
3688 public const AllowSlowParserFunctions = [
3689 'default' => false,
3690 ];
3691
3695 public const AllowSchemaUpdates = [
3696 'default' => true,
3697 ];
3698
3702 public const MaxArticleSize = [
3703 'default' => 2048,
3704 ];
3705
3710 public const MemoryLimit = [
3711 'default' => '50M',
3712 ];
3713
3767 public const PoolCounterConf = [
3768 'default' => null,
3769 'type' => '?map',
3770 ];
3771
3784 public const PoolCountClientConf = [
3785 'default' => [
3786 'servers' => [
3787 '127.0.0.1'
3788 ],
3789 'timeout' => 0.1,
3790 ],
3791 'type' => 'map',
3792 ];
3793
3801 public const MaxUserDBWriteDuration = [
3802 'default' => false,
3803 'type' => 'integer|false',
3804 ];
3805
3813 public const MaxJobDBWriteDuration = [
3814 'default' => false,
3815 'type' => 'integer|false',
3816 ];
3817
3822 public const LinkHolderBatchSize = [
3823 'default' => 1000,
3824 ];
3825
3829 public const MaximumMovedPages = [
3830 'default' => 100,
3831 ];
3832
3845 public const ForceDeferredUpdatesPreSend = [
3846 'default' => false,
3847 ];
3848
3858 public const MultiShardSiteStats = [
3859 'default' => false,
3860 'type' => 'boolean',
3861 ];
3862
3863 // endregion -- end performance hacks
3864
3865 /***************************************************************************/
3866 // region Cache settings
3877 public const CacheDirectory = [
3878 'default' => false,
3879 ];
3880
3905 public const MainCacheType = [
3906 'default' => CACHE_NONE,
3907 ];
3908
3915 public const MessageCacheType = [
3916 'default' => CACHE_ANYTHING,
3917 ];
3918
3944 public const ParserCacheType = [
3945 'default' => CACHE_ANYTHING,
3946 ];
3947
3957 public const SessionCacheType = [
3958 'default' => CACHE_ANYTHING,
3959 ];
3960
3969 public const AnonSessionCacheType = [
3970 'default' => false
3971 ];
3972
3981 public const LanguageConverterCacheType = [
3982 'default' => CACHE_ANYTHING,
3983 ];
3984
4048 public const ObjectCaches = [
4049 'default' => [
4050 CACHE_NONE => [ 'class' => EmptyBagOStuff::class, 'reportDupes' => false ],
4051 CACHE_DB => [ 'class' => SqlBagOStuff::class, 'loggroup' => 'SQLBagOStuff' ],
4052
4053 'memcached-php' => [ 'class' => MemcachedPhpBagOStuff::class, 'loggroup' => 'memcached' ],
4054 'memcached-pecl' => [ 'class' => MemcachedPeclBagOStuff::class, 'loggroup' => 'memcached' ],
4055 'hash' => [ 'class' => HashBagOStuff::class, 'reportDupes' => false ],
4056
4057 // Deprecated since 1.35.
4058 // - To configure a wg*CacheType variable to use the local server cache,
4059 // use CACHE_ACCEL instead, which will select these automatically.
4060 // - To access the object for the local server cache at run-time,
4061 // use MediaWikiServices::getLocalServerObjectCache()
4062 // instead of e.g. ObjectCache::getInstance( 'apcu' ).
4063 // - To instantiate a new one of these explicitly, do so directly
4064 // by using `new APCUBagOStuff( [ … ] )`
4065 // - To instantiate a new one of these including auto-detection and fallback,
4066 // use ObjectCache::makeLocalServerCache().
4067 'apc' => [ 'class' => APCUBagOStuff::class, 'reportDupes' => false ],
4068 'apcu' => [ 'class' => APCUBagOStuff::class, 'reportDupes' => false ],
4069 ],
4070 'type' => 'map',
4071 ];
4072
4080 public const WANObjectCache = [
4081 'default' => [],
4082 'type' => 'map',
4083 ];
4084
4117 public const MicroStashType = [
4118 'default' => CACHE_ANYTHING,
4119 'type' => 'string|int',
4120 ];
4121
4149 public const MainStash = [
4150 'default' => CACHE_DB,
4151 ];
4152
4177 public const ParsoidCacheConfig = [
4178 'type' => 'object',
4179 'properties' => [
4180 'StashType' => [ 'type' => 'int|string|null', 'default' => null ],
4181 'StashDuration' => [ 'type' => 'int', 'default' => 24 * 60 * 60 ],
4182 'WarmParsoidParserCache' => [ 'type' => 'bool', 'default' => false ],
4183 ]
4184 ];
4185
4195 public const ParsoidSelectiveUpdateSampleRate = [
4196 'type' => 'integer',
4197 'default' => 0,
4198 ];
4199
4219 public const ParserCacheFilterConfig = [
4220 'type' => 'map',
4221 'default' => [ // default value
4222 'pcache' => [ // old parser cache
4223 'default' => [ // all namespaces
4224 // 0 means no threshold.
4225 // Use PHP_INT_MAX to disable cache.
4226 'minCpuTime' => 0
4227 ],
4228 ],
4229 'postproc-pcache' => [ // postprocessing output cache
4230 'default' => [ // all namespaces
4231 // 0 means no threshold.
4232 // Use PHP_INT_MAX to disable cache.
4233 'minCpuTime' => PHP_INT_MAX
4234 ],
4235 ],
4236 'parsoid-pcache' => [ // parsoid output cache
4237 'default' => [ // all namespaces
4238 // 0 means no threshold.
4239 // Use PHP_INT_MAX to disable cache.
4240 'minCpuTime' => 0
4241 ],
4242 ],
4243 'postproc-parsoid-pcache' => [ // parsoid postprocessing output cache
4244 'default' => [ // all namespaces
4245 // 0 means no threshold.
4246 // Use PHP_INT_MAX to disable cache.
4247 'minCpuTime' => 0
4248 ],
4249 ],
4250 ],
4251 'additionalProperties' => [ // caches
4252 'type' => 'map',
4253 'description' => 'A map of namespace IDs to filter definitions.',
4254 'additionalProperties' => [ // namespaces
4255 'type' => 'map',
4256 'description' => 'A map of filter names to values.',
4257 'properties' => [ // filters
4258 'minCpuTime' => [ 'type' => 'float' ]
4259 ]
4260 ],
4261 ],
4262 ];
4263
4269 public const ChronologyProtectorSecret = [
4270 'default' => '',
4271 'type' => 'string',
4272 ];
4273
4279 public const ParserCacheExpireTime = [
4280 'default' => 60 * 60 * 24,
4281 ];
4282
4292 public const ParserCacheAsyncExpireTime = [
4293 'default' => 60,
4294 ];
4295
4303 public const ParserCacheAsyncRefreshJobs = [
4304 'default' => true,
4305 ];
4306
4312 public const OldRevisionParserCacheExpireTime = [
4313 'default' => 60 * 60,
4314 ];
4315
4319 public const ObjectCacheSessionExpiry = [
4320 'default' => 60 * 60,
4321 ];
4322
4336 public const PHPSessionHandling = [
4337 'default' => 'warn',
4338 'type' => 'string',
4339 'deprecated' => 'since 1.45 Integration with PHP session handling will be removed in the future',
4340 ];
4341
4349 public const SuspiciousIpExpiry = [
4350 'default' => false,
4351 'type' => 'integer|false',
4352 ];
4353
4359 public const SessionPbkdf2Iterations = [
4360 'default' => 10001,
4361 ];
4362
4373 public const UseSessionCookieJwt = [
4374 'default' => false,
4375 ];
4376
4383 public const JwtSessionCookieIssuer = [
4384 'default' => null,
4385 ];
4386
4390 public const MemCachedServers = [
4391 'default' => [ '127.0.0.1:11211', ],
4392 'type' => 'list',
4393 ];
4394
4399 public const MemCachedPersistent = [
4400 'default' => false,
4401 ];
4402
4406 public const MemCachedTimeout = [
4407 'default' => 500_000,
4408 ];
4409
4421 public const UseLocalMessageCache = [
4422 'default' => false,
4423 ];
4424
4432 public const AdaptiveMessageCache = [
4433 'default' => false,
4434 ];
4435
4467 public const LocalisationCacheConf = [
4468 'properties' => [
4469 'class' => [ 'type' => 'string', 'default' => LocalisationCache::class ],
4470 'store' => [ 'type' => 'string', 'default' => 'detect' ],
4471 'storeClass' => [ 'type' => 'false|string', 'default' => false ],
4472 'storeDirectory' => [ 'type' => 'false|string', 'default' => false ],
4473 'storeServer' => [ 'type' => 'object', 'default' => [] ],
4474 'forceRecache' => [ 'type' => 'bool', 'default' => false ],
4475 'manualRecache' => [ 'type' => 'bool', 'default' => false ],
4476 ],
4477 'type' => 'object',
4478 ];
4479
4483 public const CachePages = [
4484 'default' => true,
4485 ];
4486
4496 public const CacheEpoch = [
4497 'default' => '20030516000000',
4498 ];
4499
4504 public const GitInfoCacheDirectory = [
4505 'default' => false,
4506 ];
4507
4513 public const UseFileCache = [
4514 'default' => false,
4515 ];
4516
4523 public const FileCacheDepth = [
4524 'default' => 2,
4525 ];
4526
4531 public const RenderHashAppend = [
4532 'default' => '',
4533 ];
4534
4544 public const EnableSidebarCache = [
4545 'default' => false,
4546 ];
4547
4551 public const SidebarCacheExpiry = [
4552 'default' => 86400,
4553 ];
4554
4561 public const UseGzip = [
4562 'default' => false,
4563 ];
4564
4574 public const InvalidateCacheOnLocalSettingsChange = [
4575 'default' => true,
4576 ];
4577
4592 public const ExtensionInfoMTime = [
4593 'default' => false,
4594 'type' => 'integer|false',
4595 ];
4596
4603 public const EnableRemoteBagOStuffTests = [
4604 'default' => false,
4605 ];
4606
4607 // endregion -- end of cache settings
4608
4609 /***************************************************************************/
4610 // region HTTP proxy (CDN) settings
4629 public const UseCdn = [
4630 'default' => false,
4631 ];
4632
4641 public const VaryOnXFP = [
4642 'default' => false,
4643 ];
4644
4654 public const InternalServer = [
4655 'default' => false,
4656 ];
4657
4667 public const CdnMaxAge = [
4668 'default' => 18000,
4669 ];
4670
4677 public const CdnMaxageLagged = [
4678 'default' => 30,
4679 ];
4680
4687 public const CdnMaxageStale = [
4688 'default' => 10,
4689 ];
4690
4706 public const CdnReboundPurgeDelay = [
4707 'default' => 0,
4708 ];
4709
4716 public const CdnMaxageSubstitute = [
4717 'default' => 60,
4718 ];
4719
4725 public const ForcedRawSMaxage = [
4726 'default' => 300,
4727 ];
4728
4739 public const CdnServers = [
4740 'default' => [],
4741 'type' => 'map',
4742 ];
4743
4752 public const CdnServersNoPurge = [
4753 'default' => [],
4754 'type' => 'map',
4755 ];
4756
4805 public const HTCPRouting = [
4806 'default' => [],
4807 'type' => 'map',
4808 ];
4809
4815 public const HTCPMulticastTTL = [
4816 'default' => 1,
4817 ];
4818
4822 public const UsePrivateIPs = [
4823 'default' => false,
4824 ];
4825
4837 public const CdnMatchParameterOrder = [
4838 'default' => true,
4839 ];
4840
4841 // endregion -- end of HTTP proxy settings
4842
4843 /***************************************************************************/
4844 // region Language, regional and character encoding settings
4864 public const LanguageCode = [
4865 'default' => 'en',
4866 ];
4867
4879 public const GrammarForms = [
4880 'default' => [],
4881 'type' => 'map',
4882 ];
4883
4887 public const InterwikiMagic = [
4888 'default' => true,
4889 ];
4890
4894 public const HideInterlanguageLinks = [
4895 'default' => false,
4896 ];
4897
4918 public const ExtraInterlanguageLinkPrefixes = [
4919 'default' => [],
4920 'type' => 'list',
4921 ];
4922
4930 public const InterlanguageLinkCodeMap = [
4931 'default' => [],
4932 'type' => 'map',
4933 ];
4934
4938 public const ExtraLanguageNames = [
4939 'default' => [],
4940 'type' => 'map',
4941 ];
4942
4957 public const ExtraLanguageCodes = [
4958 'default' => [
4959 'bh' => 'bho',
4960 'no' => 'nb',
4961 'simple' => 'en',
4962 ],
4963 'type' => 'map',
4964 ];
4965
4974 public const DummyLanguageCodes = [
4975 'default' => [],
4976 'type' => 'map',
4977 ];
4978
4986 public const AllUnicodeFixes = [
4987 'default' => false,
4988 ];
4989
5000 public const LegacyEncoding = [
5001 'default' => false,
5002 ];
5003
5008 public const AmericanDates = [
5009 'default' => false,
5010 ];
5011
5016 public const TranslateNumerals = [
5017 'default' => true,
5018 ];
5019
5025 public const UseDatabaseMessages = [
5026 'default' => true,
5027 ];
5028
5032 public const MaxMsgCacheEntrySize = [
5033 'default' => 10000,
5034 ];
5035
5039 public const DisableLangConversion = [
5040 'default' => false,
5041 ];
5042
5047 public const DisableTitleConversion = [
5048 'default' => false,
5049 ];
5050
5055 public const DefaultLanguageVariant = [
5056 'default' => false,
5057 ];
5058
5063 public const UsePigLatinVariant = [
5064 'default' => false,
5065 ];
5066
5077 public const DisabledVariants = [
5078 'default' => [],
5079 'type' => 'map',
5080 ];
5081
5100 public const VariantArticlePath = [
5101 'default' => false,
5102 ];
5103
5119 public const UseXssLanguage = [
5120 'default' => false,
5121 ];
5122
5128 public const LoginLanguageSelector = [
5129 'default' => false,
5130 ];
5131
5152 public const ForceUIMsgAsContentMsg = [
5153 'default' => [],
5154 'type' => 'map',
5155 ];
5156
5169 public const RawHtmlMessages = [
5170 'default' => [],
5171 'type' => 'list',
5172 'items' => [ 'type' => 'string', ],
5173 ];
5174
5199 public const Localtimezone = [
5200 'dynamicDefault' => true,
5201 ];
5202
5203 public static function getDefaultLocaltimezone(): string {
5204 // This defaults to the `date.timezone` value of the PHP INI option. If this option is not set,
5205 // it falls back to UTC.
5206 $localtimezone = date_default_timezone_get();
5207 if ( !$localtimezone ) {
5208 // Make doubly sure we have a valid time zone, even if date_default_timezone_get()
5209 // returned garbage.
5210 $localtimezone = 'UTC';
5211 }
5212
5213 return $localtimezone;
5214 }
5215
5225 public const LocalTZoffset = [
5226 'dynamicDefault' => [ 'use' => [ 'Localtimezone' ] ]
5227 ];
5228
5229 public static function getDefaultLocalTZoffset( ?string $localtimezone ): int {
5230 // NOTE: Extra fallback, in case $localtimezone is ''.
5231 // Many extsing LocalSettings files have $wgLocaltimezone = ''
5232 // in them, erroneously generated by the installer.
5233 $localtimezone = $localtimezone ?: self::getDefaultLocaltimezone();
5234
5235 try {
5236 $timezone = new DateTimeZone( $localtimezone );
5237 } catch ( \Exception $e ) {
5238 throw new ConfigException(
5239 sprintf( "Invalid timezone '%s'. Please set a valid timezone in '$%s' in LocalSettings.php. Refer to the list of valid timezones at https://www.php.net/timezones. Error: %s",
5240 $localtimezone,
5241 "wgLocaltimezone",
5242 $e->getMessage() ),
5243 );
5244 }
5245
5246 $offset = $timezone->getOffset( new DateTime() );
5247
5248 return (int)( $offset / 60 );
5249 }
5250
5259 public const OverrideUcfirstCharacters = [
5260 'default' => [],
5261 'type' => 'map',
5262 ];
5263
5264 // endregion -- End of language/charset settings
5265
5266 /***************************************************************************/
5267 // region Output format and skin settings
5273 public const MimeType = [
5274 'default' => 'text/html',
5275 ];
5276
5286 public const Html5Version = [
5287 'default' => null,
5288 ];
5289
5297 public const EditSubmitButtonLabelPublish = [
5298 'default' => false,
5299 ];
5300
5317 public const XhtmlNamespaces = [
5318 'default' => [],
5319 'type' => 'map',
5320 ];
5321
5329 public const SiteNotice = [
5330 'default' => '',
5331 ];
5332
5344 public const BrowserFormatDetection = [
5345 'default' => 'telephone=no',
5346 'type' => 'string',
5347 ];
5348
5357 public const SkinMetaTags = [
5358 'default' => [],
5359 'type' => 'map',
5360 ];
5361
5366 public const DefaultSkin = [
5367 'default' => 'vector-2022',
5368 ];
5369
5375 public const FallbackSkin = [
5376 'default' => 'fallback',
5377 ];
5378
5389 public const SkipSkins = [
5390 'default' => [],
5391 'type' => 'map',
5392 ];
5393
5397 public const DisableOutputCompression = [
5398 'default' => false,
5399 ];
5400
5430 public const FragmentMode = [
5431 'default' => [ 'html5', 'legacy', ],
5432 'type' => 'list',
5433 ];
5434
5443 public const ExternalInterwikiFragmentMode = [
5444 'default' => 'legacy',
5445 ];
5446
5478 public const FooterIcons = [
5479 'default' => [
5480 "copyright" => [
5481 "copyright" => [], // placeholder for the built in copyright icon
5482 ],
5483 "poweredby" => [
5484 "mediawiki" => [
5485 // Defaults to point at
5486 // "$wgResourceBasePath/resources/assets/poweredby_mediawiki_88x31.png"
5487 // plus srcset for 2x resolution variant.
5488 "src" => null,
5489 "url" => "https://www.mediawiki.org/",
5490 "alt" => "Powered by MediaWiki",
5491 "lang" => "en",
5492 ]
5493 ],
5494 ],
5495 'type' => 'map',
5496 ];
5497
5505 public const UseCombinedLoginLink = [
5506 'default' => false,
5507 ];
5508
5512 public const Edititis = [
5513 'default' => false,
5514 ];
5515
5527 public const Send404Code = [
5528 'default' => true,
5529 ];
5530
5541 public const ShowRollbackEditCount = [
5542 'default' => 10,
5543 ];
5544
5551 public const EnableCanonicalServerLink = [
5552 'default' => false,
5553 ];
5554
5568 public const InterwikiLogoOverride = [
5569 'default' => [],
5570 'type' => 'list',
5571 'items' => [ 'type' => 'string', ],
5572 ];
5573
5574 // endregion -- End of output format settings
5575
5576 /***************************************************************************/
5577 // region ResourceLoader settings
5587 public const MangleFlashPolicy = [
5588 'default' => true,
5589 'obsolete' => 'Since 1.39; no longer has any effect.',
5590 'description' => 'Has been emitting warnings since 1.39 (LTS). ' .
5591 'Can be removed completely in 1.44, assuming 1.43 is an LTS release.'
5592 ];
5593
5903 public const ResourceModules = [
5904 'default' => [],
5905 'type' => 'map',
5906 ];
5907
6002 public const ResourceModuleSkinStyles = [
6003 'default' => [],
6004 'type' => 'map',
6005 ];
6006
6018 public const ResourceLoaderSources = [
6019 'default' => [],
6020 'type' => 'map',
6021 ];
6022
6028 public const ResourceBasePath = [
6029 'default' => null,
6030 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
6031 ];
6032
6037 public static function getDefaultResourceBasePath( $scriptPath ): string {
6038 return $scriptPath;
6039 }
6040
6053 public const ResourceLoaderMaxage = [
6054 'default' => [],
6055 'type' => 'map',
6056 ];
6057
6063 public const ResourceLoaderDebug = [
6064 'default' => false,
6065 ];
6066
6079 public const ResourceLoaderMaxQueryLength = [
6080 'default' => false,
6081 'type' => 'integer|false',
6082 ];
6083
6094 public const ResourceLoaderValidateJS = [
6095 'default' => true,
6096 ];
6097
6106 public const ResourceLoaderEnableJSProfiler = [
6107 'default' => false,
6108 ];
6109
6114 public const ResourceLoaderStorageEnabled = [
6115 'default' => true,
6116 ];
6117
6124 public const ResourceLoaderStorageVersion = [
6125 'default' => 1,
6126 ];
6127
6134 public const ResourceLoaderEnableSourceMapLinks = [
6135 'default' => true,
6136 ];
6137
6149 public const AllowSiteCSSOnRestrictedPages = [
6150 'default' => false,
6151 ];
6152
6163 public const VueDevelopmentMode = [
6164 'default' => false,
6165 ];
6166
6180 public const CodexDevelopmentDir = [
6181 'default' => null,
6182 ];
6183
6184 // endregion -- End of ResourceLoader settings
6185
6186 /***************************************************************************/
6187 // region Page titles and redirects
6194 public const MetaNamespace = [
6195 'default' => false,
6196 'dynamicDefault' => [ 'use' => [ 'Sitename' ] ]
6197 ];
6198
6203 public static function getDefaultMetaNamespace( $sitename ): string {
6204 return str_replace( ' ', '_', $sitename );
6205 }
6206
6214 public const MetaNamespaceTalk = [
6215 'default' => false,
6216 ];
6217
6224 public const CanonicalNamespaceNames = [
6225 'default' => NamespaceInfo::CANONICAL_NAMES,
6226 'type' => 'map',
6227 ];
6228
6255 public const ExtraNamespaces = [
6256 'default' => [],
6257 'type' => 'map',
6258 ];
6259
6268 public const ExtraGenderNamespaces = [
6269 'default' => [],
6270 'type' => 'map',
6271 ];
6272
6295 public const NamespaceAliases = [
6296 'default' => [],
6297 'type' => 'map',
6298 ];
6299
6326 public const LegalTitleChars = [
6327 'default' => ' %!"$&\'()*,\\-.\\/0-9:;=?@A-Z\\\\^_`a-z~\\x80-\\xFF+',
6328 'deprecated' => 'since 1.41; use Extension:TitleBlacklist to customize',
6329 ];
6330
6338 public const CapitalLinks = [
6339 'default' => true,
6340 ];
6341
6356 public const CapitalLinkOverrides = [
6357 'default' => [],
6358 'type' => 'map',
6359 ];
6360
6365 public const NamespacesWithSubpages = [
6366 'default' => [
6367 NS_TALK => true,
6368 NS_USER => true,
6369 NS_USER_TALK => true,
6370 NS_PROJECT => true,
6371 NS_PROJECT_TALK => true,
6372 NS_FILE_TALK => true,
6373 NS_MEDIAWIKI => true,
6374 NS_MEDIAWIKI_TALK => true,
6375 NS_TEMPLATE => true,
6376 NS_TEMPLATE_TALK => true,
6377 NS_HELP => true,
6378 NS_HELP_TALK => true,
6379 NS_CATEGORY_TALK => true
6380 ],
6381 'type' => 'map',
6382 ];
6383
6393 public const NamespacesWithoutAutoSummaries = [
6394 'default' => [],
6395 'type' => 'list',
6396 ];
6397
6404 public const ContentNamespaces = [
6405 'default' => [ NS_MAIN ],
6406 'type' => 'list',
6407 ];
6408
6417 public const ShortPagesNamespaceExclusions = [
6418 'default' => [],
6419 'type' => 'list',
6420 ];
6421
6430 public const ExtraSignatureNamespaces = [
6431 'default' => [],
6432 'type' => 'list',
6433 ];
6434
6446 public const InvalidRedirectTargets = [
6447 'default' => [ 'Filepath', 'Mypage', 'Mytalk', 'Redirect', 'Mylog' ],
6448 'type' => 'list',
6449 ];
6450
6459 public const DisableHardRedirects = [
6460 'default' => false,
6461 ];
6462
6468 public const FixDoubleRedirects = [
6469 'default' => false,
6470 ];
6471
6472 // endregion -- End of title and interwiki settings
6473
6474 /***************************************************************************/
6475 // region Interwiki links and sites
6484 public const LocalInterwikis = [
6485 'default' => [],
6486 'type' => 'list',
6487 ];
6488
6492 public const InterwikiExpiry = [
6493 'default' => 10800,
6494 ];
6495
6516 public const InterwikiCache = [
6517 'default' => false,
6518 'type' => 'false|map',
6519 'mergeStrategy' => 'replace',
6520 ];
6521
6529 public const InterwikiScopes = [
6530 'default' => 3,
6531 ];
6532
6536 public const InterwikiFallbackSite = [
6537 'default' => 'wiki',
6538 ];
6539
6556 public const RedirectSources = [
6557 'default' => false,
6558 ];
6559
6565 public const SiteTypes = [
6566 'default' => [ 'mediawiki' => MediaWikiSite::class, ],
6567 'type' => 'map',
6568 ];
6569
6570 // endregion -- Interwiki links and sites
6571
6572 /***************************************************************************/
6573 // region Parser settings
6581 public const MaxTocLevel = [
6582 'default' => 999,
6583 ];
6584
6589 public const MaxPPNodeCount = [
6590 'default' => 1_000_000,
6591 ];
6592
6600 public const MaxTemplateDepth = [
6601 'default' => 100,
6602 ];
6603
6607 public const MaxPPExpandDepth = [
6608 'default' => 100,
6609 ];
6610
6621 public const UrlProtocols = [
6622 'default' => [
6623 'bitcoin:', 'ftp://', 'ftps://', 'geo:', 'git://', 'gopher://', 'http://',
6624 'https://', 'irc://', 'ircs://', 'magnet:', 'mailto:', 'matrix:', 'mms://',
6625 'news:', 'nntp://', 'redis://', 'sftp://', 'sip:', 'sips:', 'sms:',
6626 'ssh://', 'svn://', 'tel:', 'telnet://', 'urn:', 'wikipedia://', 'worldwind://',
6627 'xmpp:', '//',
6628 ],
6629 'type' => 'list',
6630 ];
6631
6635 public const CleanSignatures = [
6636 'default' => true,
6637 ];
6638
6642 public const AllowExternalImages = [
6643 'default' => false,
6644 ];
6645
6660 public const AllowExternalImagesFrom = [
6661 'default' => '',
6662 ];
6663
6675 public const EnableImageWhitelist = [
6676 'default' => false,
6677 ];
6678
6697 public const TidyConfig = [
6698 'default' => [],
6699 'type' => 'map',
6700 ];
6701
6710 public const ParsoidSettings = [
6711 'default' => [
6712 'useSelser' => true,
6713 ],
6714 'type' => 'map',
6715 ];
6716
6730 public const ParsoidExperimentalParserFunctionOutput = [
6731 'default' => false,
6732 'type' => 'boolean',
6733 ];
6734
6743 public const UseLegacyMediaStyles = [
6744 'default' => false,
6745 ];
6746
6753 public const RawHtml = [
6754 'default' => false,
6755 ];
6756
6766 public const ExternalLinkTarget = [
6767 'default' => false,
6768 ];
6769
6776 public const NoFollowLinks = [
6777 'default' => true,
6778 ];
6779
6785 public const NoFollowNsExceptions = [
6786 'default' => [],
6787 'type' => 'list',
6788 ];
6789
6803 public const NoFollowDomainExceptions = [
6804 'default' => [ 'mediawiki.org', ],
6805 'type' => 'list',
6806 ];
6807
6812 public const RegisterInternalExternals = [
6813 'default' => false,
6814 ];
6815
6822 public const ExternalLinksIgnoreDomains = [
6823 'default' => [],
6824 'type' => 'array',
6825 ];
6826
6830 public const AllowDisplayTitle = [
6831 'default' => true,
6832 ];
6833
6839 public const RestrictDisplayTitle = [
6840 'default' => true,
6841 ];
6842
6847 public const ExpensiveParserFunctionLimit = [
6848 'default' => 100,
6849 ];
6850
6855 public const PreprocessorCacheThreshold = [
6856 'default' => 1000,
6857 ];
6858
6862 public const EnableScaryTranscluding = [
6863 'default' => false,
6864 ];
6865
6871 public const TranscludeCacheExpiry = [
6872 'default' => 3600,
6873 ];
6874
6881 public const EnableMagicLinks = [
6882 'default' => [
6883 'ISBN' => false,
6884 'PMID' => false,
6885 'RFC' => false,
6886 ],
6887 'type' => 'map',
6888 ];
6889
6899 public const ParserEnableUserLanguage = [
6900 'default' => false,
6901 ];
6902
6903 // endregion -- end of parser settings
6904
6905 /***************************************************************************/
6906 // region Statistics and content analysis
6925 public const ArticleCountMethod = [
6926 'default' => 'link',
6927 ];
6928
6937 public const ActiveUserDays = [
6938 'default' => 30,
6939 ];
6940
6953 public const LearnerEdits = [
6954 'default' => 10,
6955 ];
6956
6962 public const LearnerMemberSince = [
6963 'default' => 4,
6964 ];
6965
6971 public const ExperiencedUserEdits = [
6972 'default' => 500,
6973 ];
6974
6980 public const ExperiencedUserMemberSince = [
6981 'default' => 30,
6982 ];
6983
7002 public const ManualRevertSearchRadius = [
7003 'default' => 15,
7004 'type' => 'integer',
7005 ];
7006
7019 public const RevertedTagMaxDepth = [
7020 'default' => 15,
7021 'type' => 'integer',
7022 ];
7023
7024 // endregion -- End of statistics and content analysis
7025
7026 /***************************************************************************/
7027 // region User accounts, authentication
7036 public const CentralIdLookupProviders = [
7037 'default' => [
7038 'local' => [
7039 'class' => LocalIdLookup::class,
7040 'services' => [
7041 'MainConfig',
7042 'DBLoadBalancerFactory',
7043 'HideUserUtils',
7044 ]
7045 ]
7046 ],
7047 'type' => 'map',
7048 ];
7049
7053 public const CentralIdLookupProvider = [
7054 'default' => 'local',
7055 'type' => 'string',
7056 ];
7057
7062 public const UserRegistrationProviders = [
7063 'default' => [
7064 LocalUserRegistrationProvider::TYPE => [
7065 'class' => LocalUserRegistrationProvider::class,
7066 'services' => [
7067 'ConnectionProvider',
7068 ],
7069 ],
7070 ],
7071 'type' => 'map',
7072 ];
7073
7138 public const PasswordPolicy = [
7139 'default' => [
7140 'policies' => [
7141 'bureaucrat' => [
7142 'MinimalPasswordLength' => 10,
7143 'MinimumPasswordLengthToLogin' => 1,
7144 ],
7145 'sysop' => [
7146 'MinimalPasswordLength' => 10,
7147 'MinimumPasswordLengthToLogin' => 1,
7148 ],
7149 'interface-admin' => [
7150 'MinimalPasswordLength' => 10,
7151 'MinimumPasswordLengthToLogin' => 1,
7152 ],
7153 'bot' => [
7154 'MinimalPasswordLength' => 10,
7155 'MinimumPasswordLengthToLogin' => 1,
7156 ],
7157 'default' => [
7158 'MinimalPasswordLength' => [ 'value' => 8, 'suggestChangeOnLogin' => true ],
7159 'PasswordCannotBeSubstringInUsername' => [
7160 'value' => true,
7161 'suggestChangeOnLogin' => true
7162 ],
7163 'PasswordCannotMatchDefaults' => [ 'value' => true, 'suggestChangeOnLogin' => true ],
7164 'MaximalPasswordLength' => [ 'value' => 4096, 'suggestChangeOnLogin' => true ],
7165 'PasswordNotInCommonList' => [ 'value' => true, 'suggestChangeOnLogin' => true ],
7166 ],
7167 ],
7168 'checks' => [
7169 'MinimalPasswordLength' => [ PasswordPolicyChecks::class, 'checkMinimalPasswordLength' ],
7170 'MinimumPasswordLengthToLogin' => [ PasswordPolicyChecks::class, 'checkMinimumPasswordLengthToLogin' ],
7171 'PasswordCannotBeSubstringInUsername' => [ PasswordPolicyChecks::class, 'checkPasswordCannotBeSubstringInUsername' ],
7172 'PasswordCannotMatchDefaults' => [ PasswordPolicyChecks::class, 'checkPasswordCannotMatchDefaults' ],
7173 'MaximalPasswordLength' => [ PasswordPolicyChecks::class, 'checkMaximalPasswordLength' ],
7174 'PasswordNotInCommonList' => [ PasswordPolicyChecks::class, 'checkPasswordNotInCommonList' ],
7175 ],
7176 ],
7177 'type' => 'map',
7178 'mergeStrategy' => 'array_replace_recursive',
7179 ];
7180
7200 public const AuthManagerConfig = [
7201 'default' => null,
7202 'type' => '?map',
7203 ];
7204
7209 public const AuthManagerAutoConfig = [
7210 'default' => [
7211 'preauth' => [
7212 ThrottlePreAuthenticationProvider::class => [
7213 'class' => ThrottlePreAuthenticationProvider::class,
7214 'sort' => 0,
7215 ],
7216 PreviouslyRenamedAccountPreAuthenticationProvider::class => [
7217 'class' => PreviouslyRenamedAccountPreAuthenticationProvider::class,
7218 'services' => [
7219 'ConnectionProvider',
7220 'UserFactory',
7221 ],
7222 'sort' => 0,
7223 ],
7224 ],
7225 'primaryauth' => [
7226 // TemporaryPasswordPrimaryAuthenticationProvider should come before
7227 // any other PasswordAuthenticationRequest-based
7228 // PrimaryAuthenticationProvider (or at least any that might return
7229 // FAIL rather than ABSTAIN for a wrong password), or password reset
7230 // won't work right. Do not remove this (or change the key) or
7231 // auto-configuration of other such providers in extensions will
7232 // probably auto-insert themselves in the wrong place.
7233 TemporaryPasswordPrimaryAuthenticationProvider::class => [
7234 'class' => TemporaryPasswordPrimaryAuthenticationProvider::class,
7235 'services' => [
7236 'DBLoadBalancerFactory',
7237 'UserOptionsLookup',
7238 ],
7239 'args' => [ [
7240 // Fall through to LocalPasswordPrimaryAuthenticationProvider
7241 'authoritative' => false,
7242 ] ],
7243 'sort' => 0,
7244 ],
7245 LocalPasswordPrimaryAuthenticationProvider::class => [
7246 'class' => LocalPasswordPrimaryAuthenticationProvider::class,
7247 'services' => [
7248 'DBLoadBalancerFactory',
7249 ],
7250 'args' => [ [
7251 // Last one should be authoritative, or else the user will get
7252 // a less-than-helpful error message (something like "supplied
7253 // authentication info not supported" rather than "wrong
7254 // password") if it too fails.
7255 'authoritative' => true,
7256 ] ],
7257 'sort' => 100,
7258 ],
7259 ],
7260 'secondaryauth' => [
7261 CheckBlocksSecondaryAuthenticationProvider::class => [
7262 'class' => CheckBlocksSecondaryAuthenticationProvider::class,
7263 'sort' => 0,
7264 ],
7265 ResetPasswordSecondaryAuthenticationProvider::class => [
7266 'class' => ResetPasswordSecondaryAuthenticationProvider::class,
7267 'sort' => 100,
7268 ],
7269 // Linking during login is experimental, enable at your own risk - T134952
7270 // MediaWiki\Auth\ConfirmLinkSecondaryAuthenticationProvider::class => [
7271 // 'class' => MediaWiki\Auth\ConfirmLinkSecondaryAuthenticationProvider::class,
7272 // 'sort' => 100,
7273 // ],
7274 EmailNotificationSecondaryAuthenticationProvider::class => [
7275 'class' => EmailNotificationSecondaryAuthenticationProvider::class,
7276 'services' => [
7277 'DBLoadBalancerFactory',
7278 ],
7279 'sort' => 200,
7280 ],
7281 ],
7282 ],
7283 'type' => 'map',
7284 'mergeStrategy' => 'array_plus_2d',
7285 ];
7286
7297 public const RememberMe = [
7298 'default' => 'choose',
7299 'type' => 'string',
7300 ];
7301
7339 public const ReauthenticateTime = [
7340 'default' => [ 'default' => 3600, ],
7341 'type' => 'map',
7342 'additionalProperties' => [ 'type' => 'integer', ],
7343 ];
7344
7359 public const AllowSecuritySensitiveOperationIfCannotReauthenticate = [
7360 'default' => [ 'default' => true, ],
7361 'type' => 'map',
7362 'additionalProperties' => [ 'type' => 'boolean', ],
7363 ];
7364
7375 public const ChangeCredentialsBlacklist = [
7376 'default' => [
7377 TemporaryPasswordAuthenticationRequest::class,
7378 ],
7379 'type' => 'list',
7380 'items' => [ 'type' => 'string', ],
7381 ];
7382
7393 public const RemoveCredentialsBlacklist = [
7394 'default' => [
7395 PasswordAuthenticationRequest::class,
7396 ],
7397 'type' => 'list',
7398 'items' => [ 'type' => 'string', ],
7399 ];
7400
7407 public const InvalidPasswordReset = [
7408 'default' => true,
7409 ];
7410
7419 public const PasswordDefault = [
7420 'default' => 'pbkdf2',
7421 ];
7422
7450 public const PasswordConfig = [
7451 'default' => [
7452 'A' => [
7453 'class' => MWOldPassword::class,
7454 ],
7455 'B' => [
7456 'class' => MWSaltedPassword::class,
7457 ],
7458 'pbkdf2-legacyA' => [
7459 'class' => LayeredParameterizedPassword::class,
7460 'types' => [
7461 'A',
7462 'pbkdf2',
7463 ],
7464 ],
7465 'pbkdf2-legacyB' => [
7466 'class' => LayeredParameterizedPassword::class,
7467 'types' => [
7468 'B',
7469 'pbkdf2',
7470 ],
7471 ],
7472 'bcrypt' => [
7473 'class' => BcryptPassword::class,
7474 'cost' => 9,
7475 ],
7476 'pbkdf2' => [
7477 'class' => Pbkdf2PasswordUsingOpenSSL::class,
7478 'algo' => 'sha512',
7479 'cost' => '30000',
7480 'length' => '64',
7481 ],
7482 'argon2' => [
7483 'class' => Argon2Password::class,
7484
7485 // Algorithm used:
7486 // * 'argon2i' is optimized against side-channel attacks
7487 // * 'argon2id' is optimized against both side-channel and GPU cracking
7488 // * 'auto' to use the best available algorithm. If you're using more than one server, be
7489 // careful when you're mixing PHP versions because newer PHP might generate hashes that
7490 // older versions would not understand.
7491 'algo' => 'auto',
7492
7493 // The parameters below are the same as options accepted by password_hash().
7494 // Set them to override that function's defaults.
7495 //
7496 // 'memory_cost' => PASSWORD_ARGON2_DEFAULT_MEMORY_COST,
7497 // 'time_cost' => PASSWORD_ARGON2_DEFAULT_TIME_COST,
7498 // 'threads' => PASSWORD_ARGON2_DEFAULT_THREADS,
7499 ],
7500 ],
7501 'type' => 'map',
7502 ];
7503
7510 public const PasswordResetRoutes = [
7511 'default' => [
7512 'username' => true,
7513 'email' => true,
7514 ],
7515 'type' => 'map',
7516 ];
7517
7521 public const MaxSigChars = [
7522 'default' => 255,
7523 ];
7524
7537 public const SignatureValidation = [
7538 'default' => 'warning',
7539 ];
7540
7547 public const SignatureAllowedLintErrors = [
7548 'default' => [ 'obsolete-tag', ],
7549 'type' => 'list',
7550 ];
7551
7556 public const MaxNameChars = [
7557 'default' => 255,
7558 ];
7559
7566 public const ReservedUsernames = [
7567 'default' => [
7568 'MediaWiki default', // Default 'Main Page' and MediaWiki: message pages
7569 'Conversion script', // Used for the old Wikipedia software upgrade
7570 'Maintenance script', // Maintenance scripts which perform editing, image import script
7571 'Template namespace initialisation script', // Used in 1.2->1.3 upgrade
7572 'ScriptImporter', // Default user name used by maintenance/importSiteScripts.php
7573 'Delete page script', // Default user name used by maintenance/deleteBatch.php
7574 'Move page script', // Default user name used by maintenance/deleteBatch.php
7575 'Command line script', // Default user name used by maintenance/undelete.php
7576 'Unknown user', // Used in WikiImporter & RevisionStore for revisions with no author and in User for invalid user id
7577 'msg:double-redirect-fixer', // Automatic double redirect fix
7578 'msg:usermessage-editor', // Default user for leaving user messages
7579 'msg:proxyblocker', // For $wgProxyList and Special:Blockme (removed in 1.22)
7580 'msg:sorbs', // For $wgEnableDnsBlacklist etc.
7581 'msg:spambot_username', // Used by cleanupSpam.php
7582 'msg:autochange-username', // Used by anon category RC entries (removed in 1.44)
7583 ],
7584 'type' => 'list',
7585 ];
7586
7603 public const DefaultUserOptions = [
7604 'default' =>
7605 // This array should be sorted by key
7606 [
7607 'ccmeonemails' => 0,
7608 'date' => 'default',
7609 'diffonly' => 0,
7610 'diff-type' => 'table',
7611 'disablemail' => 0,
7612 'editfont' => 'monospace',
7613 'editondblclick' => 0,
7614 'editrecovery' => 0,
7615 'editsectiononrightclick' => 0,
7616 'email-allow-new-users' => 1,
7617 'enotifminoredits' => 0,
7618 'enotifrevealaddr' => 0,
7619 'enotifusertalkpages' => 1,
7620 'enotifwatchlistpages' => 1,
7621 'extendwatchlist' => 1,
7622 'fancysig' => 0,
7623 'forceeditsummary' => 0,
7624 'forcesafemode' => 0,
7625 'gender' => 'unknown',
7626 'hidecategorization' => 1,
7627 'hideminor' => 0,
7628 'hidepatrolled' => 0,
7629 'imagesize' => 2,
7630 'minordefault' => 0,
7631 'newpageshidepatrolled' => 0,
7632 'nickname' => '',
7633 'norollbackdiff' => 0,
7634 'prefershttps' => 1,
7635 'previewonfirst' => 0,
7636 'previewontop' => 1,
7637 'pst-cssjs' => 1,
7638 'rcdays' => 7,
7639 'rcenhancedfilters-disable' => 0,
7640 'rclimit' => 50,
7641 'requireemail' => 0,
7642 'search-match-redirect' => true,
7643 'search-special-page' => 'Search',
7644 'search-thumbnail-extra-namespaces' => true,
7645 'searchlimit' => 20,
7646 'showhiddencats' => 0,
7647 'shownumberswatching' => 1,
7648 'showrollbackconfirmation' => 0,
7649 'skin' => false,
7650 'skin-responsive' => 1,
7651 'thumbsize' => 5,
7652 'underline' => 2,
7653 'useeditwarning' => 1,
7654 'uselivepreview' => 0,
7655 'usenewrc' => 1,
7656 'watchcreations' => 1,
7657 'watchcreations-expiry' => 'infinite',
7658 'watchdefault' => 1,
7659 'watchdefault-expiry' => 'infinite',
7660 'watchdeletion' => 0,
7661 'watchlistdays' => 7,
7662 'watchlisthideanons' => 0,
7663 'watchlisthidebots' => 0,
7664 'watchlisthidecategorization' => 1,
7665 'watchlisthideliu' => 0,
7666 'watchlisthideminor' => 0,
7667 'watchlisthideown' => 0,
7668 'watchlisthidepatrolled' => 0,
7669 'watchlistreloadautomatically' => 0,
7670 'watchlistunwatchlinks' => 0,
7671 'watchmoves' => 0,
7672 'watchrollback' => 0,
7673 'watchuploads' => 1,
7674 'watchrollback-expiry' => 'infinite',
7675 'watchstar-expiry' => 'infinite',
7676 'wlenhancedfilters-disable' => 0,
7677 'wllimit' => 250,
7678 ],
7679 'type' => 'map',
7680 ];
7681
7713 public const ConditionalUserOptions = [
7714 'default' => [],
7715 'type' => 'map',
7716 ];
7717
7721 public const HiddenPrefs = [
7722 'default' => [],
7723 'type' => 'list',
7724 ];
7725
7729 public const UserJsPrefLimit = [
7730 'default' => 100,
7731 'type' => 'int',
7732 ];
7733
7740 public const InvalidUsernameCharacters = [
7741 'default' => '@:>=',
7742 ];
7743
7753 public const UserrightsInterwikiDelimiter = [
7754 'default' => '@',
7755 ];
7756
7765 public const SecureLogin = [
7766 'default' => false,
7767 ];
7768
7778 public const AuthenticationTokenVersion = [
7779 'default' => null,
7780 'type' => '?string',
7781 ];
7782
7792 public const SessionProviders = [
7793 'type' => 'map',
7794 'default' => [
7795 \MediaWiki\Session\CookieSessionProvider::class => [
7796 'class' => \MediaWiki\Session\CookieSessionProvider::class,
7797 'args' => [ [
7798 'priority' => 30,
7799 ] ],
7800 'services' => [
7801 'JwtCodec',
7802 'UrlUtils',
7803 ],
7804 ],
7805 \MediaWiki\Session\BotPasswordSessionProvider::class => [
7806 'class' => \MediaWiki\Session\BotPasswordSessionProvider::class,
7807 'args' => [ [
7808 'priority' => 75,
7809 ] ],
7810 'services' => [
7811 'GrantsInfo'
7812 ],
7813 ],
7814 ],
7815 ];
7816
7891 public const AutoCreateTempUser = [
7892 'properties' => [
7893 'known' => [ 'type' => 'bool', 'default' => false ],
7894 'enabled' => [ 'type' => 'bool', 'default' => false ],
7895 'actions' => [ 'type' => 'list', 'default' => [ 'edit' ] ],
7896 'genPattern' => [ 'type' => 'string', 'default' => '~$1' ],
7897 'matchPattern' => [ 'type' => 'string|array|null', 'default' => null ],
7898 'reservedPattern' => [ 'type' => 'string|null', 'default' => '~$1' ],
7899 'serialProvider' => [ 'type' => 'object', 'default' => [ 'type' => 'local', 'useYear' => true ] ],
7900 'serialMapping' => [ 'type' => 'object', 'default' => [ 'type' => 'readable-numeric' ] ],
7901 'expireAfterDays' => [ 'type' => 'int|null', 'default' => 90 ],
7902 'notifyBeforeExpirationDays' => [ 'type' => 'int|null', 'default' => 10 ],
7903 ],
7904 'type' => 'object',
7905 ];
7906
7907 // endregion -- end user accounts
7908
7909 /***************************************************************************/
7910 // region User rights, access control and monitoring
7914 public const AutoblockExemptions = [
7915 'default' => [],
7916 'type' => 'array',
7917 ];
7918
7922 public const AutoblockExpiry = [
7923 'default' => 86400,
7924 ];
7925
7933 public const BlockAllowsUTEdit = [
7934 'default' => true,
7935 ];
7936
7951 public const BlockCIDRLimit = [
7952 'default' => [
7953 'IPv4' => 16,
7954 'IPv6' => 19,
7955 ],
7956 'type' => 'map',
7957 ];
7958
7964 public const BlockDisablesLogin = [
7965 'default' => false,
7966 ];
7967
7973 public const EnableMultiBlocks = [
7974 'default' => false,
7975 'type' => 'boolean',
7976 ];
7977
7997 public const WhitelistRead = [
7998 'default' => false,
7999 ];
8000
8028 public const WhitelistReadRegexp = [
8029 'default' => false,
8030 ];
8031
8036 public const EmailConfirmToEdit = [
8037 'default' => false,
8038 ];
8039
8044 public const HideIdentifiableRedirects = [
8045 'default' => true,
8046 ];
8047
8072 public const GroupPermissions = [
8073 'type' => 'map',
8074 'additionalProperties' => [
8075 'type' => 'map',
8076 'additionalProperties' => [ 'type' => 'boolean', ],
8077 ],
8078 'mergeStrategy' => 'array_plus_2d',
8079 'default' => [
8080 '*' => [
8081 'createaccount' => true,
8082 'read' => true,
8083 'edit' => true,
8084 'createpage' => true,
8085 'createtalk' => true,
8086 'viewmyprivateinfo' => true,
8087 'editmyprivateinfo' => true,
8088 'editmyoptions' => true,
8089 ],
8090 'user' => [
8091 'move' => true,
8092 'move-subpages' => true,
8093 'move-rootuserpages' => true,
8094 'move-categorypages' => true,
8095 'movefile' => true,
8096 'read' => true,
8097 'edit' => true,
8098 'createpage' => true,
8099 'createtalk' => true,
8100 'upload' => true,
8101 'reupload' => true,
8102 'reupload-shared' => true,
8103 'minoredit' => true,
8104 'editmyusercss' => true,
8105 'editmyuserjson' => true,
8106 'editmyuserjs' => true,
8107 'editmyuserjsredirect' => true,
8108 'sendemail' => true,
8109 'applychangetags' => true,
8110 'changetags' => true,
8111 'viewmywatchlist' => true,
8112 'editmywatchlist' => true,
8113 'createwithcontentmodel' => true,
8114 ],
8115 'autoconfirmed' => [
8116 'autoconfirmed' => true,
8117 'editsemiprotected' => true,
8118 ],
8119 'bot' => [
8120 'bot' => true,
8121 'autoconfirmed' => true,
8122 'editsemiprotected' => true,
8123 'nominornewtalk' => true,
8124 'autopatrol' => true,
8125 'suppressredirect' => true,
8126 'apihighlimits' => true,
8127 ],
8128 'sysop' => [
8129 'block' => true,
8130 'createaccount' => true,
8131 'createpreviouslyrenamedaccount' => true,
8132 'delete' => true,
8133 'bigdelete' => true,
8134 'deletedhistory' => true,
8135 'deletedtext' => true,
8136 'undelete' => true,
8137 'editcontentmodel' => true,
8138 'editinterface' => true,
8139 'editsitejson' => true,
8140 'edituserjson' => true,
8141 'import' => true,
8142 'importupload' => true,
8143 'move' => true,
8144 'move-subpages' => true,
8145 'move-rootuserpages' => true,
8146 'move-categorypages' => true,
8147 'patrol' => true,
8148 'autopatrol' => true,
8149 'protect' => true,
8150 'editprotected' => true,
8151 'rollback' => true,
8152 'upload' => true,
8153 'reupload' => true,
8154 'reupload-shared' => true,
8155 'unwatchedpages' => true,
8156 'autoconfirmed' => true,
8157 'editsemiprotected' => true,
8158 'ipblock-exempt' => true,
8159 'blockemail' => true,
8160 'markbotedits' => true,
8161 'apihighlimits' => true,
8162 'browsearchive' => true,
8163 'noratelimit' => true,
8164 'movefile' => true,
8165 'unblockself' => true,
8166 'suppressredirect' => true,
8167 'mergehistory' => true,
8168 'managechangetags' => true,
8169 'deletechangetags' => true,
8170 ],
8171 'interface-admin' => [
8172 'editinterface' => true,
8173 'editsitecss' => true,
8174 'editsitejson' => true,
8175 'editsitejs' => true,
8176 'editusercss' => true,
8177 'edituserjson' => true,
8178 'edituserjs' => true,
8179 ],
8180 'bureaucrat' => [
8181 'userrights' => true,
8182 'noratelimit' => true,
8183 'renameuser' => true,
8184 ],
8185 'suppress' => [
8186 'hideuser' => true,
8187 'suppressrevision' => true,
8188 'viewsuppressed' => true,
8189 'suppressionlog' => true,
8190 'deleterevision' => true,
8191 'deletelogentry' => true,
8192 ],
8193 ],
8194 ];
8195
8203 public const PrivilegedGroups = [
8204 'default' => [
8205 'bureaucrat',
8206 'interface-admin',
8207 'suppress',
8208 'sysop',
8209 ],
8210 'type' => 'list',
8211 ];
8212
8222 public const RevokePermissions = [
8223 'default' => [],
8224 'type' => 'map',
8225 'mergeStrategy' => 'array_plus_2d',
8226 ];
8227
8247 public const GroupInheritsPermissions = [
8248 'default' => [],
8249 'type' => 'map',
8250 'additionalProperties' => [ 'type' => 'string', ],
8251 ];
8252
8256 public const ImplicitGroups = [
8257 'default' => [ '*', 'user', 'autoconfirmed' ],
8258 'type' => 'list',
8259 ];
8260
8285 public const GroupsAddToSelf = [
8286 'default' => [],
8287 'type' => 'map',
8288 ];
8289
8293 public const GroupsRemoveFromSelf = [
8294 'default' => [],
8295 'type' => 'map',
8296 ];
8297
8319 public const RestrictedGroups = [
8320 'default' => [],
8321 'type' => 'map',
8322 ];
8323
8336 public const UserRequirementsPrivateConditions = [
8337 'default' => [],
8338 'type' => 'list',
8339 ];
8340
8349 public const RestrictionTypes = [
8350 'default' => [ 'create', 'edit', 'move', 'upload' ],
8351 'type' => 'list',
8352 ];
8353
8365 public const RestrictionLevels = [
8366 'default' => [ '', 'autoconfirmed', 'sysop' ],
8367 'type' => 'list',
8368 ];
8369
8379 public const CascadingRestrictionLevels = [
8380 'default' => [ 'sysop', ],
8381 'type' => 'list',
8382 ];
8383
8396 public const SemiprotectedRestrictionLevels = [
8397 'default' => [ 'autoconfirmed', ],
8398 'type' => 'list',
8399 ];
8400
8408 public const NamespaceProtection = [
8409 'default' => [],
8410 'type' => 'map',
8411 ];
8412
8422 public const NonincludableNamespaces = [
8423 'default' => [],
8424 'type' => 'map',
8425 ];
8426
8450 public const AutoConfirmAge = [
8451 'default' => 0,
8452 ];
8453
8465 public const AutoConfirmCount = [
8466 'default' => 0,
8467 ];
8468
8526 public const Autopromote = [
8527 'default' => [
8528 'autoconfirmed' => [ '&',
8529 [ APCOND_EDITCOUNT, null ], // NOTE: null means $wgAutoConfirmCount
8530 [ APCOND_AGE, null ], // NOTE: null means AutoConfirmAge
8531 ],
8532 ],
8533 'type' => 'map',
8534 ];
8535
8555 public const AutopromoteOnce = [
8556 'default' => [ 'onEdit' => [], ],
8557 'type' => 'map',
8558 ];
8559
8565 public const AutopromoteOnceLogInRC = [
8566 'default' => true,
8567 ];
8568
8576 public const AutopromoteOnceRCExcludedGroups = [
8577 'default' => [],
8578 'type' => 'array',
8579 ];
8580
8610 public const AddGroups = [
8611 'default' => [],
8612 'type' => 'map',
8613 'mergeStrategy' => 'array_merge_recursive',
8614 ];
8615
8619 public const RemoveGroups = [
8620 'default' => [],
8621 'type' => 'map',
8622 'mergeStrategy' => 'array_merge_recursive',
8623 ];
8624
8635 public const AvailableRights = [
8636 'default' => [],
8637 'type' => 'list',
8638 'items' => [ 'type' => 'string', ],
8639 ];
8640
8654 public const ImplicitRights = [
8655 'default' => [],
8656 'type' => 'list',
8657 'items' => [ 'type' => 'string', ]
8658 ];
8659
8664 public const DeleteRevisionsLimit = [
8665 'default' => 0,
8666 ];
8667
8673 public const DeleteRevisionsBatchSize = [
8674 'default' => 1000,
8675 ];
8676
8686 public const HideUserContribLimit = [
8687 'default' => 1000,
8688 ];
8689
8716 public const AccountCreationThrottle = [
8717 'default' => [ [
8718 'count' => 0,
8719 'seconds' => 86400,
8720 ] ],
8721 'type' => 'int|list',
8722 ];
8723
8749 public const TempAccountCreationThrottle = [
8750 'default' => [
8751 [
8752 'count' => 1,
8753 'seconds' => 600,
8754 ],
8755 [
8756 'count' => 6,
8757 'seconds' => 86400,
8758 ]
8759 ],
8760 'type' => 'list',
8761 ];
8762
8798 public const TempAccountNameAcquisitionThrottle = [
8799 'default' => [ [
8800 'count' => 60,
8801 'seconds' => 86400,
8802 ] ],
8803 'type' => 'list',
8804 ];
8805
8816 public const SpamRegex = [
8817 'default' => [],
8818 'type' => 'list',
8819 ];
8820
8824 public const SummarySpamRegex = [
8825 'default' => [],
8826 'type' => 'list',
8827 ];
8828
8835 public const EnableDnsBlacklist = [
8836 'default' => false,
8837 ];
8838
8863 public const DnsBlacklistUrls = [
8864 'default' => [],
8865 'type' => 'list',
8866 ];
8867
8876 public const ProxyList = [
8877 'default' => [],
8878 'type' => 'string|list',
8879 ];
8880
8885 public const ProxyWhitelist = [
8886 'default' => [],
8887 'type' => 'list',
8888 ];
8889
8897 public const SoftBlockRanges = [
8898 'default' => [],
8899 'type' => 'list',
8900 'items' => [ 'type' => 'string', ],
8901 ];
8902
8908 public const ApplyIpBlocksToXff = [
8909 'default' => false,
8910 ];
8911
8954 public const RateLimits = [
8955 'default' => [
8956 // Page edits
8957 'edit' => [
8958 'ip' => [ 8, 60 ],
8959 'newbie' => [ 8, 60 ],
8960 'user' => [ 90, 60 ],
8961 ],
8962 // Page moves
8963 'move' => [
8964 'newbie' => [ 2, 120 ],
8965 'user' => [ 8, 60 ],
8966 ],
8967 // File uploads
8968 'upload' => [
8969 'ip' => [ 8, 60 ],
8970 'newbie' => [ 8, 60 ],
8971 ],
8972 // Page rollbacks
8973 'rollback' => [
8974 'user' => [ 10, 60 ],
8975 'newbie' => [ 5, 120 ]
8976 ],
8977 // Triggering password resets emails
8978 'mailpassword' => [
8979 'ip' => [ 5, 3600 ],
8980 ],
8981 // Emailing other users using MediaWiki
8982 'sendemail' => [
8983 'ip' => [ 5, 86400 ],
8984 'newbie' => [ 5, 86400 ],
8985 'user' => [ 20, 86400 ],
8986 ],
8987 'changeemail' => [
8988 'ip-all' => [ 10, 3600 ],
8989 'user' => [ 4, 86400 ]
8990 ],
8991 // since 1.33 - rate limit email confirmations
8992 'confirmemail' => [
8993 'ip-all' => [ 10, 3600 ],
8994 'user' => [ 4, 86400 ]
8995 ],
8996 // Purging pages
8997 'purge' => [
8998 'ip' => [ 30, 60 ],
8999 'user' => [ 30, 60 ],
9000 ],
9001 // Purges of link tables
9002 'linkpurge' => [
9003 'ip' => [ 30, 60 ],
9004 'user' => [ 30, 60 ],
9005 ],
9006 // Files rendered via thumb.php or thumb_handler.php
9007 'renderfile' => [
9008 'ip' => [ 700, 30 ],
9009 'user' => [ 700, 30 ],
9010 ],
9011 // Same as above but for non-standard thumbnails
9012 'renderfile-nonstandard' => [
9013 'ip' => [ 70, 30 ],
9014 'user' => [ 70, 30 ],
9015 ],
9016 // Stashing edits into cache before save
9017 'stashedit' => [
9018 'ip' => [ 30, 60 ],
9019 'newbie' => [ 30, 60 ],
9020 ],
9021 // Stash base HTML for VE edits
9022 'stashbasehtml' => [
9023 'ip' => [ 5, 60 ],
9024 'newbie' => [ 5, 60 ],
9025 ],
9026 // Adding or removing change tags
9027 'changetags' => [
9028 'ip' => [ 8, 60 ],
9029 'newbie' => [ 8, 60 ],
9030 ],
9031 // Changing the content model of a page
9032 'editcontentmodel' => [
9033 'newbie' => [ 2, 120 ],
9034 'user' => [ 8, 60 ],
9035 ],
9036 ],
9037 'type' => 'map',
9038 'mergeStrategy' => 'array_plus_2d',
9039 ];
9040
9046 public const RateLimitsExcludedIPs = [
9047 'default' => [],
9048 'type' => 'list',
9049 ];
9050
9056 public const PutIPinRC = [
9057 'default' => true,
9058 ];
9059
9064 public const QueryPageDefaultLimit = [
9065 'default' => 50,
9066 ];
9067
9099 public const ExternalQuerySources = [
9100 'default' => [],
9101 'type' => 'map',
9102 'additionalProperties' => [
9103 'type' => 'object',
9104 'properties' => [
9105 'enabled' => [
9106 'type' => 'boolean',
9107 'default' => false,
9108 ],
9109 'url' => [
9110 'type' => 'string',
9111 'format' => 'uri',
9112 ],
9113 'timeout' => [
9114 'type' => 'integer',
9115 'default' => 10,
9116 ],
9117 ],
9118 'required' => [ 'enabled', 'url' ],
9119 'additionalProperties' => false,
9120 ],
9121 ];
9122
9135 public const PasswordAttemptThrottle = [
9136 'default' => [
9137 // Short term limit
9138 [ 'count' => 5, 'seconds' => 300 ],
9139 // Long term limit. We need to balance the risk
9140 // of somebody using this as a DoS attack to lock someone
9141 // out of their account, and someone doing a brute force attack.
9142 [ 'count' => 150, 'seconds' => 60 * 60 * 48 ],
9143 ],
9144 'type' => 'list',
9145 ];
9146
9157 public const GrantPermissions = [
9158 'default' => [
9159 'basic' => [
9160 'autocreateaccount' => true,
9161 'autoconfirmed' => true,
9162 'autopatrol' => true,
9163 'editsemiprotected' => true,
9164 'ipblock-exempt' => true,
9165 'nominornewtalk' => true,
9166 'patrolmarks' => true,
9167 'read' => true,
9168 'unwatchedpages' => true,
9169 ],
9170 'highvolume' => [
9171 'bot' => true,
9172 'apihighlimits' => true,
9173 'noratelimit' => true,
9174 'markbotedits' => true,
9175 ],
9176 'import' => [
9177 'import' => true,
9178 'importupload' => true,
9179 ],
9180 'editpage' => [
9181 'edit' => true,
9182 'minoredit' => true,
9183 'applychangetags' => true,
9184 'changetags' => true,
9185 'editcontentmodel' => true,
9186 'createwithcontentmodel' => true,
9187 'pagelang' => true,
9188 ],
9189 'editprotected' => [
9190 'edit' => true,
9191 'minoredit' => true,
9192 'applychangetags' => true,
9193 'changetags' => true,
9194 'editcontentmodel' => true,
9195 'createwithcontentmodel' => true,
9196 'editprotected' => true,
9197 ],
9198 'editmycssjs' => [
9199 'edit' => true,
9200 'minoredit' => true,
9201 'applychangetags' => true,
9202 'changetags' => true,
9203 'editcontentmodel' => true,
9204 'createwithcontentmodel' => true,
9205 'editmyusercss' => true,
9206 'editmyuserjson' => true,
9207 'editmyuserjs' => true,
9208 ],
9209 'editmyoptions' => [
9210 'editmyoptions' => true,
9211 'editmyuserjson' => true,
9212 ],
9213 'editinterface' => [
9214 'edit' => true,
9215 'minoredit' => true,
9216 'applychangetags' => true,
9217 'changetags' => true,
9218 'editcontentmodel' => true,
9219 'createwithcontentmodel' => true,
9220 'editinterface' => true,
9221 'edituserjson' => true,
9222 'editsitejson' => true,
9223 ],
9224 'editsiteconfig' => [
9225 'edit' => true,
9226 'minoredit' => true,
9227 'applychangetags' => true,
9228 'changetags' => true,
9229 'editcontentmodel' => true,
9230 'createwithcontentmodel' => true,
9231 'editinterface' => true,
9232 'edituserjson' => true,
9233 'editsitejson' => true,
9234 'editusercss' => true,
9235 'edituserjs' => true,
9236 'editsitecss' => true,
9237 'editsitejs' => true,
9238 ],
9239 'createeditmovepage' => [
9240 'edit' => true,
9241 'minoredit' => true,
9242 'applychangetags' => true,
9243 'changetags' => true,
9244 'editcontentmodel' => true,
9245 'createwithcontentmodel' => true,
9246 'createpage' => true,
9247 'createtalk' => true,
9248 'delete-redirect' => true,
9249 'move' => true,
9250 'move-rootuserpages' => true,
9251 'move-subpages' => true,
9252 'move-categorypages' => true,
9253 'suppressredirect' => true,
9254 ],
9255 'uploadfile' => [
9256 'upload' => true,
9257 'reupload-own' => true,
9258 ],
9259 'uploadeditmovefile' => [
9260 'upload' => true,
9261 'reupload-own' => true,
9262 'reupload' => true,
9263 'reupload-shared' => true,
9264 'upload_by_url' => true,
9265 'movefile' => true,
9266 'suppressredirect' => true,
9267 ],
9268 'patrol' => [
9269 'patrol' => true,
9270 ],
9271 'rollback' => [
9272 'rollback' => true,
9273 ],
9274 'blockusers' => [
9275 'block' => true,
9276 'blockemail' => true,
9277 ],
9278 'viewdeleted' => [
9279 'browsearchive' => true,
9280 'deletedhistory' => true,
9281 'deletedtext' => true,
9282 ],
9283 'viewrestrictedlogs' => [
9284 'suppressionlog' => true,
9285 ],
9286 'delete' => [
9287 'edit' => true,
9288 'minoredit' => true,
9289 'applychangetags' => true,
9290 'changetags' => true,
9291 'editcontentmodel' => true,
9292 'createwithcontentmodel' => true,
9293 'browsearchive' => true,
9294 'deletedhistory' => true,
9295 'deletedtext' => true,
9296 'delete' => true,
9297 'bigdelete' => true,
9298 'deletelogentry' => true,
9299 'deleterevision' => true,
9300 'undelete' => true,
9301 ],
9302 'oversight' => [
9303 'suppressrevision' => true,
9304 'viewsuppressed' => true,
9305 ],
9306 'protect' => [
9307 'edit' => true,
9308 'minoredit' => true,
9309 'applychangetags' => true,
9310 'changetags' => true,
9311 'editcontentmodel' => true,
9312 'createwithcontentmodel' => true,
9313 'editprotected' => true,
9314 'protect' => true,
9315 ],
9316 'viewmywatchlist' => [
9317 'viewmywatchlist' => true,
9318 ],
9319 'editmywatchlist' => [
9320 'editmywatchlist' => true,
9321 ],
9322 'sendemail' => [
9323 'sendemail' => true,
9324 ],
9325 'createaccount' => [
9326 'createaccount' => true,
9327 ],
9328 'privateinfo' => [
9329 'viewmyprivateinfo' => true,
9330 ],
9331 'mergehistory' => [
9332 'mergehistory' => true,
9333 ],
9334 ],
9335 'type' => 'map',
9336 'mergeStrategy' => 'array_plus_2d',
9337 'additionalProperties' => [
9338 'type' => 'map',
9339 'additionalProperties' => [ 'type' => 'boolean', ],
9340 ],
9341 ];
9342
9353 public const GrantPermissionGroups = [
9354 'default' =>
9355 [
9356 // Hidden grants are implicitly present
9357 'basic' => 'hidden',
9358
9359 'editpage' => 'page-interaction',
9360 'createeditmovepage' => 'page-interaction',
9361 'editprotected' => 'page-interaction',
9362 'patrol' => 'page-interaction',
9363
9364 'uploadfile' => 'file-interaction',
9365 'uploadeditmovefile' => 'file-interaction',
9366
9367 'sendemail' => 'email',
9368
9369 'viewmywatchlist' => 'watchlist-interaction',
9370 'editviewmywatchlist' => 'watchlist-interaction',
9371
9372 'editmycssjs' => 'customization',
9373 'editmyoptions' => 'customization',
9374
9375 'editinterface' => 'administration',
9376 'editsiteconfig' => 'administration',
9377 'rollback' => 'administration',
9378 'blockusers' => 'administration',
9379 'delete' => 'administration',
9380 'viewdeleted' => 'administration',
9381 'viewrestrictedlogs' => 'administration',
9382 'protect' => 'administration',
9383 'oversight' => 'administration',
9384 'createaccount' => 'administration',
9385 'mergehistory' => 'administration',
9386 'import' => 'administration',
9387
9388 'highvolume' => 'high-volume',
9389
9390 'privateinfo' => 'private-information',
9391 ],
9392 'type' => 'map',
9393 'additionalProperties' => [ 'type' => 'string', ],
9394 ];
9395
9406 public const GrantRiskGroups = [
9407 'default' => [
9408 'basic' => GrantsInfo::RISK_LOW,
9409 'editpage' => GrantsInfo::RISK_LOW,
9410 'createeditmovepage' => GrantsInfo::RISK_LOW,
9411 'editprotected' => GrantsInfo::RISK_VANDALISM,
9412 'patrol' => GrantsInfo::RISK_LOW,
9413 'uploadfile' => GrantsInfo::RISK_LOW,
9414 'uploadeditmovefile' => GrantsInfo::RISK_LOW,
9415 'sendemail' => GrantsInfo::RISK_SECURITY,
9416 'viewmywatchlist' => GrantsInfo::RISK_LOW,
9417 'editviewmywatchlist' => GrantsInfo::RISK_LOW,
9418 'editmycssjs' => GrantsInfo::RISK_SECURITY,
9419 'editmyoptions' => GrantsInfo::RISK_SECURITY,
9420 'editinterface' => GrantsInfo::RISK_VANDALISM,
9421 'editsiteconfig' => GrantsInfo::RISK_SECURITY,
9422 'rollback' => GrantsInfo::RISK_LOW,
9423 'blockusers' => GrantsInfo::RISK_VANDALISM,
9424 'delete' => GrantsInfo::RISK_VANDALISM,
9425 'viewdeleted' => GrantsInfo::RISK_VANDALISM,
9426 'viewrestrictedlogs' => GrantsInfo::RISK_SECURITY,
9427 'protect' => GrantsInfo::RISK_VANDALISM,
9428 'oversight' => GrantsInfo::RISK_SECURITY,
9429 'createaccount' => GrantsInfo::RISK_LOW,
9430 'mergehistory' => GrantsInfo::RISK_VANDALISM,
9431 'import' => GrantsInfo::RISK_SECURITY,
9432 'highvolume' => GrantsInfo::RISK_LOW,
9433 'privateinfo' => GrantsInfo::RISK_LOW,
9434 ],
9435 'type' => 'map',
9436 ];
9437
9441 public const EnableBotPasswords = [
9442 'default' => true,
9443 'type' => 'boolean',
9444 ];
9445
9452 public const BotPasswordsCluster = [
9453 'default' => false,
9454 'type' => 'string|false',
9455 ];
9456
9466 public const BotPasswordsDatabase = [
9467 'default' => false,
9468 'type' => 'string|false',
9469 ];
9470
9476 public const BotPasswordsLimit = [
9477 'default' => 100,
9478 'type' => 'int',
9479 ];
9480
9481 // endregion -- end of user rights settings
9482
9483 /***************************************************************************/
9484 // region Security
9490 public const SecretKey = [
9491 'default' => false,
9492 ];
9493
9500 public const JwtPrivateKey = [
9501 'default' => false,
9502 ];
9503
9510 public const JwtPublicKey = [
9511 'default' => false,
9512 ];
9513
9519 public const AllowUserJs = [
9520 'default' => false,
9521 ];
9522
9528 public const AllowUserCss = [
9529 'default' => false,
9530 ];
9531
9538 public const AllowUserCssPrefs = [
9539 'default' => true,
9540 ];
9541
9545 public const UseSiteJs = [
9546 'default' => true,
9547 ];
9548
9552 public const UseSiteCss = [
9553 'default' => true,
9554 ];
9555
9560 public const BreakFrames = [
9561 'default' => false,
9562 ];
9563
9583 public const EditPageFrameOptions = [
9584 'default' => 'DENY',
9585 ];
9586
9598 public const ApiFrameOptions = [
9599 'default' => 'DENY',
9600 ];
9601
9611 public const CSPHeader = [
9612 'default' => false,
9613 'type' => 'false|object',
9614 ];
9615
9621 public const CSPReportOnlyHeader = [
9622 'default' => false,
9623 'type' => 'false|object',
9624 ];
9625
9631 public const CSPUseReportURIDirective = [
9632 'default' => false,
9633 'type' => 'false|object',
9634 ];
9635
9645 public const CSPFalsePositiveUrls = [
9646 'default' => [
9647 'https://3hub.co' => true,
9648 'https://morepro.info' => true,
9649 'https://p.ato.mx' => true,
9650 'https://s.ato.mx' => true,
9651 'https://adserver.adtech.de' => true,
9652 'https://ums.adtechus.com' => true,
9653 'https://cas.criteo.com' => true,
9654 'https://cat.nl.eu.criteo.com' => true,
9655 'https://atpixel.alephd.com' => true,
9656 'https://rtb.metrigo.com' => true,
9657 'https://d5p.de17a.com' => true,
9658 'https://ad.lkqd.net/vpaid/vpaid.js' => true,
9659 'https://ad.lkqd.net/vpaid/vpaid.js?fusion=1.0' => true,
9660 'https://t.lkqd.net/t' => true,
9661 'chrome-extension' => true,
9662 ],
9663 'type' => 'map',
9664 ];
9665
9673 public const AllowCrossOrigin = [
9674 'default' => false,
9675 'type' => 'boolean',
9676 ];
9677
9691 public const RestAllowCrossOriginCookieAuth = [
9692 'default' => false,
9693 'type' => 'boolean',
9694 ];
9695
9704 public const SessionSecret = [
9705 'default' => false,
9706 ];
9707
9708 // endregion -- end of security
9709
9710 /***************************************************************************/
9711 // region Cookie settings
9717 public const CookieExpiration = [
9718 'default' => 30 * 86400,
9719 ];
9720
9728 public const ExtendedLoginCookieExpiration = [
9729 'default' => 180 * 86400,
9730 ];
9731
9739 public const SessionCookieJwtExpiration = [
9740 'default' => 4 * 3600,
9741 ];
9742
9747 public const CookieDomain = [
9748 'default' => '',
9749 ];
9750
9755 public const CookiePath = [
9756 'default' => '/',
9757 ];
9758
9769 public const CookieSecure = [
9770 'default' => 'detect',
9771 'dynamicDefault' => [ 'use' => [ 'ForceHTTPS' ] ]
9772 ];
9773
9774 public static function getDefaultCookieSecure( bool $forceHTTPS ): bool {
9775 return $forceHTTPS || ( WebRequest::detectProtocol() === 'https' );
9776 }
9777
9783 public const CookiePrefix = [
9784 'default' => false,
9785 'dynamicDefault' => [
9786 'use' => [ 'SharedDB', 'SharedPrefix', 'SharedTables', 'DBname', 'DBprefix' ]
9787 ],
9788 ];
9789
9790 public static function getDefaultCookiePrefix(
9791 ?string $sharedDB, ?string $sharedPrefix, array $sharedTables, string $dbName, string $dbPrefix
9792 ): string {
9793 if ( $sharedDB && in_array( 'user', $sharedTables ) ) {
9794 return $sharedDB . ( $sharedPrefix ? "_$sharedPrefix" : '' );
9795 }
9796 return $dbName . ( $dbPrefix ? "_$dbPrefix" : '' );
9797 }
9798
9804 public const CookieHttpOnly = [
9805 'default' => true,
9806 ];
9807
9817 public const CookieSameSite = [
9818 'default' => null,
9819 'type' => '?string',
9820 ];
9821
9825 public const CacheVaryCookies = [
9826 'default' => [],
9827 'type' => 'list',
9828 ];
9829
9833 public const SessionName = [
9834 'default' => false,
9835 ];
9836
9844 public const CookieSetOnAutoblock = [
9845 'default' => true,
9846 ];
9847
9855 public const CookieSetOnIpBlock = [
9856 'default' => true,
9857 ];
9858
9859 // endregion -- end of cookie settings
9860
9861 /***************************************************************************/
9862 // region Profiling, testing and debugging
9864 // See $wgProfiler for how to enable profiling.
9865
9877 public const DebugLogFile = [
9878 'default' => '',
9879 ];
9880
9884 public const DebugLogPrefix = [
9885 'default' => '',
9886 ];
9887
9893 public const DebugRedirects = [
9894 'default' => false,
9895 ];
9896
9911 public const DebugRawPage = [
9912 'default' => false,
9913 ];
9914
9923 public const DebugComments = [
9924 'default' => false,
9925 ];
9926
9934 public const DebugDumpSql = [
9935 'default' => false,
9936 ];
9937
9943 public const TrxProfilerLimits = [
9944 'default' => [
9945 // HTTP GET/HEAD requests.
9946 // Primary queries should not happen on GET requests
9947 'GET' => [
9948 'masterConns' => 0,
9949 'writes' => 0,
9950 'readQueryTime' => 5,
9951 'readQueryRows' => 10000
9952 ],
9953 // HTTP POST requests.
9954 // Primary reads and writes will happen for a subset of these.
9955 'POST' => [
9956 'readQueryTime' => 5,
9957 'writeQueryTime' => 1,
9958 'readQueryRows' => 100_000,
9959 'maxAffected' => 1000
9960 ],
9961 'POST-nonwrite' => [
9962 'writes' => 0,
9963 'readQueryTime' => 5,
9964 'readQueryRows' => 10000
9965 ],
9966 // Deferred updates that run after HTTP response is sent for GET requests
9967 'PostSend-GET' => [
9968 'readQueryTime' => 5,
9969 'writeQueryTime' => 1,
9970 'readQueryRows' => 10000,
9971 'maxAffected' => 1000,
9972 // Log primary queries under the post-send entry point as they are discouraged
9973 'masterConns' => 0,
9974 'writes' => 0,
9975 ],
9976 // Deferred updates that run after HTTP response is sent for POST requests
9977 'PostSend-POST' => [
9978 'readQueryTime' => 5,
9979 'writeQueryTime' => 1,
9980 'readQueryRows' => 100_000,
9981 'maxAffected' => 1000
9982 ],
9983 // Background job runner
9984 'JobRunner' => [
9985 'readQueryTime' => 30,
9986 'writeQueryTime' => 5,
9987 'readQueryRows' => 100_000,
9988 'maxAffected' => 500 // ballpark of $wgUpdateRowsPerQuery
9989 ],
9990 // Command-line scripts
9991 'Maintenance' => [
9992 'writeQueryTime' => 5,
9993 'maxAffected' => 1000
9994 ]
9995 ],
9996 'type' => 'map',
9997 ];
9998
10031 public const DebugLogGroups = [
10032 'default' => [],
10033 'type' => 'map',
10034 ];
10035
10057 public const MWLoggerDefaultSpi = [
10058 'default' => [ 'class' => 'MediaWiki\\Logger\\LegacySpi', ],
10059 'mergeStrategy' => 'replace',
10060 'type' => 'map',
10061 ];
10062
10068 public const ShowDebug = [
10069 'default' => false,
10070 ];
10071
10075 public const SpecialVersionShowHooks = [
10076 'default' => false,
10077 ];
10078
10086 public const ShowExceptionDetails = [
10087 'default' => false,
10088 ];
10089
10093 public const LogExceptionBacktrace = [
10094 'default' => true,
10095 ];
10096
10101 public const PropagateErrors = [
10102 'default' => true,
10103 ];
10104
10108 public const ShowHostnames = [
10109 'default' => false,
10110 ];
10111
10119 public const OverrideHostname = [
10120 'default' => false,
10121 ];
10122
10127 public const DevelopmentWarnings = [
10128 'default' => false,
10129 ];
10130
10136 public const DeprecationReleaseLimit = [
10137 'default' => false,
10138 ];
10139
10205 public const Profiler = [
10206 'default' => [],
10207 'type' => 'map',
10208 'mergeStrategy' => 'replace',
10209 ];
10210
10221 public const StatsdServer = [
10222 'default' => false,
10223 ];
10224
10232 public const StatsdMetricPrefix = [
10233 'default' => 'MediaWiki',
10234 ];
10235
10244 public const StatsTarget = [
10245 'default' => null,
10246 'type' => '?string',
10247 ];
10248
10258 public const StatsFormat = [
10259 'default' => null,
10260 'type' => '?string',
10261 ];
10262
10272 public const StatsPrefix = [
10273 'default' => 'mediawiki',
10274 'type' => 'string',
10275 ];
10276
10296 public const OpenTelemetryConfig = [
10297 'default' => null,
10298 'type' => 'map|null'
10299 ];
10300
10307 public const PageInfoTransclusionLimit = [
10308 'default' => 50,
10309 ];
10310
10314 public const EnableJavaScriptTest = [
10315 'default' => false,
10316 ];
10317
10323 public const CachePrefix = [
10324 'default' => false,
10325 ];
10326
10335 public const DebugToolbar = [
10336 'default' => false,
10337 ];
10338
10347 public const ApiClientErrorSampleRate = [
10348 'default' => 1.0,
10349 ];
10350
10351 // endregion -- end of profiling, testing and debugging
10352
10353 /***************************************************************************/
10354 // region Search
10360 public const DisableTextSearch = [
10361 'default' => false,
10362 ];
10363
10368 public const AdvancedSearchHighlighting = [
10369 'default' => false,
10370 ];
10371
10376 public const SearchHighlightBoundaries = [
10377 'default' => '[\\p{Z}\\p{P}\\p{C}]',
10378 ];
10379
10388 public const OpenSearchTemplates = [
10389 'default' => [
10390 'application/x-suggestions+json' => false,
10391 'application/x-suggestions+xml' => false,
10392 ],
10393 'type' => 'map',
10394 ];
10395
10402 public const EnableOpenSearchSuggest = [
10403 'default' => true,
10404 'obsolete' => 'Since 1.35, no longer used',
10405 'description' => 'Has been emitting warnings since 1.39 (LTS). ' .
10406 'Can be removed completely in 1.44, assuming 1.43 is an LTS release.'
10407 ];
10408
10413 public const OpenSearchDefaultLimit = [
10414 'default' => 10,
10415 ];
10416
10421 public const OpenSearchDescriptionLength = [
10422 'default' => 100,
10423 ];
10424
10428 public const SearchSuggestCacheExpiry = [
10429 'default' => 1200,
10430 ];
10431
10436 public const DisableSearchUpdate = [
10437 'default' => false,
10438 ];
10439
10450 public const NamespacesToBeSearchedDefault = [
10451 'default' => [ NS_MAIN => true, ],
10452 'type' => 'map',
10453 ];
10454
10459 public const DisableInternalSearch = [
10460 'default' => false,
10461 ];
10462
10480 public const SearchForwardUrl = [
10481 'default' => null,
10482 ];
10483
10490 public const SitemapNamespaces = [
10491 'default' => false,
10492 'type' => 'false|list',
10493 ];
10494
10498 public const SitemapNamespacesPriorities = [
10499 'deprecated' => 'since 1.45 and ignored',
10500 'default' => false,
10501 'type' => 'false|map',
10502 ];
10503
10537 public const SitemapApiConfig = [
10538 'default' => [],
10539 'type' => 'object',
10540 'additionalProperties' => [
10541 'enabled' => [ 'type' => 'bool' ],
10542 'sitemapsPerIndex' => [ 'type' => 'int' ],
10543 'pagesPerSitemap' => [ 'type' => 'int' ],
10544 'expiry' => [ 'type' => 'int' ],
10545 ]
10546 ];
10547
10558 public const SpecialSearchFormOptions = [
10559 'default' => [],
10560 'type' => 'map',
10561 ];
10562
10571 public const SearchMatchRedirectPreference = [
10572 'default' => false,
10573 'type' => 'boolean',
10574 ];
10575
10582 public const SearchRunSuggestedQuery = [
10583 'default' => true,
10584 'type' => 'boolean',
10585 ];
10586
10587 // endregion -- end of search settings
10588
10589 /***************************************************************************/
10590 // region Edit user interface
10597 public const Diff3 = [
10598 'default' => '/usr/bin/diff3',
10599 ];
10600
10604 public const Diff = [
10605 'default' => '/usr/bin/diff',
10606 ];
10607
10613 public const PreviewOnOpenNamespaces = [
10614 'default' => [
10615 NS_CATEGORY => true
10616 ],
10617 'type' => 'map',
10618 ];
10619
10625 public const UniversalEditButton = [
10626 'default' => true,
10627 ];
10628
10634 public const UseAutomaticEditSummaries = [
10635 'default' => true,
10636 ];
10637
10638 // endregion -- end edit UI
10639
10640 /***************************************************************************/
10641 // region Maintenance
10643 // See also $wgSiteNotice
10644
10648 public const CommandLineDarkBg = [
10649 'default' => false,
10650 ];
10651
10660 public const ReadOnly = [
10661 'default' => null,
10662 ];
10663
10669 public const ReadOnlyWatchedItemStore = [
10670 'default' => false,
10671 'type' => 'boolean',
10672 ];
10673
10682 public const ReadOnlyFile = [
10683 'default' => false,
10684 'dynamicDefault' => [ 'use' => [ 'UploadDirectory' ] ]
10685 ];
10686
10691 public static function getDefaultReadOnlyFile( $uploadDirectory ): string {
10692 return "$uploadDirectory/lock_yBgMBwiR";
10693 }
10694
10704 public const UpgradeKey = [
10705 'default' => false,
10706 ];
10707
10711 public const GitBin = [
10712 'default' => '/usr/bin/git',
10713 ];
10714
10728 public const GitRepositoryViewers = [
10729 'default' => [
10730 'https://(?:[a-z0-9_]+@)?gerrit.wikimedia.org/r/(?:p/)?(.*)' => 'https://gerrit.wikimedia.org/g/%R/+/%H',
10731 'ssh://(?:[a-z0-9_]+@)?gerrit.wikimedia.org:29418/(.*)' => 'https://gerrit.wikimedia.org/g/%R/+/%H',
10732 ],
10733 'type' => 'map',
10734 ];
10735
10753 public const InstallerInitialPages = [
10754 'default' => [
10755 [
10756 'titlemsg' => 'mainpage',
10757 'text' => "{{subst:int:mainpagetext}}\n\n{{subst:int:mainpagedocfooter}}",
10758 ]
10759 ],
10760 'type' => 'list'
10761 ];
10762
10763 // endregion -- End of maintenance
10764
10765 /***************************************************************************/
10766 // region Recent changes, new pages, watchlist and history
10775 public const RCMaxAge = [
10776 'default' => 90 * 24 * 3600,
10777 ];
10778
10786 public const WatchersMaxAge = [
10787 'default' => 180 * 24 * 3600,
10788 ];
10789
10798 public const UnwatchedPageSecret = [
10799 'default' => 1,
10800 ];
10801
10809 public const RCFilterByAge = [
10810 'default' => false,
10811 ];
10812
10817 public const RCLinkLimits = [
10818 'default' => [ 50, 100, 250, 500 ],
10819 'type' => 'list',
10820 ];
10821
10828 public const RCLinkDays = [
10829 'default' => [ 1, 3, 7, 14, 30 ],
10830 'type' => 'list',
10831 ];
10832
10894 public const RCFeeds = [
10895 'default' => [],
10896 'type' => 'map',
10897 ];
10898
10911 public const RCWatchCategoryMembership = [
10912 'default' => false,
10913 ];
10914
10923 public const UseRCPatrol = [
10924 'default' => true,
10925 ];
10926
10933 public const StructuredChangeFiltersLiveUpdatePollingRate = [
10934 'default' => 3,
10935 ];
10936
10944 public const UseNPPatrol = [
10945 'default' => true,
10946 ];
10947
10956 public const UseFilePatrol = [
10957 'default' => true,
10958 ];
10959
10963 public const Feed = [
10964 'default' => true,
10965 ];
10966
10971 public const FeedLimit = [
10972 'default' => 50,
10973 ];
10974
10984 public const FeedCacheTimeout = [
10985 'default' => 60,
10986 ];
10987
10992 public const FeedDiffCutoff = [
10993 'default' => 32768,
10994 ];
10995
11011 public const OverrideSiteFeed = [
11012 'default' => [],
11013 'type' => 'map',
11014 ];
11015
11022 public const FeedClasses = [
11023 'default' => [
11024 'rss' => \MediaWiki\Feed\RSSFeed::class,
11025 'atom' => \MediaWiki\Feed\AtomFeed::class,
11026 ],
11027 'type' => 'map',
11028 ];
11029
11034 public const AdvertisedFeedTypes = [
11035 'default' => [ 'atom', ],
11036 'type' => 'list',
11037 ];
11038
11042 public const RCShowWatchingUsers = [
11043 'default' => false,
11044 ];
11045
11049 public const RCShowChangedSize = [
11050 'default' => true,
11051 ];
11052
11058 public const RCChangedSizeThreshold = [
11059 'default' => 500,
11060 ];
11061
11066 public const ShowUpdatedMarker = [
11067 'default' => true,
11068 ];
11069
11074 public const DisableAnonTalk = [
11075 'default' => false,
11076 ];
11077
11082 public const UseTagFilter = [
11083 'default' => true,
11084 ];
11085
11105 public const SoftwareTags = [
11106 'default' => [
11107 'mw-contentmodelchange' => true,
11108 'mw-new-redirect' => true,
11109 'mw-removed-redirect' => true,
11110 'mw-changed-redirect-target' => true,
11111 'mw-blank' => true,
11112 'mw-replace' => true,
11113 'mw-recreated' => true,
11114 'mw-rollback' => true,
11115 'mw-undo' => true,
11116 'mw-manual-revert' => true,
11117 'mw-reverted' => true,
11118 'mw-server-side-upload' => true,
11119 'mw-ipblock-appeal' => true,
11120 'mw-edited-other-users-js' => true,
11121 ],
11122 'type' => 'map',
11123 'additionalProperties' => [ 'type' => 'boolean', ],
11124 ];
11125
11133 public const UnwatchedPageThreshold = [
11134 'default' => false,
11135 ];
11136
11162 public const RecentChangesFlags = [
11163 'default' => [
11164 'newpage' => [
11165 'letter' => 'newpageletter',
11166 'title' => 'recentchanges-label-newpage',
11167 'legend' => 'recentchanges-legend-newpage',
11168 'grouping' => 'any',
11169 ],
11170 'minor' => [
11171 'letter' => 'minoreditletter',
11172 'title' => 'recentchanges-label-minor',
11173 'legend' => 'recentchanges-legend-minor',
11174 'class' => 'minoredit',
11175 'grouping' => 'all',
11176 ],
11177 'bot' => [
11178 'letter' => 'boteditletter',
11179 'title' => 'recentchanges-label-bot',
11180 'legend' => 'recentchanges-legend-bot',
11181 'class' => 'botedit',
11182 'grouping' => 'all',
11183 ],
11184 'unpatrolled' => [
11185 'letter' => 'unpatrolledletter',
11186 'title' => 'recentchanges-label-unpatrolled',
11187 'legend' => 'recentchanges-legend-unpatrolled',
11188 'grouping' => 'any',
11189 ],
11190 ],
11191 'type' => 'map',
11192 ];
11193
11199 public const WatchlistExpiry = [
11200 'default' => false,
11201 'type' => 'boolean',
11202 ];
11203
11209 public const EnableWatchstarPopover = [
11210 'default' => false,
11211 'type' => 'boolean',
11212 ];
11213
11219 public const EnableWatchlistLabels = [
11220 'default' => false,
11221 'type' => 'boolean',
11222 ];
11223
11229 public const WatchlistLabelsMaxPerUser = [
11230 'default' => 100,
11231 'type' => 'integer',
11232 ];
11233
11244 public const WatchlistPurgeRate = [
11245 'default' => 0.1,
11246 'type' => 'float',
11247 ];
11248
11263 public const WatchlistExpiryMaxDuration = [
11264 'default' => '1 year',
11265 'type' => '?string',
11266 ];
11267
11274 public const EnableChangesListQueryPartitioning = [
11275 'default' => false,
11276 'type' => 'bool',
11277 ];
11278
11279 // endregion -- end RC/watchlist
11280
11281 /***************************************************************************/
11282 // region Copyright and credits settings
11292 public const RightsPage = [
11293 'default' => null,
11294 ];
11295
11302 public const RightsUrl = [
11303 'default' => null,
11304 ];
11305
11314 public const RightsText = [
11315 'default' => null,
11316 ];
11317
11321 public const RightsIcon = [
11322 'default' => null,
11323 ];
11324
11328 public const UseCopyrightUpload = [
11329 'default' => false,
11330 ];
11331
11339 public const MaxCredits = [
11340 'default' => 0,
11341 ];
11342
11348 public const ShowCreditsIfMax = [
11349 'default' => true,
11350 ];
11351
11352 // endregion -- end of copyright and credits settings
11353
11354 /***************************************************************************/
11355 // region Import / Export
11381 public const ImportSources = [
11382 'default' => [],
11383 'type' => 'map',
11384 ];
11385
11394 public const ImportTargetNamespace = [
11395 'default' => null,
11396 ];
11397
11404 public const ExportAllowHistory = [
11405 'default' => true,
11406 ];
11407
11413 public const ExportMaxHistory = [
11414 'default' => 0,
11415 ];
11416
11420 public const ExportAllowListContributors = [
11421 'default' => false,
11422 ];
11423
11435 public const ExportMaxLinkDepth = [
11436 'default' => 0,
11437 ];
11438
11442 public const ExportFromNamespaces = [
11443 'default' => false,
11444 ];
11445
11449 public const ExportAllowAll = [
11450 'default' => false,
11451 ];
11452
11459 public const ExportPagelistLimit = [
11460 'default' => 5000,
11461 ];
11462
11467 public const XmlDumpSchemaVersion = [
11468 'default' => XML_DUMP_SCHEMA_VERSION_11,
11469 ];
11470
11471 // endregion -- end of import/export
11472
11473 /***************************************************************************/
11474 // region Wiki Farm
11486 public const WikiFarmSettingsDirectory = [
11487 'default' => null
11488 ];
11489
11497 public const WikiFarmSettingsExtension = [
11498 'default' => 'yaml'
11499 ];
11500
11501 // endregion -- End Wiki Farm
11502
11503 /***************************************************************************/
11504 // region Extensions
11511 public const ExtensionFunctions = [
11512 'default' => [],
11513 'type' => 'list',
11514 ];
11515
11546 public const ExtensionMessagesFiles = [
11547 'default' => [],
11548 'type' => 'map',
11549 ];
11550
11579 public const MessagesDirs = [
11580 'default' => [],
11581 'type' => 'map',
11582 ];
11583
11610 public const TranslationAliasesDirs = [
11611 'default' => [],
11612 'type' => 'map',
11613 ];
11614
11621 public const ExtensionEntryPointListFiles = [
11622 'default' => [],
11623 'type' => 'map',
11624 ];
11625
11629 public const EnableParserLimitReporting = [
11630 'default' => true,
11631 ];
11632
11658 public const ValidSkinNames = [
11659 'default' => [],
11660 'type' => 'map',
11661 ];
11662
11668 public const SpecialPages = [
11669 'default' => [],
11670 'type' => 'map',
11671 ];
11672
11683 public const AutoloadAttemptLowercase = [
11684 'default' => false,
11685 'obsolete' => 'Since 1.40; no longer has any effect.',
11686 'description' => 'Has been emitting warnings since 1.39 (LTS). ' .
11687 'Can be removed completely in 1.44, assuming 1.43 is an LTS release.'
11688 ];
11689
11748 public const ExtensionCredits = [
11749 'default' => [],
11750 'type' => 'map',
11751 ];
11752
11782 public const Hooks = [
11783 'default' => [],
11784 'type' => 'map',
11785 'mergeStrategy' => 'array_merge_recursive',
11786 ];
11787
11802 public const ServiceWiringFiles = [
11803 'default' => [],
11804 'type' => 'list',
11805 ];
11806
11825 public const JobClasses = [
11826 'default' => [
11827 'deletePage' => DeletePageJob::class,
11828 'refreshLinks' => RefreshLinksJob::class,
11829 'deleteLinks' => DeleteLinksJob::class,
11830 'htmlCacheUpdate' => HTMLCacheUpdateJob::class,
11831 'sendMail' => [
11832 'class' => EmaillingJob::class,
11833 'services' => [
11834 0 => 'Emailer'
11835 ]
11836 ],
11837 'enotifNotify' => [
11838 'class' => RecentChangeNotifyJob::class,
11839 'services' => [
11840 'RecentChangeLookup',
11841 ],
11842 ],
11843 'fixDoubleRedirect' => [
11844 'class' => DoubleRedirectJob::class,
11845 'services' => [
11846 'RevisionLookup',
11847 'MagicWordFactory',
11848 'WikiPageFactory',
11849 ],
11850 // This job requires a title
11851 'needsPage' => true,
11852 ],
11853 'AssembleUploadChunks' => AssembleUploadChunksJob::class,
11854 'PublishStashedFile' => PublishStashedFileJob::class,
11855 'ThumbnailRender' => ThumbnailRenderJob::class,
11856 'UploadFromUrl' => UploadFromUrlJob::class,
11857 'recentChangesUpdate' => RecentChangesUpdateJob::class,
11858 'refreshLinksPrioritized' => RefreshLinksJob::class,
11859 'refreshLinksDynamic' => RefreshLinksJob::class,
11860 'activityUpdateJob' => ActivityUpdateJob::class,
11861 'categoryMembershipChange' => [
11862 'class' => CategoryMembershipChangeJob::class,
11863 'services' => [
11864 'RecentChangeFactory',
11865 ],
11866 ],
11867 'CategoryCountUpdateJob' => [
11868 'class' => CategoryCountUpdateJob::class,
11869 'services' => [
11870 'ConnectionProvider',
11871 'NamespaceInfo',
11872 ],
11873 ],
11874 'clearUserWatchlist' => ClearUserWatchlistJob::class,
11875 'watchlistExpiry' => WatchlistExpiryJob::class,
11876 'cdnPurge' => CdnPurgeJob::class,
11877 'userGroupExpiry' => UserGroupExpiryJob::class,
11878 'clearWatchlistNotifications' => ClearWatchlistNotificationsJob::class,
11879 'userOptionsUpdate' => UserOptionsUpdateJob::class,
11880 'revertedTagUpdate' => RevertedTagUpdateJob::class,
11881 'null' => NullJob::class,
11882 'userEditCountInit' => UserEditCountInitJob::class,
11883 'parsoidCachePrewarm' => [
11884 'class' => ParsoidCachePrewarmJob::class,
11885 'services' => [
11886 'ParserOutputAccess',
11887 'PageStore',
11888 'RevisionLookup',
11889 'ParsoidSiteConfig',
11890 ],
11891 // tell the JobFactory not to include the $page parameter in the constructor call
11892 'needsPage' => false
11893 ],
11894 'renameUserTable' => [
11895 'class' => RenameUserTableJob::class,
11896 'services' => [
11897 'MainConfig',
11898 'DBLoadBalancerFactory'
11899 ]
11900 ],
11901 'renameUserDerived' => [
11902 'class' => RenameUserDerivedJob::class,
11903 'services' => [
11904 'RenameUserFactory',
11905 'UserFactory'
11906 ]
11907 ],
11908 // 'renameUser' is a alias for backward compatibility
11909 // it should be removed in the future releases
11910 'renameUser' => [
11911 'class' => RenameUserTableJob::class,
11912 'services' => [
11913 'MainConfig',
11914 'DBLoadBalancerFactory'
11915 ]
11916 ],
11917 ],
11918 'type' => 'map',
11919 ];
11920
11932 public const JobTypesExcludedFromDefaultQueue = [
11933 'default' => [ 'AssembleUploadChunks', 'PublishStashedFile', 'UploadFromUrl' ],
11934 'type' => 'list',
11935 ];
11936
11946 public const JobBackoffThrottling = [
11947 'default' => [],
11948 'type' => 'map',
11949 'additionalProperties' => [ 'type' => 'float', ],
11950 ];
11951
11959 public const JobTypeConf = [
11960 'default' => [
11961 'default' => [
11962 'class' => JobQueueDB::class,
11963 'order' => 'random',
11964 'claimTTL' => 3600
11965 ],
11966 ],
11967 'additionalProperties' => [
11968 'type' => 'object',
11969 'properties' => [
11970 'class' => [ 'type' => 'string' ],
11971 'order' => [ 'type' => 'string' ],
11972 'claimTTL' => [ 'type' => 'int' ]
11973 ],
11974 ],
11975 'type' => 'map',
11976 ];
11977
11990 public const JobQueueIncludeInMaxLagFactor = [
11991 'default' => false,
11992 ];
11993
11999 public const SpecialPageCacheUpdates = [
12000 'default' => [
12001 'Statistics' => [ SiteStatsUpdate::class, 'cacheUpdate' ]
12002 ],
12003 'type' => 'map',
12004 ];
12005
12014 public const PagePropLinkInvalidations = [
12015 'default' => [ 'hiddencat' => 'categorylinks', ],
12016 'type' => 'map',
12017 ];
12018
12019 // endregion -- End extensions
12020
12021 /***************************************************************************/
12022 // region Categories
12029 public const CategoryMagicGallery = [
12030 'default' => true,
12031 ];
12032
12036 public const CategoryPagingLimit = [
12037 'default' => 200,
12038 ];
12039
12066 public const CategoryCollation = [
12067 'default' => 'uppercase',
12068 ];
12069
12081 public const TempCategoryCollations = [
12082 'default' => [],
12083 'type' => 'list',
12084 ];
12085
12094 public const SortedCategories = [
12095 'default' => false,
12096 'type' => 'boolean',
12097 ];
12098
12113 public const TrackingCategories = [
12114 'default' => [],
12115 'type' => 'list',
12116 'deprecated' => 'since 1.25 Extensions should now register tracking categories using ' .
12117 'the new extension registration system.',
12118 ];
12119
12120 // endregion -- End categories
12121
12122 /***************************************************************************/
12123 // region Logging
12135 public const LogTypes = [
12136 'default' => [
12137 '',
12138 'block',
12139 'protect',
12140 'rights',
12141 'delete',
12142 'upload',
12143 'move',
12144 'import',
12145 'interwiki',
12146 'patrol',
12147 'merge',
12148 'suppress',
12149 'tag',
12150 'managetags',
12151 'contentmodel',
12152 'renameuser',
12153 ],
12154 'type' => 'list',
12155 ];
12156
12164 public const LogRestrictions = [
12165 'default' => [ 'suppress' => 'suppressionlog', ],
12166 'type' => 'map',
12167 ];
12168
12187 public const FilterLogTypes = [
12188 'default' => [
12189 'patrol' => true,
12190 'tag' => true,
12191 'newusers' => false,
12192 ],
12193 'type' => 'map',
12194 ];
12195
12205 public const LogNames = [
12206 'default' => [
12207 '' => 'all-logs-page',
12208 'block' => 'blocklogpage',
12209 'protect' => 'protectlogpage',
12210 'rights' => 'rightslog',
12211 'delete' => 'dellogpage',
12212 'upload' => 'uploadlogpage',
12213 'move' => 'movelogpage',
12214 'import' => 'importlogpage',
12215 'patrol' => 'patrol-log-page',
12216 'merge' => 'mergelog',
12217 'suppress' => 'suppressionlog',
12218 ],
12219 'type' => 'map',
12220 ];
12221
12231 public const LogHeaders = [
12232 'default' => [
12233 '' => 'alllogstext',
12234 'block' => 'blocklogtext',
12235 'delete' => 'dellogpagetext',
12236 'import' => 'importlogpagetext',
12237 'merge' => 'mergelogpagetext',
12238 'move' => 'movelogpagetext',
12239 'patrol' => 'patrol-log-header',
12240 'protect' => 'protectlogtext',
12241 'rights' => 'rightslogtext',
12242 'suppress' => 'suppressionlogtext',
12243 'upload' => 'uploadlogpagetext',
12244 ],
12245 'type' => 'map',
12246 ];
12247
12255 public const LogActions = [
12256 'default' => [],
12257 'type' => 'map',
12258 ];
12259
12269 public const LogActionsHandlers = [
12270 'default' => [
12271 'block/block' => [
12272 'class' => BlockLogFormatter::class,
12273 'services' => [
12274 'TitleParser',
12275 'NamespaceInfo',
12276 ]
12277 ],
12278 'block/reblock' => [
12279 'class' => BlockLogFormatter::class,
12280 'services' => [
12281 'TitleParser',
12282 'NamespaceInfo',
12283 ]
12284 ],
12285 'block/unblock' => [
12286 'class' => BlockLogFormatter::class,
12287 'services' => [
12288 'TitleParser',
12289 'NamespaceInfo',
12290 ]
12291 ],
12292 'contentmodel/change' => ContentModelLogFormatter::class,
12293 'contentmodel/new' => ContentModelLogFormatter::class,
12294 'delete/delete' => DeleteLogFormatter::class,
12295 'delete/delete_redir' => DeleteLogFormatter::class,
12296 'delete/delete_redir2' => DeleteLogFormatter::class,
12297 'delete/event' => DeleteLogFormatter::class,
12298 'delete/restore' => DeleteLogFormatter::class,
12299 'delete/revision' => DeleteLogFormatter::class,
12300 'import/interwiki' => ImportLogFormatter::class,
12301 'import/upload' => ImportLogFormatter::class,
12302 'interwiki/iw_add' => InterwikiLogFormatter::class,
12303 'interwiki/iw_delete' => InterwikiLogFormatter::class,
12304 'interwiki/iw_edit' => InterwikiLogFormatter::class,
12305 'managetags/activate' => LogFormatter::class,
12306 'managetags/create' => LogFormatter::class,
12307 'managetags/deactivate' => LogFormatter::class,
12308 'managetags/delete' => LogFormatter::class,
12309 'merge/merge' => [
12310 'class' => MergeLogFormatter::class,
12311 'services' => [
12312 'TitleParser',
12313 ]
12314 ],
12315 'merge/merge-into' => [
12316 'class' => MergeLogFormatter::class,
12317 'services' => [
12318 'TitleParser',
12319 ]
12320 ],
12321 'move/move' => [
12322 'class' => MoveLogFormatter::class,
12323 'services' => [
12324 'TitleParser',
12325 ]
12326 ],
12327 'move/move_redir' => [
12328 'class' => MoveLogFormatter::class,
12329 'services' => [
12330 'TitleParser',
12331 ]
12332 ],
12333 'patrol/patrol' => PatrolLogFormatter::class,
12334 'patrol/autopatrol' => PatrolLogFormatter::class,
12335 'protect/modify' => [
12336 'class' => ProtectLogFormatter::class,
12337 'services' => [
12338 'TitleParser',
12339 ]
12340 ],
12341 'protect/move_prot' => [
12342 'class' => ProtectLogFormatter::class,
12343 'services' => [
12344 'TitleParser',
12345 ]
12346 ],
12347 'protect/protect' => [
12348 'class' => ProtectLogFormatter::class,
12349 'services' => [
12350 'TitleParser',
12351 ]
12352 ],
12353 'protect/unprotect' => [
12354 'class' => ProtectLogFormatter::class,
12355 'services' => [
12356 'TitleParser',
12357 ]
12358 ],
12359 'renameuser/renameuser' => [
12360 'class' => RenameuserLogFormatter::class,
12361 'services' => [
12362 'TitleParser',
12363 ]
12364 ],
12365 'rights/autopromote' => RightsLogFormatter::class,
12366 'rights/rights' => RightsLogFormatter::class,
12367 'suppress/block' => [
12368 'class' => BlockLogFormatter::class,
12369 'services' => [
12370 'TitleParser',
12371 'NamespaceInfo',
12372 ]
12373 ],
12374 'suppress/delete' => DeleteLogFormatter::class,
12375 'suppress/event' => DeleteLogFormatter::class,
12376 'suppress/reblock' => [
12377 'class' => BlockLogFormatter::class,
12378 'services' => [
12379 'TitleParser',
12380 'NamespaceInfo',
12381 ]
12382 ],
12383 'suppress/revision' => DeleteLogFormatter::class,
12384 'tag/update' => TagLogFormatter::class,
12385 'upload/overwrite' => UploadLogFormatter::class,
12386 'upload/revert' => UploadLogFormatter::class,
12387 'upload/upload' => UploadLogFormatter::class,
12388 ],
12389 'type' => 'map',
12390 ];
12391
12401 public const ActionFilteredLogs = [
12402 'default' => [
12403 'block' => [
12404 'block' => [ 'block' ],
12405 'reblock' => [ 'reblock' ],
12406 'unblock' => [ 'unblock' ],
12407 ],
12408 'contentmodel' => [
12409 'change' => [ 'change' ],
12410 'new' => [ 'new' ],
12411 ],
12412 'delete' => [
12413 'delete' => [ 'delete' ],
12414 'delete_redir' => [ 'delete_redir', 'delete_redir2' ],
12415 'restore' => [ 'restore' ],
12416 'event' => [ 'event' ],
12417 'revision' => [ 'revision' ],
12418 ],
12419 'import' => [
12420 'interwiki' => [ 'interwiki' ],
12421 'upload' => [ 'upload' ],
12422 ],
12423 'managetags' => [
12424 'create' => [ 'create' ],
12425 'delete' => [ 'delete' ],
12426 'activate' => [ 'activate' ],
12427 'deactivate' => [ 'deactivate' ],
12428 ],
12429 'move' => [
12430 'move' => [ 'move' ],
12431 'move_redir' => [ 'move_redir' ],
12432 ],
12433 'newusers' => [
12434 'create' => [ 'create', 'newusers' ],
12435 'create2' => [ 'create2' ],
12436 'autocreate' => [ 'autocreate' ],
12437 'byemail' => [ 'byemail' ],
12438 ],
12439 'protect' => [
12440 'protect' => [ 'protect' ],
12441 'modify' => [ 'modify' ],
12442 'unprotect' => [ 'unprotect' ],
12443 'move_prot' => [ 'move_prot' ],
12444 ],
12445 'rights' => [
12446 'rights' => [ 'rights' ],
12447 'autopromote' => [ 'autopromote' ],
12448 ],
12449 'suppress' => [
12450 'event' => [ 'event' ],
12451 'revision' => [ 'revision' ],
12452 'delete' => [ 'delete' ],
12453 'block' => [ 'block' ],
12454 'reblock' => [ 'reblock' ],
12455 ],
12456 'upload' => [
12457 'upload' => [ 'upload' ],
12458 'overwrite' => [ 'overwrite' ],
12459 'revert' => [ 'revert' ],
12460 ],
12461 ],
12462 'type' => 'map',
12463 ];
12464
12468 public const NewUserLog = [
12469 'default' => true,
12470 ];
12471
12477 public const PageCreationLog = [
12478 'default' => true,
12479 ];
12480
12481 // endregion -- end logging
12482
12483 /***************************************************************************/
12484 // region Special pages (general and miscellaneous)
12490 public const AllowSpecialInclusion = [
12491 'default' => true,
12492 ];
12493
12500 public const DisableQueryPageUpdate = [
12501 'default' => false,
12502 ];
12503
12508 public const CountCategorizedImagesAsUsed = [
12509 'default' => false,
12510 ];
12511
12516 public const MaxRedirectLinksRetrieved = [
12517 'default' => 500,
12518 ];
12519
12526 public const RangeContributionsCIDRLimit = [
12527 'default' => [
12528 'IPv4' => 16,
12529 'IPv6' => 32,
12530 ],
12531 'type' => 'map',
12532 'additionalProperties' => [ 'type' => 'integer', ],
12533 ];
12534
12535 // endregion -- end special pages
12536
12537 /***************************************************************************/
12538 // region Actions
12547 public const Actions = [
12548 'default' => [],
12549 'type' => 'map',
12550 ];
12551
12552 // endregion -- end actions
12553
12554 /***************************************************************************/
12555 // region Robot (search engine crawler) policy
12557 // See also $wgNoFollowLinks.
12558
12564 public const DefaultRobotPolicy = [
12565 'default' => 'index,follow',
12566 ];
12567
12583 public const NamespaceRobotPolicies = [
12584 'default' => [],
12585 'type' => 'map',
12586 ];
12587
12617 public const ArticleRobotPolicies = [
12618 'default' => [],
12619 'type' => 'map',
12620 ];
12621
12633 public const ExemptFromUserRobotsControl = [
12634 'default' => null,
12635 'type' => '?list',
12636 ];
12637
12638 // endregion End robot policy
12639
12640 /***************************************************************************/
12641 // region Action API and REST API
12658 public const DebugAPI = [
12659 'default' => false,
12660 ];
12661
12697 public const APIModules = [
12698 'default' => [],
12699 'type' => 'map',
12700 ];
12701
12710 public const APIFormatModules = [
12711 'default' => [],
12712 'type' => 'map',
12713 ];
12714
12723 public const APIMetaModules = [
12724 'default' => [],
12725 'type' => 'map',
12726 ];
12727
12736 public const APIPropModules = [
12737 'default' => [],
12738 'type' => 'map',
12739 ];
12740
12749 public const APIListModules = [
12750 'default' => [],
12751 'type' => 'map',
12752 ];
12753
12758 public const APIMaxDBRows = [
12759 'default' => 5000,
12760 ];
12761
12767 public const APIMaxResultSize = [
12768 'default' => 8_388_608,
12769 ];
12770
12775 public const APIMaxUncachedDiffs = [
12776 'default' => 1,
12777 ];
12778
12785 public const APIMaxLagThreshold = [
12786 'default' => 7,
12787 ];
12788
12792 public const APICacheHelpTimeout = [
12793 'default' => 60 * 60,
12794 ];
12795
12800 public const APIUselessQueryPages = [
12801 'default' => [
12802 'MIMEsearch',
12803 'LinkSearch',
12804 ],
12805 'type' => 'list',
12806 ];
12807
12811 public const AjaxLicensePreview = [
12812 'default' => true,
12813 ];
12814
12837 public const CrossSiteAJAXdomains = [
12838 'default' => [],
12839 'type' => 'map',
12840 ];
12841
12847 public const CrossSiteAJAXdomainExceptions = [
12848 'default' => [],
12849 'type' => 'map',
12850 ];
12851
12855 public const AllowedCorsHeaders = [
12856 'default' => [
12857 /* simple headers (see spec) */
12858 'Accept',
12859 'Accept-Language',
12860 'Content-Language',
12861 'Content-Type',
12862 /* non-authorable headers in XHR, which are however requested by some UAs */
12863 'Accept-Encoding',
12864 'DNT',
12865 'Origin',
12866 /* MediaWiki whitelist */
12867 'User-Agent',
12868 'Api-User-Agent',
12869 'Promise-Non-Write-API-Action',
12870 /* Allowing caching preflight requests, see T269636 */
12871 'Access-Control-Max-Age',
12872 /* OAuth 2.0, see T322944 */
12873 'Authorization',
12874 ],
12875 'type' => 'list',
12876 ];
12877
12883 public const RestAPIAdditionalRouteFiles = [
12884 'default' => [],
12885 'type' => 'list',
12886 ];
12887
12906 public const RestSandboxSpecs = [
12907 'default' => [],
12908 'type' => 'map',
12909 'additionalProperties' => [
12910 'type' => 'object',
12911 'properties' => [
12912 'url' => [ 'type' => 'string', 'format' => 'url' ],
12913 'name' => [ 'type' => 'string' ],
12914 'file' => [ 'type' => 'string' ],
12915 'msg' => [ 'type' => 'string', 'description' => 'a message key' ]
12916 ],
12917 ]
12918 ];
12919
12920 // endregion -- End AJAX and API
12921
12922 /***************************************************************************/
12923 // region Shell and process control
12929 public const MaxShellMemory = [
12930 'default' => 307_200,
12931 ];
12932
12937 public const MaxShellFileSize = [
12938 'default' => 102_400,
12939 ];
12940
12944 public const MaxShellTime = [
12945 'default' => 180,
12946 ];
12947
12952 public const MaxShellWallClockTime = [
12953 'default' => 180,
12954 ];
12955
12979 public const ShellCgroup = [
12980 'default' => false,
12981 ];
12982
12986 public const PhpCli = [
12987 'default' => '/usr/bin/php',
12988 ];
12989
13002 public const ShellRestrictionMethod = [
13003 'default' => 'autodetect',
13004 'type' => 'string|false',
13005 ];
13006
13020 public const ShellboxUrls = [
13021 'default' => [ 'default' => null, ],
13022 'type' => 'map',
13023 'additionalProperties' => [
13024 'type' => 'string|false|null',
13025 ],
13026 ];
13027
13034 public const ShellboxSecretKey = [
13035 'default' => null,
13036 'type' => '?string',
13037 ];
13038
13048 public const ShellboxShell = [
13049 'default' => '/bin/sh',
13050 'type' => '?string',
13051 ];
13052
13053 // endregion -- end Shell and process control
13054
13055 /***************************************************************************/
13056 // region HTTP client
13064 public const HTTPTimeout = [
13065 'default' => 25,
13066 'type' => 'float',
13067 ];
13068
13076 public const HTTPConnectTimeout = [
13077 'default' => 5.0,
13078 'type' => 'float',
13079 ];
13080
13088 public const HTTPMaxTimeout = [
13089 'default' => 0,
13090 'type' => 'float',
13091 ];
13092
13100 public const HTTPMaxConnectTimeout = [
13101 'default' => 0,
13102 'type' => 'float',
13103 ];
13104
13110 public const HTTPImportTimeout = [
13111 'default' => 25,
13112 ];
13113
13117 public const AsyncHTTPTimeout = [
13118 'default' => 25,
13119 ];
13120
13124 public const HTTPProxy = [
13125 'default' => '',
13126 ];
13127
13134 public const LocalVirtualHosts = [
13135 'default' => [],
13136 'type' => 'map',
13137 ];
13138
13146 public const LocalHTTPProxy = [
13147 'default' => false,
13148 'type' => 'string|false',
13149 ];
13150
13160 public const AllowExternalReqID = [
13161 'default' => false,
13162 ];
13163
13172 public const GenerateReqIDFormat = [
13173 'default' => 'rand24',
13174 'type' => 'string',
13175 ];
13176
13177 // endregion -- End HTTP client
13178
13179 /***************************************************************************/
13180 // region Job queue
13200 public const JobRunRate = [
13201 'default' => 1,
13202 ];
13203
13211 public const RunJobsAsync = [
13212 'default' => false,
13213 ];
13214
13218 public const UpdateRowsPerJob = [
13219 'default' => 300,
13220 ];
13221
13225 public const UpdateRowsPerQuery = [
13226 'default' => 100,
13227 ];
13228
13229 // endregion -- End job queue
13230
13231 /***************************************************************************/
13232 // region Miscellaneous
13240 public const RedirectOnLogin = [
13241 'default' => null,
13242 ];
13243
13280 public const VirtualRestConfig = [
13281 'default' => [
13282 'paths' => [],
13283 'modules' => [],
13284 'global' => [
13285 # Timeout in seconds
13286 'timeout' => 360,
13287 # 'domain' is set to $wgCanonicalServer in Setup.php
13288 'forwardCookies' => false,
13289 'HTTPProxy' => null
13290 ]
13291 ],
13292 'mergeStrategy' => 'array_plus_2d',
13293 'type' => 'map',
13294 ];
13295
13318 public const EventRelayerConfig = [
13319 'default' => [
13320 'default' => [ 'class' => EventRelayerNull::class, ],
13321 ],
13322 'type' => 'map',
13323 ];
13324
13342 public const Pingback = [
13343 'default' => false,
13344 'type' => 'boolean',
13345 ];
13346
13352 public const OriginTrials = [
13353 'default' => [],
13354 'type' => 'list',
13355 ];
13356
13363 public const ReportToExpiry = [
13364 'default' => 86400,
13365 'type' => 'integer',
13366 ];
13367
13374 public const ReportToEndpoints = [
13375 'default' => [],
13376 'type' => 'list',
13377 ];
13378
13387 public const FeaturePolicyReportOnly = [
13388 'default' => [],
13389 'type' => 'list',
13390 ];
13391
13397 public const SkinsPreferred = [
13398 'default' => [ 'vector-2022', 'vector' ],
13399 'type' => 'list',
13400 ];
13401
13407 public const SpecialContributeSkinsEnabled = [
13408 'default' => [],
13409 'type' => 'list',
13410 ];
13411
13416 public const SpecialContributeNewPageTarget = [
13417 'default' => null,
13418 'type' => '?string',
13419 ];
13420
13427 public const EnableEditRecovery = [
13428 'default' => false,
13429 'type' => 'boolean',
13430 ];
13431
13435 public const EditRecoveryExpiry = [
13436 'default' => 30 * 24 * 3600,
13437 'type' => 'integer',
13438 ];
13439
13446 public const UseCodexSpecialBlock = [
13447 'default' => false,
13448 'type' => 'boolean',
13449 ];
13450
13457 public const ShowLogoutConfirmation = [
13458 'default' => false,
13459 'type' => 'boolean',
13460 ];
13461
13467 public const EnableProtectionIndicators = [
13468 'default' => true,
13469 'type' => 'boolean',
13470 ];
13471
13478 public const OutputPipelineStages = [
13479 'default' => [],
13480 'type' => 'map',
13481 ];
13482
13510 public const FeatureShutdown = [
13511 'default' => [],
13512 'type' => 'list',
13513 ];
13514
13521 public const CloneArticleParserOutput = [
13522 'default' => true,
13523 'type' => 'boolean',
13524 ];
13525
13533 public const UseLeximorph = [
13534 'default' => false,
13535 'type' => 'boolean',
13536 ];
13537
13544 public const UsePostprocCacheLegacy = [
13545 'default' => false,
13546 'type' => 'boolean'
13547 ];
13548
13555 public const UsePostprocCacheParsoid = [
13556 'default' => true,
13557 'type' => 'boolean'
13558 ];
13559
13570 public const ParserOptionsLogUnsafeSampleRate = [
13571 'default' => 0,
13572 'type' => 'integer'
13573 ];
13574
13575 // endregion -- End Miscellaneous
13576}
const SCHEMA_COMPAT_OLD
Definition Defines.php:305
const AV_SCAN_FAILED
Definition Defines.php:86
const AV_VIRUS_FOUND
Definition Defines.php:84
const APCOND_AGE
Definition Defines.php:191
const NS_HELP
Definition Defines.php:63
const CONTENT_MODEL_VUE
Definition Defines.php:241
const NS_USER
Definition Defines.php:53
const CONTENT_MODEL_CSS
Definition Defines.php:237
const NS_FILE
Definition Defines.php:57
const CACHE_NONE
Definition Defines.php:73
const CACHE_ANYTHING
Definition Defines.php:72
const NS_MEDIAWIKI_TALK
Definition Defines.php:60
const NS_MAIN
Definition Defines.php:51
const NS_PROJECT_TALK
Definition Defines.php:56
const NS_MEDIAWIKI
Definition Defines.php:59
const NS_TEMPLATE
Definition Defines.php:61
const NS_FILE_TALK
Definition Defines.php:58
const XML_DUMP_SCHEMA_VERSION_11
Definition Defines.php:349
const CONTENT_MODEL_WIKITEXT
Definition Defines.php:235
const CONTENT_MODEL_JSON
Definition Defines.php:239
const NS_HELP_TALK
Definition Defines.php:64
const NS_CATEGORY_TALK
Definition Defines.php:66
const CONTENT_MODEL_TEXT
Definition Defines.php:238
const CACHE_DB
Definition Defines.php:74
const AV_SCAN_ABORTED
Definition Defines.php:85
const APCOND_EDITCOUNT
Definition Defines.php:190
const NS_TALK
Definition Defines.php:52
const AV_NO_VIRUS
Definition Defines.php:83
const NS_USER_TALK
Definition Defines.php:54
const CONTENT_MODEL_UNKNOWN
Definition Defines.php:242
const NS_PROJECT
Definition Defines.php:55
const NS_CATEGORY
Definition Defines.php:65
const CONTENT_MODEL_JAVASCRIPT
Definition Defines.php:236
const NS_TEMPLATE_TALK
Definition Defines.php:62
const MEDIATYPE_VIDEO
Definition defines.php:22
const MEDIATYPE_AUDIO
Definition defines.php:19
const MEDIATYPE_BITMAP
Definition defines.php:15
if(!defined('MW_SETUP_CALLBACK'))
Definition WebStart.php:69
Maintenance script that fixes double redirects.
Check if the user is blocked, and prevent authentication if so.
Handles email notification / email address confirmation for account creation.
A primary authentication provider that uses the password field in the 'user' table.
This is a value object for authentication requests with a username and password.
Reset the local password, if signalled via $this->manager->setAuthenticationSessionData()
This represents the intention to set a temporary password for the user.
A primary authentication provider that uses the temporary password field in the 'user' table.
A pre-authentication provider to throttle authentication actions.
Exceptions for config failures.
Content handler for CSS pages.
Content handler implementation for unknown content.
Content handler for JSON text.
Base content handler implementation for flat text contents.
Content handler for Vue pages.
Content handler for wiki text pages.
Class for handling updates to the site_stats table.
Local repository that stores files in the local filesystem and registers them in the wiki's own datab...
Definition LocalRepo.php:45
Database-backed job queue storage.
Assemble the segments of a chunked upload.
Job to update category membership counts.
Job to purge a set of URLs from CDN.
Fix any double redirects after moving a page.
Job to purge the HTML/file cache for all pages that link to or use another page or file.
No-op job that does nothing.
Definition NullJob.php:40
Upload a file from the upload stash into the local file repo.
Job to update link tables for rerendered wiki pages.
Job for deferring the execution of RevertedTagUpdate.
Job for asynchronous rendering of thumbnails, e.g.
Upload a file by URL, via the jobqueue.
JwtCodec using lcobucci/jwt with an RSA key ($wgJwtPublicKey / $wgJwtPrivateKey).
Caching for the contents of localisation files.
This class formats block log entries.
This class formats delete log entries.
This class formats import log entries.
LogFormatter for interwiki/* logs.
Implements the default log formatting.
This class formats merge log entries.
This class formats move log entries.
This class formats patrol log entries.
This class formats protect log entries.
LogFormatter for renameuser/renameuser logs.
This class formats rights log entries.
This class formats tag log entries.
This class formats upload log entries.
Send an arbitrary single email.
RDBMS-based caching module.
Job to prune link tables for pages that were deleted.
Implements Argon2, a modern key derivation algorithm designed to resist GPU cracking and side-channel...
A Bcrypt-hashed password.
This password hash type layers one or more parameterized password types on top of each other.
The old style of MediaWiki password hashing.
The old style of MediaWiki password hashing, with a salt.
Functions to check passwords against a policy requirement.
Users can authorize applications to use their account via OAuth.
Job to add recent change entries mentioning category membership changes.
Purge expired rows from the recentchanges table.
Custom job to perform user rename on wiki family using shared tables or virtual domains.
Custom job to perform updates on tables in busier environments.
The WebRequest class encapsulates getting at data passed in the URL or via a POSTed form,...
This serves as the entry point to the MediaWiki session handling system.
Class representing a MediaWiki site.
Service for storing and loading Content objects representing revision data blobs.
This is a utility class for dealing with namespaces that encodes all the "magic" behaviors of them ba...
A CentralIdLookup provider that just uses local IDs.
Job that updates a user's preferences.
Job that initializes an user's edit count.
Purge expired user group memberships.
Job for updating user activity like "last viewed" timestamps.
Job to clear a users watchlist in batches.
Job for clearing all of the "last viewed" timestamps for a user's watchlist, or setting them all to t...
No-op class for publishing messages into a PubSub system.
Store data in the local server memory via APCu (php-apcu)
No-op implementation that stores nothing.
Store data in a memory for the current request/process only.
Store data on memcached server(s) via the php-memcached PECL extension.
Store data on memcached servers(s) via a pure-PHP memcached client.
return[ 'config-schema-inverse'=>['default'=>['ConfigRegistry'=>['main'=> 'MediaWiki\\Config\\GlobalVarConfig::newInstance',], 'Sitename'=> 'MediaWiki', 'Server'=> false, 'CanonicalServer'=> false, 'ServerName'=> false, 'AssumeProxiesUseDefaultProtocolPorts'=> true, 'HttpsPort'=> 443, 'ForceHTTPS'=> false, 'ScriptPath'=> '/wiki', 'UsePathInfo'=> null, 'Script'=> false, 'LoadScript'=> false, 'RestPath'=> false, 'StylePath'=> false, 'LocalStylePath'=> false, 'ExtensionAssetsPath'=> false, 'ExtensionDirectory'=> null, 'StyleDirectory'=> null, 'ArticlePath'=> false, 'UploadPath'=> false, 'ImgAuthPath'=> false, 'ThumbPath'=> false, 'UploadDirectory'=> false, 'FileCacheDirectory'=> false, 'Logo'=> false, 'Logos'=> false, 'Favicon'=> '/favicon.ico', 'AppleTouchIcon'=> false, 'ReferrerPolicy'=> false, 'TmpDirectory'=> false, 'UploadBaseUrl'=> '', 'UploadStashScalerBaseUrl'=> false, 'ActionPaths'=>[], 'MainPageIsDomainRoot'=> false, 'EnableUploads'=> false, 'UploadStashMaxAge'=> 21600, 'EnableAsyncUploads'=> false, 'EnableAsyncUploadsByURL'=> false, 'UploadMaintenance'=> false, 'IllegalFileChars'=> ':\\/\\\\', 'DeletedDirectory'=> false, 'ImgAuthDetails'=> false, 'ImgAuthUrlPathMap'=>[], 'LocalFileRepo'=>['class'=> 'MediaWiki\\FileRepo\\LocalRepo', 'name'=> 'local', 'directory'=> null, 'scriptDirUrl'=> null, 'favicon'=> null, 'url'=> null, 'hashLevels'=> null, 'thumbScriptUrl'=> null, 'transformVia404'=> null, 'deletedDir'=> null, 'deletedHashLevels'=> null, 'updateCompatibleMetadata'=> null, 'reserializeMetadata'=> null,], 'ForeignFileRepos'=>[], 'UseInstantCommons'=> false, 'UseSharedUploads'=> false, 'SharedUploadDirectory'=> null, 'SharedUploadPath'=> null, 'HashedSharedUploadDirectory'=> true, 'RepositoryBaseUrl'=> 'https:'FetchCommonsDescriptions'=> false, 'SharedUploadDBname'=> false, 'SharedUploadDBprefix'=> '', 'CacheSharedUploads'=> true, 'ForeignUploadTargets'=>['local',], 'UploadDialog'=>['fields'=>['description'=> true, 'date'=> false, 'categories'=> false,], 'licensemessages'=>['local'=> 'generic-local', 'foreign'=> 'generic-foreign',], 'comment'=>['local'=> '', 'foreign'=> '',], 'format'=>['filepage'=> ' $DESCRIPTION', 'description'=> ' $TEXT', 'ownwork'=> '', 'license'=> '', 'uncategorized'=> '',],], 'FileBackends'=>[], 'LockManagers'=>[], 'ShowEXIF'=> null, 'UpdateCompatibleMetadata'=> false, 'AllowCopyUploads'=> false, 'CopyUploadsDomains'=>[], 'CopyUploadsFromSpecialUpload'=> false, 'CopyUploadProxy'=> false, 'CopyUploadTimeout'=> false, 'CopyUploadAllowOnWikiDomainConfig'=> false, 'MaxUploadSize'=> 104857600, 'MinUploadChunkSize'=> 1024, 'UploadNavigationUrl'=> false, 'UploadMissingFileUrl'=> false, 'ThumbnailScriptPath'=> false, 'SharedThumbnailScriptPath'=> false, 'HashedUploadDirectory'=> true, 'CSPUploadEntryPoint'=> true, 'FileExtensions'=>['png', 'gif', 'jpg', 'jpeg', 'webp',], 'ProhibitedFileExtensions'=>['html', 'htm', 'js', 'jsb', 'mhtml', 'mht', 'xhtml', 'xht', 'php', 'phtml', 'php3', 'php4', 'php5', 'phps', 'phar', 'shtml', 'jhtml', 'pl', 'py', 'cgi', 'exe', 'scr', 'dll', 'msi', 'vbs', 'bat', 'com', 'pif', 'cmd', 'vxd', 'cpl', 'xml',], 'MimeTypeExclusions'=>['text/html', 'application/javascript', 'text/javascript', 'text/x-javascript', 'application/x-shellscript', 'application/x-php', 'text/x-php', 'text/x-python', 'text/x-perl', 'text/x-bash', 'text/x-sh', 'text/x-csh', 'text/scriptlet', 'application/x-msdownload', 'application/x-msmetafile', 'application/java', 'application/xml', 'text/xml',], 'CheckFileExtensions'=> true, 'StrictFileExtensions'=> true, 'DisableUploadScriptChecks'=> false, 'UploadSizeWarning'=> false, 'TrustedMediaFormats'=>['BITMAP', 'AUDIO', 'VIDEO', 'image/svg+xml', 'application/pdf',], 'MediaHandlers'=>[], 'NativeImageLazyLoading'=> false, 'ParserTestMediaHandlers'=>['image/jpeg'=> 'MockBitmapHandler', 'image/png'=> 'MockBitmapHandler', 'image/gif'=> 'MockBitmapHandler', 'image/tiff'=> 'MockBitmapHandler', 'image/webp'=> 'MockBitmapHandler', 'image/x-ms-bmp'=> 'MockBitmapHandler', 'image/x-bmp'=> 'MockBitmapHandler', 'image/x-xcf'=> 'MockBitmapHandler', 'image/svg+xml'=> 'MockSvgHandler', 'image/vnd.djvu'=> 'MockDjVuHandler',], 'UseImageResize'=> true, 'UseImageMagick'=> false, 'ImageMagickConvertCommand'=> '/usr/bin/convert', 'MaxInterlacingAreas'=>[], 'SharpenParameter'=> '0x0.4', 'SharpenReductionThreshold'=> 0.85, 'ImageMagickTempDir'=> false, 'CustomConvertCommand'=> false, 'JpegTran'=> '/usr/bin/jpegtran', 'JpegPixelFormat'=> 'yuv420', 'JpegQuality'=> 80, 'Exiv2Command'=> '/usr/bin/exiv2', 'Exiftool'=> '/usr/bin/exiftool', 'SVGConverters'=>['ImageMagick'=> ' $path/convert -background "#ffffff00" -thumbnail $widthx$height\\! $input PNG:$output', 'inkscape'=> ' $path/inkscape -w $width -o $output $input', 'batik'=> 'java -Djava.awt.headless=true -jar $path/batik-rasterizer.jar -w $width -d $output $input', 'rsvg'=> ' $path/rsvg-convert -w $width -h $height -o $output $input', 'ImagickExt'=>['SvgHandler::rasterizeImagickExt',],], 'SVGConverter'=> 'ImageMagick', 'SVGConverterPath'=> '', 'SVGMaxSize'=> 5120, 'SVGMetadataCutoff'=> 5242880, 'SVGNativeRendering'=> true, 'SVGNativeRenderingSizeLimit'=> 51200, 'MediaInTargetLanguage'=> true, 'MaxImageArea'=> 12500000, 'MaxAnimatedGifArea'=> 12500000, 'TiffThumbnailType'=>[], 'ThumbnailEpoch'=> '20030516000000', 'AttemptFailureEpoch'=> 1, 'IgnoreImageErrors'=> false, 'GenerateThumbnailOnParse'=> true, 'ShowArchiveThumbnails'=> true, 'EnableAutoRotation'=> null, 'Antivirus'=> null, 'AntivirusSetup'=>['clamav'=>['command'=> 'clamscan --no-summary ', 'codemap'=>[0=> 0, 1=> 1, 52=> -1, ' *'=> false,], 'messagepattern'=> '/.*?:(.*)/sim',],], 'AntivirusRequired'=> true, 'VerifyMimeType'=> true, 'MimeTypeFile'=> 'internal', 'MimeInfoFile'=> 'internal', 'MimeDetectorCommand'=> null, 'TrivialMimeDetection'=> false, 'XMLMimeTypes'=>['http:'svg'=> 'image/svg+xml', 'http:'http:'html'=> 'text/html',], 'ImageLimits'=>[[320, 240,], [640, 480,], [800, 600,], [1024, 768,], [1280, 1024,], [2560, 2048,],], 'ThumbLimits'=>[120, 150, 180, 200, 220, 250, 300, 400,], 'ThumbnailNamespaces'=>[6,], 'ThumbnailSteps'=> null, 'ThumbnailBuckets'=> null, 'ThumbnailMinimumBucketDistance'=> 50, 'UploadThumbnailRenderMap'=>[], 'UploadThumbnailRenderMethod'=> 'jobqueue', 'UploadThumbnailRenderHttpCustomHost'=> false, 'UploadThumbnailRenderHttpCustomDomain'=> false, 'UseTinyRGBForJPGThumbnails'=> false, 'GalleryOptions'=>[], 'ThumbUpright'=> 0.75, 'DirectoryMode'=> 511, 'ResponsiveImages'=> true, 'ImagePreconnect'=> false, 'TrackMediaRequestProvenance'=> false, 'DjvuUseBoxedCommand'=> false, 'DjvuDump'=> null, 'DjvuRenderer'=> null, 'DjvuTxt'=> null, 'DjvuPostProcessor'=> 'pnmtojpeg', 'DjvuOutputExtension'=> 'jpg', 'EmergencyContact'=> false, 'PasswordSender'=> false, 'NoReplyAddress'=> false, 'EnableEmail'=> true, 'EnableUserEmail'=> true, 'UserEmailUseReplyTo'=> true, 'PasswordReminderResendTime'=> 24, 'NewPasswordExpiry'=> 604800, 'UserEmailConfirmationTokenExpiry'=> 604800, 'PasswordExpirationDays'=> false, 'PasswordExpireGrace'=> 604800, 'SMTP'=> false, 'AdditionalMailParams'=> null, 'AllowHTMLEmail'=> false, 'EnotifFromEditor'=> false, 'EmailAuthentication'=> true, 'EmailConfirmationBanner'=> false, 'EnotifWatchlist'=> false, 'EnotifUserTalk'=> false, 'EnotifRevealEditorAddress'=> false, 'EnotifMinorEdits'=> true, 'EnotifUseRealName'=> false, 'UsersNotifiedOnAllChanges'=>[], 'DBname'=> 'my_wiki', 'DBmwschema'=> null, 'DBprefix'=> '', 'DBserver'=> 'localhost', 'DBport'=> 5432, 'DBuser'=> 'wikiuser', 'DBpassword'=> '', 'DBtype'=> 'mysql', 'DBssl'=> false, 'DBcompress'=> false, 'DBStrictWarnings'=> false, 'DBadminuser'=> null, 'DBadminpassword'=> null, 'SearchType'=> null, 'SearchTypeAlternatives'=> null, 'DBTableOptions'=> 'ENGINE=InnoDB, DEFAULT CHARSET=binary', 'SQLMode'=> '', 'SQLiteDataDir'=> '', 'SharedDB'=> null, 'SharedPrefix'=> false, 'SharedTables'=>['user', 'user_properties', 'user_autocreate_serial',], 'SharedSchema'=> false, 'DBservers'=> false, 'LBFactoryConf'=>['class'=> 'Wikimedia\\Rdbms\\LBFactorySimple',], 'DataCenterUpdateStickTTL'=> 10, 'DBerrorLog'=> false, 'DBerrorLogTZ'=> false, 'LocalDatabases'=>[], 'DatabaseReplicaLagWarning'=> 10, 'DatabaseReplicaLagCritical'=> 30, 'MaxExecutionTimeForExpensiveQueries'=> 0, 'VirtualDomainsMapping'=>[], 'FileSchemaMigrationStage'=> 3, 'ExternalLinksDomainGaps'=>[], 'ContentHandlers'=>['wikitext'=>['class'=> 'MediaWiki\\Content\\WikitextContentHandler', 'services'=>['TitleFactory', 'ParserFactory', 'GlobalIdGenerator', 'LanguageNameUtils', 'LinkRenderer', 'MagicWordFactory', 'ParsoidParserFactory',],], 'javascript'=>['class'=> 'MediaWiki\\Content\\JavaScriptContentHandler', 'services'=>['MainConfig', 'ParserFactory', 'UserOptionsLookup',],], 'json'=>['class'=> 'MediaWiki\\Content\\JsonContentHandler', 'services'=>['ParsoidParserFactory', 'TitleFactory',],], 'css'=>['class'=> 'MediaWiki\\Content\\CssContentHandler', 'services'=>['MainConfig', 'ParserFactory', 'UserOptionsLookup',],], 'vue'=>['class'=> 'MediaWiki\\Content\\VueContentHandler', 'services'=>['MainConfig', 'ParserFactory',],], 'text'=> 'MediaWiki\\Content\\TextContentHandler', 'unknown'=> 'MediaWiki\\Content\\FallbackContentHandler',], 'NamespaceContentModels'=>[], 'TextModelsToParse'=>['wikitext', 'javascript', 'css',], 'CompressRevisions'=> false, 'ExternalStores'=>[], 'ExternalServers'=>[], 'DefaultExternalStore'=> false, 'RevisionCacheExpiry'=> 604800, 'PageLanguageUseDB'=> false, 'DiffEngine'=> null, 'ExternalDiffEngine'=> false, 'Wikidiff2Options'=>[], 'RequestTimeLimit'=> null, 'TransactionalTimeLimit'=> 120, 'CriticalSectionTimeLimit'=> 180.0, 'MiserMode'=> false, 'DisableQueryPages'=> false, 'QueryCacheLimit'=> 1000, 'WantedPagesThreshold'=> 1, 'AllowSlowParserFunctions'=> false, 'AllowSchemaUpdates'=> true, 'MaxArticleSize'=> 2048, 'MemoryLimit'=> '50M', 'PoolCounterConf'=> null, 'PoolCountClientConf'=>['servers'=>['127.0.0.1',], 'timeout'=> 0.1,], 'MaxUserDBWriteDuration'=> false, 'MaxJobDBWriteDuration'=> false, 'LinkHolderBatchSize'=> 1000, 'MaximumMovedPages'=> 100, 'ForceDeferredUpdatesPreSend'=> false, 'MultiShardSiteStats'=> false, 'CacheDirectory'=> false, 'MainCacheType'=> 0, 'MessageCacheType'=> -1, 'ParserCacheType'=> -1, 'SessionCacheType'=> -1, 'AnonSessionCacheType'=> false, 'LanguageConverterCacheType'=> -1, 'ObjectCaches'=>[0=>['class'=> 'Wikimedia\\ObjectCache\\EmptyBagOStuff', 'reportDupes'=> false,], 1=>['class'=> 'MediaWiki\\ObjectCache\\SqlBagOStuff', 'loggroup'=> 'SQLBagOStuff',], 'memcached-php'=>['class'=> 'Wikimedia\\ObjectCache\\MemcachedPhpBagOStuff', 'loggroup'=> 'memcached',], 'memcached-pecl'=>['class'=> 'Wikimedia\\ObjectCache\\MemcachedPeclBagOStuff', 'loggroup'=> 'memcached',], 'hash'=>['class'=> 'Wikimedia\\ObjectCache\\HashBagOStuff', 'reportDupes'=> false,], 'apc'=>['class'=> 'Wikimedia\\ObjectCache\\APCUBagOStuff', 'reportDupes'=> false,], 'apcu'=>['class'=> 'Wikimedia\\ObjectCache\\APCUBagOStuff', 'reportDupes'=> false,],], 'WANObjectCache'=>[], 'MicroStashType'=> -1, 'MainStash'=> 1, 'ParsoidCacheConfig'=>['StashType'=> null, 'StashDuration'=> 86400, 'WarmParsoidParserCache'=> false,], 'ParsoidSelectiveUpdateSampleRate'=> 0, 'ParserCacheFilterConfig'=>['pcache'=>['default'=>['minCpuTime'=> 0,],], 'postproc-pcache'=>['default'=>['minCpuTime'=> 9223372036854775807,],], 'parsoid-pcache'=>['default'=>['minCpuTime'=> 0,],], 'postproc-parsoid-pcache'=>['default'=>['minCpuTime'=> 0,],],], 'ChronologyProtectorSecret'=> '', 'ParserCacheExpireTime'=> 86400, 'ParserCacheAsyncExpireTime'=> 60, 'ParserCacheAsyncRefreshJobs'=> true, 'OldRevisionParserCacheExpireTime'=> 3600, 'ObjectCacheSessionExpiry'=> 3600, 'PHPSessionHandling'=> 'warn', 'SuspiciousIpExpiry'=> false, 'SessionPbkdf2Iterations'=> 10001, 'UseSessionCookieJwt'=> false, 'JwtSessionCookieIssuer'=> null, 'MemCachedServers'=>['127.0.0.1:11211',], 'MemCachedPersistent'=> false, 'MemCachedTimeout'=> 500000, 'UseLocalMessageCache'=> false, 'AdaptiveMessageCache'=> false, 'LocalisationCacheConf'=>['class'=> 'MediaWiki\\Language\\LocalisationCache', 'store'=> 'detect', 'storeClass'=> false, 'storeDirectory'=> false, 'storeServer'=>[], 'forceRecache'=> false, 'manualRecache'=> false,], 'CachePages'=> true, 'CacheEpoch'=> '20030516000000', 'GitInfoCacheDirectory'=> false, 'UseFileCache'=> false, 'FileCacheDepth'=> 2, 'RenderHashAppend'=> '', 'EnableSidebarCache'=> false, 'SidebarCacheExpiry'=> 86400, 'UseGzip'=> false, 'InvalidateCacheOnLocalSettingsChange'=> true, 'ExtensionInfoMTime'=> false, 'EnableRemoteBagOStuffTests'=> false, 'UseCdn'=> false, 'VaryOnXFP'=> false, 'InternalServer'=> false, 'CdnMaxAge'=> 18000, 'CdnMaxageLagged'=> 30, 'CdnMaxageStale'=> 10, 'CdnReboundPurgeDelay'=> 0, 'CdnMaxageSubstitute'=> 60, 'ForcedRawSMaxage'=> 300, 'CdnServers'=>[], 'CdnServersNoPurge'=>[], 'HTCPRouting'=>[], 'HTCPMulticastTTL'=> 1, 'UsePrivateIPs'=> false, 'CdnMatchParameterOrder'=> true, 'LanguageCode'=> 'en', 'GrammarForms'=>[], 'InterwikiMagic'=> true, 'HideInterlanguageLinks'=> false, 'ExtraInterlanguageLinkPrefixes'=>[], 'InterlanguageLinkCodeMap'=>[], 'ExtraLanguageNames'=>[], 'ExtraLanguageCodes'=>['bh'=> 'bho', 'no'=> 'nb', 'simple'=> 'en',], 'DummyLanguageCodes'=>[], 'AllUnicodeFixes'=> false, 'LegacyEncoding'=> false, 'AmericanDates'=> false, 'TranslateNumerals'=> true, 'UseDatabaseMessages'=> true, 'MaxMsgCacheEntrySize'=> 10000, 'DisableLangConversion'=> false, 'DisableTitleConversion'=> false, 'DefaultLanguageVariant'=> false, 'UsePigLatinVariant'=> false, 'DisabledVariants'=>[], 'VariantArticlePath'=> false, 'UseXssLanguage'=> false, 'LoginLanguageSelector'=> false, 'ForceUIMsgAsContentMsg'=>[], 'RawHtmlMessages'=>[], 'Localtimezone'=> null, 'LocalTZoffset'=> null, 'OverrideUcfirstCharacters'=>[], 'MimeType'=> 'text/html', 'Html5Version'=> null, 'EditSubmitButtonLabelPublish'=> false, 'XhtmlNamespaces'=>[], 'SiteNotice'=> '', 'BrowserFormatDetection'=> 'telephone=no', 'SkinMetaTags'=>[], 'DefaultSkin'=> 'vector-2022', 'FallbackSkin'=> 'fallback', 'SkipSkins'=>[], 'DisableOutputCompression'=> false, 'FragmentMode'=>['html5', 'legacy',], 'ExternalInterwikiFragmentMode'=> 'legacy', 'FooterIcons'=>['copyright'=>['copyright'=>[],], 'poweredby'=>['mediawiki'=>['src'=> null, 'url'=> 'https:'alt'=> 'Powered by MediaWiki', 'lang'=> 'en',],],], 'UseCombinedLoginLink'=> false, 'Edititis'=> false, 'Send404Code'=> true, 'ShowRollbackEditCount'=> 10, 'EnableCanonicalServerLink'=> false, 'InterwikiLogoOverride'=>[], 'ResourceModules'=>[], 'ResourceModuleSkinStyles'=>[], 'ResourceLoaderSources'=>[], 'ResourceBasePath'=> null, 'ResourceLoaderMaxage'=>[], 'ResourceLoaderDebug'=> false, 'ResourceLoaderMaxQueryLength'=> false, 'ResourceLoaderValidateJS'=> true, 'ResourceLoaderEnableJSProfiler'=> false, 'ResourceLoaderStorageEnabled'=> true, 'ResourceLoaderStorageVersion'=> 1, 'ResourceLoaderEnableSourceMapLinks'=> true, 'AllowSiteCSSOnRestrictedPages'=> false, 'VueDevelopmentMode'=> false, 'CodexDevelopmentDir'=> null, 'MetaNamespace'=> false, 'MetaNamespaceTalk'=> false, 'CanonicalNamespaceNames'=>[-2=> 'Media', -1=> 'Special', 0=> '', 1=> 'Talk', 2=> 'User', 3=> 'User_talk', 4=> 'Project', 5=> 'Project_talk', 6=> 'File', 7=> 'File_talk', 8=> 'MediaWiki', 9=> 'MediaWiki_talk', 10=> 'Template', 11=> 'Template_talk', 12=> 'Help', 13=> 'Help_talk', 14=> 'Category', 15=> 'Category_talk',], 'ExtraNamespaces'=>[], 'ExtraGenderNamespaces'=>[], 'NamespaceAliases'=>[], 'LegalTitleChars'=> ' %!"$&\'()*,\\-.\\/0-9:;=?@A-Z\\\\^_`a-z~\\x80-\\xFF+', 'CapitalLinks' => true, 'CapitalLinkOverrides' => [ ], 'NamespacesWithSubpages' => [ 1 => true, 2 => true, 3 => true, 4 => true, 5 => true, 7 => true, 8 => true, 9 => true, 10 => true, 11 => true, 12 => true, 13 => true, 15 => true, ], 'NamespacesWithoutAutoSummaries' => [ ], 'ContentNamespaces' => [ 0, ], 'ShortPagesNamespaceExclusions' => [ ], 'ExtraSignatureNamespaces' => [ ], 'InvalidRedirectTargets' => [ 'Filepath', 'Mypage', 'Mytalk', 'Redirect', 'Mylog', ], 'DisableHardRedirects' => false, 'FixDoubleRedirects' => false, 'LocalInterwikis' => [ ], 'InterwikiExpiry' => 10800, 'InterwikiCache' => false, 'InterwikiScopes' => 3, 'InterwikiFallbackSite' => 'wiki', 'RedirectSources' => false, 'SiteTypes' => [ 'mediawiki' => 'MediaWiki\\Site\\MediaWikiSite', ], 'MaxTocLevel' => 999, 'MaxPPNodeCount' => 1000000, 'MaxTemplateDepth' => 100, 'MaxPPExpandDepth' => 100, 'UrlProtocols' => [ 'bitcoin:', 'ftp: 'ftps: 'geo:', 'git: 'gopher: 'http: 'https: 'irc: 'ircs: 'magnet:', 'mailto:', 'matrix:', 'mms: 'news:', 'nntp: 'redis: 'sftp: 'sip:', 'sips:', 'sms:', 'ssh: 'svn: 'tel:', 'telnet: 'urn:', 'wikipedia: 'worldwind: 'xmpp:', ' ], 'CleanSignatures' => true, 'AllowExternalImages' => false, 'AllowExternalImagesFrom' => '', 'EnableImageWhitelist' => false, 'TidyConfig' => [ ], 'ParsoidSettings' => [ 'useSelser' => true, ], 'ParsoidExperimentalParserFunctionOutput' => false, 'UseLegacyMediaStyles' => false, 'RawHtml' => false, 'ExternalLinkTarget' => false, 'NoFollowLinks' => true, 'NoFollowNsExceptions' => [ ], 'NoFollowDomainExceptions' => [ 'mediawiki.org', ], 'RegisterInternalExternals' => false, 'ExternalLinksIgnoreDomains' => [ ], 'AllowDisplayTitle' => true, 'RestrictDisplayTitle' => true, 'ExpensiveParserFunctionLimit' => 100, 'PreprocessorCacheThreshold' => 1000, 'EnableScaryTranscluding' => false, 'TranscludeCacheExpiry' => 3600, 'EnableMagicLinks' => [ 'ISBN' => false, 'PMID' => false, 'RFC' => false, ], 'ParserEnableUserLanguage' => false, 'ArticleCountMethod' => 'link', 'ActiveUserDays' => 30, 'LearnerEdits' => 10, 'LearnerMemberSince' => 4, 'ExperiencedUserEdits' => 500, 'ExperiencedUserMemberSince' => 30, 'ManualRevertSearchRadius' => 15, 'RevertedTagMaxDepth' => 15, 'CentralIdLookupProviders' => [ 'local' => [ 'class' => 'MediaWiki\\User\\CentralId\\LocalIdLookup', 'services' => [ 'MainConfig', 'DBLoadBalancerFactory', 'HideUserUtils', ], ], ], 'CentralIdLookupProvider' => 'local', 'UserRegistrationProviders' => [ 'local' => [ 'class' => 'MediaWiki\\User\\Registration\\LocalUserRegistrationProvider', 'services' => [ 'ConnectionProvider', ], ], ], 'PasswordPolicy' => [ 'policies' => [ 'bureaucrat' => [ 'MinimalPasswordLength' => 10, 'MinimumPasswordLengthToLogin' => 1, ], 'sysop' => [ 'MinimalPasswordLength' => 10, 'MinimumPasswordLengthToLogin' => 1, ], 'interface-admin' => [ 'MinimalPasswordLength' => 10, 'MinimumPasswordLengthToLogin' => 1, ], 'bot' => [ 'MinimalPasswordLength' => 10, 'MinimumPasswordLengthToLogin' => 1, ], 'default' => [ 'MinimalPasswordLength' => [ 'value' => 8, 'suggestChangeOnLogin' => true, ], 'PasswordCannotBeSubstringInUsername' => [ 'value' => true, 'suggestChangeOnLogin' => true, ], 'PasswordCannotMatchDefaults' => [ 'value' => true, 'suggestChangeOnLogin' => true, ], 'MaximalPasswordLength' => [ 'value' => 4096, 'suggestChangeOnLogin' => true, ], 'PasswordNotInCommonList' => [ 'value' => true, 'suggestChangeOnLogin' => true, ], ], ], 'checks' => [ 'MinimalPasswordLength' => [ 'MediaWiki\\Password\\PasswordPolicyChecks', 'checkMinimalPasswordLength', ], 'MinimumPasswordLengthToLogin' => [ 'MediaWiki\\Password\\PasswordPolicyChecks', 'checkMinimumPasswordLengthToLogin', ], 'PasswordCannotBeSubstringInUsername' => [ 'MediaWiki\\Password\\PasswordPolicyChecks', 'checkPasswordCannotBeSubstringInUsername', ], 'PasswordCannotMatchDefaults' => [ 'MediaWiki\\Password\\PasswordPolicyChecks', 'checkPasswordCannotMatchDefaults', ], 'MaximalPasswordLength' => [ 'MediaWiki\\Password\\PasswordPolicyChecks', 'checkMaximalPasswordLength', ], 'PasswordNotInCommonList' => [ 'MediaWiki\\Password\\PasswordPolicyChecks', 'checkPasswordNotInCommonList', ], ], ], 'AuthManagerConfig' => null, 'AuthManagerAutoConfig' => [ 'preauth' => [ 'MediaWiki\\Auth\\ThrottlePreAuthenticationProvider' => [ 'class' => 'MediaWiki\\Auth\\ThrottlePreAuthenticationProvider', 'sort' => 0, ], 'MediaWiki\\Auth\\PreviouslyRenamedAccountPreAuthenticationProvider' => [ 'class' => 'MediaWiki\\Auth\\PreviouslyRenamedAccountPreAuthenticationProvider', 'services' => [ 'ConnectionProvider', 'UserFactory', ], 'sort' => 0, ], ], 'primaryauth' => [ 'MediaWiki\\Auth\\TemporaryPasswordPrimaryAuthenticationProvider' => [ 'class' => 'MediaWiki\\Auth\\TemporaryPasswordPrimaryAuthenticationProvider', 'services' => [ 'DBLoadBalancerFactory', 'UserOptionsLookup', ], 'args' => [ [ 'authoritative' => false, ], ], 'sort' => 0, ], 'MediaWiki\\Auth\\LocalPasswordPrimaryAuthenticationProvider' => [ 'class' => 'MediaWiki\\Auth\\LocalPasswordPrimaryAuthenticationProvider', 'services' => [ 'DBLoadBalancerFactory', ], 'args' => [ [ 'authoritative' => true, ], ], 'sort' => 100, ], ], 'secondaryauth' => [ 'MediaWiki\\Auth\\CheckBlocksSecondaryAuthenticationProvider' => [ 'class' => 'MediaWiki\\Auth\\CheckBlocksSecondaryAuthenticationProvider', 'sort' => 0, ], 'MediaWiki\\Auth\\ResetPasswordSecondaryAuthenticationProvider' => [ 'class' => 'MediaWiki\\Auth\\ResetPasswordSecondaryAuthenticationProvider', 'sort' => 100, ], 'MediaWiki\\Auth\\EmailNotificationSecondaryAuthenticationProvider' => [ 'class' => 'MediaWiki\\Auth\\EmailNotificationSecondaryAuthenticationProvider', 'services' => [ 'DBLoadBalancerFactory', ], 'sort' => 200, ], ], ], 'RememberMe' => 'choose', 'ReauthenticateTime' => [ 'default' => 3600, ], 'AllowSecuritySensitiveOperationIfCannotReauthenticate' => [ 'default' => true, ], 'ChangeCredentialsBlacklist' => [ 'MediaWiki\\Auth\\TemporaryPasswordAuthenticationRequest', ], 'RemoveCredentialsBlacklist' => [ 'MediaWiki\\Auth\\PasswordAuthenticationRequest', ], 'InvalidPasswordReset' => true, 'PasswordDefault' => 'pbkdf2', 'PasswordConfig' => [ 'A' => [ 'class' => 'MediaWiki\\Password\\MWOldPassword', ], 'B' => [ 'class' => 'MediaWiki\\Password\\MWSaltedPassword', ], 'pbkdf2-legacyA' => [ 'class' => 'MediaWiki\\Password\\LayeredParameterizedPassword', 'types' => [ 'A', 'pbkdf2', ], ], 'pbkdf2-legacyB' => [ 'class' => 'MediaWiki\\Password\\LayeredParameterizedPassword', 'types' => [ 'B', 'pbkdf2', ], ], 'bcrypt' => [ 'class' => 'MediaWiki\\Password\\BcryptPassword', 'cost' => 9, ], 'pbkdf2' => [ 'class' => 'MediaWiki\\Password\\Pbkdf2PasswordUsingOpenSSL', 'algo' => 'sha512', 'cost' => '30000', 'length' => '64', ], 'argon2' => [ 'class' => 'MediaWiki\\Password\\Argon2Password', 'algo' => 'auto', ], ], 'PasswordResetRoutes' => [ 'username' => true, 'email' => true, ], 'MaxSigChars' => 255, 'SignatureValidation' => 'warning', 'SignatureAllowedLintErrors' => [ 'obsolete-tag', ], 'MaxNameChars' => 255, 'ReservedUsernames' => [ 'MediaWiki default', 'Conversion script', 'Maintenance script', 'Template namespace initialisation script', 'ScriptImporter', 'Delete page script', 'Move page script', 'Command line script', 'Unknown user', 'msg:double-redirect-fixer', 'msg:usermessage-editor', 'msg:proxyblocker', 'msg:sorbs', 'msg:spambot_username', 'msg:autochange-username', ], 'DefaultUserOptions' => [ 'ccmeonemails' => 0, 'date' => 'default', 'diffonly' => 0, 'diff-type' => 'table', 'disablemail' => 0, 'editfont' => 'monospace', 'editondblclick' => 0, 'editrecovery' => 0, 'editsectiononrightclick' => 0, 'email-allow-new-users' => 1, 'enotifminoredits' => 0, 'enotifrevealaddr' => 0, 'enotifusertalkpages' => 1, 'enotifwatchlistpages' => 1, 'extendwatchlist' => 1, 'fancysig' => 0, 'forceeditsummary' => 0, 'forcesafemode' => 0, 'gender' => 'unknown', 'hidecategorization' => 1, 'hideminor' => 0, 'hidepatrolled' => 0, 'imagesize' => 2, 'minordefault' => 0, 'newpageshidepatrolled' => 0, 'nickname' => '', 'norollbackdiff' => 0, 'prefershttps' => 1, 'previewonfirst' => 0, 'previewontop' => 1, 'pst-cssjs' => 1, 'rcdays' => 7, 'rcenhancedfilters-disable' => 0, 'rclimit' => 50, 'requireemail' => 0, 'search-match-redirect' => true, 'search-special-page' => 'Search', 'search-thumbnail-extra-namespaces' => true, 'searchlimit' => 20, 'showhiddencats' => 0, 'shownumberswatching' => 1, 'showrollbackconfirmation' => 0, 'skin' => false, 'skin-responsive' => 1, 'thumbsize' => 5, 'underline' => 2, 'useeditwarning' => 1, 'uselivepreview' => 0, 'usenewrc' => 1, 'watchcreations' => 1, 'watchcreations-expiry' => 'infinite', 'watchdefault' => 1, 'watchdefault-expiry' => 'infinite', 'watchdeletion' => 0, 'watchlistdays' => 7, 'watchlisthideanons' => 0, 'watchlisthidebots' => 0, 'watchlisthidecategorization' => 1, 'watchlisthideliu' => 0, 'watchlisthideminor' => 0, 'watchlisthideown' => 0, 'watchlisthidepatrolled' => 0, 'watchlistreloadautomatically' => 0, 'watchlistunwatchlinks' => 0, 'watchmoves' => 0, 'watchrollback' => 0, 'watchuploads' => 1, 'watchrollback-expiry' => 'infinite', 'watchstar-expiry' => 'infinite', 'wlenhancedfilters-disable' => 0, 'wllimit' => 250, ], 'ConditionalUserOptions' => [ ], 'HiddenPrefs' => [ ], 'UserJsPrefLimit' => 100, 'InvalidUsernameCharacters' => '@:>=', 'UserrightsInterwikiDelimiter' => '@', 'SecureLogin' => false, 'AuthenticationTokenVersion' => null, 'SessionProviders' => [ 'MediaWiki\\Session\\CookieSessionProvider' => [ 'class' => 'MediaWiki\\Session\\CookieSessionProvider', 'args' => [ [ 'priority' => 30, ], ], 'services' => [ 'JwtCodec', 'UrlUtils', ], ], 'MediaWiki\\Session\\BotPasswordSessionProvider' => [ 'class' => 'MediaWiki\\Session\\BotPasswordSessionProvider', 'args' => [ [ 'priority' => 75, ], ], 'services' => [ 'GrantsInfo', ], ], ], 'AutoCreateTempUser' => [ 'known' => false, 'enabled' => false, 'actions' => [ 'edit', ], 'genPattern' => '~$1', 'matchPattern' => null, 'reservedPattern' => '~$1', 'serialProvider' => [ 'type' => 'local', 'useYear' => true, ], 'serialMapping' => [ 'type' => 'readable-numeric', ], 'expireAfterDays' => 90, 'notifyBeforeExpirationDays' => 10, ], 'AutoblockExemptions' => [ ], 'AutoblockExpiry' => 86400, 'BlockAllowsUTEdit' => true, 'BlockCIDRLimit' => [ 'IPv4' => 16, 'IPv6' => 19, ], 'BlockDisablesLogin' => false, 'EnableMultiBlocks' => false, 'WhitelistRead' => false, 'WhitelistReadRegexp' => false, 'EmailConfirmToEdit' => false, 'HideIdentifiableRedirects' => true, 'GroupPermissions' => [ '*' => [ 'createaccount' => true, 'read' => true, 'edit' => true, 'createpage' => true, 'createtalk' => true, 'viewmyprivateinfo' => true, 'editmyprivateinfo' => true, 'editmyoptions' => true, ], 'user' => [ 'move' => true, 'move-subpages' => true, 'move-rootuserpages' => true, 'move-categorypages' => true, 'movefile' => true, 'read' => true, 'edit' => true, 'createpage' => true, 'createtalk' => true, 'upload' => true, 'reupload' => true, 'reupload-shared' => true, 'minoredit' => true, 'editmyusercss' => true, 'editmyuserjson' => true, 'editmyuserjs' => true, 'editmyuserjsredirect' => true, 'sendemail' => true, 'applychangetags' => true, 'changetags' => true, 'viewmywatchlist' => true, 'editmywatchlist' => true, 'createwithcontentmodel' => true, ], 'autoconfirmed' => [ 'autoconfirmed' => true, 'editsemiprotected' => true, ], 'bot' => [ 'bot' => true, 'autoconfirmed' => true, 'editsemiprotected' => true, 'nominornewtalk' => true, 'autopatrol' => true, 'suppressredirect' => true, 'apihighlimits' => true, ], 'sysop' => [ 'block' => true, 'createaccount' => true, 'createpreviouslyrenamedaccount' => true, 'delete' => true, 'bigdelete' => true, 'deletedhistory' => true, 'deletedtext' => true, 'undelete' => true, 'editcontentmodel' => true, 'editinterface' => true, 'editsitejson' => true, 'edituserjson' => true, 'import' => true, 'importupload' => true, 'move' => true, 'move-subpages' => true, 'move-rootuserpages' => true, 'move-categorypages' => true, 'patrol' => true, 'autopatrol' => true, 'protect' => true, 'editprotected' => true, 'rollback' => true, 'upload' => true, 'reupload' => true, 'reupload-shared' => true, 'unwatchedpages' => true, 'autoconfirmed' => true, 'editsemiprotected' => true, 'ipblock-exempt' => true, 'blockemail' => true, 'markbotedits' => true, 'apihighlimits' => true, 'browsearchive' => true, 'noratelimit' => true, 'movefile' => true, 'unblockself' => true, 'suppressredirect' => true, 'mergehistory' => true, 'managechangetags' => true, 'deletechangetags' => true, ], 'interface-admin' => [ 'editinterface' => true, 'editsitecss' => true, 'editsitejson' => true, 'editsitejs' => true, 'editusercss' => true, 'edituserjson' => true, 'edituserjs' => true, ], 'bureaucrat' => [ 'userrights' => true, 'noratelimit' => true, 'renameuser' => true, ], 'suppress' => [ 'hideuser' => true, 'suppressrevision' => true, 'viewsuppressed' => true, 'suppressionlog' => true, 'deleterevision' => true, 'deletelogentry' => true, ], ], 'PrivilegedGroups' => [ 'bureaucrat', 'interface-admin', 'suppress', 'sysop', ], 'RevokePermissions' => [ ], 'GroupInheritsPermissions' => [ ], 'ImplicitGroups' => [ '*', 'user', 'autoconfirmed', ], 'GroupsAddToSelf' => [ ], 'GroupsRemoveFromSelf' => [ ], 'RestrictedGroups' => [ ], 'UserRequirementsPrivateConditions' => [ ], 'RestrictionTypes' => [ 'create', 'edit', 'move', 'upload', ], 'RestrictionLevels' => [ '', 'autoconfirmed', 'sysop', ], 'CascadingRestrictionLevels' => [ 'sysop', ], 'SemiprotectedRestrictionLevels' => [ 'autoconfirmed', ], 'NamespaceProtection' => [ ], 'NonincludableNamespaces' => [ ], 'AutoConfirmAge' => 0, 'AutoConfirmCount' => 0, 'Autopromote' => [ 'autoconfirmed' => [ '&', [ 1, null, ], [ 2, null, ], ], ], 'AutopromoteOnce' => [ 'onEdit' => [ ], ], 'AutopromoteOnceLogInRC' => true, 'AutopromoteOnceRCExcludedGroups' => [ ], 'AddGroups' => [ ], 'RemoveGroups' => [ ], 'AvailableRights' => [ ], 'ImplicitRights' => [ ], 'DeleteRevisionsLimit' => 0, 'DeleteRevisionsBatchSize' => 1000, 'HideUserContribLimit' => 1000, 'AccountCreationThrottle' => [ [ 'count' => 0, 'seconds' => 86400, ], ], 'TempAccountCreationThrottle' => [ [ 'count' => 1, 'seconds' => 600, ], [ 'count' => 6, 'seconds' => 86400, ], ], 'TempAccountNameAcquisitionThrottle' => [ [ 'count' => 60, 'seconds' => 86400, ], ], 'SpamRegex' => [ ], 'SummarySpamRegex' => [ ], 'EnableDnsBlacklist' => false, 'DnsBlacklistUrls' => [ ], 'ProxyList' => [ ], 'ProxyWhitelist' => [ ], 'SoftBlockRanges' => [ ], 'ApplyIpBlocksToXff' => false, 'RateLimits' => [ 'edit' => [ 'ip' => [ 8, 60, ], 'newbie' => [ 8, 60, ], 'user' => [ 90, 60, ], ], 'move' => [ 'newbie' => [ 2, 120, ], 'user' => [ 8, 60, ], ], 'upload' => [ 'ip' => [ 8, 60, ], 'newbie' => [ 8, 60, ], ], 'rollback' => [ 'user' => [ 10, 60, ], 'newbie' => [ 5, 120, ], ], 'mailpassword' => [ 'ip' => [ 5, 3600, ], ], 'sendemail' => [ 'ip' => [ 5, 86400, ], 'newbie' => [ 5, 86400, ], 'user' => [ 20, 86400, ], ], 'changeemail' => [ 'ip-all' => [ 10, 3600, ], 'user' => [ 4, 86400, ], ], 'confirmemail' => [ 'ip-all' => [ 10, 3600, ], 'user' => [ 4, 86400, ], ], 'purge' => [ 'ip' => [ 30, 60, ], 'user' => [ 30, 60, ], ], 'linkpurge' => [ 'ip' => [ 30, 60, ], 'user' => [ 30, 60, ], ], 'renderfile' => [ 'ip' => [ 700, 30, ], 'user' => [ 700, 30, ], ], 'renderfile-nonstandard' => [ 'ip' => [ 70, 30, ], 'user' => [ 70, 30, ], ], 'stashedit' => [ 'ip' => [ 30, 60, ], 'newbie' => [ 30, 60, ], ], 'stashbasehtml' => [ 'ip' => [ 5, 60, ], 'newbie' => [ 5, 60, ], ], 'changetags' => [ 'ip' => [ 8, 60, ], 'newbie' => [ 8, 60, ], ], 'editcontentmodel' => [ 'newbie' => [ 2, 120, ], 'user' => [ 8, 60, ], ], ], 'RateLimitsExcludedIPs' => [ ], 'PutIPinRC' => true, 'QueryPageDefaultLimit' => 50, 'ExternalQuerySources' => [ ], 'PasswordAttemptThrottle' => [ [ 'count' => 5, 'seconds' => 300, ], [ 'count' => 150, 'seconds' => 172800, ], ], 'GrantPermissions' => [ 'basic' => [ 'autocreateaccount' => true, 'autoconfirmed' => true, 'autopatrol' => true, 'editsemiprotected' => true, 'ipblock-exempt' => true, 'nominornewtalk' => true, 'patrolmarks' => true, 'read' => true, 'unwatchedpages' => true, ], 'highvolume' => [ 'bot' => true, 'apihighlimits' => true, 'noratelimit' => true, 'markbotedits' => true, ], 'import' => [ 'import' => true, 'importupload' => true, ], 'editpage' => [ 'edit' => true, 'minoredit' => true, 'applychangetags' => true, 'changetags' => true, 'editcontentmodel' => true, 'createwithcontentmodel' => true, 'pagelang' => true, ], 'editprotected' => [ 'edit' => true, 'minoredit' => true, 'applychangetags' => true, 'changetags' => true, 'editcontentmodel' => true, 'createwithcontentmodel' => true, 'editprotected' => true, ], 'editmycssjs' => [ 'edit' => true, 'minoredit' => true, 'applychangetags' => true, 'changetags' => true, 'editcontentmodel' => true, 'createwithcontentmodel' => true, 'editmyusercss' => true, 'editmyuserjson' => true, 'editmyuserjs' => true, ], 'editmyoptions' => [ 'editmyoptions' => true, 'editmyuserjson' => true, ], 'editinterface' => [ 'edit' => true, 'minoredit' => true, 'applychangetags' => true, 'changetags' => true, 'editcontentmodel' => true, 'createwithcontentmodel' => true, 'editinterface' => true, 'edituserjson' => true, 'editsitejson' => true, ], 'editsiteconfig' => [ 'edit' => true, 'minoredit' => true, 'applychangetags' => true, 'changetags' => true, 'editcontentmodel' => true, 'createwithcontentmodel' => true, 'editinterface' => true, 'edituserjson' => true, 'editsitejson' => true, 'editusercss' => true, 'edituserjs' => true, 'editsitecss' => true, 'editsitejs' => true, ], 'createeditmovepage' => [ 'edit' => true, 'minoredit' => true, 'applychangetags' => true, 'changetags' => true, 'editcontentmodel' => true, 'createwithcontentmodel' => true, 'createpage' => true, 'createtalk' => true, 'delete-redirect' => true, 'move' => true, 'move-rootuserpages' => true, 'move-subpages' => true, 'move-categorypages' => true, 'suppressredirect' => true, ], 'uploadfile' => [ 'upload' => true, 'reupload-own' => true, ], 'uploadeditmovefile' => [ 'upload' => true, 'reupload-own' => true, 'reupload' => true, 'reupload-shared' => true, 'upload_by_url' => true, 'movefile' => true, 'suppressredirect' => true, ], 'patrol' => [ 'patrol' => true, ], 'rollback' => [ 'rollback' => true, ], 'blockusers' => [ 'block' => true, 'blockemail' => true, ], 'viewdeleted' => [ 'browsearchive' => true, 'deletedhistory' => true, 'deletedtext' => true, ], 'viewrestrictedlogs' => [ 'suppressionlog' => true, ], 'delete' => [ 'edit' => true, 'minoredit' => true, 'applychangetags' => true, 'changetags' => true, 'editcontentmodel' => true, 'createwithcontentmodel' => true, 'browsearchive' => true, 'deletedhistory' => true, 'deletedtext' => true, 'delete' => true, 'bigdelete' => true, 'deletelogentry' => true, 'deleterevision' => true, 'undelete' => true, ], 'oversight' => [ 'suppressrevision' => true, 'viewsuppressed' => true, ], 'protect' => [ 'edit' => true, 'minoredit' => true, 'applychangetags' => true, 'changetags' => true, 'editcontentmodel' => true, 'createwithcontentmodel' => true, 'editprotected' => true, 'protect' => true, ], 'viewmywatchlist' => [ 'viewmywatchlist' => true, ], 'editmywatchlist' => [ 'editmywatchlist' => true, ], 'sendemail' => [ 'sendemail' => true, ], 'createaccount' => [ 'createaccount' => true, ], 'privateinfo' => [ 'viewmyprivateinfo' => true, ], 'mergehistory' => [ 'mergehistory' => true, ], ], 'GrantPermissionGroups' => [ 'basic' => 'hidden', 'editpage' => 'page-interaction', 'createeditmovepage' => 'page-interaction', 'editprotected' => 'page-interaction', 'patrol' => 'page-interaction', 'uploadfile' => 'file-interaction', 'uploadeditmovefile' => 'file-interaction', 'sendemail' => 'email', 'viewmywatchlist' => 'watchlist-interaction', 'editviewmywatchlist' => 'watchlist-interaction', 'editmycssjs' => 'customization', 'editmyoptions' => 'customization', 'editinterface' => 'administration', 'editsiteconfig' => 'administration', 'rollback' => 'administration', 'blockusers' => 'administration', 'delete' => 'administration', 'viewdeleted' => 'administration', 'viewrestrictedlogs' => 'administration', 'protect' => 'administration', 'oversight' => 'administration', 'createaccount' => 'administration', 'mergehistory' => 'administration', 'import' => 'administration', 'highvolume' => 'high-volume', 'privateinfo' => 'private-information', ], 'GrantRiskGroups' => [ 'basic' => 'low', 'editpage' => 'low', 'createeditmovepage' => 'low', 'editprotected' => 'vandalism', 'patrol' => 'low', 'uploadfile' => 'low', 'uploadeditmovefile' => 'low', 'sendemail' => 'security', 'viewmywatchlist' => 'low', 'editviewmywatchlist' => 'low', 'editmycssjs' => 'security', 'editmyoptions' => 'security', 'editinterface' => 'vandalism', 'editsiteconfig' => 'security', 'rollback' => 'low', 'blockusers' => 'vandalism', 'delete' => 'vandalism', 'viewdeleted' => 'vandalism', 'viewrestrictedlogs' => 'security', 'protect' => 'vandalism', 'oversight' => 'security', 'createaccount' => 'low', 'mergehistory' => 'vandalism', 'import' => 'security', 'highvolume' => 'low', 'privateinfo' => 'low', ], 'EnableBotPasswords' => true, 'BotPasswordsCluster' => false, 'BotPasswordsDatabase' => false, 'BotPasswordsLimit' => 100, 'SecretKey' => false, 'JwtPrivateKey' => false, 'JwtPublicKey' => false, 'AllowUserJs' => false, 'AllowUserCss' => false, 'AllowUserCssPrefs' => true, 'UseSiteJs' => true, 'UseSiteCss' => true, 'BreakFrames' => false, 'EditPageFrameOptions' => 'DENY', 'ApiFrameOptions' => 'DENY', 'CSPHeader' => false, 'CSPReportOnlyHeader' => false, 'CSPUseReportURIDirective' => false, 'CSPFalsePositiveUrls' => [ 'https: 'https: 'https: 'https: 'https: 'https: 'https: 'https: 'https: 'https: 'https: 'https: 'https: 'https: 'chrome-extension' => true, ], 'AllowCrossOrigin' => false, 'RestAllowCrossOriginCookieAuth' => false, 'SessionSecret' => false, 'CookieExpiration' => 2592000, 'ExtendedLoginCookieExpiration' => 15552000, 'SessionCookieJwtExpiration' => 14400, 'CookieDomain' => '', 'CookiePath' => '/', 'CookieSecure' => 'detect', 'CookiePrefix' => false, 'CookieHttpOnly' => true, 'CookieSameSite' => null, 'CacheVaryCookies' => [ ], 'SessionName' => false, 'CookieSetOnAutoblock' => true, 'CookieSetOnIpBlock' => true, 'DebugLogFile' => '', 'DebugLogPrefix' => '', 'DebugRedirects' => false, 'DebugRawPage' => false, 'DebugComments' => false, 'DebugDumpSql' => false, 'TrxProfilerLimits' => [ 'GET' => [ 'masterConns' => 0, 'writes' => 0, 'readQueryTime' => 5, 'readQueryRows' => 10000, ], 'POST' => [ 'readQueryTime' => 5, 'writeQueryTime' => 1, 'readQueryRows' => 100000, 'maxAffected' => 1000, ], 'POST-nonwrite' => [ 'writes' => 0, 'readQueryTime' => 5, 'readQueryRows' => 10000, ], 'PostSend-GET' => [ 'readQueryTime' => 5, 'writeQueryTime' => 1, 'readQueryRows' => 10000, 'maxAffected' => 1000, 'masterConns' => 0, 'writes' => 0, ], 'PostSend-POST' => [ 'readQueryTime' => 5, 'writeQueryTime' => 1, 'readQueryRows' => 100000, 'maxAffected' => 1000, ], 'JobRunner' => [ 'readQueryTime' => 30, 'writeQueryTime' => 5, 'readQueryRows' => 100000, 'maxAffected' => 500, ], 'Maintenance' => [ 'writeQueryTime' => 5, 'maxAffected' => 1000, ], ], 'DebugLogGroups' => [ ], 'MWLoggerDefaultSpi' => [ 'class' => 'MediaWiki\\Logger\\LegacySpi', ], 'ShowDebug' => false, 'SpecialVersionShowHooks' => false, 'ShowExceptionDetails' => false, 'LogExceptionBacktrace' => true, 'PropagateErrors' => true, 'ShowHostnames' => false, 'OverrideHostname' => false, 'DevelopmentWarnings' => false, 'DeprecationReleaseLimit' => false, 'Profiler' => [ ], 'StatsdServer' => false, 'StatsdMetricPrefix' => 'MediaWiki', 'StatsTarget' => null, 'StatsFormat' => null, 'StatsPrefix' => 'mediawiki', 'OpenTelemetryConfig' => null, 'PageInfoTransclusionLimit' => 50, 'EnableJavaScriptTest' => false, 'CachePrefix' => false, 'DebugToolbar' => false, 'ApiClientErrorSampleRate' => 1.0, 'DisableTextSearch' => false, 'AdvancedSearchHighlighting' => false, 'SearchHighlightBoundaries' => '[\\p{Z}\\p{P}\\p{C}]', 'OpenSearchTemplates' => [ 'application/x-suggestions+json' => false, 'application/x-suggestions+xml' => false, ], 'OpenSearchDefaultLimit' => 10, 'OpenSearchDescriptionLength' => 100, 'SearchSuggestCacheExpiry' => 1200, 'DisableSearchUpdate' => false, 'NamespacesToBeSearchedDefault' => [ true, ], 'DisableInternalSearch' => false, 'SearchForwardUrl' => null, 'SitemapNamespaces' => false, 'SitemapNamespacesPriorities' => false, 'SitemapApiConfig' => [ ], 'SpecialSearchFormOptions' => [ ], 'SearchMatchRedirectPreference' => false, 'SearchRunSuggestedQuery' => true, 'Diff3' => '/usr/bin/diff3', 'Diff' => '/usr/bin/diff', 'PreviewOnOpenNamespaces' => [ 14 => true, ], 'UniversalEditButton' => true, 'UseAutomaticEditSummaries' => true, 'CommandLineDarkBg' => false, 'ReadOnly' => null, 'ReadOnlyWatchedItemStore' => false, 'ReadOnlyFile' => false, 'UpgradeKey' => false, 'GitBin' => '/usr/bin/git', 'GitRepositoryViewers' => [ 'https: 'ssh: ], 'InstallerInitialPages' => [ [ 'titlemsg' => 'mainpage', 'text' => '{{subst:int:mainpagetext}}{{subst:int:mainpagedocfooter}}', ], ], 'RCMaxAge' => 7776000, 'WatchersMaxAge' => 15552000, 'UnwatchedPageSecret' => 1, 'RCFilterByAge' => false, 'RCLinkLimits' => [ 50, 100, 250, 500, ], 'RCLinkDays' => [ 1, 3, 7, 14, 30, ], 'RCFeeds' => [ ], 'RCWatchCategoryMembership' => false, 'UseRCPatrol' => true, 'StructuredChangeFiltersLiveUpdatePollingRate' => 3, 'UseNPPatrol' => true, 'UseFilePatrol' => true, 'Feed' => true, 'FeedLimit' => 50, 'FeedCacheTimeout' => 60, 'FeedDiffCutoff' => 32768, 'OverrideSiteFeed' => [ ], 'FeedClasses' => [ 'rss' => 'MediaWiki\\Feed\\RSSFeed', 'atom' => 'MediaWiki\\Feed\\AtomFeed', ], 'AdvertisedFeedTypes' => [ 'atom', ], 'RCShowWatchingUsers' => false, 'RCShowChangedSize' => true, 'RCChangedSizeThreshold' => 500, 'ShowUpdatedMarker' => true, 'DisableAnonTalk' => false, 'UseTagFilter' => true, 'SoftwareTags' => [ 'mw-contentmodelchange' => true, 'mw-new-redirect' => true, 'mw-removed-redirect' => true, 'mw-changed-redirect-target' => true, 'mw-blank' => true, 'mw-replace' => true, 'mw-recreated' => true, 'mw-rollback' => true, 'mw-undo' => true, 'mw-manual-revert' => true, 'mw-reverted' => true, 'mw-server-side-upload' => true, 'mw-ipblock-appeal' => true, 'mw-edited-other-users-js' => true, ], 'UnwatchedPageThreshold' => false, 'RecentChangesFlags' => [ 'newpage' => [ 'letter' => 'newpageletter', 'title' => 'recentchanges-label-newpage', 'legend' => 'recentchanges-legend-newpage', 'grouping' => 'any', ], 'minor' => [ 'letter' => 'minoreditletter', 'title' => 'recentchanges-label-minor', 'legend' => 'recentchanges-legend-minor', 'class' => 'minoredit', 'grouping' => 'all', ], 'bot' => [ 'letter' => 'boteditletter', 'title' => 'recentchanges-label-bot', 'legend' => 'recentchanges-legend-bot', 'class' => 'botedit', 'grouping' => 'all', ], 'unpatrolled' => [ 'letter' => 'unpatrolledletter', 'title' => 'recentchanges-label-unpatrolled', 'legend' => 'recentchanges-legend-unpatrolled', 'grouping' => 'any', ], ], 'WatchlistExpiry' => false, 'EnableWatchstarPopover' => false, 'EnableWatchlistLabels' => false, 'WatchlistLabelsMaxPerUser' => 100, 'WatchlistPurgeRate' => 0.1, 'WatchlistExpiryMaxDuration' => '1 year', 'EnableChangesListQueryPartitioning' => false, 'RightsPage' => null, 'RightsUrl' => null, 'RightsText' => null, 'RightsIcon' => null, 'UseCopyrightUpload' => false, 'MaxCredits' => 0, 'ShowCreditsIfMax' => true, 'ImportSources' => [ ], 'ImportTargetNamespace' => null, 'ExportAllowHistory' => true, 'ExportMaxHistory' => 0, 'ExportAllowListContributors' => false, 'ExportMaxLinkDepth' => 0, 'ExportFromNamespaces' => false, 'ExportAllowAll' => false, 'ExportPagelistLimit' => 5000, 'XmlDumpSchemaVersion' => '0.11', 'WikiFarmSettingsDirectory' => null, 'WikiFarmSettingsExtension' => 'yaml', 'ExtensionFunctions' => [ ], 'ExtensionMessagesFiles' => [ ], 'MessagesDirs' => [ ], 'TranslationAliasesDirs' => [ ], 'ExtensionEntryPointListFiles' => [ ], 'EnableParserLimitReporting' => true, 'ValidSkinNames' => [ ], 'SpecialPages' => [ ], 'ExtensionCredits' => [ ], 'Hooks' => [ ], 'ServiceWiringFiles' => [ ], 'JobClasses' => [ 'deletePage' => 'MediaWiki\\Page\\DeletePageJob', 'refreshLinks' => 'MediaWiki\\JobQueue\\Jobs\\RefreshLinksJob', 'deleteLinks' => 'MediaWiki\\Page\\DeleteLinksJob', 'htmlCacheUpdate' => 'MediaWiki\\JobQueue\\Jobs\\HTMLCacheUpdateJob', 'sendMail' => [ 'class' => 'MediaWiki\\Mail\\EmaillingJob', 'services' => [ 'Emailer', ], ], 'enotifNotify' => [ 'class' => 'MediaWiki\\RecentChanges\\RecentChangeNotifyJob', 'services' => [ 'RecentChangeLookup', ], ], 'fixDoubleRedirect' => [ 'class' => 'MediaWiki\\JobQueue\\Jobs\\DoubleRedirectJob', 'services' => [ 'RevisionLookup', 'MagicWordFactory', 'WikiPageFactory', ], 'needsPage' => true, ], 'AssembleUploadChunks' => 'MediaWiki\\JobQueue\\Jobs\\AssembleUploadChunksJob', 'PublishStashedFile' => 'MediaWiki\\JobQueue\\Jobs\\PublishStashedFileJob', 'ThumbnailRender' => 'MediaWiki\\JobQueue\\Jobs\\ThumbnailRenderJob', 'UploadFromUrl' => 'MediaWiki\\JobQueue\\Jobs\\UploadFromUrlJob', 'recentChangesUpdate' => 'MediaWiki\\RecentChanges\\RecentChangesUpdateJob', 'refreshLinksPrioritized' => 'MediaWiki\\JobQueue\\Jobs\\RefreshLinksJob', 'refreshLinksDynamic' => 'MediaWiki\\JobQueue\\Jobs\\RefreshLinksJob', 'activityUpdateJob' => 'MediaWiki\\Watchlist\\ActivityUpdateJob', 'categoryMembershipChange' => [ 'class' => 'MediaWiki\\RecentChanges\\CategoryMembershipChangeJob', 'services' => [ 'RecentChangeFactory', ], ], 'CategoryCountUpdateJob' => [ 'class' => 'MediaWiki\\JobQueue\\Jobs\\CategoryCountUpdateJob', 'services' => [ 'ConnectionProvider', 'NamespaceInfo', ], ], 'clearUserWatchlist' => 'MediaWiki\\Watchlist\\ClearUserWatchlistJob', 'watchlistExpiry' => 'MediaWiki\\Watchlist\\WatchlistExpiryJob', 'cdnPurge' => 'MediaWiki\\JobQueue\\Jobs\\CdnPurgeJob', 'userGroupExpiry' => 'MediaWiki\\User\\UserGroupExpiryJob', 'clearWatchlistNotifications' => 'MediaWiki\\Watchlist\\ClearWatchlistNotificationsJob', 'userOptionsUpdate' => 'MediaWiki\\User\\Options\\UserOptionsUpdateJob', 'revertedTagUpdate' => 'MediaWiki\\JobQueue\\Jobs\\RevertedTagUpdateJob', 'null' => 'MediaWiki\\JobQueue\\Jobs\\NullJob', 'userEditCountInit' => 'MediaWiki\\User\\UserEditCountInitJob', 'parsoidCachePrewarm' => [ 'class' => 'MediaWiki\\JobQueue\\Jobs\\ParsoidCachePrewarmJob', 'services' => [ 'ParserOutputAccess', 'PageStore', 'RevisionLookup', 'ParsoidSiteConfig', ], 'needsPage' => false, ], 'renameUserTable' => [ 'class' => 'MediaWiki\\RenameUser\\Job\\RenameUserTableJob', 'services' => [ 'MainConfig', 'DBLoadBalancerFactory', ], ], 'renameUserDerived' => [ 'class' => 'MediaWiki\\RenameUser\\Job\\RenameUserDerivedJob', 'services' => [ 'RenameUserFactory', 'UserFactory', ], ], 'renameUser' => [ 'class' => 'MediaWiki\\RenameUser\\Job\\RenameUserTableJob', 'services' => [ 'MainConfig', 'DBLoadBalancerFactory', ], ], ], 'JobTypesExcludedFromDefaultQueue' => [ 'AssembleUploadChunks', 'PublishStashedFile', 'UploadFromUrl', ], 'JobBackoffThrottling' => [ ], 'JobTypeConf' => [ 'default' => [ 'class' => 'MediaWiki\\JobQueue\\JobQueueDB', 'order' => 'random', 'claimTTL' => 3600, ], ], 'JobQueueIncludeInMaxLagFactor' => false, 'SpecialPageCacheUpdates' => [ 'Statistics' => [ 'MediaWiki\\Deferred\\SiteStatsUpdate', 'cacheUpdate', ], ], 'PagePropLinkInvalidations' => [ 'hiddencat' => 'categorylinks', ], 'CategoryMagicGallery' => true, 'CategoryPagingLimit' => 200, 'CategoryCollation' => 'uppercase', 'TempCategoryCollations' => [ ], 'SortedCategories' => false, 'TrackingCategories' => [ ], 'LogTypes' => [ '', 'block', 'protect', 'rights', 'delete', 'upload', 'move', 'import', 'interwiki', 'patrol', 'merge', 'suppress', 'tag', 'managetags', 'contentmodel', 'renameuser', ], 'LogRestrictions' => [ 'suppress' => 'suppressionlog', ], 'FilterLogTypes' => [ 'patrol' => true, 'tag' => true, 'newusers' => false, ], 'LogNames' => [ '' => 'all-logs-page', 'block' => 'blocklogpage', 'protect' => 'protectlogpage', 'rights' => 'rightslog', 'delete' => 'dellogpage', 'upload' => 'uploadlogpage', 'move' => 'movelogpage', 'import' => 'importlogpage', 'patrol' => 'patrol-log-page', 'merge' => 'mergelog', 'suppress' => 'suppressionlog', ], 'LogHeaders' => [ '' => 'alllogstext', 'block' => 'blocklogtext', 'delete' => 'dellogpagetext', 'import' => 'importlogpagetext', 'merge' => 'mergelogpagetext', 'move' => 'movelogpagetext', 'patrol' => 'patrol-log-header', 'protect' => 'protectlogtext', 'rights' => 'rightslogtext', 'suppress' => 'suppressionlogtext', 'upload' => 'uploadlogpagetext', ], 'LogActions' => [ ], 'LogActionsHandlers' => [ 'block/block' => [ 'class' => 'MediaWiki\\Logging\\BlockLogFormatter', 'services' => [ 'TitleParser', 'NamespaceInfo', ], ], 'block/reblock' => [ 'class' => 'MediaWiki\\Logging\\BlockLogFormatter', 'services' => [ 'TitleParser', 'NamespaceInfo', ], ], 'block/unblock' => [ 'class' => 'MediaWiki\\Logging\\BlockLogFormatter', 'services' => [ 'TitleParser', 'NamespaceInfo', ], ], 'contentmodel/change' => 'MediaWiki\\Logging\\ContentModelLogFormatter', 'contentmodel/new' => 'MediaWiki\\Logging\\ContentModelLogFormatter', 'delete/delete' => 'MediaWiki\\Logging\\DeleteLogFormatter', 'delete/delete_redir' => 'MediaWiki\\Logging\\DeleteLogFormatter', 'delete/delete_redir2' => 'MediaWiki\\Logging\\DeleteLogFormatter', 'delete/event' => 'MediaWiki\\Logging\\DeleteLogFormatter', 'delete/restore' => 'MediaWiki\\Logging\\DeleteLogFormatter', 'delete/revision' => 'MediaWiki\\Logging\\DeleteLogFormatter', 'import/interwiki' => 'MediaWiki\\Logging\\ImportLogFormatter', 'import/upload' => 'MediaWiki\\Logging\\ImportLogFormatter', 'interwiki/iw_add' => 'MediaWiki\\Logging\\InterwikiLogFormatter', 'interwiki/iw_delete' => 'MediaWiki\\Logging\\InterwikiLogFormatter', 'interwiki/iw_edit' => 'MediaWiki\\Logging\\InterwikiLogFormatter', 'managetags/activate' => 'MediaWiki\\Logging\\LogFormatter', 'managetags/create' => 'MediaWiki\\Logging\\LogFormatter', 'managetags/deactivate' => 'MediaWiki\\Logging\\LogFormatter', 'managetags/delete' => 'MediaWiki\\Logging\\LogFormatter', 'merge/merge' => [ 'class' => 'MediaWiki\\Logging\\MergeLogFormatter', 'services' => [ 'TitleParser', ], ], 'merge/merge-into' => [ 'class' => 'MediaWiki\\Logging\\MergeLogFormatter', 'services' => [ 'TitleParser', ], ], 'move/move' => [ 'class' => 'MediaWiki\\Logging\\MoveLogFormatter', 'services' => [ 'TitleParser', ], ], 'move/move_redir' => [ 'class' => 'MediaWiki\\Logging\\MoveLogFormatter', 'services' => [ 'TitleParser', ], ], 'patrol/patrol' => 'MediaWiki\\Logging\\PatrolLogFormatter', 'patrol/autopatrol' => 'MediaWiki\\Logging\\PatrolLogFormatter', 'protect/modify' => [ 'class' => 'MediaWiki\\Logging\\ProtectLogFormatter', 'services' => [ 'TitleParser', ], ], 'protect/move_prot' => [ 'class' => 'MediaWiki\\Logging\\ProtectLogFormatter', 'services' => [ 'TitleParser', ], ], 'protect/protect' => [ 'class' => 'MediaWiki\\Logging\\ProtectLogFormatter', 'services' => [ 'TitleParser', ], ], 'protect/unprotect' => [ 'class' => 'MediaWiki\\Logging\\ProtectLogFormatter', 'services' => [ 'TitleParser', ], ], 'renameuser/renameuser' => [ 'class' => 'MediaWiki\\Logging\\RenameuserLogFormatter', 'services' => [ 'TitleParser', ], ], 'rights/autopromote' => 'MediaWiki\\Logging\\RightsLogFormatter', 'rights/rights' => 'MediaWiki\\Logging\\RightsLogFormatter', 'suppress/block' => [ 'class' => 'MediaWiki\\Logging\\BlockLogFormatter', 'services' => [ 'TitleParser', 'NamespaceInfo', ], ], 'suppress/delete' => 'MediaWiki\\Logging\\DeleteLogFormatter', 'suppress/event' => 'MediaWiki\\Logging\\DeleteLogFormatter', 'suppress/reblock' => [ 'class' => 'MediaWiki\\Logging\\BlockLogFormatter', 'services' => [ 'TitleParser', 'NamespaceInfo', ], ], 'suppress/revision' => 'MediaWiki\\Logging\\DeleteLogFormatter', 'tag/update' => 'MediaWiki\\Logging\\TagLogFormatter', 'upload/overwrite' => 'MediaWiki\\Logging\\UploadLogFormatter', 'upload/revert' => 'MediaWiki\\Logging\\UploadLogFormatter', 'upload/upload' => 'MediaWiki\\Logging\\UploadLogFormatter', ], 'ActionFilteredLogs' => [ 'block' => [ 'block' => [ 'block', ], 'reblock' => [ 'reblock', ], 'unblock' => [ 'unblock', ], ], 'contentmodel' => [ 'change' => [ 'change', ], 'new' => [ 'new', ], ], 'delete' => [ 'delete' => [ 'delete', ], 'delete_redir' => [ 'delete_redir', 'delete_redir2', ], 'restore' => [ 'restore', ], 'event' => [ 'event', ], 'revision' => [ 'revision', ], ], 'import' => [ 'interwiki' => [ 'interwiki', ], 'upload' => [ 'upload', ], ], 'managetags' => [ 'create' => [ 'create', ], 'delete' => [ 'delete', ], 'activate' => [ 'activate', ], 'deactivate' => [ 'deactivate', ], ], 'move' => [ 'move' => [ 'move', ], 'move_redir' => [ 'move_redir', ], ], 'newusers' => [ 'create' => [ 'create', 'newusers', ], 'create2' => [ 'create2', ], 'autocreate' => [ 'autocreate', ], 'byemail' => [ 'byemail', ], ], 'protect' => [ 'protect' => [ 'protect', ], 'modify' => [ 'modify', ], 'unprotect' => [ 'unprotect', ], 'move_prot' => [ 'move_prot', ], ], 'rights' => [ 'rights' => [ 'rights', ], 'autopromote' => [ 'autopromote', ], ], 'suppress' => [ 'event' => [ 'event', ], 'revision' => [ 'revision', ], 'delete' => [ 'delete', ], 'block' => [ 'block', ], 'reblock' => [ 'reblock', ], ], 'upload' => [ 'upload' => [ 'upload', ], 'overwrite' => [ 'overwrite', ], 'revert' => [ 'revert', ], ], ], 'NewUserLog' => true, 'PageCreationLog' => true, 'AllowSpecialInclusion' => true, 'DisableQueryPageUpdate' => false, 'CountCategorizedImagesAsUsed' => false, 'MaxRedirectLinksRetrieved' => 500, 'RangeContributionsCIDRLimit' => [ 'IPv4' => 16, 'IPv6' => 32, ], 'Actions' => [ ], 'DefaultRobotPolicy' => 'index,follow', 'NamespaceRobotPolicies' => [ ], 'ArticleRobotPolicies' => [ ], 'ExemptFromUserRobotsControl' => null, 'DebugAPI' => false, 'APIModules' => [ ], 'APIFormatModules' => [ ], 'APIMetaModules' => [ ], 'APIPropModules' => [ ], 'APIListModules' => [ ], 'APIMaxDBRows' => 5000, 'APIMaxResultSize' => 8388608, 'APIMaxUncachedDiffs' => 1, 'APIMaxLagThreshold' => 7, 'APICacheHelpTimeout' => 3600, 'APIUselessQueryPages' => [ 'MIMEsearch', 'LinkSearch', ], 'AjaxLicensePreview' => true, 'CrossSiteAJAXdomains' => [ ], 'CrossSiteAJAXdomainExceptions' => [ ], 'AllowedCorsHeaders' => [ 'Accept', 'Accept-Language', 'Content-Language', 'Content-Type', 'Accept-Encoding', 'DNT', 'Origin', 'User-Agent', 'Api-User-Agent', 'Promise-Non-Write-API-Action', 'Access-Control-Max-Age', 'Authorization', ], 'RestAPIAdditionalRouteFiles' => [ ], 'RestSandboxSpecs' => [ ], 'MaxShellMemory' => 307200, 'MaxShellFileSize' => 102400, 'MaxShellTime' => 180, 'MaxShellWallClockTime' => 180, 'ShellCgroup' => false, 'PhpCli' => '/usr/bin/php', 'ShellRestrictionMethod' => 'autodetect', 'ShellboxUrls' => [ 'default' => null, ], 'ShellboxSecretKey' => null, 'ShellboxShell' => '/bin/sh', 'HTTPTimeout' => 25, 'HTTPConnectTimeout' => 5.0, 'HTTPMaxTimeout' => 0, 'HTTPMaxConnectTimeout' => 0, 'HTTPImportTimeout' => 25, 'AsyncHTTPTimeout' => 25, 'HTTPProxy' => '', 'LocalVirtualHosts' => [ ], 'LocalHTTPProxy' => false, 'AllowExternalReqID' => false, 'GenerateReqIDFormat' => 'rand24', 'JobRunRate' => 1, 'RunJobsAsync' => false, 'UpdateRowsPerJob' => 300, 'UpdateRowsPerQuery' => 100, 'RedirectOnLogin' => null, 'VirtualRestConfig' => [ 'paths' => [ ], 'modules' => [ ], 'global' => [ 'timeout' => 360, 'forwardCookies' => false, 'HTTPProxy' => null, ], ], 'EventRelayerConfig' => [ 'default' => [ 'class' => 'Wikimedia\\EventRelayer\\EventRelayerNull', ], ], 'Pingback' => false, 'OriginTrials' => [ ], 'ReportToExpiry' => 86400, 'ReportToEndpoints' => [ ], 'FeaturePolicyReportOnly' => [ ], 'SkinsPreferred' => [ 'vector-2022', 'vector', ], 'SpecialContributeSkinsEnabled' => [ ], 'SpecialContributeNewPageTarget' => null, 'EnableEditRecovery' => false, 'EditRecoveryExpiry' => 2592000, 'UseCodexSpecialBlock' => false, 'ShowLogoutConfirmation' => false, 'EnableProtectionIndicators' => true, 'OutputPipelineStages' => [ ], 'FeatureShutdown' => [ ], 'CloneArticleParserOutput' => true, 'UseLeximorph' => false, 'UsePostprocCacheLegacy' => false, 'UsePostprocCacheParsoid' => true, 'ParserOptionsLogUnsafeSampleRate' => 0, ], 'type' => [ 'ConfigRegistry' => 'object', 'AssumeProxiesUseDefaultProtocolPorts' => 'boolean', 'ForceHTTPS' => 'boolean', 'ExtensionDirectory' => [ 'string', 'null', ], 'StyleDirectory' => [ 'string', 'null', ], 'UploadDirectory' => [ 'string', 'boolean', 'null', ], 'Logos' => [ 'object', 'boolean', ], 'ReferrerPolicy' => [ 'array', 'string', 'boolean', ], 'ActionPaths' => 'object', 'MainPageIsDomainRoot' => 'boolean', 'ImgAuthUrlPathMap' => 'object', 'LocalFileRepo' => 'object', 'ForeignFileRepos' => 'array', 'UseSharedUploads' => 'boolean', 'SharedUploadDirectory' => [ 'string', 'null', ], 'SharedUploadPath' => [ 'string', 'null', ], 'HashedSharedUploadDirectory' => 'boolean', 'FetchCommonsDescriptions' => 'boolean', 'SharedUploadDBname' => [ 'boolean', 'string', ], 'SharedUploadDBprefix' => 'string', 'CacheSharedUploads' => 'boolean', 'ForeignUploadTargets' => 'array', 'UploadDialog' => 'object', 'FileBackends' => 'object', 'LockManagers' => 'array', 'CopyUploadsDomains' => 'array', 'CopyUploadTimeout' => [ 'boolean', 'integer', ], 'SharedThumbnailScriptPath' => [ 'string', 'boolean', ], 'HashedUploadDirectory' => 'boolean', 'CSPUploadEntryPoint' => 'boolean', 'FileExtensions' => 'array', 'ProhibitedFileExtensions' => 'array', 'MimeTypeExclusions' => 'array', 'TrustedMediaFormats' => 'array', 'MediaHandlers' => 'object', 'NativeImageLazyLoading' => 'boolean', 'ParserTestMediaHandlers' => 'object', 'MaxInterlacingAreas' => 'object', 'SVGConverters' => 'object', 'SVGNativeRendering' => [ 'string', 'boolean', ], 'MaxImageArea' => [ 'string', 'integer', 'boolean', ], 'TiffThumbnailType' => 'array', 'GenerateThumbnailOnParse' => 'boolean', 'EnableAutoRotation' => [ 'boolean', 'null', ], 'Antivirus' => [ 'string', 'null', ], 'AntivirusSetup' => 'object', 'MimeDetectorCommand' => [ 'string', 'null', ], 'XMLMimeTypes' => 'object', 'ImageLimits' => 'array', 'ThumbLimits' => 'array', 'ThumbnailNamespaces' => 'array', 'ThumbnailSteps' => [ 'array', 'null', ], 'ThumbnailBuckets' => [ 'array', 'null', ], 'UploadThumbnailRenderMap' => 'object', 'GalleryOptions' => 'object', 'DjvuDump' => [ 'string', 'null', ], 'DjvuRenderer' => [ 'string', 'null', ], 'DjvuTxt' => [ 'string', 'null', ], 'DjvuPostProcessor' => [ 'string', 'null', ], 'SMTP' => [ 'boolean', 'object', ], 'EnotifFromEditor' => 'boolean', 'EmailConfirmationBanner' => 'boolean', 'EnotifRevealEditorAddress' => 'boolean', 'UsersNotifiedOnAllChanges' => 'object', 'DBmwschema' => [ 'string', 'null', ], 'SharedTables' => 'array', 'DBservers' => [ 'boolean', 'array', ], 'LBFactoryConf' => 'object', 'LocalDatabases' => 'array', 'VirtualDomainsMapping' => 'object', 'FileSchemaMigrationStage' => 'integer', 'ExternalLinksDomainGaps' => 'object', 'ContentHandlers' => 'object', 'NamespaceContentModels' => 'object', 'TextModelsToParse' => 'array', 'ExternalStores' => 'array', 'ExternalServers' => 'object', 'DefaultExternalStore' => [ 'array', 'boolean', ], 'RevisionCacheExpiry' => 'integer', 'PageLanguageUseDB' => 'boolean', 'DiffEngine' => [ 'string', 'null', ], 'ExternalDiffEngine' => [ 'string', 'boolean', ], 'Wikidiff2Options' => 'object', 'RequestTimeLimit' => [ 'integer', 'null', ], 'CriticalSectionTimeLimit' => 'number', 'PoolCounterConf' => [ 'object', 'null', ], 'PoolCountClientConf' => 'object', 'MaxUserDBWriteDuration' => [ 'integer', 'boolean', ], 'MaxJobDBWriteDuration' => [ 'integer', 'boolean', ], 'MultiShardSiteStats' => 'boolean', 'ObjectCaches' => 'object', 'WANObjectCache' => 'object', 'MicroStashType' => [ 'string', 'integer', ], 'ParsoidCacheConfig' => 'object', 'ParsoidSelectiveUpdateSampleRate' => 'integer', 'ParserCacheFilterConfig' => 'object', 'ChronologyProtectorSecret' => 'string', 'PHPSessionHandling' => 'string', 'SuspiciousIpExpiry' => [ 'integer', 'boolean', ], 'MemCachedServers' => 'array', 'LocalisationCacheConf' => 'object', 'ExtensionInfoMTime' => [ 'integer', 'boolean', ], 'CdnServers' => 'object', 'CdnServersNoPurge' => 'object', 'HTCPRouting' => 'object', 'GrammarForms' => 'object', 'ExtraInterlanguageLinkPrefixes' => 'array', 'InterlanguageLinkCodeMap' => 'object', 'ExtraLanguageNames' => 'object', 'ExtraLanguageCodes' => 'object', 'DummyLanguageCodes' => 'object', 'DisabledVariants' => 'object', 'ForceUIMsgAsContentMsg' => 'object', 'RawHtmlMessages' => 'array', 'OverrideUcfirstCharacters' => 'object', 'XhtmlNamespaces' => 'object', 'BrowserFormatDetection' => 'string', 'SkinMetaTags' => 'object', 'SkipSkins' => 'object', 'FragmentMode' => 'array', 'FooterIcons' => 'object', 'InterwikiLogoOverride' => 'array', 'ResourceModules' => 'object', 'ResourceModuleSkinStyles' => 'object', 'ResourceLoaderSources' => 'object', 'ResourceLoaderMaxage' => 'object', 'ResourceLoaderMaxQueryLength' => [ 'integer', 'boolean', ], 'CanonicalNamespaceNames' => 'object', 'ExtraNamespaces' => 'object', 'ExtraGenderNamespaces' => 'object', 'NamespaceAliases' => 'object', 'CapitalLinkOverrides' => 'object', 'NamespacesWithSubpages' => 'object', 'NamespacesWithoutAutoSummaries' => 'array', 'ContentNamespaces' => 'array', 'ShortPagesNamespaceExclusions' => 'array', 'ExtraSignatureNamespaces' => 'array', 'InvalidRedirectTargets' => 'array', 'LocalInterwikis' => 'array', 'InterwikiCache' => [ 'boolean', 'object', ], 'SiteTypes' => 'object', 'UrlProtocols' => 'array', 'TidyConfig' => 'object', 'ParsoidSettings' => 'object', 'ParsoidExperimentalParserFunctionOutput' => 'boolean', 'NoFollowNsExceptions' => 'array', 'NoFollowDomainExceptions' => 'array', 'ExternalLinksIgnoreDomains' => 'array', 'EnableMagicLinks' => 'object', 'ManualRevertSearchRadius' => 'integer', 'RevertedTagMaxDepth' => 'integer', 'CentralIdLookupProviders' => 'object', 'CentralIdLookupProvider' => 'string', 'UserRegistrationProviders' => 'object', 'PasswordPolicy' => 'object', 'AuthManagerConfig' => [ 'object', 'null', ], 'AuthManagerAutoConfig' => 'object', 'RememberMe' => 'string', 'ReauthenticateTime' => 'object', 'AllowSecuritySensitiveOperationIfCannotReauthenticate' => 'object', 'ChangeCredentialsBlacklist' => 'array', 'RemoveCredentialsBlacklist' => 'array', 'PasswordConfig' => 'object', 'PasswordResetRoutes' => 'object', 'SignatureAllowedLintErrors' => 'array', 'ReservedUsernames' => 'array', 'DefaultUserOptions' => 'object', 'ConditionalUserOptions' => 'object', 'HiddenPrefs' => 'array', 'UserJsPrefLimit' => 'integer', 'AuthenticationTokenVersion' => [ 'string', 'null', ], 'SessionProviders' => 'object', 'AutoCreateTempUser' => 'object', 'AutoblockExemptions' => 'array', 'BlockCIDRLimit' => 'object', 'EnableMultiBlocks' => 'boolean', 'GroupPermissions' => 'object', 'PrivilegedGroups' => 'array', 'RevokePermissions' => 'object', 'GroupInheritsPermissions' => 'object', 'ImplicitGroups' => 'array', 'GroupsAddToSelf' => 'object', 'GroupsRemoveFromSelf' => 'object', 'RestrictedGroups' => 'object', 'UserRequirementsPrivateConditions' => 'array', 'RestrictionTypes' => 'array', 'RestrictionLevels' => 'array', 'CascadingRestrictionLevels' => 'array', 'SemiprotectedRestrictionLevels' => 'array', 'NamespaceProtection' => 'object', 'NonincludableNamespaces' => 'object', 'Autopromote' => 'object', 'AutopromoteOnce' => 'object', 'AutopromoteOnceRCExcludedGroups' => 'array', 'AddGroups' => 'object', 'RemoveGroups' => 'object', 'AvailableRights' => 'array', 'ImplicitRights' => 'array', 'AccountCreationThrottle' => [ 'integer', 'array', ], 'TempAccountCreationThrottle' => 'array', 'TempAccountNameAcquisitionThrottle' => 'array', 'SpamRegex' => 'array', 'SummarySpamRegex' => 'array', 'DnsBlacklistUrls' => 'array', 'ProxyList' => [ 'string', 'array', ], 'ProxyWhitelist' => 'array', 'SoftBlockRanges' => 'array', 'RateLimits' => 'object', 'RateLimitsExcludedIPs' => 'array', 'ExternalQuerySources' => 'object', 'PasswordAttemptThrottle' => 'array', 'GrantPermissions' => 'object', 'GrantPermissionGroups' => 'object', 'GrantRiskGroups' => 'object', 'EnableBotPasswords' => 'boolean', 'BotPasswordsCluster' => [ 'string', 'boolean', ], 'BotPasswordsDatabase' => [ 'string', 'boolean', ], 'BotPasswordsLimit' => 'integer', 'CSPHeader' => [ 'boolean', 'object', ], 'CSPReportOnlyHeader' => [ 'boolean', 'object', ], 'CSPUseReportURIDirective' => [ 'boolean', 'object', ], 'CSPFalsePositiveUrls' => 'object', 'AllowCrossOrigin' => 'boolean', 'RestAllowCrossOriginCookieAuth' => 'boolean', 'CookieSameSite' => [ 'string', 'null', ], 'CacheVaryCookies' => 'array', 'TrxProfilerLimits' => 'object', 'DebugLogGroups' => 'object', 'MWLoggerDefaultSpi' => 'object', 'Profiler' => 'object', 'StatsTarget' => [ 'string', 'null', ], 'StatsFormat' => [ 'string', 'null', ], 'StatsPrefix' => 'string', 'OpenTelemetryConfig' => [ 'object', 'null', ], 'OpenSearchTemplates' => 'object', 'NamespacesToBeSearchedDefault' => 'object', 'SitemapNamespaces' => [ 'boolean', 'array', ], 'SitemapNamespacesPriorities' => [ 'boolean', 'object', ], 'SitemapApiConfig' => 'object', 'SpecialSearchFormOptions' => 'object', 'SearchMatchRedirectPreference' => 'boolean', 'SearchRunSuggestedQuery' => 'boolean', 'PreviewOnOpenNamespaces' => 'object', 'ReadOnlyWatchedItemStore' => 'boolean', 'GitRepositoryViewers' => 'object', 'InstallerInitialPages' => 'array', 'RCLinkLimits' => 'array', 'RCLinkDays' => 'array', 'RCFeeds' => 'object', 'OverrideSiteFeed' => 'object', 'FeedClasses' => 'object', 'AdvertisedFeedTypes' => 'array', 'SoftwareTags' => 'object', 'RecentChangesFlags' => 'object', 'WatchlistExpiry' => 'boolean', 'EnableWatchstarPopover' => 'boolean', 'EnableWatchlistLabels' => 'boolean', 'WatchlistLabelsMaxPerUser' => 'integer', 'WatchlistPurgeRate' => 'number', 'WatchlistExpiryMaxDuration' => [ 'string', 'null', ], 'EnableChangesListQueryPartitioning' => 'boolean', 'ImportSources' => 'object', 'ExtensionFunctions' => 'array', 'ExtensionMessagesFiles' => 'object', 'MessagesDirs' => 'object', 'TranslationAliasesDirs' => 'object', 'ExtensionEntryPointListFiles' => 'object', 'ValidSkinNames' => 'object', 'SpecialPages' => 'object', 'ExtensionCredits' => 'object', 'Hooks' => 'object', 'ServiceWiringFiles' => 'array', 'JobClasses' => 'object', 'JobTypesExcludedFromDefaultQueue' => 'array', 'JobBackoffThrottling' => 'object', 'JobTypeConf' => 'object', 'SpecialPageCacheUpdates' => 'object', 'PagePropLinkInvalidations' => 'object', 'TempCategoryCollations' => 'array', 'SortedCategories' => 'boolean', 'TrackingCategories' => 'array', 'LogTypes' => 'array', 'LogRestrictions' => 'object', 'FilterLogTypes' => 'object', 'LogNames' => 'object', 'LogHeaders' => 'object', 'LogActions' => 'object', 'LogActionsHandlers' => 'object', 'ActionFilteredLogs' => 'object', 'RangeContributionsCIDRLimit' => 'object', 'Actions' => 'object', 'NamespaceRobotPolicies' => 'object', 'ArticleRobotPolicies' => 'object', 'ExemptFromUserRobotsControl' => [ 'array', 'null', ], 'APIModules' => 'object', 'APIFormatModules' => 'object', 'APIMetaModules' => 'object', 'APIPropModules' => 'object', 'APIListModules' => 'object', 'APIUselessQueryPages' => 'array', 'CrossSiteAJAXdomains' => 'object', 'CrossSiteAJAXdomainExceptions' => 'object', 'AllowedCorsHeaders' => 'array', 'RestAPIAdditionalRouteFiles' => 'array', 'RestSandboxSpecs' => 'object', 'ShellRestrictionMethod' => [ 'string', 'boolean', ], 'ShellboxUrls' => 'object', 'ShellboxSecretKey' => [ 'string', 'null', ], 'ShellboxShell' => [ 'string', 'null', ], 'HTTPTimeout' => 'number', 'HTTPConnectTimeout' => 'number', 'HTTPMaxTimeout' => 'number', 'HTTPMaxConnectTimeout' => 'number', 'LocalVirtualHosts' => 'object', 'LocalHTTPProxy' => [ 'string', 'boolean', ], 'GenerateReqIDFormat' => 'string', 'VirtualRestConfig' => 'object', 'EventRelayerConfig' => 'object', 'Pingback' => 'boolean', 'OriginTrials' => 'array', 'ReportToExpiry' => 'integer', 'ReportToEndpoints' => 'array', 'FeaturePolicyReportOnly' => 'array', 'SkinsPreferred' => 'array', 'SpecialContributeSkinsEnabled' => 'array', 'SpecialContributeNewPageTarget' => [ 'string', 'null', ], 'EnableEditRecovery' => 'boolean', 'EditRecoveryExpiry' => 'integer', 'UseCodexSpecialBlock' => 'boolean', 'ShowLogoutConfirmation' => 'boolean', 'EnableProtectionIndicators' => 'boolean', 'OutputPipelineStages' => 'object', 'FeatureShutdown' => 'array', 'CloneArticleParserOutput' => 'boolean', 'UseLeximorph' => 'boolean', 'UsePostprocCacheLegacy' => 'boolean', 'UsePostprocCacheParsoid' => 'boolean', 'ParserOptionsLogUnsafeSampleRate' => 'integer', ], 'mergeStrategy' => [ 'TiffThumbnailType' => 'replace', 'LBFactoryConf' => 'replace', 'InterwikiCache' => 'replace', 'PasswordPolicy' => 'array_replace_recursive', 'AuthManagerAutoConfig' => 'array_plus_2d', 'GroupPermissions' => 'array_plus_2d', 'RevokePermissions' => 'array_plus_2d', 'AddGroups' => 'array_merge_recursive', 'RemoveGroups' => 'array_merge_recursive', 'RateLimits' => 'array_plus_2d', 'GrantPermissions' => 'array_plus_2d', 'MWLoggerDefaultSpi' => 'replace', 'Profiler' => 'replace', 'Hooks' => 'array_merge_recursive', 'VirtualRestConfig' => 'array_plus_2d', ], 'dynamicDefault' => [ 'UsePathInfo' => [ 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultUsePathInfo', ], ], 'Script' => [ 'use' => [ 'ScriptPath', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultScript', ], ], 'LoadScript' => [ 'use' => [ 'ScriptPath', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultLoadScript', ], ], 'RestPath' => [ 'use' => [ 'ScriptPath', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultRestPath', ], ], 'StylePath' => [ 'use' => [ 'ResourceBasePath', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultStylePath', ], ], 'LocalStylePath' => [ 'use' => [ 'ScriptPath', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultLocalStylePath', ], ], 'ExtensionAssetsPath' => [ 'use' => [ 'ResourceBasePath', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultExtensionAssetsPath', ], ], 'ArticlePath' => [ 'use' => [ 'Script', 'UsePathInfo', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultArticlePath', ], ], 'UploadPath' => [ 'use' => [ 'ScriptPath', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultUploadPath', ], ], 'FileCacheDirectory' => [ 'use' => [ 'UploadDirectory', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultFileCacheDirectory', ], ], 'Logo' => [ 'use' => [ 'ResourceBasePath', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultLogo', ], ], 'DeletedDirectory' => [ 'use' => [ 'UploadDirectory', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultDeletedDirectory', ], ], 'ShowEXIF' => [ 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultShowEXIF', ], ], 'SharedPrefix' => [ 'use' => [ 'DBprefix', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultSharedPrefix', ], ], 'SharedSchema' => [ 'use' => [ 'DBmwschema', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultSharedSchema', ], ], 'DBerrorLogTZ' => [ 'use' => [ 'Localtimezone', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultDBerrorLogTZ', ], ], 'Localtimezone' => [ 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultLocaltimezone', ], ], 'LocalTZoffset' => [ 'use' => [ 'Localtimezone', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultLocalTZoffset', ], ], 'ResourceBasePath' => [ 'use' => [ 'ScriptPath', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultResourceBasePath', ], ], 'MetaNamespace' => [ 'use' => [ 'Sitename', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultMetaNamespace', ], ], 'CookieSecure' => [ 'use' => [ 'ForceHTTPS', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultCookieSecure', ], ], 'CookiePrefix' => [ 'use' => [ 'SharedDB', 'SharedPrefix', 'SharedTables', 'DBname', 'DBprefix', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultCookiePrefix', ], ], 'ReadOnlyFile' => [ 'use' => [ 'UploadDirectory', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultReadOnlyFile', ], ], ], ], 'config-schema' => [ 'UploadStashScalerBaseUrl' => [ 'deprecated' => 'since 1.36 Use thumbProxyUrl in $wgLocalFileRepo', ], 'IllegalFileChars' => [ 'deprecated' => 'since 1.41; no longer customizable', ], 'ThumbnailNamespaces' => [ 'items' => [ 'type' => 'integer', ], ], 'LocalDatabases' => [ 'items' => [ 'type' => 'string', ], ], 'ParserCacheFilterConfig' => [ 'additionalProperties' => [ 'type' => 'object', 'description' => 'A map of namespace IDs to filter definitions.', 'additionalProperties' => [ 'type' => 'object', 'description' => 'A map of filter names to values.', 'properties' => [ 'minCpuTime' => [ 'type' => 'number', ], ], ], ], ], 'PHPSessionHandling' => [ 'deprecated' => 'since 1.45 Integration with PHP session handling will be removed in the future', ], 'RawHtmlMessages' => [ 'items' => [ 'type' => 'string', ], ], 'InterwikiLogoOverride' => [ 'items' => [ 'type' => 'string', ], ], 'LegalTitleChars' => [ 'deprecated' => 'since 1.41; use Extension:TitleBlacklist to customize', ], 'ReauthenticateTime' => [ 'additionalProperties' => [ 'type' => 'integer', ], ], 'AllowSecuritySensitiveOperationIfCannotReauthenticate' => [ 'additionalProperties' => [ 'type' => 'boolean', ], ], 'ChangeCredentialsBlacklist' => [ 'items' => [ 'type' => 'string', ], ], 'RemoveCredentialsBlacklist' => [ 'items' => [ 'type' => 'string', ], ], 'GroupPermissions' => [ 'additionalProperties' => [ 'type' => 'object', 'additionalProperties' => [ 'type' => 'boolean', ], ], ], 'GroupInheritsPermissions' => [ 'additionalProperties' => [ 'type' => 'string', ], ], 'AvailableRights' => [ 'items' => [ 'type' => 'string', ], ], 'ImplicitRights' => [ 'items' => [ 'type' => 'string', ], ], 'SoftBlockRanges' => [ 'items' => [ 'type' => 'string', ], ], 'ExternalQuerySources' => [ 'additionalProperties' => [ 'type' => 'object', 'properties' => [ 'enabled' => [ 'type' => 'boolean', 'default' => false, ], 'url' => [ 'type' => 'string', 'format' => 'uri', ], 'timeout' => [ 'type' => 'integer', 'default' => 10, ], ], 'required' => [ 'enabled', 'url', ], 'additionalProperties' => false, ], ], 'GrantPermissions' => [ 'additionalProperties' => [ 'type' => 'object', 'additionalProperties' => [ 'type' => 'boolean', ], ], ], 'GrantPermissionGroups' => [ 'additionalProperties' => [ 'type' => 'string', ], ], 'SitemapNamespacesPriorities' => [ 'deprecated' => 'since 1.45 and ignored', ], 'SitemapApiConfig' => [ 'additionalProperties' => [ 'enabled' => [ 'type' => 'bool', ], 'sitemapsPerIndex' => [ 'type' => 'int', ], 'pagesPerSitemap' => [ 'type' => 'int', ], 'expiry' => [ 'type' => 'int', ], ], ], 'SoftwareTags' => [ 'additionalProperties' => [ 'type' => 'boolean', ], ], 'JobBackoffThrottling' => [ 'additionalProperties' => [ 'type' => 'number', ], ], 'JobTypeConf' => [ 'additionalProperties' => [ 'type' => 'object', 'properties' => [ 'class' => [ 'type' => 'string', ], 'order' => [ 'type' => 'string', ], 'claimTTL' => [ 'type' => 'integer', ], ], ], ], 'TrackingCategories' => [ 'deprecated' => 'since 1.25 Extensions should now register tracking categories using the new extension registration system.', ], 'RangeContributionsCIDRLimit' => [ 'additionalProperties' => [ 'type' => 'integer', ], ], 'RestSandboxSpecs' => [ 'additionalProperties' => [ 'type' => 'object', 'properties' => [ 'url' => [ 'type' => 'string', 'format' => 'url', ], 'name' => [ 'type' => 'string', ], 'file' => [ 'type' => 'string', ], 'msg' => [ 'type' => 'string', 'description' => 'a message key', ], ], ], ], 'ShellboxUrls' => [ 'additionalProperties' => [ 'type' => [ 'string', 'boolean', 'null', ], ], ], ], 'obsolete-config' => [ 'MangleFlashPolicy' => 'Since 1.39; no longer has any effect.', 'EnableOpenSearchSuggest' => 'Since 1.35, no longer used', 'AutoloadAttemptLowercase' => 'Since 1.40; no longer has any effect.', ],]
Helper trait for implementations \DAO.