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;
86use MediaWiki\Settings\Source\JsonSchemaTrait;
99use ReflectionClass;
106
138class MainConfigSchema {
139 use JsonSchemaTrait;
140
162 public static function listDefaultValues( string $prefix = '' ): Generator {
163 $class = new ReflectionClass( self::class );
164 foreach ( $class->getReflectionConstants() as $const ) {
165 if ( !$const->isPublic() ) {
166 continue;
167 }
168
169 $value = $const->getValue();
170
171 if ( !is_array( $value ) ) {
172 // Just in case we end up having some other kind of constant on this class.
173 continue;
174 }
175
176 if ( isset( $value['obsolete'] ) ) {
177 continue;
178 }
179
180 $name = $const->getName();
181 yield "$prefix$name" => self::getDefaultFromJsonSchema( $value );
182 }
183 }
184
197 public static function getDefaultValue( string $name ) {
198 $class = new ReflectionClass( self::class );
199 if ( !$class->hasConstant( $name ) ) {
200 throw new InvalidArgumentException( "Unknown setting: $name" );
201 }
202 $value = $class->getConstant( $name );
203
204 if ( !is_array( $value ) ) {
205 // Might happen if we end up having other kinds of constants on this class.
206 throw new InvalidArgumentException( "Unknown setting: $name" );
207 }
208
209 return self::getDefaultFromJsonSchema( $value );
210 }
211
212 /***************************************************************************/
220 public const ConfigRegistry = [
221 'default' => [
222 'main' => 'MediaWiki\\Config\\GlobalVarConfig::newInstance',
223 ],
224 'type' => 'map',
225 ];
226
230 public const Sitename = [
231 'default' => 'MediaWiki',
232 ];
233
234 /***************************************************************************/
235 // region Server URLs and file paths
260 public const Server = [
261 'default' => false,
262 ];
263
273 public const CanonicalServer = [
274 'default' => false,
275 ];
276
283 public const ServerName = [
284 'default' => false,
285 ];
286
293 public const AssumeProxiesUseDefaultProtocolPorts = [
294 'default' => true,
295 'type' => 'boolean',
296 ];
297
308 public const HttpsPort = [
309 'default' => 443,
310 ];
311
329 public const ForceHTTPS = [
330 'default' => false,
331 'type' => 'boolean',
332 ];
333
344 public const ScriptPath = [
345 'default' => '/wiki',
346 ];
347
362 public const UsePathInfo = [
363 'dynamicDefault' => true,
364 ];
365
366 public static function getDefaultUsePathInfo(): bool {
367 // These often break when PHP is set up in CGI mode.
368 // PATH_INFO *may* be correct if cgi.fix_pathinfo is set, but then again it may not;
369 // lighttpd converts incoming path data to lowercase on systems
370 // with case-insensitive filesystems, and there have been reports of
371 // problems on Apache as well.
372 return !str_contains( PHP_SAPI, 'cgi' ) && !str_contains( PHP_SAPI, 'apache2filter' ) &&
373 !str_contains( PHP_SAPI, 'isapi' );
374 }
375
381 public const Script = [
382 'default' => false,
383 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
384 ];
385
390 public static function getDefaultScript( $scriptPath ): string {
391 return "$scriptPath/index.php";
392 }
393
401 public const LoadScript = [
402 'default' => false,
403 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
404 ];
405
410 public static function getDefaultLoadScript( $scriptPath ): string {
411 return "$scriptPath/load.php";
412 }
413
420 public const RestPath = [
421 'default' => false,
422 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
423 ];
424
429 public static function getDefaultRestPath( $scriptPath ): string {
430 return "$scriptPath/rest.php";
431 }
432
440 public const StylePath = [
441 'default' => false,
442 'dynamicDefault' => [ 'use' => [ 'ResourceBasePath' ] ]
443 ];
444
449 public static function getDefaultStylePath( $resourceBasePath ): string {
450 return "$resourceBasePath/skins";
451 }
452
460 public const LocalStylePath = [
461 'default' => false,
462 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
463 ];
464
469 public static function getDefaultLocalStylePath( $scriptPath ): string {
470 // Avoid ResourceBasePath here since that may point to a different domain (e.g. CDN)
471 return "$scriptPath/skins";
472 }
473
481 public const ExtensionAssetsPath = [
482 'default' => false,
483 'dynamicDefault' => [ 'use' => [ 'ResourceBasePath' ] ]
484 ];
485
490 public static function getDefaultExtensionAssetsPath( $resourceBasePath ): string {
491 return "$resourceBasePath/extensions";
492 }
493
502 public const ExtensionDirectory = [
503 'default' => null,
504 'type' => '?string',
505 ];
506
515 public const StyleDirectory = [
516 'default' => null,
517 'type' => '?string',
518 ];
519
527 public const ArticlePath = [
528 'default' => false,
529 'dynamicDefault' => [ 'use' => [ 'Script', 'UsePathInfo' ] ]
530 ];
531
537 public static function getDefaultArticlePath( string $script, $usePathInfo ): string {
538 if ( $usePathInfo ) {
539 return "$script/$1";
540 }
541 return "$script?title=$1";
542 }
543
549 public const UploadPath = [
550 'default' => false,
551 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
552 ];
553
558 public static function getDefaultUploadPath( $scriptPath ): string {
559 return "$scriptPath/images";
560 }
561
574 public const ImgAuthPath = [
575 'default' => false,
576 ];
577
584 public const ThumbPath = [
585 'default' => false,
586 ];
587
593 public const UploadDirectory = [
594 'default' => false,
595 'type' => '?string|false',
596 ];
597
603 public const FileCacheDirectory = [
604 'default' => false,
605 'dynamicDefault' => [ 'use' => [ 'UploadDirectory' ] ]
606 ];
607
612 public static function getDefaultFileCacheDirectory( $uploadDirectory ): string {
613 return "$uploadDirectory/cache";
614 }
615
624 public const Logo = [
625 'default' => false,
626 'dynamicDefault' => [ 'use' => [ 'ResourceBasePath' ] ]
627 ];
628
633 public static function getDefaultLogo( $resourceBasePath ): string {
634 return "$resourceBasePath/resources/assets/change-your-logo.svg";
635 }
636
686 public const Logos = [
687 'default' => false,
688 'type' => 'map|false',
689 ];
690
696 public const Favicon = [
697 'default' => '/favicon.ico',
698 ];
699
707 public const AppleTouchIcon = [
708 'default' => false,
709 ];
710
729 public const ReferrerPolicy = [
730 'default' => false,
731 'type' => 'list|string|false',
732 ];
733
755 public const TmpDirectory = [
756 'default' => false,
757 ];
758
771 public const UploadBaseUrl = [
772 'default' => '',
773 ];
774
787 public const UploadStashScalerBaseUrl = [
788 'default' => false,
789 'deprecated' => 'since 1.36 Use thumbProxyUrl in $wgLocalFileRepo',
790 ];
791
806 public const ActionPaths = [
807 'default' => [],
808 'type' => 'map',
809 ];
810
817 public const MainPageIsDomainRoot = [
818 'default' => false,
819 'type' => 'boolean',
820 ];
821
822 // endregion -- end of server URLs and file paths
823
824 /***************************************************************************/
825 // region Files and file uploads
837 public const EnableUploads = [
838 'default' => false,
839 ];
840
844 public const UploadStashMaxAge = [
845 'default' => 6 * 3600, // 6 hours
846 ];
847
854 public const EnableAsyncUploads = [
855 'default' => false,
856 ];
857
863 public const EnableAsyncUploadsByURL = [
864 'default' => false,
865 ];
866
870 public const UploadMaintenance = [
871 'default' => false,
872 ];
873
883 public const IllegalFileChars = [
884 'default' => ':\\/\\\\',
885 'deprecated' => 'since 1.41; no longer customizable',
886 ];
887
893 public const DeletedDirectory = [
894 'default' => false,
895 'dynamicDefault' => [ 'use' => [ 'UploadDirectory' ] ]
896 ];
897
902 public static function getDefaultDeletedDirectory( $uploadDirectory ): string {
903 return "$uploadDirectory/deleted";
904 }
905
909 public const ImgAuthDetails = [
910 'default' => false,
911 ];
912
928 public const ImgAuthUrlPathMap = [
929 'default' => [],
930 'type' => 'map',
931 ];
932
1067 public const LocalFileRepo = [
1068 'default' => [
1069 'class' => LocalRepo::class,
1070 'name' => 'local',
1071 'directory' => null, // $wgUploadDirectory
1072 'scriptDirUrl' => null, // $wgScriptPath
1073 'favicon' => null, // $wgFavicon
1074 'url' => null, // $wgUploadBaseUrl . $wgUploadPath
1075 'hashLevels' => null, // $wgHashedUploadDirectory
1076 'thumbScriptUrl' => null, // $wgThumbnailScriptPath
1077 'transformVia404' => null, // $wgGenerateThumbnailOnParse
1078 'deletedDir' => null, // $wgDeletedDirectory
1079 'deletedHashLevels' => null, // $wgHashedUploadDirectory
1080 'updateCompatibleMetadata' => null, // $wgUpdateCompatibleMetadata
1081 'reserializeMetadata' => null, // $wgUpdateCompatibleMetadata
1082 ],
1083 'type' => 'map',
1084 ];
1085
1103 public const ForeignFileRepos = [
1104 'default' => [],
1105 'type' => 'list',
1106 ];
1107
1117 public const UseInstantCommons = [
1118 'default' => false,
1119 ];
1120
1148 public const UseSharedUploads = [
1149 'default' => false,
1150 'type' => 'boolean',
1151 ];
1152
1160 public const SharedUploadDirectory = [
1161 'default' => null,
1162 'type' => '?string',
1163 ];
1164
1172 public const SharedUploadPath = [
1173 'default' => null,
1174 'type' => '?string',
1175 ];
1176
1184 public const HashedSharedUploadDirectory = [
1185 'default' => true,
1186 'type' => 'boolean',
1187 ];
1188
1196 public const RepositoryBaseUrl = [
1197 'default' => 'https://commons.wikimedia.org/wiki/File:',
1198 ];
1199
1207 public const FetchCommonsDescriptions = [
1208 'default' => false,
1209 'type' => 'boolean',
1210 ];
1211
1220 public const SharedUploadDBname = [
1221 'default' => false,
1222 'type' => 'false|string',
1223 ];
1224
1232 public const SharedUploadDBprefix = [
1233 'default' => '',
1234 'type' => 'string',
1235 ];
1236
1244 public const CacheSharedUploads = [
1245 'default' => true,
1246 'type' => 'boolean',
1247 ];
1248
1259 public const ForeignUploadTargets = [
1260 'default' => [ 'local', ],
1261 'type' => 'list',
1262 ];
1263
1273 public const UploadDialog = [
1274 'default' =>
1275 [
1276 'fields' =>
1277 [
1278 'description' => true,
1279 'date' => false,
1280 'categories' => false,
1281 ],
1282 'licensemessages' =>
1283 [
1284 'local' => 'generic-local',
1285 'foreign' => 'generic-foreign',
1286 ],
1287 'comment' =>
1288 [
1289 'local' => '',
1290 'foreign' => '',
1291 ],
1292 'format' =>
1293 [
1294 'filepage' => '$DESCRIPTION',
1295 'description' => '$TEXT',
1296 'ownwork' => '',
1297 'license' => '',
1298 'uncategorized' => '',
1299 ],
1300 ],
1301 'type' => 'map',
1302 ];
1303
1341 public const FileBackends = [
1342 'default' => [],
1343 'type' => 'map',
1344 ];
1345
1369 public const LockManagers = [
1370 'default' => [],
1371 'type' => 'list',
1372 ];
1373
1389 public const ShowEXIF = [
1390 'dynamicDefault' => [ 'callback' => [ self::class, 'getDefaultShowEXIF' ] ],
1391 ];
1392
1393 public static function getDefaultShowEXIF(): bool {
1394 return function_exists( 'exif_read_data' );
1395 }
1396
1400 public const UpdateCompatibleMetadata = [
1401 'default' => false,
1402 ];
1403
1410 public const AllowCopyUploads = [
1411 'default' => false,
1412 ];
1413
1419 public const CopyUploadsDomains = [
1420 'default' => [],
1421 'type' => 'list',
1422 ];
1423
1429 public const CopyUploadsFromSpecialUpload = [
1430 'default' => false,
1431 ];
1432
1438 public const CopyUploadProxy = [
1439 'default' => false,
1440 ];
1441
1450 public const CopyUploadTimeout = [
1451 'default' => false,
1452 'type' => 'false|integer',
1453 ];
1454
1461 public const CopyUploadAllowOnWikiDomainConfig = [
1462 'default' => false,
1463 ];
1464
1485 public const MaxUploadSize = [
1486 'default' => 1024 * 1024 * 100,
1487 ];
1488
1503 public const MinUploadChunkSize = [
1504 'default' => 1024,
1505 ];
1506
1518 public const UploadNavigationUrl = [
1519 'default' => false,
1520 ];
1521
1527 public const UploadMissingFileUrl = [
1528 'default' => false,
1529 ];
1530
1544 public const ThumbnailScriptPath = [
1545 'default' => false,
1546 ];
1547
1555 public const SharedThumbnailScriptPath = [
1556 'default' => false,
1557 'type' => 'string|false',
1558 ];
1559
1565 public const HashedUploadDirectory = [
1566 'default' => true,
1567 'type' => 'boolean',
1568 ];
1569
1579 public const CSPUploadEntryPoint = [
1580 'default' => true,
1581 'type' => 'boolean',
1582 ];
1583
1592 public const FileExtensions = [
1593 'default' => [ 'png', 'gif', 'jpg', 'jpeg', 'webp', ],
1594 'type' => 'list',
1595 ];
1596
1605 public const ProhibitedFileExtensions = [
1606 'default' => [
1607 # HTML may contain cookie-stealing JavaScript and web bugs
1608 'html', 'htm', 'js', 'jsb', 'mhtml', 'mht', 'xhtml', 'xht',
1609 # PHP scripts may execute arbitrary code on the server
1610 'php', 'phtml', 'php3', 'php4', 'php5', 'phps', 'phar',
1611 # Other types that may be interpreted by some servers
1612 'shtml', 'jhtml', 'pl', 'py', 'cgi',
1613 # May contain harmful executables for Windows victims
1614 'exe', 'scr', 'dll', 'msi', 'vbs', 'bat', 'com', 'pif', 'cmd', 'vxd', 'cpl',
1615 # T341565
1616 'xml',
1617 ],
1618 'type' => 'list',
1619 ];
1620
1627 public const MimeTypeExclusions = [
1628 'default' => [
1629 # HTML may contain cookie-stealing JavaScript and web bugs
1630 'text/html',
1631 # Similarly with JavaScript itself
1632 'application/javascript', 'text/javascript', 'text/x-javascript', 'application/x-shellscript',
1633 # PHP scripts may execute arbitrary code on the server
1634 'application/x-php', 'text/x-php',
1635 # Other types that may be interpreted by some servers
1636 'text/x-python', 'text/x-perl', 'text/x-bash', 'text/x-sh', 'text/x-csh',
1637 # Client-side hazards on Internet Explorer
1638 'text/scriptlet', 'application/x-msdownload',
1639 # Windows metafile, client-side vulnerability on some systems
1640 'application/x-msmetafile',
1641 # Files that look like java files
1642 'application/java',
1643 # XML files generally - T341565
1644 'application/xml', 'text/xml',
1645 ],
1646 'type' => 'list',
1647 ];
1648
1654 public const CheckFileExtensions = [
1655 'default' => true,
1656 ];
1657
1664 public const StrictFileExtensions = [
1665 'default' => true,
1666 ];
1667
1674 public const DisableUploadScriptChecks = [
1675 'default' => false,
1676 ];
1677
1681 public const UploadSizeWarning = [
1682 'default' => false,
1683 ];
1684
1696 public const TrustedMediaFormats = [
1697 'default' => [
1698 MEDIATYPE_BITMAP, // all bitmap formats
1699 MEDIATYPE_AUDIO, // all audio formats
1700 MEDIATYPE_VIDEO, // all plain video formats
1701 "image/svg+xml", // svg (only needed if inline rendering of svg is not supported)
1702 "application/pdf", // PDF files
1703 # "application/x-shockwave-flash", //flash/shockwave movie
1704 ],
1705 'type' => 'list',
1706 ];
1707
1716 public const MediaHandlers = [
1717 'default' => [],
1718 'type' => 'map',
1719 ];
1720
1727 public const NativeImageLazyLoading = [
1728 'default' => false,
1729 'type' => 'boolean',
1730 ];
1731
1736 public const ParserTestMediaHandlers = [
1737 'default' => [
1738 'image/jpeg' => 'MockBitmapHandler',
1739 'image/png' => 'MockBitmapHandler',
1740 'image/gif' => 'MockBitmapHandler',
1741 'image/tiff' => 'MockBitmapHandler',
1742 'image/webp' => 'MockBitmapHandler',
1743 'image/x-ms-bmp' => 'MockBitmapHandler',
1744 'image/x-bmp' => 'MockBitmapHandler',
1745 'image/x-xcf' => 'MockBitmapHandler',
1746 'image/svg+xml' => 'MockSvgHandler',
1747 'image/vnd.djvu' => 'MockDjVuHandler',
1748 ],
1749 'type' => 'map',
1750 ];
1751
1757 public const UseImageResize = [
1758 'default' => true,
1759 ];
1760
1770 public const UseImageMagick = [
1771 'default' => false,
1772 ];
1773
1777 public const ImageMagickConvertCommand = [
1778 'default' => '/usr/bin/convert',
1779 ];
1780
1786 public const MaxInterlacingAreas = [
1787 'default' => [],
1788 'type' => 'map',
1789 ];
1790
1794 public const SharpenParameter = [
1795 'default' => '0x0.4',
1796 ];
1797
1801 public const SharpenReductionThreshold = [
1802 'default' => 0.85,
1803 ];
1804
1809 public const ImageMagickTempDir = [
1810 'default' => false,
1811 ];
1812
1825 public const CustomConvertCommand = [
1826 'default' => false,
1827 ];
1828
1834 public const JpegTran = [
1835 'default' => '/usr/bin/jpegtran',
1836 ];
1837
1857 public const JpegPixelFormat = [
1858 'default' => 'yuv420',
1859 ];
1860
1868 public const JpegQuality = [
1869 'default' => 80,
1870 ];
1871
1876 public const Exiv2Command = [
1877 'default' => '/usr/bin/exiv2',
1878 ];
1879
1885 public const Exiftool = [
1886 'default' => '/usr/bin/exiftool',
1887 ];
1888
1899 public const SVGConverters = [
1900 'default' => [
1901 'ImageMagick' => '$path/convert -background "#ffffff00" -thumbnail $widthx$height\\! $input PNG:$output',
1902 'inkscape' => '$path/inkscape -w $width -o $output $input',
1903 'batik' => 'java -Djava.awt.headless=true -jar $path/batik-rasterizer.jar -w $width -d $output $input',
1904 'rsvg' => '$path/rsvg-convert -w $width -h $height -o $output $input',
1905 'ImagickExt' => [ 'SvgHandler::rasterizeImagickExt', ],
1906 ],
1907 'type' => 'map',
1908 ];
1909
1913 public const SVGConverter = [
1914 'default' => 'ImageMagick',
1915 ];
1916
1920 public const SVGConverterPath = [
1921 'default' => '',
1922 ];
1923
1927 public const SVGMaxSize = [
1928 'default' => 5120,
1929 ];
1930
1936 public const SVGMetadataCutoff = [
1937 'default' => 1024 * 1024 * 5,
1938 ];
1939
1950 public const SVGNativeRendering = [
1951 'default' => true,
1952 'type' => 'string|boolean',
1953 ];
1954
1962 public const SVGNativeRenderingSizeLimit = [
1963 'default' => 50 * 1024,
1964 ];
1965
1975 public const MediaInTargetLanguage = [
1976 'default' => true,
1977 ];
1978
1996 public const MaxImageArea = [
1997 'default' => 12_500_000,
1998 'type' => 'string|integer|false',
1999 ];
2000
2009 public const MaxAnimatedGifArea = [
2010 'default' => 12_500_000,
2011 ];
2012
2028 public const TiffThumbnailType = [
2029 'default' => [],
2030 'type' => 'list',
2031 'mergeStrategy' => 'replace',
2032 ];
2033
2041 public const ThumbnailEpoch = [
2042 'default' => '20030516000000',
2043 ];
2044
2052 public const AttemptFailureEpoch = [
2053 'default' => 1,
2054 ];
2055
2067 public const IgnoreImageErrors = [
2068 'default' => false,
2069 ];
2070
2091 public const GenerateThumbnailOnParse = [
2092 'default' => true,
2093 'type' => 'boolean',
2094 ];
2095
2099 public const ShowArchiveThumbnails = [
2100 'default' => true,
2101 ];
2102
2108 public const EnableAutoRotation = [
2109 'default' => null,
2110 'type' => '?boolean',
2111 ];
2112
2118 public const Antivirus = [
2119 'default' => null,
2120 'type' => '?string',
2121 ];
2122
2158 public const AntivirusSetup = [
2159 'default' => [
2160 # setup for clamav
2161 'clamav' => [
2162 'command' => 'clamscan --no-summary ',
2163 'codemap' => [
2164 "0" => AV_NO_VIRUS, # no virus
2165 "1" => AV_VIRUS_FOUND, # virus found
2166 "52" => AV_SCAN_ABORTED, # unsupported file format (probably immune)
2167 "*" => AV_SCAN_FAILED, # else scan failed
2168 ],
2169 'messagepattern' => '/.*?:(.*)/sim',
2170 ],
2171 ],
2172 'type' => 'map',
2173 ];
2174
2178 public const AntivirusRequired = [
2179 'default' => true,
2180 ];
2181
2185 public const VerifyMimeType = [
2186 'default' => true,
2187 ];
2188
2199 public const MimeTypeFile = [
2200 'default' => 'internal',
2201 ];
2202
2208 public const MimeInfoFile = [
2209 'default' => 'internal',
2210 ];
2211
2225 public const MimeDetectorCommand = [
2226 'default' => null,
2227 'type' => '?string',
2228 ];
2229
2235 public const TrivialMimeDetection = [
2236 'default' => false,
2237 ];
2238
2244 public const XMLMimeTypes = [
2245 'default' => [
2246 'http://www.w3.org/2000/svg:svg' => 'image/svg+xml',
2247 'svg' => 'image/svg+xml',
2248 'http://www.lysator.liu.se/~alla/dia/:diagram' => 'application/x-dia-diagram',
2249 'http://www.w3.org/1999/xhtml:html' => 'text/html',
2250 'html' => 'text/html',
2251 ],
2252 'type' => 'map',
2253 ];
2254
2265 public const ImageLimits = [
2266 'default' => [
2267 [ 320, 240 ],
2268 [ 640, 480 ],
2269 [ 800, 600 ],
2270 [ 1024, 768 ],
2271 [ 1280, 1024 ],
2272 [ 2560, 2048 ],
2273 ],
2274 'type' => 'list',
2275 ];
2276
2282 public const ThumbLimits = [
2283 'default' => [
2284 120,
2285 150,
2286 180,
2287 200,
2288 250,
2289 300
2290 ],
2291 'type' => 'list',
2292 ];
2293
2299 public const ThumbnailNamespaces = [
2300 'default' => [ NS_FILE ],
2301 'type' => 'list',
2302 'items' => [ 'type' => 'integer', ],
2303 ];
2304
2317 public const ThumbnailSteps = [
2318 'default' => null,
2319 'type' => '?list',
2320 ];
2321
2329 public const ThumbnailStepsRatio = [
2330 'default' => null,
2331 'type' => '?float',
2332 ];
2333
2344 public const ThumbnailBuckets = [
2345 'default' => null,
2346 'type' => '?list',
2347 ];
2348
2364 public const ThumbnailMinimumBucketDistance = [
2365 'default' => 50,
2366 ];
2367
2377 public const UploadThumbnailRenderMap = [
2378 'default' => [],
2379 'type' => 'map',
2380 ];
2381
2393 public const UploadThumbnailRenderMethod = [
2394 'default' => 'jobqueue',
2395 ];
2396
2403 public const UploadThumbnailRenderHttpCustomHost = [
2404 'default' => false,
2405 ];
2406
2413 public const UploadThumbnailRenderHttpCustomDomain = [
2414 'default' => false,
2415 ];
2416
2424 public const UseTinyRGBForJPGThumbnails = [
2425 'default' => false,
2426 ];
2427
2443 public const GalleryOptions = [
2444 'default' => [],
2445 'type' => 'map',
2446 ];
2447
2453 public const ThumbUpright = [
2454 'default' => 0.75,
2455 ];
2456
2460 public const DirectoryMode = [
2461 'default' => 0o777,
2462 ];
2463
2470 public const ResponsiveImages = [
2471 'default' => true,
2472 ];
2473
2490 public const ImagePreconnect = [
2491 'default' => false,
2492 ];
2493
2494 /***************************************************************************/
2495 // region DJVU settings
2504 public const DjvuUseBoxedCommand = [
2505 'default' => false,
2506 ];
2507
2516 public const DjvuDump = [
2517 'default' => null,
2518 'type' => '?string',
2519 ];
2520
2526 public const DjvuRenderer = [
2527 'default' => null,
2528 'type' => '?string',
2529 ];
2530
2539 public const DjvuTxt = [
2540 'default' => null,
2541 'type' => '?string',
2542 ];
2543
2549 public const DjvuPostProcessor = [
2550 'default' => 'pnmtojpeg',
2551 'type' => '?string',
2552 ];
2553
2557 public const DjvuOutputExtension = [
2558 'default' => 'jpg',
2559 ];
2560
2561 // endregion -- end of DJvu
2562
2563 // endregion -- end of file uploads
2564
2565 /***************************************************************************/
2566 // region Email settings
2574 public const EmergencyContact = [
2575 'default' => false,
2576 ];
2577
2586 public const PasswordSender = [
2587 'default' => false,
2588 ];
2589
2595 public const NoReplyAddress = [
2596 'default' => false,
2597 ];
2598
2604 public const EnableEmail = [
2605 'default' => true,
2606 ];
2607
2613 public const EnableUserEmail = [
2614 'default' => true,
2615 ];
2616
2626 public const UserEmailUseReplyTo = [
2627 'default' => true,
2628 ];
2629
2634 public const PasswordReminderResendTime = [
2635 'default' => 24,
2636 ];
2637
2641 public const NewPasswordExpiry = [
2642 'default' => 3600 * 24 * 7,
2643 ];
2644
2648 public const UserEmailConfirmationTokenExpiry = [
2649 'default' => 7 * 24 * 60 * 60,
2650 ];
2651
2657 public const UserEmailConfirmationUseHTML = [
2658 'default' => false,
2659 'type' => 'boolean',
2660 ];
2661
2666 public const PasswordExpirationDays = [
2667 'default' => false,
2668 ];
2669
2674 public const PasswordExpireGrace = [
2675 'default' => 3600 * 24 * 7,
2676 ];
2677
2695 public const SMTP = [
2696 'default' => false,
2697 'type' => 'false|map',
2698 ];
2699
2703 public const AdditionalMailParams = [
2704 'default' => null,
2705 ];
2706
2711 public const AllowHTMLEmail = [
2712 'default' => false,
2713 ];
2714
2724 public const EnotifFromEditor = [
2725 'default' => false,
2726 'type' => 'boolean',
2727 ];
2728
2735 public const EmailAuthentication = [
2736 'default' => true,
2737 ];
2738
2742 public const EnotifWatchlist = [
2743 'default' => false,
2744 ];
2745
2753 public const EnotifUserTalk = [
2754 'default' => false,
2755 ];
2756
2769 public const EnotifRevealEditorAddress = [
2770 'default' => false,
2771 'type' => 'boolean',
2772 ];
2773
2787 public const EnotifMinorEdits = [
2788 'default' => true,
2789 ];
2790
2794 public const EnotifUseRealName = [
2795 'default' => false,
2796 ];
2797
2802 public const UsersNotifiedOnAllChanges = [
2803 'default' => [],
2804 'type' => 'map',
2805 ];
2806
2807 // endregion -- end of email settings
2808
2809 /***************************************************************************/
2810 // region Database settings
2823 public const DBname = [
2824 'default' => 'my_wiki',
2825 ];
2826
2837 public const DBmwschema = [
2838 'default' => null,
2839 'type' => '?string',
2840 ];
2841
2853 public const DBprefix = [
2854 'default' => '',
2855 ];
2856
2860 public const DBserver = [
2861 'default' => 'localhost',
2862 ];
2863
2867 public const DBport = [
2868 'default' => 5432,
2869 ];
2870
2874 public const DBuser = [
2875 'default' => 'wikiuser',
2876 ];
2877
2881 public const DBpassword = [
2882 'default' => '',
2883 ];
2884
2888 public const DBtype = [
2889 'default' => 'mysql',
2890 ];
2891
2899 public const DBssl = [
2900 'default' => false,
2901 ];
2902
2911 public const DBcompress = [
2912 'default' => false,
2913 ];
2914
2926 public const DBStrictWarnings = [
2927 'default' => false,
2928 ];
2929
2933 public const DBadminuser = [
2934 'default' => null,
2935 ];
2936
2940 public const DBadminpassword = [
2941 'default' => null,
2942 ];
2943
2955 public const SearchType = [
2956 'default' => null,
2957 ];
2958
2971 public const SearchTypeAlternatives = [
2972 'default' => null,
2973 ];
2974
2978 public const DBTableOptions = [
2979 'default' => 'ENGINE=InnoDB, DEFAULT CHARSET=binary',
2980 ];
2981
2989 public const SQLMode = [
2990 'default' => '',
2991 ];
2992
2996 public const SQLiteDataDir = [
2997 'default' => '',
2998 ];
2999
3020 public const SharedDB = [
3021 'default' => null,
3022 ];
3023
3027 public const SharedPrefix = [
3028 'default' => false,
3029 'dynamicDefault' => [ 'use' => [ 'DBprefix' ] ]
3030 ];
3031
3036 public static function getDefaultSharedPrefix( $dbPrefix ) {
3037 return $dbPrefix;
3038 }
3039
3044 public const SharedTables = [
3045 'default' => [
3046 'user',
3047 'user_properties',
3048 'user_autocreate_serial',
3049 ],
3050 'type' => 'list',
3051 ];
3052
3057 public const SharedSchema = [
3058 'default' => false,
3059 'dynamicDefault' => [ 'use' => [ 'DBmwschema' ] ]
3060 ];
3061
3066 public static function getDefaultSharedSchema( $dbMwschema ) {
3067 return $dbMwschema;
3068 }
3069
3121 public const DBservers = [
3122 'default' => false,
3123 'type' => 'false|list',
3124 ];
3125
3136 public const LBFactoryConf = [
3137 'default' => [
3138 'class' => 'Wikimedia\\Rdbms\\LBFactorySimple',
3139 ],
3140 'type' => 'map',
3141 'mergeStrategy' => 'replace',
3142 ];
3143
3155 public const DataCenterUpdateStickTTL = [
3156 'default' => 10,
3157 ];
3158
3162 public const DBerrorLog = [
3163 'default' => false,
3164 ];
3165
3186 public const DBerrorLogTZ = [
3187 'default' => false,
3188 'dynamicDefault' => [ 'use' => [ 'Localtimezone' ] ]
3189 ];
3190
3191 public static function getDefaultDBerrorLogTZ( ?string $localtimezone ): string {
3192 // NOTE: Extra fallback, in case $localtimezone is ''.
3193 // Many extsing LocalSettings files have $wgLocaltimezone = ''
3194 // in them, erroneously generated by the installer.
3195 return $localtimezone ?: self::getDefaultLocaltimezone();
3196 }
3197
3233 public const LocalDatabases = [
3234 'default' => [],
3235 'type' => 'list',
3236 'items' => [ 'type' => 'string', ],
3237 ];
3238
3246 public const DatabaseReplicaLagWarning = [
3247 'default' => 10,
3248 ];
3249
3254 public const DatabaseReplicaLagCritical = [
3255 'default' => 30,
3256 ];
3257
3264 public const MaxExecutionTimeForExpensiveQueries = [
3265 'default' => 0,
3266 ];
3267
3283 public const VirtualDomainsMapping = [
3284 'default' => [],
3285 'type' => 'map',
3286 ];
3287
3299 public const FileSchemaMigrationStage = [
3300 'default' => SCHEMA_COMPAT_OLD,
3301 'type' => 'integer',
3302 ];
3303
3317 public const ImageLinksSchemaMigrationStage = [
3319 'type' => 'integer',
3320 ];
3321
3340 public const ExternalLinksDomainGaps = [
3341 'default' => [],
3342 'type' => 'map',
3343 ];
3344
3345 // endregion -- End of DB settings
3346
3347 /***************************************************************************/
3348 // region Content handlers and storage
3359 public const ContentHandlers = [
3360 'default' =>
3361 [
3362 // the usual case
3364 'class' => WikitextContentHandler::class,
3365 'services' => [
3366 'TitleFactory',
3367 'ParserFactory',
3368 'GlobalIdGenerator',
3369 'LanguageNameUtils',
3370 'LinkRenderer',
3371 'MagicWordFactory',
3372 'ParsoidParserFactory',
3373 ],
3374 ],
3375 // dumb version, no syntax highlighting
3377 'class' => JavaScriptContentHandler::class,
3378 'services' => [
3379 'MainConfig',
3380 'ParserFactory',
3381 'UserOptionsLookup',
3382 ],
3383 ],
3384 // simple implementation, for use by extensions, etc.
3386 'class' => JsonContentHandler::class,
3387 'services' => [
3388 'ParsoidParserFactory',
3389 'TitleFactory',
3390 ],
3391 ],
3392 // dumb version, no syntax highlighting
3394 'class' => CssContentHandler::class,
3395 'services' => [
3396 'MainConfig',
3397 'ParserFactory',
3398 'UserOptionsLookup',
3399 ],
3400 ],
3402 'class' => VueContentHandler::class,
3403 'services' => [
3404 'MainConfig',
3405 'ParserFactory',
3406 ]
3407 ],
3408 // plain text, for use by extensions, etc.
3409 CONTENT_MODEL_TEXT => TextContentHandler::class,
3410 // fallback for unknown models, from imports or extensions that were removed
3411 CONTENT_MODEL_UNKNOWN => FallbackContentHandler::class,
3412 ],
3413 'type' => 'map',
3414 ];
3415
3427 public const NamespaceContentModels = [
3428 'default' => [],
3429 'type' => 'map',
3430 ];
3431
3447 public const TextModelsToParse = [
3448 'default' => [
3449 CONTENT_MODEL_WIKITEXT, // Just for completeness, wikitext will always be parsed.
3450 CONTENT_MODEL_JAVASCRIPT, // Make categories etc work, people put them into comments.
3451 CONTENT_MODEL_CSS, // Make categories etc work, people put them into comments.
3452 ],
3453 'type' => 'list',
3454 ];
3455
3462 public const CompressRevisions = [
3463 'default' => false,
3464 ];
3465
3475 public const ExternalStores = [
3476 'default' => [],
3477 'type' => 'list',
3478 ];
3479
3499 public const ExternalServers = [
3500 'default' => [],
3501 'type' => 'map',
3502 ];
3503
3516 public const DefaultExternalStore = [
3517 'default' => false,
3518 'type' => 'list|false',
3519 ];
3520
3527 public const RevisionCacheExpiry = [
3528 'default' => SqlBlobStore::DEFAULT_TTL,
3529 'type' => 'integer',
3530 ];
3531
3538 public const PageLanguageUseDB = [
3539 'default' => false,
3540 'type' => 'boolean',
3541 ];
3542
3555 public const DiffEngine = [
3556 'default' => null,
3557 'type' => '?string',
3558 ];
3559
3563 public const ExternalDiffEngine = [
3564 'default' => false,
3565 'type' => 'string|false',
3566 ];
3567
3592 public const Wikidiff2Options = [
3593 'default' => [],
3594 'type' => 'map'
3595 ];
3596
3597 // endregion -- end of Content handlers and storage
3598
3599 /***************************************************************************/
3600 // region Performance hacks and limits
3612 public const RequestTimeLimit = [
3613 'default' => null,
3614 'type' => '?integer',
3615 ];
3616
3626 public const TransactionalTimeLimit = [
3627 'default' => 120,
3628 ];
3629
3644 public const CriticalSectionTimeLimit = [
3645 'default' => 180.0,
3646 'type' => 'float',
3647 ];
3648
3652 public const MiserMode = [
3653 'default' => false,
3654 ];
3655
3659 public const DisableQueryPages = [
3660 'default' => false,
3661 ];
3662
3666 public const QueryCacheLimit = [
3667 'default' => 1000,
3668 ];
3669
3673 public const WantedPagesThreshold = [
3674 'default' => 1,
3675 ];
3676
3680 public const AllowSlowParserFunctions = [
3681 'default' => false,
3682 ];
3683
3687 public const AllowSchemaUpdates = [
3688 'default' => true,
3689 ];
3690
3694 public const MaxArticleSize = [
3695 'default' => 2048,
3696 ];
3697
3702 public const MemoryLimit = [
3703 'default' => '50M',
3704 ];
3705
3759 public const PoolCounterConf = [
3760 'default' => null,
3761 'type' => '?map',
3762 ];
3763
3776 public const PoolCountClientConf = [
3777 'default' => [
3778 'servers' => [
3779 '127.0.0.1'
3780 ],
3781 'timeout' => 0.1,
3782 ],
3783 'type' => 'map',
3784 ];
3785
3793 public const MaxUserDBWriteDuration = [
3794 'default' => false,
3795 'type' => 'integer|false',
3796 ];
3797
3805 public const MaxJobDBWriteDuration = [
3806 'default' => false,
3807 'type' => 'integer|false',
3808 ];
3809
3814 public const LinkHolderBatchSize = [
3815 'default' => 1000,
3816 ];
3817
3821 public const MaximumMovedPages = [
3822 'default' => 100,
3823 ];
3824
3837 public const ForceDeferredUpdatesPreSend = [
3838 'default' => false,
3839 ];
3840
3850 public const MultiShardSiteStats = [
3851 'default' => false,
3852 'type' => 'boolean',
3853 ];
3854
3855 // endregion -- end performance hacks
3856
3857 /***************************************************************************/
3858 // region Cache settings
3869 public const CacheDirectory = [
3870 'default' => false,
3871 ];
3872
3897 public const MainCacheType = [
3898 'default' => CACHE_NONE,
3899 ];
3900
3907 public const MessageCacheType = [
3908 'default' => CACHE_ANYTHING,
3909 ];
3910
3936 public const ParserCacheType = [
3937 'default' => CACHE_ANYTHING,
3938 ];
3939
3949 public const SessionCacheType = [
3950 'default' => CACHE_ANYTHING,
3951 ];
3952
3961 public const AnonSessionCacheType = [
3962 'default' => false
3963 ];
3964
3973 public const LanguageConverterCacheType = [
3974 'default' => CACHE_ANYTHING,
3975 ];
3976
4040 public const ObjectCaches = [
4041 'default' => [
4042 CACHE_NONE => [ 'class' => EmptyBagOStuff::class, 'reportDupes' => false ],
4043 CACHE_DB => [ 'class' => SqlBagOStuff::class, 'loggroup' => 'SQLBagOStuff' ],
4044
4045 'memcached-php' => [ 'class' => MemcachedPhpBagOStuff::class, 'loggroup' => 'memcached' ],
4046 'memcached-pecl' => [ 'class' => MemcachedPeclBagOStuff::class, 'loggroup' => 'memcached' ],
4047 'hash' => [ 'class' => HashBagOStuff::class, 'reportDupes' => false ],
4048
4049 // Deprecated since 1.35.
4050 // - To configure a wg*CacheType variable to use the local server cache,
4051 // use CACHE_ACCEL instead, which will select these automatically.
4052 // - To access the object for the local server cache at run-time,
4053 // use MediaWikiServices::getLocalServerObjectCache()
4054 // instead of e.g. ObjectCache::getInstance( 'apcu' ).
4055 // - To instantiate a new one of these explicitly, do so directly
4056 // by using `new APCUBagOStuff( [ … ] )`
4057 // - To instantiate a new one of these including auto-detection and fallback,
4058 // use ObjectCache::makeLocalServerCache().
4059 'apc' => [ 'class' => APCUBagOStuff::class, 'reportDupes' => false ],
4060 'apcu' => [ 'class' => APCUBagOStuff::class, 'reportDupes' => false ],
4061 ],
4062 'type' => 'map',
4063 ];
4064
4072 public const WANObjectCache = [
4073 'default' => [],
4074 'type' => 'map',
4075 ];
4076
4109 public const MicroStashType = [
4110 'default' => CACHE_ANYTHING,
4111 'type' => 'string|int',
4112 ];
4113
4141 public const MainStash = [
4142 'default' => CACHE_DB,
4143 ];
4144
4169 public const ParsoidCacheConfig = [
4170 'type' => 'object',
4171 'properties' => [
4172 'StashType' => [ 'type' => 'int|string|null', 'default' => null ],
4173 'StashDuration' => [ 'type' => 'int', 'default' => 24 * 60 * 60 ],
4174 'WarmParsoidParserCache' => [ 'type' => 'bool', 'default' => false ],
4175 ]
4176 ];
4177
4187 public const ParsoidSelectiveUpdateSampleRate = [
4188 'type' => 'integer',
4189 'default' => 0,
4190 ];
4191
4211 public const ParserCacheFilterConfig = [
4212 'type' => 'map',
4213 'default' => [ // default value
4214 'pcache' => [ // old parser cache
4215 'default' => [ // all namespaces
4216 // 0 means no threshold.
4217 // Use PHP_INT_MAX to disable cache.
4218 'minCpuTime' => 0
4219 ],
4220 ],
4221 'parsoid-pcache' => [ // parsoid output cache
4222 'default' => [ // all namespaces
4223 // 0 means no threshold.
4224 // Use PHP_INT_MAX to disable cache.
4225 'minCpuTime' => 0
4226 ],
4227 ],
4228 'postproc-pcache' => [ // postprocessing output cache
4229 'default' => [ // all namespaces
4230 // 0 means no threshold.
4231 // Use PHP_INT_MAX to disable cache.
4232 'minCpuTime' => PHP_INT_MAX
4233 ],
4234 ],
4235 'postproc-parsoid-pcache' => [ // parsoid postprocessing output cache
4236 'default' => [ // all namespaces
4237 // 0 means no threshold.
4238 // Use PHP_INT_MAX to disable cache.
4239 'minCpuTime' => PHP_INT_MAX
4240 ],
4241 ],
4242 ],
4243 'additionalProperties' => [ // caches
4244 'type' => 'map',
4245 'description' => 'A map of namespace IDs to filter definitions.',
4246 'additionalProperties' => [ // namespaces
4247 'type' => 'map',
4248 'description' => 'A map of filter names to values.',
4249 'properties' => [ // filters
4250 'minCpuTime' => [ 'type' => 'float' ]
4251 ]
4252 ],
4253 ],
4254 ];
4255
4261 public const ChronologyProtectorSecret = [
4262 'default' => '',
4263 'type' => 'string',
4264 ];
4265
4271 public const ParserCacheExpireTime = [
4272 'default' => 60 * 60 * 24,
4273 ];
4274
4284 public const ParserCacheAsyncExpireTime = [
4285 'default' => 60,
4286 ];
4287
4295 public const ParserCacheAsyncRefreshJobs = [
4296 'default' => true,
4297 ];
4298
4304 public const OldRevisionParserCacheExpireTime = [
4305 'default' => 60 * 60,
4306 ];
4307
4311 public const ObjectCacheSessionExpiry = [
4312 'default' => 60 * 60,
4313 ];
4314
4328 public const PHPSessionHandling = [
4329 'default' => 'warn',
4330 'type' => 'string',
4331 'deprecated' => 'since 1.45 Integration with PHP session handling will be removed in the future',
4332 ];
4333
4341 public const SuspiciousIpExpiry = [
4342 'default' => false,
4343 'type' => 'integer|false',
4344 ];
4345
4351 public const SessionPbkdf2Iterations = [
4352 'default' => 10001,
4353 ];
4354
4365 public const UseSessionCookieJwt = [
4366 'default' => false,
4367 ];
4368
4372 public const MemCachedServers = [
4373 'default' => [ '127.0.0.1:11211', ],
4374 'type' => 'list',
4375 ];
4376
4381 public const MemCachedPersistent = [
4382 'default' => false,
4383 ];
4384
4388 public const MemCachedTimeout = [
4389 'default' => 500_000,
4390 ];
4391
4403 public const UseLocalMessageCache = [
4404 'default' => false,
4405 ];
4406
4414 public const AdaptiveMessageCache = [
4415 'default' => false,
4416 ];
4417
4449 public const LocalisationCacheConf = [
4450 'properties' => [
4451 'class' => [ 'type' => 'string', 'default' => LocalisationCache::class ],
4452 'store' => [ 'type' => 'string', 'default' => 'detect' ],
4453 'storeClass' => [ 'type' => 'false|string', 'default' => false ],
4454 'storeDirectory' => [ 'type' => 'false|string', 'default' => false ],
4455 'storeServer' => [ 'type' => 'object', 'default' => [] ],
4456 'forceRecache' => [ 'type' => 'bool', 'default' => false ],
4457 'manualRecache' => [ 'type' => 'bool', 'default' => false ],
4458 ],
4459 'type' => 'object',
4460 ];
4461
4465 public const CachePages = [
4466 'default' => true,
4467 ];
4468
4478 public const CacheEpoch = [
4479 'default' => '20030516000000',
4480 ];
4481
4486 public const GitInfoCacheDirectory = [
4487 'default' => false,
4488 ];
4489
4495 public const UseFileCache = [
4496 'default' => false,
4497 ];
4498
4505 public const FileCacheDepth = [
4506 'default' => 2,
4507 ];
4508
4513 public const RenderHashAppend = [
4514 'default' => '',
4515 ];
4516
4526 public const EnableSidebarCache = [
4527 'default' => false,
4528 ];
4529
4533 public const SidebarCacheExpiry = [
4534 'default' => 86400,
4535 ];
4536
4543 public const UseGzip = [
4544 'default' => false,
4545 ];
4546
4556 public const InvalidateCacheOnLocalSettingsChange = [
4557 'default' => true,
4558 ];
4559
4574 public const ExtensionInfoMTime = [
4575 'default' => false,
4576 'type' => 'integer|false',
4577 ];
4578
4585 public const EnableRemoteBagOStuffTests = [
4586 'default' => false,
4587 ];
4588
4589 // endregion -- end of cache settings
4590
4591 /***************************************************************************/
4592 // region HTTP proxy (CDN) settings
4611 public const UseCdn = [
4612 'default' => false,
4613 ];
4614
4623 public const VaryOnXFP = [
4624 'default' => false,
4625 ];
4626
4636 public const InternalServer = [
4637 'default' => false,
4638 ];
4639
4649 public const CdnMaxAge = [
4650 'default' => 18000,
4651 ];
4652
4659 public const CdnMaxageLagged = [
4660 'default' => 30,
4661 ];
4662
4669 public const CdnMaxageStale = [
4670 'default' => 10,
4671 ];
4672
4688 public const CdnReboundPurgeDelay = [
4689 'default' => 0,
4690 ];
4691
4698 public const CdnMaxageSubstitute = [
4699 'default' => 60,
4700 ];
4701
4707 public const ForcedRawSMaxage = [
4708 'default' => 300,
4709 ];
4710
4721 public const CdnServers = [
4722 'default' => [],
4723 'type' => 'map',
4724 ];
4725
4734 public const CdnServersNoPurge = [
4735 'default' => [],
4736 'type' => 'map',
4737 ];
4738
4787 public const HTCPRouting = [
4788 'default' => [],
4789 'type' => 'map',
4790 ];
4791
4797 public const HTCPMulticastTTL = [
4798 'default' => 1,
4799 ];
4800
4804 public const UsePrivateIPs = [
4805 'default' => false,
4806 ];
4807
4819 public const CdnMatchParameterOrder = [
4820 'default' => true,
4821 ];
4822
4823 // endregion -- end of HTTP proxy settings
4824
4825 /***************************************************************************/
4826 // region Language, regional and character encoding settings
4846 public const LanguageCode = [
4847 'default' => 'en',
4848 ];
4849
4861 public const GrammarForms = [
4862 'default' => [],
4863 'type' => 'map',
4864 ];
4865
4869 public const InterwikiMagic = [
4870 'default' => true,
4871 ];
4872
4876 public const HideInterlanguageLinks = [
4877 'default' => false,
4878 ];
4879
4900 public const ExtraInterlanguageLinkPrefixes = [
4901 'default' => [],
4902 'type' => 'list',
4903 ];
4904
4912 public const InterlanguageLinkCodeMap = [
4913 'default' => [],
4914 'type' => 'map',
4915 ];
4916
4920 public const ExtraLanguageNames = [
4921 'default' => [],
4922 'type' => 'map',
4923 ];
4924
4939 public const ExtraLanguageCodes = [
4940 'default' => [
4941 'bh' => 'bho',
4942 'no' => 'nb',
4943 'simple' => 'en',
4944 ],
4945 'type' => 'map',
4946 ];
4947
4956 public const DummyLanguageCodes = [
4957 'default' => [],
4958 'type' => 'map',
4959 ];
4960
4968 public const AllUnicodeFixes = [
4969 'default' => false,
4970 ];
4971
4982 public const LegacyEncoding = [
4983 'default' => false,
4984 ];
4985
4990 public const AmericanDates = [
4991 'default' => false,
4992 ];
4993
4998 public const TranslateNumerals = [
4999 'default' => true,
5000 ];
5001
5007 public const UseDatabaseMessages = [
5008 'default' => true,
5009 ];
5010
5014 public const MaxMsgCacheEntrySize = [
5015 'default' => 10000,
5016 ];
5017
5021 public const DisableLangConversion = [
5022 'default' => false,
5023 ];
5024
5029 public const DisableTitleConversion = [
5030 'default' => false,
5031 ];
5032
5037 public const DefaultLanguageVariant = [
5038 'default' => false,
5039 ];
5040
5045 public const UsePigLatinVariant = [
5046 'default' => false,
5047 ];
5048
5059 public const DisabledVariants = [
5060 'default' => [],
5061 'type' => 'map',
5062 ];
5063
5082 public const VariantArticlePath = [
5083 'default' => false,
5084 ];
5085
5101 public const UseXssLanguage = [
5102 'default' => false,
5103 ];
5104
5110 public const LoginLanguageSelector = [
5111 'default' => false,
5112 ];
5113
5134 public const ForceUIMsgAsContentMsg = [
5135 'default' => [],
5136 'type' => 'map',
5137 ];
5138
5151 public const RawHtmlMessages = [
5152 'default' => [],
5153 'type' => 'list',
5154 'items' => [ 'type' => 'string', ],
5155 ];
5156
5181 public const Localtimezone = [
5182 'dynamicDefault' => true,
5183 ];
5184
5185 public static function getDefaultLocaltimezone(): string {
5186 // This defaults to the `date.timezone` value of the PHP INI option. If this option is not set,
5187 // it falls back to UTC.
5188 $localtimezone = date_default_timezone_get();
5189 if ( !$localtimezone ) {
5190 // Make doubly sure we have a valid time zone, even if date_default_timezone_get()
5191 // returned garbage.
5192 $localtimezone = 'UTC';
5193 }
5194
5195 return $localtimezone;
5196 }
5197
5207 public const LocalTZoffset = [
5208 'dynamicDefault' => [ 'use' => [ 'Localtimezone' ] ]
5209 ];
5210
5211 public static function getDefaultLocalTZoffset( ?string $localtimezone ): int {
5212 // NOTE: Extra fallback, in case $localtimezone is ''.
5213 // Many extsing LocalSettings files have $wgLocaltimezone = ''
5214 // in them, erroneously generated by the installer.
5215 $localtimezone = $localtimezone ?: self::getDefaultLocaltimezone();
5216
5217 try {
5218 $timezone = new DateTimeZone( $localtimezone );
5219 } catch ( \Exception $e ) {
5220 throw new ConfigException(
5221 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",
5222 $localtimezone,
5223 "wgLocaltimezone",
5224 $e->getMessage() ),
5225 );
5226 }
5227
5228 $offset = $timezone->getOffset( new DateTime() );
5229
5230 return (int)( $offset / 60 );
5231 }
5232
5241 public const OverrideUcfirstCharacters = [
5242 'default' => [],
5243 'type' => 'map',
5244 ];
5245
5246 // endregion -- End of language/charset settings
5247
5248 /***************************************************************************/
5249 // region Output format and skin settings
5255 public const MimeType = [
5256 'default' => 'text/html',
5257 ];
5258
5268 public const Html5Version = [
5269 'default' => null,
5270 ];
5271
5279 public const EditSubmitButtonLabelPublish = [
5280 'default' => false,
5281 ];
5282
5299 public const XhtmlNamespaces = [
5300 'default' => [],
5301 'type' => 'map',
5302 ];
5303
5311 public const SiteNotice = [
5312 'default' => '',
5313 ];
5314
5326 public const BrowserFormatDetection = [
5327 'default' => 'telephone=no',
5328 'type' => 'string',
5329 ];
5330
5339 public const SkinMetaTags = [
5340 'default' => [],
5341 'type' => 'map',
5342 ];
5343
5348 public const DefaultSkin = [
5349 'default' => 'vector-2022',
5350 ];
5351
5357 public const FallbackSkin = [
5358 'default' => 'fallback',
5359 ];
5360
5371 public const SkipSkins = [
5372 'default' => [],
5373 'type' => 'map',
5374 ];
5375
5379 public const DisableOutputCompression = [
5380 'default' => false,
5381 ];
5382
5412 public const FragmentMode = [
5413 'default' => [ 'html5', 'legacy', ],
5414 'type' => 'list',
5415 ];
5416
5425 public const ExternalInterwikiFragmentMode = [
5426 'default' => 'legacy',
5427 ];
5428
5460 public const FooterIcons = [
5461 'default' => [
5462 "copyright" => [
5463 "copyright" => [], // placeholder for the built in copyright icon
5464 ],
5465 "poweredby" => [
5466 "mediawiki" => [
5467 // Defaults to point at
5468 // "$wgResourceBasePath/resources/assets/poweredby_mediawiki_88x31.png"
5469 // plus srcset for 1.5x, 2x resolution variants.
5470 "src" => null,
5471 "url" => "https://www.mediawiki.org/",
5472 "alt" => "Powered by MediaWiki",
5473 "lang" => "en",
5474 ]
5475 ],
5476 ],
5477 'type' => 'map',
5478 ];
5479
5487 public const UseCombinedLoginLink = [
5488 'default' => false,
5489 ];
5490
5494 public const Edititis = [
5495 'default' => false,
5496 ];
5497
5509 public const Send404Code = [
5510 'default' => true,
5511 ];
5512
5523 public const ShowRollbackEditCount = [
5524 'default' => 10,
5525 ];
5526
5533 public const EnableCanonicalServerLink = [
5534 'default' => false,
5535 ];
5536
5550 public const InterwikiLogoOverride = [
5551 'default' => [],
5552 'type' => 'list',
5553 'items' => [ 'type' => 'string', ],
5554 ];
5555
5556 // endregion -- End of output format settings
5557
5558 /***************************************************************************/
5559 // region ResourceLoader settings
5569 public const MangleFlashPolicy = [
5570 'default' => true,
5571 'obsolete' => 'Since 1.39; no longer has any effect.',
5572 'description' => 'Has been emitting warnings since 1.39 (LTS). ' .
5573 'Can be removed completely in 1.44, assuming 1.43 is an LTS release.'
5574 ];
5575
5885 public const ResourceModules = [
5886 'default' => [],
5887 'type' => 'map',
5888 ];
5889
5984 public const ResourceModuleSkinStyles = [
5985 'default' => [],
5986 'type' => 'map',
5987 ];
5988
6000 public const ResourceLoaderSources = [
6001 'default' => [],
6002 'type' => 'map',
6003 ];
6004
6010 public const ResourceBasePath = [
6011 'default' => null,
6012 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
6013 ];
6014
6019 public static function getDefaultResourceBasePath( $scriptPath ): string {
6020 return $scriptPath;
6021 }
6022
6035 public const ResourceLoaderMaxage = [
6036 'default' => [],
6037 'type' => 'map',
6038 ];
6039
6045 public const ResourceLoaderDebug = [
6046 'default' => false,
6047 ];
6048
6061 public const ResourceLoaderMaxQueryLength = [
6062 'default' => false,
6063 'type' => 'integer|false',
6064 ];
6065
6076 public const ResourceLoaderValidateJS = [
6077 'default' => true,
6078 ];
6079
6088 public const ResourceLoaderEnableJSProfiler = [
6089 'default' => false,
6090 ];
6091
6096 public const ResourceLoaderStorageEnabled = [
6097 'default' => true,
6098 ];
6099
6106 public const ResourceLoaderStorageVersion = [
6107 'default' => 1,
6108 ];
6109
6116 public const ResourceLoaderEnableSourceMapLinks = [
6117 'default' => true,
6118 ];
6119
6131 public const AllowSiteCSSOnRestrictedPages = [
6132 'default' => false,
6133 ];
6134
6145 public const VueDevelopmentMode = [
6146 'default' => false,
6147 ];
6148
6162 public const CodexDevelopmentDir = [
6163 'default' => null,
6164 ];
6165
6166 // endregion -- End of ResourceLoader settings
6167
6168 /***************************************************************************/
6169 // region Page titles and redirects
6176 public const MetaNamespace = [
6177 'default' => false,
6178 'dynamicDefault' => [ 'use' => [ 'Sitename' ] ]
6179 ];
6180
6185 public static function getDefaultMetaNamespace( $sitename ): string {
6186 return str_replace( ' ', '_', $sitename );
6187 }
6188
6196 public const MetaNamespaceTalk = [
6197 'default' => false,
6198 ];
6199
6206 public const CanonicalNamespaceNames = [
6207 'default' => NamespaceInfo::CANONICAL_NAMES,
6208 'type' => 'map',
6209 ];
6210
6237 public const ExtraNamespaces = [
6238 'default' => [],
6239 'type' => 'map',
6240 ];
6241
6250 public const ExtraGenderNamespaces = [
6251 'default' => [],
6252 'type' => 'map',
6253 ];
6254
6277 public const NamespaceAliases = [
6278 'default' => [],
6279 'type' => 'map',
6280 ];
6281
6308 public const LegalTitleChars = [
6309 'default' => ' %!"$&\'()*,\\-.\\/0-9:;=?@A-Z\\\\^_`a-z~\\x80-\\xFF+',
6310 'deprecated' => 'since 1.41; use Extension:TitleBlacklist to customize',
6311 ];
6312
6320 public const CapitalLinks = [
6321 'default' => true,
6322 ];
6323
6338 public const CapitalLinkOverrides = [
6339 'default' => [],
6340 'type' => 'map',
6341 ];
6342
6347 public const NamespacesWithSubpages = [
6348 'default' => [
6349 NS_TALK => true,
6350 NS_USER => true,
6351 NS_USER_TALK => true,
6352 NS_PROJECT => true,
6353 NS_PROJECT_TALK => true,
6354 NS_FILE_TALK => true,
6355 NS_MEDIAWIKI => true,
6356 NS_MEDIAWIKI_TALK => true,
6357 NS_TEMPLATE => true,
6358 NS_TEMPLATE_TALK => true,
6359 NS_HELP => true,
6360 NS_HELP_TALK => true,
6361 NS_CATEGORY_TALK => true
6362 ],
6363 'type' => 'map',
6364 ];
6365
6372 public const ContentNamespaces = [
6373 'default' => [ NS_MAIN ],
6374 'type' => 'list',
6375 ];
6376
6385 public const ShortPagesNamespaceExclusions = [
6386 'default' => [],
6387 'type' => 'list',
6388 ];
6389
6398 public const ExtraSignatureNamespaces = [
6399 'default' => [],
6400 'type' => 'list',
6401 ];
6402
6414 public const InvalidRedirectTargets = [
6415 'default' => [ 'Filepath', 'Mypage', 'Mytalk', 'Redirect', 'Mylog' ],
6416 'type' => 'list',
6417 ];
6418
6427 public const DisableHardRedirects = [
6428 'default' => false,
6429 ];
6430
6436 public const FixDoubleRedirects = [
6437 'default' => false,
6438 ];
6439
6440 // endregion -- End of title and interwiki settings
6441
6442 /***************************************************************************/
6443 // region Interwiki links and sites
6452 public const LocalInterwikis = [
6453 'default' => [],
6454 'type' => 'list',
6455 ];
6456
6460 public const InterwikiExpiry = [
6461 'default' => 10800,
6462 ];
6463
6484 public const InterwikiCache = [
6485 'default' => false,
6486 'type' => 'false|map',
6487 'mergeStrategy' => 'replace',
6488 ];
6489
6497 public const InterwikiScopes = [
6498 'default' => 3,
6499 ];
6500
6504 public const InterwikiFallbackSite = [
6505 'default' => 'wiki',
6506 ];
6507
6524 public const RedirectSources = [
6525 'default' => false,
6526 ];
6527
6533 public const SiteTypes = [
6534 'default' => [ 'mediawiki' => MediaWikiSite::class, ],
6535 'type' => 'map',
6536 ];
6537
6538 // endregion -- Interwiki links and sites
6539
6540 /***************************************************************************/
6541 // region Parser settings
6549 public const MaxTocLevel = [
6550 'default' => 999,
6551 ];
6552
6557 public const MaxPPNodeCount = [
6558 'default' => 1_000_000,
6559 ];
6560
6568 public const MaxTemplateDepth = [
6569 'default' => 100,
6570 ];
6571
6575 public const MaxPPExpandDepth = [
6576 'default' => 100,
6577 ];
6578
6589 public const UrlProtocols = [
6590 'default' => [
6591 'bitcoin:', 'ftp://', 'ftps://', 'geo:', 'git://', 'gopher://', 'http://',
6592 'https://', 'irc://', 'ircs://', 'magnet:', 'mailto:', 'matrix:', 'mms://',
6593 'news:', 'nntp://', 'redis://', 'sftp://', 'sip:', 'sips:', 'sms:',
6594 'ssh://', 'svn://', 'tel:', 'telnet://', 'urn:', 'wikipedia://', 'worldwind://',
6595 'xmpp:', '//',
6596 ],
6597 'type' => 'list',
6598 ];
6599
6603 public const CleanSignatures = [
6604 'default' => true,
6605 ];
6606
6610 public const AllowExternalImages = [
6611 'default' => false,
6612 ];
6613
6628 public const AllowExternalImagesFrom = [
6629 'default' => '',
6630 ];
6631
6643 public const EnableImageWhitelist = [
6644 'default' => false,
6645 ];
6646
6665 public const TidyConfig = [
6666 'default' => [],
6667 'type' => 'map',
6668 ];
6669
6678 public const ParsoidSettings = [
6679 'default' => [
6680 'useSelser' => true,
6681 ],
6682 'type' => 'map',
6683 ];
6684
6698 public const ParsoidExperimentalParserFunctionOutput = [
6699 'default' => false,
6700 'type' => 'boolean',
6701 ];
6702
6711 public const UseLegacyMediaStyles = [
6712 'default' => false,
6713 ];
6714
6721 public const RawHtml = [
6722 'default' => false,
6723 ];
6724
6734 public const ExternalLinkTarget = [
6735 'default' => false,
6736 ];
6737
6744 public const NoFollowLinks = [
6745 'default' => true,
6746 ];
6747
6753 public const NoFollowNsExceptions = [
6754 'default' => [],
6755 'type' => 'list',
6756 ];
6757
6771 public const NoFollowDomainExceptions = [
6772 'default' => [ 'mediawiki.org', ],
6773 'type' => 'list',
6774 ];
6775
6780 public const RegisterInternalExternals = [
6781 'default' => false,
6782 ];
6783
6790 public const ExternalLinksIgnoreDomains = [
6791 'default' => [],
6792 'type' => 'array',
6793 ];
6794
6798 public const AllowDisplayTitle = [
6799 'default' => true,
6800 ];
6801
6807 public const RestrictDisplayTitle = [
6808 'default' => true,
6809 ];
6810
6815 public const ExpensiveParserFunctionLimit = [
6816 'default' => 100,
6817 ];
6818
6823 public const PreprocessorCacheThreshold = [
6824 'default' => 1000,
6825 ];
6826
6830 public const EnableScaryTranscluding = [
6831 'default' => false,
6832 ];
6833
6839 public const TranscludeCacheExpiry = [
6840 'default' => 3600,
6841 ];
6842
6849 public const EnableMagicLinks = [
6850 'default' => [
6851 'ISBN' => false,
6852 'PMID' => false,
6853 'RFC' => false,
6854 ],
6855 'type' => 'map',
6856 ];
6857
6867 public const ParserEnableUserLanguage = [
6868 'default' => false,
6869 ];
6870
6871 // endregion -- end of parser settings
6872
6873 /***************************************************************************/
6874 // region Statistics and content analysis
6893 public const ArticleCountMethod = [
6894 'default' => 'link',
6895 ];
6896
6905 public const ActiveUserDays = [
6906 'default' => 30,
6907 ];
6908
6921 public const LearnerEdits = [
6922 'default' => 10,
6923 ];
6924
6930 public const LearnerMemberSince = [
6931 'default' => 4,
6932 ];
6933
6939 public const ExperiencedUserEdits = [
6940 'default' => 500,
6941 ];
6942
6948 public const ExperiencedUserMemberSince = [
6949 'default' => 30,
6950 ];
6951
6970 public const ManualRevertSearchRadius = [
6971 'default' => 15,
6972 'type' => 'integer',
6973 ];
6974
6987 public const RevertedTagMaxDepth = [
6988 'default' => 15,
6989 'type' => 'integer',
6990 ];
6991
6992 // endregion -- End of statistics and content analysis
6993
6994 /***************************************************************************/
6995 // region User accounts, authentication
7004 public const CentralIdLookupProviders = [
7005 'default' => [
7006 'local' => [
7007 'class' => LocalIdLookup::class,
7008 'services' => [
7009 'MainConfig',
7010 'DBLoadBalancerFactory',
7011 'HideUserUtils',
7012 ]
7013 ]
7014 ],
7015 'type' => 'map',
7016 ];
7017
7021 public const CentralIdLookupProvider = [
7022 'default' => 'local',
7023 'type' => 'string',
7024 ];
7025
7030 public const UserRegistrationProviders = [
7031 'default' => [
7032 LocalUserRegistrationProvider::TYPE => [
7033 'class' => LocalUserRegistrationProvider::class,
7034 'services' => [
7035 'ConnectionProvider',
7036 ],
7037 ],
7038 ],
7039 'type' => 'map',
7040 ];
7041
7106 public const PasswordPolicy = [
7107 'default' => [
7108 'policies' => [
7109 'bureaucrat' => [
7110 'MinimalPasswordLength' => 10,
7111 'MinimumPasswordLengthToLogin' => 1,
7112 ],
7113 'sysop' => [
7114 'MinimalPasswordLength' => 10,
7115 'MinimumPasswordLengthToLogin' => 1,
7116 ],
7117 'interface-admin' => [
7118 'MinimalPasswordLength' => 10,
7119 'MinimumPasswordLengthToLogin' => 1,
7120 ],
7121 'bot' => [
7122 'MinimalPasswordLength' => 10,
7123 'MinimumPasswordLengthToLogin' => 1,
7124 ],
7125 'default' => [
7126 'MinimalPasswordLength' => [ 'value' => 8, 'suggestChangeOnLogin' => true ],
7127 'PasswordCannotBeSubstringInUsername' => [
7128 'value' => true,
7129 'suggestChangeOnLogin' => true
7130 ],
7131 'PasswordCannotMatchDefaults' => [ 'value' => true, 'suggestChangeOnLogin' => true ],
7132 'MaximalPasswordLength' => [ 'value' => 4096, 'suggestChangeOnLogin' => true ],
7133 'PasswordNotInCommonList' => [ 'value' => true, 'suggestChangeOnLogin' => true ],
7134 ],
7135 ],
7136 'checks' => [
7137 'MinimalPasswordLength' => [ PasswordPolicyChecks::class, 'checkMinimalPasswordLength' ],
7138 'MinimumPasswordLengthToLogin' => [ PasswordPolicyChecks::class, 'checkMinimumPasswordLengthToLogin' ],
7139 'PasswordCannotBeSubstringInUsername' => [ PasswordPolicyChecks::class, 'checkPasswordCannotBeSubstringInUsername' ],
7140 'PasswordCannotMatchDefaults' => [ PasswordPolicyChecks::class, 'checkPasswordCannotMatchDefaults' ],
7141 'MaximalPasswordLength' => [ PasswordPolicyChecks::class, 'checkMaximalPasswordLength' ],
7142 'PasswordNotInCommonList' => [ PasswordPolicyChecks::class, 'checkPasswordNotInCommonList' ],
7143 ],
7144 ],
7145 'type' => 'map',
7146 'mergeStrategy' => 'array_replace_recursive',
7147 ];
7148
7168 public const AuthManagerConfig = [
7169 'default' => null,
7170 'type' => '?map',
7171 ];
7172
7177 public const AuthManagerAutoConfig = [
7178 'default' => [
7179 'preauth' => [
7180 ThrottlePreAuthenticationProvider::class => [
7181 'class' => ThrottlePreAuthenticationProvider::class,
7182 'sort' => 0,
7183 ],
7184 ],
7185 'primaryauth' => [
7186 // TemporaryPasswordPrimaryAuthenticationProvider should come before
7187 // any other PasswordAuthenticationRequest-based
7188 // PrimaryAuthenticationProvider (or at least any that might return
7189 // FAIL rather than ABSTAIN for a wrong password), or password reset
7190 // won't work right. Do not remove this (or change the key) or
7191 // auto-configuration of other such providers in extensions will
7192 // probably auto-insert themselves in the wrong place.
7193 TemporaryPasswordPrimaryAuthenticationProvider::class => [
7194 'class' => TemporaryPasswordPrimaryAuthenticationProvider::class,
7195 'services' => [
7196 'DBLoadBalancerFactory',
7197 'UserOptionsLookup',
7198 ],
7199 'args' => [ [
7200 // Fall through to LocalPasswordPrimaryAuthenticationProvider
7201 'authoritative' => false,
7202 ] ],
7203 'sort' => 0,
7204 ],
7205 LocalPasswordPrimaryAuthenticationProvider::class => [
7206 'class' => LocalPasswordPrimaryAuthenticationProvider::class,
7207 'services' => [
7208 'DBLoadBalancerFactory',
7209 ],
7210 'args' => [ [
7211 // Last one should be authoritative, or else the user will get
7212 // a less-than-helpful error message (something like "supplied
7213 // authentication info not supported" rather than "wrong
7214 // password") if it too fails.
7215 'authoritative' => true,
7216 ] ],
7217 'sort' => 100,
7218 ],
7219 ],
7220 'secondaryauth' => [
7221 CheckBlocksSecondaryAuthenticationProvider::class => [
7222 'class' => CheckBlocksSecondaryAuthenticationProvider::class,
7223 'sort' => 0,
7224 ],
7225 ResetPasswordSecondaryAuthenticationProvider::class => [
7226 'class' => ResetPasswordSecondaryAuthenticationProvider::class,
7227 'sort' => 100,
7228 ],
7229 // Linking during login is experimental, enable at your own risk - T134952
7230 // MediaWiki\Auth\ConfirmLinkSecondaryAuthenticationProvider::class => [
7231 // 'class' => MediaWiki\Auth\ConfirmLinkSecondaryAuthenticationProvider::class,
7232 // 'sort' => 100,
7233 // ],
7234 EmailNotificationSecondaryAuthenticationProvider::class => [
7235 'class' => EmailNotificationSecondaryAuthenticationProvider::class,
7236 'services' => [
7237 'DBLoadBalancerFactory',
7238 ],
7239 'sort' => 200,
7240 ],
7241 ],
7242 ],
7243 'type' => 'map',
7244 'mergeStrategy' => 'array_plus_2d',
7245 ];
7246
7257 public const RememberMe = [
7258 'default' => 'choose',
7259 'type' => 'string',
7260 ];
7261
7299 public const ReauthenticateTime = [
7300 'default' => [ 'default' => 3600, ],
7301 'type' => 'map',
7302 'additionalProperties' => [ 'type' => 'integer', ],
7303 ];
7304
7319 public const AllowSecuritySensitiveOperationIfCannotReauthenticate = [
7320 'default' => [ 'default' => true, ],
7321 'type' => 'map',
7322 'additionalProperties' => [ 'type' => 'boolean', ],
7323 ];
7324
7335 public const ChangeCredentialsBlacklist = [
7336 'default' => [
7337 TemporaryPasswordAuthenticationRequest::class,
7338 ],
7339 'type' => 'list',
7340 'items' => [ 'type' => 'string', ],
7341 ];
7342
7353 public const RemoveCredentialsBlacklist = [
7354 'default' => [
7355 PasswordAuthenticationRequest::class,
7356 ],
7357 'type' => 'list',
7358 'items' => [ 'type' => 'string', ],
7359 ];
7360
7367 public const InvalidPasswordReset = [
7368 'default' => true,
7369 ];
7370
7379 public const PasswordDefault = [
7380 'default' => 'pbkdf2',
7381 ];
7382
7410 public const PasswordConfig = [
7411 'default' => [
7412 'A' => [
7413 'class' => MWOldPassword::class,
7414 ],
7415 'B' => [
7416 'class' => MWSaltedPassword::class,
7417 ],
7418 'pbkdf2-legacyA' => [
7419 'class' => LayeredParameterizedPassword::class,
7420 'types' => [
7421 'A',
7422 'pbkdf2',
7423 ],
7424 ],
7425 'pbkdf2-legacyB' => [
7426 'class' => LayeredParameterizedPassword::class,
7427 'types' => [
7428 'B',
7429 'pbkdf2',
7430 ],
7431 ],
7432 'bcrypt' => [
7433 'class' => BcryptPassword::class,
7434 'cost' => 9,
7435 ],
7436 'pbkdf2' => [
7437 'class' => Pbkdf2PasswordUsingOpenSSL::class,
7438 'algo' => 'sha512',
7439 'cost' => '30000',
7440 'length' => '64',
7441 ],
7442 'argon2' => [
7443 'class' => Argon2Password::class,
7444
7445 // Algorithm used:
7446 // * 'argon2i' is optimized against side-channel attacks
7447 // * 'argon2id' is optimized against both side-channel and GPU cracking
7448 // * 'auto' to use the best available algorithm. If you're using more than one server, be
7449 // careful when you're mixing PHP versions because newer PHP might generate hashes that
7450 // older versions would not understand.
7451 'algo' => 'auto',
7452
7453 // The parameters below are the same as options accepted by password_hash().
7454 // Set them to override that function's defaults.
7455 //
7456 // 'memory_cost' => PASSWORD_ARGON2_DEFAULT_MEMORY_COST,
7457 // 'time_cost' => PASSWORD_ARGON2_DEFAULT_TIME_COST,
7458 // 'threads' => PASSWORD_ARGON2_DEFAULT_THREADS,
7459 ],
7460 ],
7461 'type' => 'map',
7462 ];
7463
7470 public const PasswordResetRoutes = [
7471 'default' => [
7472 'username' => true,
7473 'email' => true,
7474 ],
7475 'type' => 'map',
7476 ];
7477
7481 public const MaxSigChars = [
7482 'default' => 255,
7483 ];
7484
7497 public const SignatureValidation = [
7498 'default' => 'warning',
7499 ];
7500
7507 public const SignatureAllowedLintErrors = [
7508 'default' => [ 'obsolete-tag', ],
7509 'type' => 'list',
7510 ];
7511
7516 public const MaxNameChars = [
7517 'default' => 255,
7518 ];
7519
7526 public const ReservedUsernames = [
7527 'default' => [
7528 'MediaWiki default', // Default 'Main Page' and MediaWiki: message pages
7529 'Conversion script', // Used for the old Wikipedia software upgrade
7530 'Maintenance script', // Maintenance scripts which perform editing, image import script
7531 'Template namespace initialisation script', // Used in 1.2->1.3 upgrade
7532 'ScriptImporter', // Default user name used by maintenance/importSiteScripts.php
7533 'Delete page script', // Default user name used by maintenance/deleteBatch.php
7534 'Move page script', // Default user name used by maintenance/deleteBatch.php
7535 'Command line script', // Default user name used by maintenance/undelete.php
7536 'Unknown user', // Used in WikiImporter & RevisionStore for revisions with no author and in User for invalid user id
7537 'msg:double-redirect-fixer', // Automatic double redirect fix
7538 'msg:usermessage-editor', // Default user for leaving user messages
7539 'msg:proxyblocker', // For $wgProxyList and Special:Blockme (removed in 1.22)
7540 'msg:sorbs', // For $wgEnableDnsBlacklist etc.
7541 'msg:spambot_username', // Used by cleanupSpam.php
7542 'msg:autochange-username', // Used by anon category RC entries (removed in 1.44)
7543 ],
7544 'type' => 'list',
7545 ];
7546
7563 public const DefaultUserOptions = [
7564 'default' =>
7565 // This array should be sorted by key
7566 [
7567 'ccmeonemails' => 0,
7568 'date' => 'default',
7569 'diffonly' => 0,
7570 'diff-type' => 'table',
7571 'disablemail' => 0,
7572 'editfont' => 'monospace',
7573 'editondblclick' => 0,
7574 'editrecovery' => 0,
7575 'editsectiononrightclick' => 0,
7576 'email-allow-new-users' => 1,
7577 'enotifminoredits' => 0,
7578 'enotifrevealaddr' => 0,
7579 'enotifusertalkpages' => 1,
7580 'enotifwatchlistpages' => 1,
7581 'extendwatchlist' => 1,
7582 'fancysig' => 0,
7583 'forceeditsummary' => 0,
7584 'forcesafemode' => 0,
7585 'gender' => 'unknown',
7586 'hidecategorization' => 1,
7587 'hideminor' => 0,
7588 'hidepatrolled' => 0,
7589 'imagesize' => 2,
7590 'minordefault' => 0,
7591 'newpageshidepatrolled' => 0,
7592 'nickname' => '',
7593 'norollbackdiff' => 0,
7594 'prefershttps' => 1,
7595 'previewonfirst' => 0,
7596 'previewontop' => 1,
7597 'pst-cssjs' => 1,
7598 'rcdays' => 7,
7599 'rcenhancedfilters-disable' => 0,
7600 'rclimit' => 50,
7601 'requireemail' => 0,
7602 'search-match-redirect' => true,
7603 'search-special-page' => 'Search',
7604 'search-thumbnail-extra-namespaces' => true,
7605 'searchlimit' => 20,
7606 'showhiddencats' => 0,
7607 'shownumberswatching' => 1,
7608 'showrollbackconfirmation' => 0,
7609 'skin' => false,
7610 'skin-responsive' => 1,
7611 'thumbsize' => 5,
7612 'underline' => 2,
7613 'useeditwarning' => 1,
7614 'uselivepreview' => 0,
7615 'usenewrc' => 1,
7616 'watchcreations' => 1,
7617 'watchcreations-expiry' => 'infinite',
7618 'watchdefault' => 1,
7619 'watchdefault-expiry' => 'infinite',
7620 'watchdeletion' => 0,
7621 'watchlistdays' => 7,
7622 'watchlisthideanons' => 0,
7623 'watchlisthidebots' => 0,
7624 'watchlisthidecategorization' => 1,
7625 'watchlisthideliu' => 0,
7626 'watchlisthideminor' => 0,
7627 'watchlisthideown' => 0,
7628 'watchlisthidepatrolled' => 0,
7629 'watchlistreloadautomatically' => 0,
7630 'watchlistunwatchlinks' => 0,
7631 'watchmoves' => 0,
7632 'watchrollback' => 0,
7633 'watchuploads' => 1,
7634 'watchrollback-expiry' => 'infinite',
7635 'watchstar-expiry' => 'infinite',
7636 'wlenhancedfilters-disable' => 0,
7637 'wllimit' => 250,
7638 ],
7639 'type' => 'map',
7640 ];
7641
7673 public const ConditionalUserOptions = [
7674 'default' => [],
7675 'type' => 'map',
7676 ];
7677
7681 public const HiddenPrefs = [
7682 'default' => [],
7683 'type' => 'list',
7684 ];
7685
7689 public const UserJsPrefLimit = [
7690 'default' => 100,
7691 'type' => 'int',
7692 ];
7693
7700 public const InvalidUsernameCharacters = [
7701 'default' => '@:>=',
7702 ];
7703
7713 public const UserrightsInterwikiDelimiter = [
7714 'default' => '@',
7715 ];
7716
7725 public const SecureLogin = [
7726 'default' => false,
7727 ];
7728
7738 public const AuthenticationTokenVersion = [
7739 'default' => null,
7740 'type' => '?string',
7741 ];
7742
7752 public const SessionProviders = [
7753 'type' => 'map',
7754 'default' => [
7755 \MediaWiki\Session\CookieSessionProvider::class => [
7756 'class' => \MediaWiki\Session\CookieSessionProvider::class,
7757 'args' => [ [
7758 'priority' => 30,
7759 ] ],
7760 'services' => [
7761 'JwtCodec',
7762 'UrlUtils',
7763 ],
7764 ],
7765 \MediaWiki\Session\BotPasswordSessionProvider::class => [
7766 'class' => \MediaWiki\Session\BotPasswordSessionProvider::class,
7767 'args' => [ [
7768 'priority' => 75,
7769 ] ],
7770 'services' => [
7771 'GrantsInfo'
7772 ],
7773 ],
7774 ],
7775 ];
7776
7851 public const AutoCreateTempUser = [
7852 'properties' => [
7853 'known' => [ 'type' => 'bool', 'default' => false ],
7854 'enabled' => [ 'type' => 'bool', 'default' => false ],
7855 'actions' => [ 'type' => 'list', 'default' => [ 'edit' ] ],
7856 'genPattern' => [ 'type' => 'string', 'default' => '~$1' ],
7857 'matchPattern' => [ 'type' => 'string|array|null', 'default' => null ],
7858 'reservedPattern' => [ 'type' => 'string|null', 'default' => '~$1' ],
7859 'serialProvider' => [ 'type' => 'object', 'default' => [ 'type' => 'local', 'useYear' => true ] ],
7860 'serialMapping' => [ 'type' => 'object', 'default' => [ 'type' => 'readable-numeric' ] ],
7861 'expireAfterDays' => [ 'type' => 'int|null', 'default' => 90 ],
7862 'notifyBeforeExpirationDays' => [ 'type' => 'int|null', 'default' => 10 ],
7863 ],
7864 'type' => 'object',
7865 ];
7866
7867 // endregion -- end user accounts
7868
7869 /***************************************************************************/
7870 // region User rights, access control and monitoring
7874 public const AutoblockExemptions = [
7875 'default' => [],
7876 'type' => 'array',
7877 ];
7878
7882 public const AutoblockExpiry = [
7883 'default' => 86400,
7884 ];
7885
7893 public const BlockAllowsUTEdit = [
7894 'default' => true,
7895 ];
7896
7911 public const BlockCIDRLimit = [
7912 'default' => [
7913 'IPv4' => 16,
7914 'IPv6' => 19,
7915 ],
7916 'type' => 'map',
7917 ];
7918
7924 public const BlockDisablesLogin = [
7925 'default' => false,
7926 ];
7927
7933 public const EnableMultiBlocks = [
7934 'default' => false,
7935 'type' => 'boolean',
7936 ];
7937
7957 public const WhitelistRead = [
7958 'default' => false,
7959 ];
7960
7988 public const WhitelistReadRegexp = [
7989 'default' => false,
7990 ];
7991
7996 public const EmailConfirmToEdit = [
7997 'default' => false,
7998 ];
7999
8004 public const HideIdentifiableRedirects = [
8005 'default' => true,
8006 ];
8007
8032 public const GroupPermissions = [
8033 'type' => 'map',
8034 'additionalProperties' => [
8035 'type' => 'map',
8036 'additionalProperties' => [ 'type' => 'boolean', ],
8037 ],
8038 'mergeStrategy' => 'array_plus_2d',
8039 'default' => [
8040 '*' => [
8041 'createaccount' => true,
8042 'read' => true,
8043 'edit' => true,
8044 'createpage' => true,
8045 'createtalk' => true,
8046 'viewmyprivateinfo' => true,
8047 'editmyprivateinfo' => true,
8048 'editmyoptions' => true,
8049 ],
8050 'user' => [
8051 'move' => true,
8052 'move-subpages' => true,
8053 'move-rootuserpages' => true,
8054 'move-categorypages' => true,
8055 'movefile' => true,
8056 'read' => true,
8057 'edit' => true,
8058 'createpage' => true,
8059 'createtalk' => true,
8060 'upload' => true,
8061 'reupload' => true,
8062 'reupload-shared' => true,
8063 'minoredit' => true,
8064 'editmyusercss' => true,
8065 'editmyuserjson' => true,
8066 'editmyuserjs' => true,
8067 'editmyuserjsredirect' => true,
8068 'sendemail' => true,
8069 'applychangetags' => true,
8070 'changetags' => true,
8071 'viewmywatchlist' => true,
8072 'editmywatchlist' => true,
8073 ],
8074 'autoconfirmed' => [
8075 'autoconfirmed' => true,
8076 'editsemiprotected' => true,
8077 ],
8078 'bot' => [
8079 'bot' => true,
8080 'autoconfirmed' => true,
8081 'editsemiprotected' => true,
8082 'nominornewtalk' => true,
8083 'autopatrol' => true,
8084 'suppressredirect' => true,
8085 'apihighlimits' => true,
8086 ],
8087 'sysop' => [
8088 'block' => true,
8089 'createaccount' => true,
8090 'delete' => true,
8091 'bigdelete' => true,
8092 'deletedhistory' => true,
8093 'deletedtext' => true,
8094 'undelete' => true,
8095 'editcontentmodel' => true,
8096 'editinterface' => true,
8097 'editsitejson' => true,
8098 'edituserjson' => true,
8099 'import' => true,
8100 'importupload' => true,
8101 'move' => true,
8102 'move-subpages' => true,
8103 'move-rootuserpages' => true,
8104 'move-categorypages' => true,
8105 'patrol' => true,
8106 'autopatrol' => true,
8107 'protect' => true,
8108 'editprotected' => true,
8109 'rollback' => true,
8110 'upload' => true,
8111 'reupload' => true,
8112 'reupload-shared' => true,
8113 'unwatchedpages' => true,
8114 'autoconfirmed' => true,
8115 'editsemiprotected' => true,
8116 'ipblock-exempt' => true,
8117 'blockemail' => true,
8118 'markbotedits' => true,
8119 'apihighlimits' => true,
8120 'browsearchive' => true,
8121 'noratelimit' => true,
8122 'movefile' => true,
8123 'unblockself' => true,
8124 'suppressredirect' => true,
8125 'mergehistory' => true,
8126 'managechangetags' => true,
8127 'deletechangetags' => true,
8128 ],
8129 'interface-admin' => [
8130 'editinterface' => true,
8131 'editsitecss' => true,
8132 'editsitejson' => true,
8133 'editsitejs' => true,
8134 'editusercss' => true,
8135 'edituserjson' => true,
8136 'edituserjs' => true,
8137 ],
8138 'bureaucrat' => [
8139 'userrights' => true,
8140 'noratelimit' => true,
8141 'renameuser' => true,
8142 ],
8143 'suppress' => [
8144 'hideuser' => true,
8145 'suppressrevision' => true,
8146 'viewsuppressed' => true,
8147 'suppressionlog' => true,
8148 'deleterevision' => true,
8149 'deletelogentry' => true,
8150 ],
8151 ],
8152 ];
8153
8161 public const PrivilegedGroups = [
8162 'default' => [
8163 'bureaucrat',
8164 'interface-admin',
8165 'suppress',
8166 'sysop',
8167 ],
8168 'type' => 'list',
8169 ];
8170
8180 public const RevokePermissions = [
8181 'default' => [],
8182 'type' => 'map',
8183 'mergeStrategy' => 'array_plus_2d',
8184 ];
8185
8205 public const GroupInheritsPermissions = [
8206 'default' => [],
8207 'type' => 'map',
8208 'additionalProperties' => [ 'type' => 'string', ],
8209 ];
8210
8214 public const ImplicitGroups = [
8215 'default' => [ '*', 'user', 'autoconfirmed' ],
8216 'type' => 'list',
8217 ];
8218
8243 public const GroupsAddToSelf = [
8244 'default' => [],
8245 'type' => 'map',
8246 ];
8247
8251 public const GroupsRemoveFromSelf = [
8252 'default' => [],
8253 'type' => 'map',
8254 ];
8255
8277 public const RestrictedGroups = [
8278 'default' => [],
8279 'type' => 'map',
8280 ];
8281
8294 public const UserRequirementsPrivateConditions = [
8295 'default' => [],
8296 'type' => 'list',
8297 ];
8298
8307 public const RestrictionTypes = [
8308 'default' => [ 'create', 'edit', 'move', 'upload' ],
8309 'type' => 'list',
8310 ];
8311
8323 public const RestrictionLevels = [
8324 'default' => [ '', 'autoconfirmed', 'sysop' ],
8325 'type' => 'list',
8326 ];
8327
8337 public const CascadingRestrictionLevels = [
8338 'default' => [ 'sysop', ],
8339 'type' => 'list',
8340 ];
8341
8354 public const SemiprotectedRestrictionLevels = [
8355 'default' => [ 'autoconfirmed', ],
8356 'type' => 'list',
8357 ];
8358
8366 public const NamespaceProtection = [
8367 'default' => [],
8368 'type' => 'map',
8369 ];
8370
8380 public const NonincludableNamespaces = [
8381 'default' => [],
8382 'type' => 'map',
8383 ];
8384
8408 public const AutoConfirmAge = [
8409 'default' => 0,
8410 ];
8411
8423 public const AutoConfirmCount = [
8424 'default' => 0,
8425 ];
8426
8484 public const Autopromote = [
8485 'default' => [
8486 'autoconfirmed' => [ '&',
8487 [ APCOND_EDITCOUNT, null ], // NOTE: null means $wgAutoConfirmCount
8488 [ APCOND_AGE, null ], // NOTE: null means AutoConfirmAge
8489 ],
8490 ],
8491 'type' => 'map',
8492 ];
8493
8513 public const AutopromoteOnce = [
8514 'default' => [ 'onEdit' => [], ],
8515 'type' => 'map',
8516 ];
8517
8523 public const AutopromoteOnceLogInRC = [
8524 'default' => true,
8525 ];
8526
8534 public const AutopromoteOnceRCExcludedGroups = [
8535 'default' => [],
8536 'type' => 'array',
8537 ];
8538
8568 public const AddGroups = [
8569 'default' => [],
8570 'type' => 'map',
8571 'mergeStrategy' => 'array_merge_recursive',
8572 ];
8573
8577 public const RemoveGroups = [
8578 'default' => [],
8579 'type' => 'map',
8580 'mergeStrategy' => 'array_merge_recursive',
8581 ];
8582
8593 public const AvailableRights = [
8594 'default' => [],
8595 'type' => 'list',
8596 'items' => [ 'type' => 'string', ],
8597 ];
8598
8612 public const ImplicitRights = [
8613 'default' => [],
8614 'type' => 'list',
8615 'items' => [ 'type' => 'string', ]
8616 ];
8617
8622 public const DeleteRevisionsLimit = [
8623 'default' => 0,
8624 ];
8625
8631 public const DeleteRevisionsBatchSize = [
8632 'default' => 1000,
8633 ];
8634
8644 public const HideUserContribLimit = [
8645 'default' => 1000,
8646 ];
8647
8674 public const AccountCreationThrottle = [
8675 'default' => [ [
8676 'count' => 0,
8677 'seconds' => 86400,
8678 ] ],
8679 'type' => 'int|list',
8680 ];
8681
8707 public const TempAccountCreationThrottle = [
8708 'default' => [
8709 [
8710 'count' => 1,
8711 'seconds' => 600,
8712 ],
8713 [
8714 'count' => 6,
8715 'seconds' => 86400,
8716 ]
8717 ],
8718 'type' => 'list',
8719 ];
8720
8756 public const TempAccountNameAcquisitionThrottle = [
8757 'default' => [ [
8758 'count' => 60,
8759 'seconds' => 86400,
8760 ] ],
8761 'type' => 'list',
8762 ];
8763
8774 public const SpamRegex = [
8775 'default' => [],
8776 'type' => 'list',
8777 ];
8778
8782 public const SummarySpamRegex = [
8783 'default' => [],
8784 'type' => 'list',
8785 ];
8786
8793 public const EnableDnsBlacklist = [
8794 'default' => false,
8795 ];
8796
8821 public const DnsBlacklistUrls = [
8822 'default' => [],
8823 'type' => 'list',
8824 ];
8825
8834 public const ProxyList = [
8835 'default' => [],
8836 'type' => 'string|list',
8837 ];
8838
8843 public const ProxyWhitelist = [
8844 'default' => [],
8845 'type' => 'list',
8846 ];
8847
8855 public const SoftBlockRanges = [
8856 'default' => [],
8857 'type' => 'list',
8858 'items' => [ 'type' => 'string', ],
8859 ];
8860
8866 public const ApplyIpBlocksToXff = [
8867 'default' => false,
8868 ];
8869
8912 public const RateLimits = [
8913 'default' => [
8914 // Page edits
8915 'edit' => [
8916 'ip' => [ 8, 60 ],
8917 'newbie' => [ 8, 60 ],
8918 'user' => [ 90, 60 ],
8919 ],
8920 // Page moves
8921 'move' => [
8922 'newbie' => [ 2, 120 ],
8923 'user' => [ 8, 60 ],
8924 ],
8925 // File uploads
8926 'upload' => [
8927 'ip' => [ 8, 60 ],
8928 'newbie' => [ 8, 60 ],
8929 ],
8930 // Page rollbacks
8931 'rollback' => [
8932 'user' => [ 10, 60 ],
8933 'newbie' => [ 5, 120 ]
8934 ],
8935 // Triggering password resets emails
8936 'mailpassword' => [
8937 'ip' => [ 5, 3600 ],
8938 ],
8939 // Emailing other users using MediaWiki
8940 'sendemail' => [
8941 'ip' => [ 5, 86400 ],
8942 'newbie' => [ 5, 86400 ],
8943 'user' => [ 20, 86400 ],
8944 ],
8945 'changeemail' => [
8946 'ip-all' => [ 10, 3600 ],
8947 'user' => [ 4, 86400 ]
8948 ],
8949 // since 1.33 - rate limit email confirmations
8950 'confirmemail' => [
8951 'ip-all' => [ 10, 3600 ],
8952 'user' => [ 4, 86400 ]
8953 ],
8954 // Purging pages
8955 'purge' => [
8956 'ip' => [ 30, 60 ],
8957 'user' => [ 30, 60 ],
8958 ],
8959 // Purges of link tables
8960 'linkpurge' => [
8961 'ip' => [ 30, 60 ],
8962 'user' => [ 30, 60 ],
8963 ],
8964 // Files rendered via thumb.php or thumb_handler.php
8965 'renderfile' => [
8966 'ip' => [ 700, 30 ],
8967 'user' => [ 700, 30 ],
8968 ],
8969 // Same as above but for non-standard thumbnails
8970 'renderfile-nonstandard' => [
8971 'ip' => [ 70, 30 ],
8972 'user' => [ 70, 30 ],
8973 ],
8974 // Stashing edits into cache before save
8975 'stashedit' => [
8976 'ip' => [ 30, 60 ],
8977 'newbie' => [ 30, 60 ],
8978 ],
8979 // Stash base HTML for VE edits
8980 'stashbasehtml' => [
8981 'ip' => [ 5, 60 ],
8982 'newbie' => [ 5, 60 ],
8983 ],
8984 // Adding or removing change tags
8985 'changetags' => [
8986 'ip' => [ 8, 60 ],
8987 'newbie' => [ 8, 60 ],
8988 ],
8989 // Changing the content model of a page
8990 'editcontentmodel' => [
8991 'newbie' => [ 2, 120 ],
8992 'user' => [ 8, 60 ],
8993 ],
8994 ],
8995 'type' => 'map',
8996 'mergeStrategy' => 'array_plus_2d',
8997 ];
8998
9004 public const RateLimitsExcludedIPs = [
9005 'default' => [],
9006 'type' => 'list',
9007 ];
9008
9014 public const PutIPinRC = [
9015 'default' => true,
9016 ];
9017
9022 public const QueryPageDefaultLimit = [
9023 'default' => 50,
9024 ];
9025
9057 public const ExternalQuerySources = [
9058 'default' => [],
9059 'type' => 'map',
9060 'additionalProperties' => [
9061 'type' => 'object',
9062 'properties' => [
9063 'enabled' => [
9064 'type' => 'boolean',
9065 'default' => false,
9066 ],
9067 'url' => [
9068 'type' => 'string',
9069 'format' => 'uri',
9070 ],
9071 'timeout' => [
9072 'type' => 'integer',
9073 'default' => 10,
9074 ],
9075 ],
9076 'required' => [ 'enabled', 'url' ],
9077 'additionalProperties' => false,
9078 ],
9079 ];
9080
9093 public const PasswordAttemptThrottle = [
9094 'default' => [
9095 // Short term limit
9096 [ 'count' => 5, 'seconds' => 300 ],
9097 // Long term limit. We need to balance the risk
9098 // of somebody using this as a DoS attack to lock someone
9099 // out of their account, and someone doing a brute force attack.
9100 [ 'count' => 150, 'seconds' => 60 * 60 * 48 ],
9101 ],
9102 'type' => 'list',
9103 ];
9104
9115 public const GrantPermissions = [
9116 'default' => [
9117 'basic' => [
9118 'autocreateaccount' => true,
9119 'autoconfirmed' => true,
9120 'autopatrol' => true,
9121 'editsemiprotected' => true,
9122 'ipblock-exempt' => true,
9123 'nominornewtalk' => true,
9124 'patrolmarks' => true,
9125 'read' => true,
9126 'unwatchedpages' => true,
9127 ],
9128 'highvolume' => [
9129 'bot' => true,
9130 'apihighlimits' => true,
9131 'noratelimit' => true,
9132 'markbotedits' => true,
9133 ],
9134 'import' => [
9135 'import' => true,
9136 'importupload' => true,
9137 ],
9138 'editpage' => [
9139 'edit' => true,
9140 'minoredit' => true,
9141 'applychangetags' => true,
9142 'changetags' => true,
9143 'editcontentmodel' => true,
9144 'pagelang' => true,
9145 ],
9146 'editprotected' => [
9147 'edit' => true,
9148 'minoredit' => true,
9149 'applychangetags' => true,
9150 'changetags' => true,
9151 'editcontentmodel' => true,
9152 'editprotected' => true,
9153 ],
9154 'editmycssjs' => [
9155 'edit' => true,
9156 'minoredit' => true,
9157 'applychangetags' => true,
9158 'changetags' => true,
9159 'editcontentmodel' => true,
9160 'editmyusercss' => true,
9161 'editmyuserjson' => true,
9162 'editmyuserjs' => true,
9163 ],
9164 'editmyoptions' => [
9165 'editmyoptions' => true,
9166 'editmyuserjson' => true,
9167 ],
9168 'editinterface' => [
9169 'edit' => true,
9170 'minoredit' => true,
9171 'applychangetags' => true,
9172 'changetags' => true,
9173 'editcontentmodel' => true,
9174 'editinterface' => true,
9175 'edituserjson' => true,
9176 'editsitejson' => true,
9177 ],
9178 'editsiteconfig' => [
9179 'edit' => true,
9180 'minoredit' => true,
9181 'applychangetags' => true,
9182 'changetags' => true,
9183 'editcontentmodel' => true,
9184 'editinterface' => true,
9185 'edituserjson' => true,
9186 'editsitejson' => true,
9187 'editusercss' => true,
9188 'edituserjs' => true,
9189 'editsitecss' => true,
9190 'editsitejs' => true,
9191 ],
9192 'createeditmovepage' => [
9193 'edit' => true,
9194 'minoredit' => true,
9195 'applychangetags' => true,
9196 'changetags' => true,
9197 'editcontentmodel' => true,
9198 'createpage' => true,
9199 'createtalk' => true,
9200 'delete-redirect' => true,
9201 'move' => true,
9202 'move-rootuserpages' => true,
9203 'move-subpages' => true,
9204 'move-categorypages' => true,
9205 'suppressredirect' => true,
9206 ],
9207 'uploadfile' => [
9208 'upload' => true,
9209 'reupload-own' => true,
9210 ],
9211 'uploadeditmovefile' => [
9212 'upload' => true,
9213 'reupload-own' => true,
9214 'reupload' => true,
9215 'reupload-shared' => true,
9216 'upload_by_url' => true,
9217 'movefile' => true,
9218 'suppressredirect' => true,
9219 ],
9220 'patrol' => [
9221 'patrol' => true,
9222 ],
9223 'rollback' => [
9224 'rollback' => true,
9225 ],
9226 'blockusers' => [
9227 'block' => true,
9228 'blockemail' => true,
9229 ],
9230 'viewdeleted' => [
9231 'browsearchive' => true,
9232 'deletedhistory' => true,
9233 'deletedtext' => true,
9234 ],
9235 'viewrestrictedlogs' => [
9236 'suppressionlog' => true,
9237 ],
9238 'delete' => [
9239 'edit' => true,
9240 'minoredit' => true,
9241 'applychangetags' => true,
9242 'changetags' => true,
9243 'editcontentmodel' => true,
9244 'browsearchive' => true,
9245 'deletedhistory' => true,
9246 'deletedtext' => true,
9247 'delete' => true,
9248 'bigdelete' => true,
9249 'deletelogentry' => true,
9250 'deleterevision' => true,
9251 'undelete' => true,
9252 ],
9253 'oversight' => [
9254 'suppressrevision' => true,
9255 'viewsuppressed' => true,
9256 ],
9257 'protect' => [
9258 'edit' => true,
9259 'minoredit' => true,
9260 'applychangetags' => true,
9261 'changetags' => true,
9262 'editcontentmodel' => true,
9263 'editprotected' => true,
9264 'protect' => true,
9265 ],
9266 'viewmywatchlist' => [
9267 'viewmywatchlist' => true,
9268 ],
9269 'editmywatchlist' => [
9270 'editmywatchlist' => true,
9271 ],
9272 'sendemail' => [
9273 'sendemail' => true,
9274 ],
9275 'createaccount' => [
9276 'createaccount' => true,
9277 ],
9278 'privateinfo' => [
9279 'viewmyprivateinfo' => true,
9280 ],
9281 'mergehistory' => [
9282 'mergehistory' => true,
9283 ],
9284 ],
9285 'type' => 'map',
9286 'mergeStrategy' => 'array_plus_2d',
9287 'additionalProperties' => [
9288 'type' => 'map',
9289 'additionalProperties' => [ 'type' => 'boolean', ],
9290 ],
9291 ];
9292
9303 public const GrantPermissionGroups = [
9304 'default' =>
9305 [
9306 // Hidden grants are implicitly present
9307 'basic' => 'hidden',
9308
9309 'editpage' => 'page-interaction',
9310 'createeditmovepage' => 'page-interaction',
9311 'editprotected' => 'page-interaction',
9312 'patrol' => 'page-interaction',
9313
9314 'uploadfile' => 'file-interaction',
9315 'uploadeditmovefile' => 'file-interaction',
9316
9317 'sendemail' => 'email',
9318
9319 'viewmywatchlist' => 'watchlist-interaction',
9320 'editviewmywatchlist' => 'watchlist-interaction',
9321
9322 'editmycssjs' => 'customization',
9323 'editmyoptions' => 'customization',
9324
9325 'editinterface' => 'administration',
9326 'editsiteconfig' => 'administration',
9327 'rollback' => 'administration',
9328 'blockusers' => 'administration',
9329 'delete' => 'administration',
9330 'viewdeleted' => 'administration',
9331 'viewrestrictedlogs' => 'administration',
9332 'protect' => 'administration',
9333 'oversight' => 'administration',
9334 'createaccount' => 'administration',
9335 'mergehistory' => 'administration',
9336 'import' => 'administration',
9337
9338 'highvolume' => 'high-volume',
9339
9340 'privateinfo' => 'private-information',
9341 ],
9342 'type' => 'map',
9343 'additionalProperties' => [ 'type' => 'string', ],
9344 ];
9345
9356 public const GrantRiskGroups = [
9357 'default' => [
9358 'basic' => GrantsInfo::RISK_LOW,
9359 'editpage' => GrantsInfo::RISK_LOW,
9360 'createeditmovepage' => GrantsInfo::RISK_LOW,
9361 'editprotected' => GrantsInfo::RISK_VANDALISM,
9362 'patrol' => GrantsInfo::RISK_LOW,
9363 'uploadfile' => GrantsInfo::RISK_LOW,
9364 'uploadeditmovefile' => GrantsInfo::RISK_LOW,
9365 'sendemail' => GrantsInfo::RISK_SECURITY,
9366 'viewmywatchlist' => GrantsInfo::RISK_LOW,
9367 'editviewmywatchlist' => GrantsInfo::RISK_LOW,
9368 'editmycssjs' => GrantsInfo::RISK_SECURITY,
9369 'editmyoptions' => GrantsInfo::RISK_SECURITY,
9370 'editinterface' => GrantsInfo::RISK_VANDALISM,
9371 'editsiteconfig' => GrantsInfo::RISK_SECURITY,
9372 'rollback' => GrantsInfo::RISK_LOW,
9373 'blockusers' => GrantsInfo::RISK_VANDALISM,
9374 'delete' => GrantsInfo::RISK_VANDALISM,
9375 'viewdeleted' => GrantsInfo::RISK_VANDALISM,
9376 'viewrestrictedlogs' => GrantsInfo::RISK_SECURITY,
9377 'protect' => GrantsInfo::RISK_VANDALISM,
9378 'oversight' => GrantsInfo::RISK_SECURITY,
9379 'createaccount' => GrantsInfo::RISK_LOW,
9380 'mergehistory' => GrantsInfo::RISK_VANDALISM,
9381 'import' => GrantsInfo::RISK_SECURITY,
9382 'highvolume' => GrantsInfo::RISK_LOW,
9383 'privateinfo' => GrantsInfo::RISK_LOW,
9384 ],
9385 'type' => 'map',
9386 ];
9387
9391 public const EnableBotPasswords = [
9392 'default' => true,
9393 'type' => 'boolean',
9394 ];
9395
9402 public const BotPasswordsCluster = [
9403 'default' => false,
9404 'type' => 'string|false',
9405 ];
9406
9416 public const BotPasswordsDatabase = [
9417 'default' => false,
9418 'type' => 'string|false',
9419 ];
9420
9421 // endregion -- end of user rights settings
9422
9423 /***************************************************************************/
9424 // region Security
9430 public const SecretKey = [
9431 'default' => false,
9432 ];
9433
9440 public const JwtPrivateKey = [
9441 'default' => false,
9442 ];
9443
9450 public const JwtPublicKey = [
9451 'default' => false,
9452 ];
9453
9459 public const AllowUserJs = [
9460 'default' => false,
9461 ];
9462
9468 public const AllowUserCss = [
9469 'default' => false,
9470 ];
9471
9478 public const AllowUserCssPrefs = [
9479 'default' => true,
9480 ];
9481
9485 public const UseSiteJs = [
9486 'default' => true,
9487 ];
9488
9492 public const UseSiteCss = [
9493 'default' => true,
9494 ];
9495
9500 public const BreakFrames = [
9501 'default' => false,
9502 ];
9503
9523 public const EditPageFrameOptions = [
9524 'default' => 'DENY',
9525 ];
9526
9538 public const ApiFrameOptions = [
9539 'default' => 'DENY',
9540 ];
9541
9551 public const CSPHeader = [
9552 'default' => false,
9553 'type' => 'false|object',
9554 ];
9555
9561 public const CSPReportOnlyHeader = [
9562 'default' => false,
9563 'type' => 'false|object',
9564 ];
9565
9575 public const CSPFalsePositiveUrls = [
9576 'default' => [
9577 'https://3hub.co' => true,
9578 'https://morepro.info' => true,
9579 'https://p.ato.mx' => true,
9580 'https://s.ato.mx' => true,
9581 'https://adserver.adtech.de' => true,
9582 'https://ums.adtechus.com' => true,
9583 'https://cas.criteo.com' => true,
9584 'https://cat.nl.eu.criteo.com' => true,
9585 'https://atpixel.alephd.com' => true,
9586 'https://rtb.metrigo.com' => true,
9587 'https://d5p.de17a.com' => true,
9588 'https://ad.lkqd.net/vpaid/vpaid.js' => true,
9589 'https://ad.lkqd.net/vpaid/vpaid.js?fusion=1.0' => true,
9590 'https://t.lkqd.net/t' => true,
9591 'chrome-extension' => true,
9592 ],
9593 'type' => 'map',
9594 ];
9595
9603 public const AllowCrossOrigin = [
9604 'default' => false,
9605 'type' => 'boolean',
9606 ];
9607
9621 public const RestAllowCrossOriginCookieAuth = [
9622 'default' => false,
9623 'type' => 'boolean',
9624 ];
9625
9634 public const SessionSecret = [
9635 'default' => false,
9636 ];
9637
9638 // endregion -- end of security
9639
9640 /***************************************************************************/
9641 // region Cookie settings
9647 public const CookieExpiration = [
9648 'default' => 30 * 86400,
9649 ];
9650
9658 public const ExtendedLoginCookieExpiration = [
9659 'default' => 180 * 86400,
9660 ];
9661
9669 public const SessionCookieJwtExpiration = [
9670 'default' => 4 * 3600,
9671 ];
9672
9677 public const CookieDomain = [
9678 'default' => '',
9679 ];
9680
9685 public const CookiePath = [
9686 'default' => '/',
9687 ];
9688
9699 public const CookieSecure = [
9700 'default' => 'detect',
9701 'dynamicDefault' => [ 'use' => [ 'ForceHTTPS' ] ]
9702 ];
9703
9704 public static function getDefaultCookieSecure( bool $forceHTTPS ): bool {
9705 return $forceHTTPS || ( WebRequest::detectProtocol() === 'https' );
9706 }
9707
9713 public const CookiePrefix = [
9714 'default' => false,
9715 'dynamicDefault' => [
9716 'use' => [ 'SharedDB', 'SharedPrefix', 'SharedTables', 'DBname', 'DBprefix' ]
9717 ],
9718 ];
9719
9720 public static function getDefaultCookiePrefix(
9721 ?string $sharedDB, ?string $sharedPrefix, array $sharedTables, string $dbName, string $dbPrefix
9722 ): string {
9723 if ( $sharedDB && in_array( 'user', $sharedTables ) ) {
9724 return $sharedDB . ( $sharedPrefix ? "_$sharedPrefix" : '' );
9725 }
9726 return $dbName . ( $dbPrefix ? "_$dbPrefix" : '' );
9727 }
9728
9734 public const CookieHttpOnly = [
9735 'default' => true,
9736 ];
9737
9747 public const CookieSameSite = [
9748 'default' => null,
9749 'type' => '?string',
9750 ];
9751
9755 public const CacheVaryCookies = [
9756 'default' => [],
9757 'type' => 'list',
9758 ];
9759
9763 public const SessionName = [
9764 'default' => false,
9765 ];
9766
9774 public const CookieSetOnAutoblock = [
9775 'default' => true,
9776 ];
9777
9785 public const CookieSetOnIpBlock = [
9786 'default' => true,
9787 ];
9788
9789 // endregion -- end of cookie settings
9790
9791 /***************************************************************************/
9792 // region Profiling, testing and debugging
9794 // See $wgProfiler for how to enable profiling.
9795
9807 public const DebugLogFile = [
9808 'default' => '',
9809 ];
9810
9814 public const DebugLogPrefix = [
9815 'default' => '',
9816 ];
9817
9823 public const DebugRedirects = [
9824 'default' => false,
9825 ];
9826
9841 public const DebugRawPage = [
9842 'default' => false,
9843 ];
9844
9853 public const DebugComments = [
9854 'default' => false,
9855 ];
9856
9864 public const DebugDumpSql = [
9865 'default' => false,
9866 ];
9867
9873 public const TrxProfilerLimits = [
9874 'default' => [
9875 // HTTP GET/HEAD requests.
9876 // Primary queries should not happen on GET requests
9877 'GET' => [
9878 'masterConns' => 0,
9879 'writes' => 0,
9880 'readQueryTime' => 5,
9881 'readQueryRows' => 10000
9882 ],
9883 // HTTP POST requests.
9884 // Primary reads and writes will happen for a subset of these.
9885 'POST' => [
9886 'readQueryTime' => 5,
9887 'writeQueryTime' => 1,
9888 'readQueryRows' => 100_000,
9889 'maxAffected' => 1000
9890 ],
9891 'POST-nonwrite' => [
9892 'writes' => 0,
9893 'readQueryTime' => 5,
9894 'readQueryRows' => 10000
9895 ],
9896 // Deferred updates that run after HTTP response is sent for GET requests
9897 'PostSend-GET' => [
9898 'readQueryTime' => 5,
9899 'writeQueryTime' => 1,
9900 'readQueryRows' => 10000,
9901 'maxAffected' => 1000,
9902 // Log primary queries under the post-send entry point as they are discouraged
9903 'masterConns' => 0,
9904 'writes' => 0,
9905 ],
9906 // Deferred updates that run after HTTP response is sent for POST requests
9907 'PostSend-POST' => [
9908 'readQueryTime' => 5,
9909 'writeQueryTime' => 1,
9910 'readQueryRows' => 100_000,
9911 'maxAffected' => 1000
9912 ],
9913 // Background job runner
9914 'JobRunner' => [
9915 'readQueryTime' => 30,
9916 'writeQueryTime' => 5,
9917 'readQueryRows' => 100_000,
9918 'maxAffected' => 500 // ballpark of $wgUpdateRowsPerQuery
9919 ],
9920 // Command-line scripts
9921 'Maintenance' => [
9922 'writeQueryTime' => 5,
9923 'maxAffected' => 1000
9924 ]
9925 ],
9926 'type' => 'map',
9927 ];
9928
9961 public const DebugLogGroups = [
9962 'default' => [],
9963 'type' => 'map',
9964 ];
9965
9987 public const MWLoggerDefaultSpi = [
9988 'default' => [ 'class' => 'MediaWiki\\Logger\\LegacySpi', ],
9989 'mergeStrategy' => 'replace',
9990 'type' => 'map',
9991 ];
9992
9998 public const ShowDebug = [
9999 'default' => false,
10000 ];
10001
10005 public const SpecialVersionShowHooks = [
10006 'default' => false,
10007 ];
10008
10016 public const ShowExceptionDetails = [
10017 'default' => false,
10018 ];
10019
10023 public const LogExceptionBacktrace = [
10024 'default' => true,
10025 ];
10026
10031 public const PropagateErrors = [
10032 'default' => true,
10033 ];
10034
10038 public const ShowHostnames = [
10039 'default' => false,
10040 ];
10041
10049 public const OverrideHostname = [
10050 'default' => false,
10051 ];
10052
10057 public const DevelopmentWarnings = [
10058 'default' => false,
10059 ];
10060
10066 public const DeprecationReleaseLimit = [
10067 'default' => false,
10068 ];
10069
10135 public const Profiler = [
10136 'default' => [],
10137 'type' => 'map',
10138 'mergeStrategy' => 'replace',
10139 ];
10140
10151 public const StatsdServer = [
10152 'default' => false,
10153 ];
10154
10162 public const StatsdMetricPrefix = [
10163 'default' => 'MediaWiki',
10164 ];
10165
10174 public const StatsTarget = [
10175 'default' => null,
10176 'type' => '?string',
10177 ];
10178
10188 public const StatsFormat = [
10189 'default' => null,
10190 'type' => '?string',
10191 ];
10192
10202 public const StatsPrefix = [
10203 'default' => 'mediawiki',
10204 'type' => 'string',
10205 ];
10206
10226 public const OpenTelemetryConfig = [
10227 'default' => null,
10228 'type' => 'map|null'
10229 ];
10230
10237 public const PageInfoTransclusionLimit = [
10238 'default' => 50,
10239 ];
10240
10244 public const EnableJavaScriptTest = [
10245 'default' => false,
10246 ];
10247
10253 public const CachePrefix = [
10254 'default' => false,
10255 ];
10256
10265 public const DebugToolbar = [
10266 'default' => false,
10267 ];
10268
10269 // endregion -- end of profiling, testing and debugging
10270
10271 /***************************************************************************/
10272 // region Search
10278 public const DisableTextSearch = [
10279 'default' => false,
10280 ];
10281
10286 public const AdvancedSearchHighlighting = [
10287 'default' => false,
10288 ];
10289
10294 public const SearchHighlightBoundaries = [
10295 'default' => '[\\p{Z}\\p{P}\\p{C}]',
10296 ];
10297
10306 public const OpenSearchTemplates = [
10307 'default' => [
10308 'application/x-suggestions+json' => false,
10309 'application/x-suggestions+xml' => false,
10310 ],
10311 'type' => 'map',
10312 ];
10313
10320 public const EnableOpenSearchSuggest = [
10321 'default' => true,
10322 'obsolete' => 'Since 1.35, no longer used',
10323 'description' => 'Has been emitting warnings since 1.39 (LTS). ' .
10324 'Can be removed completely in 1.44, assuming 1.43 is an LTS release.'
10325 ];
10326
10331 public const OpenSearchDefaultLimit = [
10332 'default' => 10,
10333 ];
10334
10339 public const OpenSearchDescriptionLength = [
10340 'default' => 100,
10341 ];
10342
10346 public const SearchSuggestCacheExpiry = [
10347 'default' => 1200,
10348 ];
10349
10354 public const DisableSearchUpdate = [
10355 'default' => false,
10356 ];
10357
10368 public const NamespacesToBeSearchedDefault = [
10369 'default' => [ NS_MAIN => true, ],
10370 'type' => 'map',
10371 ];
10372
10377 public const DisableInternalSearch = [
10378 'default' => false,
10379 ];
10380
10398 public const SearchForwardUrl = [
10399 'default' => null,
10400 ];
10401
10408 public const SitemapNamespaces = [
10409 'default' => false,
10410 'type' => 'false|list',
10411 ];
10412
10416 public const SitemapNamespacesPriorities = [
10417 'deprecated' => 'since 1.45 and ignored',
10418 'default' => false,
10419 'type' => 'false|map',
10420 ];
10421
10455 public const SitemapApiConfig = [
10456 'default' => [],
10457 'type' => 'object',
10458 'additionalProperties' => [
10459 'enabled' => [ 'type' => 'bool' ],
10460 'sitemapsPerIndex' => [ 'type' => 'int' ],
10461 'pagesPerSitemap' => [ 'type' => 'int' ],
10462 'expiry' => [ 'type' => 'int' ],
10463 ]
10464 ];
10465
10476 public const SpecialSearchFormOptions = [
10477 'default' => [],
10478 'type' => 'map',
10479 ];
10480
10489 public const SearchMatchRedirectPreference = [
10490 'default' => false,
10491 'type' => 'boolean',
10492 ];
10493
10500 public const SearchRunSuggestedQuery = [
10501 'default' => true,
10502 'type' => 'boolean',
10503 ];
10504
10505 // endregion -- end of search settings
10506
10507 /***************************************************************************/
10508 // region Edit user interface
10515 public const Diff3 = [
10516 'default' => '/usr/bin/diff3',
10517 ];
10518
10522 public const Diff = [
10523 'default' => '/usr/bin/diff',
10524 ];
10525
10531 public const PreviewOnOpenNamespaces = [
10532 'default' => [
10533 NS_CATEGORY => true
10534 ],
10535 'type' => 'map',
10536 ];
10537
10543 public const UniversalEditButton = [
10544 'default' => true,
10545 ];
10546
10552 public const UseAutomaticEditSummaries = [
10553 'default' => true,
10554 ];
10555
10556 // endregion -- end edit UI
10557
10558 /***************************************************************************/
10559 // region Maintenance
10561 // See also $wgSiteNotice
10562
10566 public const CommandLineDarkBg = [
10567 'default' => false,
10568 ];
10569
10578 public const ReadOnly = [
10579 'default' => null,
10580 ];
10581
10587 public const ReadOnlyWatchedItemStore = [
10588 'default' => false,
10589 'type' => 'boolean',
10590 ];
10591
10600 public const ReadOnlyFile = [
10601 'default' => false,
10602 'dynamicDefault' => [ 'use' => [ 'UploadDirectory' ] ]
10603 ];
10604
10609 public static function getDefaultReadOnlyFile( $uploadDirectory ): string {
10610 return "$uploadDirectory/lock_yBgMBwiR";
10611 }
10612
10622 public const UpgradeKey = [
10623 'default' => false,
10624 ];
10625
10629 public const GitBin = [
10630 'default' => '/usr/bin/git',
10631 ];
10632
10646 public const GitRepositoryViewers = [
10647 'default' => [
10648 'https://(?:[a-z0-9_]+@)?gerrit.wikimedia.org/r/(?:p/)?(.*)' => 'https://gerrit.wikimedia.org/g/%R/+/%H',
10649 'ssh://(?:[a-z0-9_]+@)?gerrit.wikimedia.org:29418/(.*)' => 'https://gerrit.wikimedia.org/g/%R/+/%H',
10650 ],
10651 'type' => 'map',
10652 ];
10653
10671 public const InstallerInitialPages = [
10672 'default' => [
10673 [
10674 'titlemsg' => 'mainpage',
10675 'text' => "{{subst:int:mainpagetext}}\n\n{{subst:int:mainpagedocfooter}}",
10676 ]
10677 ],
10678 'type' => 'list'
10679 ];
10680
10681 // endregion -- End of maintenance
10682
10683 /***************************************************************************/
10684 // region Recent changes, new pages, watchlist and history
10693 public const RCMaxAge = [
10694 'default' => 90 * 24 * 3600,
10695 ];
10696
10704 public const WatchersMaxAge = [
10705 'default' => 180 * 24 * 3600,
10706 ];
10707
10716 public const UnwatchedPageSecret = [
10717 'default' => 1,
10718 ];
10719
10727 public const RCFilterByAge = [
10728 'default' => false,
10729 ];
10730
10735 public const RCLinkLimits = [
10736 'default' => [ 50, 100, 250, 500 ],
10737 'type' => 'list',
10738 ];
10739
10746 public const RCLinkDays = [
10747 'default' => [ 1, 3, 7, 14, 30 ],
10748 'type' => 'list',
10749 ];
10750
10814 public const RCFeeds = [
10815 'default' => [],
10816 'type' => 'map',
10817 ];
10818
10826 public const RCEngines = [
10827 'default' => [
10828 'redis' => RedisPubSubFeedEngine::class,
10829 'udp' => UDPRCFeedEngine::class,
10830 ],
10831 'type' => 'map',
10832 ];
10833
10846 public const RCWatchCategoryMembership = [
10847 'default' => false,
10848 ];
10849
10858 public const UseRCPatrol = [
10859 'default' => true,
10860 ];
10861
10868 public const StructuredChangeFiltersLiveUpdatePollingRate = [
10869 'default' => 3,
10870 ];
10871
10879 public const UseNPPatrol = [
10880 'default' => true,
10881 ];
10882
10891 public const UseFilePatrol = [
10892 'default' => true,
10893 ];
10894
10898 public const Feed = [
10899 'default' => true,
10900 ];
10901
10906 public const FeedLimit = [
10907 'default' => 50,
10908 ];
10909
10919 public const FeedCacheTimeout = [
10920 'default' => 60,
10921 ];
10922
10927 public const FeedDiffCutoff = [
10928 'default' => 32768,
10929 ];
10930
10946 public const OverrideSiteFeed = [
10947 'default' => [],
10948 'type' => 'map',
10949 ];
10950
10957 public const FeedClasses = [
10958 'default' => [
10959 'rss' => \MediaWiki\Feed\RSSFeed::class,
10960 'atom' => \MediaWiki\Feed\AtomFeed::class,
10961 ],
10962 'type' => 'map',
10963 ];
10964
10969 public const AdvertisedFeedTypes = [
10970 'default' => [ 'atom', ],
10971 'type' => 'list',
10972 ];
10973
10977 public const RCShowWatchingUsers = [
10978 'default' => false,
10979 ];
10980
10984 public const RCShowChangedSize = [
10985 'default' => true,
10986 ];
10987
10993 public const RCChangedSizeThreshold = [
10994 'default' => 500,
10995 ];
10996
11001 public const ShowUpdatedMarker = [
11002 'default' => true,
11003 ];
11004
11009 public const DisableAnonTalk = [
11010 'default' => false,
11011 ];
11012
11017 public const UseTagFilter = [
11018 'default' => true,
11019 ];
11020
11040 public const SoftwareTags = [
11041 'default' => [
11042 'mw-contentmodelchange' => true,
11043 'mw-new-redirect' => true,
11044 'mw-removed-redirect' => true,
11045 'mw-changed-redirect-target' => true,
11046 'mw-blank' => true,
11047 'mw-replace' => true,
11048 'mw-recreated' => true,
11049 'mw-rollback' => true,
11050 'mw-undo' => true,
11051 'mw-manual-revert' => true,
11052 'mw-reverted' => true,
11053 'mw-server-side-upload' => true,
11054 'mw-ipblock-appeal' => true,
11055 ],
11056 'type' => 'map',
11057 'additionalProperties' => [ 'type' => 'boolean', ],
11058 ];
11059
11067 public const UnwatchedPageThreshold = [
11068 'default' => false,
11069 ];
11070
11096 public const RecentChangesFlags = [
11097 'default' => [
11098 'newpage' => [
11099 'letter' => 'newpageletter',
11100 'title' => 'recentchanges-label-newpage',
11101 'legend' => 'recentchanges-legend-newpage',
11102 'grouping' => 'any',
11103 ],
11104 'minor' => [
11105 'letter' => 'minoreditletter',
11106 'title' => 'recentchanges-label-minor',
11107 'legend' => 'recentchanges-legend-minor',
11108 'class' => 'minoredit',
11109 'grouping' => 'all',
11110 ],
11111 'bot' => [
11112 'letter' => 'boteditletter',
11113 'title' => 'recentchanges-label-bot',
11114 'legend' => 'recentchanges-legend-bot',
11115 'class' => 'botedit',
11116 'grouping' => 'all',
11117 ],
11118 'unpatrolled' => [
11119 'letter' => 'unpatrolledletter',
11120 'title' => 'recentchanges-label-unpatrolled',
11121 'legend' => 'recentchanges-legend-unpatrolled',
11122 'grouping' => 'any',
11123 ],
11124 ],
11125 'type' => 'map',
11126 ];
11127
11133 public const WatchlistExpiry = [
11134 'default' => false,
11135 'type' => 'boolean',
11136 ];
11137
11143 public const EnableWatchlistLabels = [
11144 'default' => false,
11145 'type' => 'boolean',
11146 ];
11147
11153 public const WatchlistLabelsMaxPerUser = [
11154 'default' => 100,
11155 'type' => 'integer',
11156 ];
11157
11168 public const WatchlistPurgeRate = [
11169 'default' => 0.1,
11170 'type' => 'float',
11171 ];
11172
11187 public const WatchlistExpiryMaxDuration = [
11188 'default' => '1 year',
11189 'type' => '?string',
11190 ];
11191
11198 public const EnableChangesListQueryPartitioning = [
11199 'default' => false,
11200 'type' => 'bool',
11201 ];
11202
11203 // endregion -- end RC/watchlist
11204
11205 /***************************************************************************/
11206 // region Copyright and credits settings
11216 public const RightsPage = [
11217 'default' => null,
11218 ];
11219
11226 public const RightsUrl = [
11227 'default' => null,
11228 ];
11229
11238 public const RightsText = [
11239 'default' => null,
11240 ];
11241
11245 public const RightsIcon = [
11246 'default' => null,
11247 ];
11248
11252 public const UseCopyrightUpload = [
11253 'default' => false,
11254 ];
11255
11263 public const MaxCredits = [
11264 'default' => 0,
11265 ];
11266
11272 public const ShowCreditsIfMax = [
11273 'default' => true,
11274 ];
11275
11276 // endregion -- end of copyright and credits settings
11277
11278 /***************************************************************************/
11279 // region Import / Export
11305 public const ImportSources = [
11306 'default' => [],
11307 'type' => 'map',
11308 ];
11309
11318 public const ImportTargetNamespace = [
11319 'default' => null,
11320 ];
11321
11328 public const ExportAllowHistory = [
11329 'default' => true,
11330 ];
11331
11337 public const ExportMaxHistory = [
11338 'default' => 0,
11339 ];
11340
11344 public const ExportAllowListContributors = [
11345 'default' => false,
11346 ];
11347
11359 public const ExportMaxLinkDepth = [
11360 'default' => 0,
11361 ];
11362
11366 public const ExportFromNamespaces = [
11367 'default' => false,
11368 ];
11369
11373 public const ExportAllowAll = [
11374 'default' => false,
11375 ];
11376
11383 public const ExportPagelistLimit = [
11384 'default' => 5000,
11385 ];
11386
11391 public const XmlDumpSchemaVersion = [
11392 'default' => XML_DUMP_SCHEMA_VERSION_11,
11393 ];
11394
11395 // endregion -- end of import/export
11396
11397 /***************************************************************************/
11398 // region Wiki Farm
11410 public const WikiFarmSettingsDirectory = [
11411 'default' => null
11412 ];
11413
11421 public const WikiFarmSettingsExtension = [
11422 'default' => 'yaml'
11423 ];
11424
11425 // endregion -- End Wiki Farm
11426
11427 /***************************************************************************/
11428 // region Extensions
11435 public const ExtensionFunctions = [
11436 'default' => [],
11437 'type' => 'list',
11438 ];
11439
11470 public const ExtensionMessagesFiles = [
11471 'default' => [],
11472 'type' => 'map',
11473 ];
11474
11503 public const MessagesDirs = [
11504 'default' => [],
11505 'type' => 'map',
11506 ];
11507
11534 public const TranslationAliasesDirs = [
11535 'default' => [],
11536 'type' => 'map',
11537 ];
11538
11545 public const ExtensionEntryPointListFiles = [
11546 'default' => [],
11547 'type' => 'map',
11548 ];
11549
11553 public const EnableParserLimitReporting = [
11554 'default' => true,
11555 ];
11556
11582 public const ValidSkinNames = [
11583 'default' => [],
11584 'type' => 'map',
11585 ];
11586
11592 public const SpecialPages = [
11593 'default' => [],
11594 'type' => 'map',
11595 ];
11596
11607 public const AutoloadAttemptLowercase = [
11608 'default' => false,
11609 'obsolete' => 'Since 1.40; no longer has any effect.',
11610 'description' => 'Has been emitting warnings since 1.39 (LTS). ' .
11611 'Can be removed completely in 1.44, assuming 1.43 is an LTS release.'
11612 ];
11613
11672 public const ExtensionCredits = [
11673 'default' => [],
11674 'type' => 'map',
11675 ];
11676
11706 public const Hooks = [
11707 'default' => [],
11708 'type' => 'map',
11709 'mergeStrategy' => 'array_merge_recursive',
11710 ];
11711
11726 public const ServiceWiringFiles = [
11727 'default' => [],
11728 'type' => 'list',
11729 ];
11730
11749 public const JobClasses = [
11750 'default' => [
11751 'deletePage' => DeletePageJob::class,
11752 'refreshLinks' => RefreshLinksJob::class,
11753 'deleteLinks' => DeleteLinksJob::class,
11754 'htmlCacheUpdate' => HTMLCacheUpdateJob::class,
11755 'sendMail' => [
11756 'class' => EmaillingJob::class,
11757 'services' => [
11758 0 => 'Emailer'
11759 ]
11760 ],
11761 'enotifNotify' => [
11762 'class' => RecentChangeNotifyJob::class,
11763 'services' => [
11764 'RecentChangeLookup',
11765 ],
11766 ],
11767 'fixDoubleRedirect' => [
11768 'class' => DoubleRedirectJob::class,
11769 'services' => [
11770 'RevisionLookup',
11771 'MagicWordFactory',
11772 'WikiPageFactory',
11773 ],
11774 // This job requires a title
11775 'needsPage' => true,
11776 ],
11777 'AssembleUploadChunks' => AssembleUploadChunksJob::class,
11778 'PublishStashedFile' => PublishStashedFileJob::class,
11779 'ThumbnailRender' => ThumbnailRenderJob::class,
11780 'UploadFromUrl' => UploadFromUrlJob::class,
11781 'recentChangesUpdate' => RecentChangesUpdateJob::class,
11782 'refreshLinksPrioritized' => RefreshLinksJob::class,
11783 'refreshLinksDynamic' => RefreshLinksJob::class,
11784 'activityUpdateJob' => ActivityUpdateJob::class,
11785 'categoryMembershipChange' => [
11786 'class' => CategoryMembershipChangeJob::class,
11787 'services' => [
11788 'RecentChangeFactory',
11789 ],
11790 ],
11791 'CategoryCountUpdateJob' => [
11792 'class' => CategoryCountUpdateJob::class,
11793 'services' => [
11794 'ConnectionProvider',
11795 'NamespaceInfo',
11796 ],
11797 ],
11798 'clearUserWatchlist' => ClearUserWatchlistJob::class,
11799 'watchlistExpiry' => WatchlistExpiryJob::class,
11800 'cdnPurge' => CdnPurgeJob::class,
11801 'userGroupExpiry' => UserGroupExpiryJob::class,
11802 'clearWatchlistNotifications' => ClearWatchlistNotificationsJob::class,
11803 'userOptionsUpdate' => UserOptionsUpdateJob::class,
11804 'revertedTagUpdate' => RevertedTagUpdateJob::class,
11805 'null' => NullJob::class,
11806 'userEditCountInit' => UserEditCountInitJob::class,
11807 'parsoidCachePrewarm' => [
11808 'class' => ParsoidCachePrewarmJob::class,
11809 'services' => [
11810 'ParserOutputAccess',
11811 'PageStore',
11812 'RevisionLookup',
11813 'ParsoidSiteConfig',
11814 ],
11815 // tell the JobFactory not to include the $page parameter in the constructor call
11816 'needsPage' => false
11817 ],
11818 'renameUserTable' => [
11819 'class' => RenameUserTableJob::class,
11820 'services' => [
11821 'MainConfig',
11822 'DBLoadBalancerFactory'
11823 ]
11824 ],
11825 'renameUserDerived' => [
11826 'class' => RenameUserDerivedJob::class,
11827 'services' => [
11828 'RenameUserFactory',
11829 'UserFactory'
11830 ]
11831 ],
11832 // 'renameUser' is a alias for backward compatibility
11833 // it should be removed in the future releases
11834 'renameUser' => [
11835 'class' => RenameUserTableJob::class,
11836 'services' => [
11837 'MainConfig',
11838 'DBLoadBalancerFactory'
11839 ]
11840 ],
11841 ],
11842 'type' => 'map',
11843 ];
11844
11856 public const JobTypesExcludedFromDefaultQueue = [
11857 'default' => [ 'AssembleUploadChunks', 'PublishStashedFile', 'UploadFromUrl' ],
11858 'type' => 'list',
11859 ];
11860
11870 public const JobBackoffThrottling = [
11871 'default' => [],
11872 'type' => 'map',
11873 'additionalProperties' => [ 'type' => 'float', ],
11874 ];
11875
11883 public const JobTypeConf = [
11884 'default' => [
11885 'default' => [
11886 'class' => JobQueueDB::class,
11887 'order' => 'random',
11888 'claimTTL' => 3600
11889 ],
11890 ],
11891 'additionalProperties' => [
11892 'type' => 'object',
11893 'properties' => [
11894 'class' => [ 'type' => 'string' ],
11895 'order' => [ 'type' => 'string' ],
11896 'claimTTL' => [ 'type' => 'int' ]
11897 ],
11898 ],
11899 'type' => 'map',
11900 ];
11901
11914 public const JobQueueIncludeInMaxLagFactor = [
11915 'default' => false,
11916 ];
11917
11923 public const SpecialPageCacheUpdates = [
11924 'default' => [
11925 'Statistics' => [ SiteStatsUpdate::class, 'cacheUpdate' ]
11926 ],
11927 'type' => 'map',
11928 ];
11929
11938 public const PagePropLinkInvalidations = [
11939 'default' => [ 'hiddencat' => 'categorylinks', ],
11940 'type' => 'map',
11941 ];
11942
11943 // endregion -- End extensions
11944
11945 /***************************************************************************/
11946 // region Categories
11953 public const CategoryMagicGallery = [
11954 'default' => true,
11955 ];
11956
11960 public const CategoryPagingLimit = [
11961 'default' => 200,
11962 ];
11963
11990 public const CategoryCollation = [
11991 'default' => 'uppercase',
11992 ];
11993
12005 public const TempCategoryCollations = [
12006 'default' => [],
12007 'type' => 'list',
12008 ];
12009
12018 public const SortedCategories = [
12019 'default' => false,
12020 'type' => 'boolean',
12021 ];
12022
12037 public const TrackingCategories = [
12038 'default' => [],
12039 'type' => 'list',
12040 'deprecated' => 'since 1.25 Extensions should now register tracking categories using ' .
12041 'the new extension registration system.',
12042 ];
12043
12044 // endregion -- End categories
12045
12046 /***************************************************************************/
12047 // region Logging
12059 public const LogTypes = [
12060 'default' => [
12061 '',
12062 'block',
12063 'protect',
12064 'rights',
12065 'delete',
12066 'upload',
12067 'move',
12068 'import',
12069 'interwiki',
12070 'patrol',
12071 'merge',
12072 'suppress',
12073 'tag',
12074 'managetags',
12075 'contentmodel',
12076 'renameuser',
12077 ],
12078 'type' => 'list',
12079 ];
12080
12088 public const LogRestrictions = [
12089 'default' => [ 'suppress' => 'suppressionlog', ],
12090 'type' => 'map',
12091 ];
12092
12111 public const FilterLogTypes = [
12112 'default' => [
12113 'patrol' => true,
12114 'tag' => true,
12115 'newusers' => false,
12116 ],
12117 'type' => 'map',
12118 ];
12119
12129 public const LogNames = [
12130 'default' => [
12131 '' => 'all-logs-page',
12132 'block' => 'blocklogpage',
12133 'protect' => 'protectlogpage',
12134 'rights' => 'rightslog',
12135 'delete' => 'dellogpage',
12136 'upload' => 'uploadlogpage',
12137 'move' => 'movelogpage',
12138 'import' => 'importlogpage',
12139 'patrol' => 'patrol-log-page',
12140 'merge' => 'mergelog',
12141 'suppress' => 'suppressionlog',
12142 ],
12143 'type' => 'map',
12144 ];
12145
12155 public const LogHeaders = [
12156 'default' => [
12157 '' => 'alllogstext',
12158 'block' => 'blocklogtext',
12159 'delete' => 'dellogpagetext',
12160 'import' => 'importlogpagetext',
12161 'merge' => 'mergelogpagetext',
12162 'move' => 'movelogpagetext',
12163 'patrol' => 'patrol-log-header',
12164 'protect' => 'protectlogtext',
12165 'rights' => 'rightslogtext',
12166 'suppress' => 'suppressionlogtext',
12167 'upload' => 'uploadlogpagetext',
12168 ],
12169 'type' => 'map',
12170 ];
12171
12179 public const LogActions = [
12180 'default' => [],
12181 'type' => 'map',
12182 ];
12183
12193 public const LogActionsHandlers = [
12194 'default' => [
12195 'block/block' => [
12196 'class' => BlockLogFormatter::class,
12197 'services' => [
12198 'TitleParser',
12199 'NamespaceInfo',
12200 ]
12201 ],
12202 'block/reblock' => [
12203 'class' => BlockLogFormatter::class,
12204 'services' => [
12205 'TitleParser',
12206 'NamespaceInfo',
12207 ]
12208 ],
12209 'block/unblock' => [
12210 'class' => BlockLogFormatter::class,
12211 'services' => [
12212 'TitleParser',
12213 'NamespaceInfo',
12214 ]
12215 ],
12216 'contentmodel/change' => ContentModelLogFormatter::class,
12217 'contentmodel/new' => ContentModelLogFormatter::class,
12218 'delete/delete' => DeleteLogFormatter::class,
12219 'delete/delete_redir' => DeleteLogFormatter::class,
12220 'delete/delete_redir2' => DeleteLogFormatter::class,
12221 'delete/event' => DeleteLogFormatter::class,
12222 'delete/restore' => DeleteLogFormatter::class,
12223 'delete/revision' => DeleteLogFormatter::class,
12224 'import/interwiki' => ImportLogFormatter::class,
12225 'import/upload' => ImportLogFormatter::class,
12226 'interwiki/iw_add' => InterwikiLogFormatter::class,
12227 'interwiki/iw_delete' => InterwikiLogFormatter::class,
12228 'interwiki/iw_edit' => InterwikiLogFormatter::class,
12229 'managetags/activate' => LogFormatter::class,
12230 'managetags/create' => LogFormatter::class,
12231 'managetags/deactivate' => LogFormatter::class,
12232 'managetags/delete' => LogFormatter::class,
12233 'merge/merge' => [
12234 'class' => MergeLogFormatter::class,
12235 'services' => [
12236 'TitleParser',
12237 ]
12238 ],
12239 'merge/merge-into' => [
12240 'class' => MergeLogFormatter::class,
12241 'services' => [
12242 'TitleParser',
12243 ]
12244 ],
12245 'move/move' => [
12246 'class' => MoveLogFormatter::class,
12247 'services' => [
12248 'TitleParser',
12249 ]
12250 ],
12251 'move/move_redir' => [
12252 'class' => MoveLogFormatter::class,
12253 'services' => [
12254 'TitleParser',
12255 ]
12256 ],
12257 'patrol/patrol' => PatrolLogFormatter::class,
12258 'patrol/autopatrol' => PatrolLogFormatter::class,
12259 'protect/modify' => [
12260 'class' => ProtectLogFormatter::class,
12261 'services' => [
12262 'TitleParser',
12263 ]
12264 ],
12265 'protect/move_prot' => [
12266 'class' => ProtectLogFormatter::class,
12267 'services' => [
12268 'TitleParser',
12269 ]
12270 ],
12271 'protect/protect' => [
12272 'class' => ProtectLogFormatter::class,
12273 'services' => [
12274 'TitleParser',
12275 ]
12276 ],
12277 'protect/unprotect' => [
12278 'class' => ProtectLogFormatter::class,
12279 'services' => [
12280 'TitleParser',
12281 ]
12282 ],
12283 'renameuser/renameuser' => [
12284 'class' => RenameuserLogFormatter::class,
12285 'services' => [
12286 'TitleParser',
12287 ]
12288 ],
12289 'rights/autopromote' => RightsLogFormatter::class,
12290 'rights/rights' => RightsLogFormatter::class,
12291 'suppress/block' => [
12292 'class' => BlockLogFormatter::class,
12293 'services' => [
12294 'TitleParser',
12295 'NamespaceInfo',
12296 ]
12297 ],
12298 'suppress/delete' => DeleteLogFormatter::class,
12299 'suppress/event' => DeleteLogFormatter::class,
12300 'suppress/reblock' => [
12301 'class' => BlockLogFormatter::class,
12302 'services' => [
12303 'TitleParser',
12304 'NamespaceInfo',
12305 ]
12306 ],
12307 'suppress/revision' => DeleteLogFormatter::class,
12308 'tag/update' => TagLogFormatter::class,
12309 'upload/overwrite' => UploadLogFormatter::class,
12310 'upload/revert' => UploadLogFormatter::class,
12311 'upload/upload' => UploadLogFormatter::class,
12312 ],
12313 'type' => 'map',
12314 ];
12315
12325 public const ActionFilteredLogs = [
12326 'default' => [
12327 'block' => [
12328 'block' => [ 'block' ],
12329 'reblock' => [ 'reblock' ],
12330 'unblock' => [ 'unblock' ],
12331 ],
12332 'contentmodel' => [
12333 'change' => [ 'change' ],
12334 'new' => [ 'new' ],
12335 ],
12336 'delete' => [
12337 'delete' => [ 'delete' ],
12338 'delete_redir' => [ 'delete_redir', 'delete_redir2' ],
12339 'restore' => [ 'restore' ],
12340 'event' => [ 'event' ],
12341 'revision' => [ 'revision' ],
12342 ],
12343 'import' => [
12344 'interwiki' => [ 'interwiki' ],
12345 'upload' => [ 'upload' ],
12346 ],
12347 'managetags' => [
12348 'create' => [ 'create' ],
12349 'delete' => [ 'delete' ],
12350 'activate' => [ 'activate' ],
12351 'deactivate' => [ 'deactivate' ],
12352 ],
12353 'move' => [
12354 'move' => [ 'move' ],
12355 'move_redir' => [ 'move_redir' ],
12356 ],
12357 'newusers' => [
12358 'create' => [ 'create', 'newusers' ],
12359 'create2' => [ 'create2' ],
12360 'autocreate' => [ 'autocreate' ],
12361 'byemail' => [ 'byemail' ],
12362 ],
12363 'protect' => [
12364 'protect' => [ 'protect' ],
12365 'modify' => [ 'modify' ],
12366 'unprotect' => [ 'unprotect' ],
12367 'move_prot' => [ 'move_prot' ],
12368 ],
12369 'rights' => [
12370 'rights' => [ 'rights' ],
12371 'autopromote' => [ 'autopromote' ],
12372 ],
12373 'suppress' => [
12374 'event' => [ 'event' ],
12375 'revision' => [ 'revision' ],
12376 'delete' => [ 'delete' ],
12377 'block' => [ 'block' ],
12378 'reblock' => [ 'reblock' ],
12379 ],
12380 'upload' => [
12381 'upload' => [ 'upload' ],
12382 'overwrite' => [ 'overwrite' ],
12383 'revert' => [ 'revert' ],
12384 ],
12385 ],
12386 'type' => 'map',
12387 ];
12388
12392 public const NewUserLog = [
12393 'default' => true,
12394 ];
12395
12401 public const PageCreationLog = [
12402 'default' => true,
12403 ];
12404
12405 // endregion -- end logging
12406
12407 /***************************************************************************/
12408 // region Special pages (general and miscellaneous)
12414 public const AllowSpecialInclusion = [
12415 'default' => true,
12416 ];
12417
12424 public const DisableQueryPageUpdate = [
12425 'default' => false,
12426 ];
12427
12432 public const CountCategorizedImagesAsUsed = [
12433 'default' => false,
12434 ];
12435
12440 public const MaxRedirectLinksRetrieved = [
12441 'default' => 500,
12442 ];
12443
12450 public const RangeContributionsCIDRLimit = [
12451 'default' => [
12452 'IPv4' => 16,
12453 'IPv6' => 32,
12454 ],
12455 'type' => 'map',
12456 'additionalProperties' => [ 'type' => 'integer', ],
12457 ];
12458
12459 // endregion -- end special pages
12460
12461 /***************************************************************************/
12462 // region Actions
12471 public const Actions = [
12472 'default' => [],
12473 'type' => 'map',
12474 ];
12475
12476 // endregion -- end actions
12477
12478 /***************************************************************************/
12479 // region Robot (search engine crawler) policy
12481 // See also $wgNoFollowLinks.
12482
12488 public const DefaultRobotPolicy = [
12489 'default' => 'index,follow',
12490 ];
12491
12507 public const NamespaceRobotPolicies = [
12508 'default' => [],
12509 'type' => 'map',
12510 ];
12511
12541 public const ArticleRobotPolicies = [
12542 'default' => [],
12543 'type' => 'map',
12544 ];
12545
12557 public const ExemptFromUserRobotsControl = [
12558 'default' => null,
12559 'type' => '?list',
12560 ];
12561
12562 // endregion End robot policy
12563
12564 /***************************************************************************/
12565 // region Action API and REST API
12582 public const DebugAPI = [
12583 'default' => false,
12584 ];
12585
12621 public const APIModules = [
12622 'default' => [],
12623 'type' => 'map',
12624 ];
12625
12634 public const APIFormatModules = [
12635 'default' => [],
12636 'type' => 'map',
12637 ];
12638
12647 public const APIMetaModules = [
12648 'default' => [],
12649 'type' => 'map',
12650 ];
12651
12660 public const APIPropModules = [
12661 'default' => [],
12662 'type' => 'map',
12663 ];
12664
12673 public const APIListModules = [
12674 'default' => [],
12675 'type' => 'map',
12676 ];
12677
12682 public const APIMaxDBRows = [
12683 'default' => 5000,
12684 ];
12685
12691 public const APIMaxResultSize = [
12692 'default' => 8_388_608,
12693 ];
12694
12699 public const APIMaxUncachedDiffs = [
12700 'default' => 1,
12701 ];
12702
12709 public const APIMaxLagThreshold = [
12710 'default' => 7,
12711 ];
12712
12716 public const APICacheHelpTimeout = [
12717 'default' => 60 * 60,
12718 ];
12719
12724 public const APIUselessQueryPages = [
12725 'default' => [
12726 'MIMEsearch',
12727 'LinkSearch',
12728 ],
12729 'type' => 'list',
12730 ];
12731
12735 public const AjaxLicensePreview = [
12736 'default' => true,
12737 ];
12738
12761 public const CrossSiteAJAXdomains = [
12762 'default' => [],
12763 'type' => 'map',
12764 ];
12765
12771 public const CrossSiteAJAXdomainExceptions = [
12772 'default' => [],
12773 'type' => 'map',
12774 ];
12775
12779 public const AllowedCorsHeaders = [
12780 'default' => [
12781 /* simple headers (see spec) */
12782 'Accept',
12783 'Accept-Language',
12784 'Content-Language',
12785 'Content-Type',
12786 /* non-authorable headers in XHR, which are however requested by some UAs */
12787 'Accept-Encoding',
12788 'DNT',
12789 'Origin',
12790 /* MediaWiki whitelist */
12791 'User-Agent',
12792 'Api-User-Agent',
12793 /* Allowing caching preflight requests, see T269636 */
12794 'Access-Control-Max-Age',
12795 /* OAuth 2.0, see T322944 */
12796 'Authorization',
12797 ],
12798 'type' => 'list',
12799 ];
12800
12806 public const RestAPIAdditionalRouteFiles = [
12807 'default' => [],
12808 'type' => 'list',
12809 ];
12810
12829 public const RestSandboxSpecs = [
12830 'default' => [],
12831 'type' => 'map',
12832 'additionalProperties' => [
12833 'type' => 'object',
12834 'properties' => [
12835 'url' => [ 'type' => 'string', 'format' => 'url' ],
12836 'name' => [ 'type' => 'string' ],
12837 'msg' => [ 'type' => 'string', 'description' => 'a message key' ]
12838 ],
12839 'required' => [ 'url' ]
12840 ]
12841 ];
12842
12843 // endregion -- End AJAX and API
12844
12845 /***************************************************************************/
12846 // region Shell and process control
12852 public const MaxShellMemory = [
12853 'default' => 307_200,
12854 ];
12855
12860 public const MaxShellFileSize = [
12861 'default' => 102_400,
12862 ];
12863
12867 public const MaxShellTime = [
12868 'default' => 180,
12869 ];
12870
12875 public const MaxShellWallClockTime = [
12876 'default' => 180,
12877 ];
12878
12902 public const ShellCgroup = [
12903 'default' => false,
12904 ];
12905
12909 public const PhpCli = [
12910 'default' => '/usr/bin/php',
12911 ];
12912
12925 public const ShellRestrictionMethod = [
12926 'default' => 'autodetect',
12927 'type' => 'string|false',
12928 ];
12929
12943 public const ShellboxUrls = [
12944 'default' => [ 'default' => null, ],
12945 'type' => 'map',
12946 'additionalProperties' => [
12947 'type' => 'string|false|null',
12948 ],
12949 ];
12950
12957 public const ShellboxSecretKey = [
12958 'default' => null,
12959 'type' => '?string',
12960 ];
12961
12971 public const ShellboxShell = [
12972 'default' => '/bin/sh',
12973 'type' => '?string',
12974 ];
12975
12976 // endregion -- end Shell and process control
12977
12978 /***************************************************************************/
12979 // region HTTP client
12987 public const HTTPTimeout = [
12988 'default' => 25,
12989 'type' => 'float',
12990 ];
12991
12999 public const HTTPConnectTimeout = [
13000 'default' => 5.0,
13001 'type' => 'float',
13002 ];
13003
13011 public const HTTPMaxTimeout = [
13012 'default' => 0,
13013 'type' => 'float',
13014 ];
13015
13023 public const HTTPMaxConnectTimeout = [
13024 'default' => 0,
13025 'type' => 'float',
13026 ];
13027
13033 public const HTTPImportTimeout = [
13034 'default' => 25,
13035 ];
13036
13040 public const AsyncHTTPTimeout = [
13041 'default' => 25,
13042 ];
13043
13047 public const HTTPProxy = [
13048 'default' => '',
13049 ];
13050
13057 public const LocalVirtualHosts = [
13058 'default' => [],
13059 'type' => 'map',
13060 ];
13061
13069 public const LocalHTTPProxy = [
13070 'default' => false,
13071 'type' => 'string|false',
13072 ];
13073
13083 public const AllowExternalReqID = [
13084 'default' => false,
13085 ];
13086
13087 // endregion -- End HTTP client
13088
13089 /***************************************************************************/
13090 // region Job queue
13110 public const JobRunRate = [
13111 'default' => 1,
13112 ];
13113
13121 public const RunJobsAsync = [
13122 'default' => false,
13123 ];
13124
13128 public const UpdateRowsPerJob = [
13129 'default' => 300,
13130 ];
13131
13135 public const UpdateRowsPerQuery = [
13136 'default' => 100,
13137 ];
13138
13139 // endregion -- End job queue
13140
13141 /***************************************************************************/
13142 // region Miscellaneous
13150 public const RedirectOnLogin = [
13151 'default' => null,
13152 ];
13153
13190 public const VirtualRestConfig = [
13191 'default' => [
13192 'paths' => [],
13193 'modules' => [],
13194 'global' => [
13195 # Timeout in seconds
13196 'timeout' => 360,
13197 # 'domain' is set to $wgCanonicalServer in Setup.php
13198 'forwardCookies' => false,
13199 'HTTPProxy' => null
13200 ]
13201 ],
13202 'mergeStrategy' => 'array_plus_2d',
13203 'type' => 'map',
13204 ];
13205
13228 public const EventRelayerConfig = [
13229 'default' => [
13230 'default' => [ 'class' => EventRelayerNull::class, ],
13231 ],
13232 'type' => 'map',
13233 ];
13234
13252 public const Pingback = [
13253 'default' => false,
13254 'type' => 'boolean',
13255 ];
13256
13262 public const OriginTrials = [
13263 'default' => [],
13264 'type' => 'list',
13265 ];
13266
13273 public const ReportToExpiry = [
13274 'default' => 86400,
13275 'type' => 'integer',
13276 ];
13277
13284 public const ReportToEndpoints = [
13285 'default' => [],
13286 'type' => 'list',
13287 ];
13288
13297 public const FeaturePolicyReportOnly = [
13298 'default' => [],
13299 'type' => 'list',
13300 ];
13301
13307 public const SkinsPreferred = [
13308 'default' => [ 'vector-2022', 'vector' ],
13309 'type' => 'list',
13310 ];
13311
13317 public const SpecialContributeSkinsEnabled = [
13318 'default' => [],
13319 'type' => 'list',
13320 ];
13321
13326 public const SpecialContributeNewPageTarget = [
13327 'default' => null,
13328 'type' => '?string',
13329 ];
13330
13337 public const EnableEditRecovery = [
13338 'default' => false,
13339 'type' => 'boolean',
13340 ];
13341
13345 public const EditRecoveryExpiry = [
13346 'default' => 30 * 24 * 3600,
13347 'type' => 'integer',
13348 ];
13349
13356 public const UseCodexSpecialBlock = [
13357 'default' => false,
13358 'type' => 'boolean',
13359 ];
13360
13367 public const ShowLogoutConfirmation = [
13368 'default' => false,
13369 'type' => 'boolean',
13370 ];
13371
13377 public const EnableProtectionIndicators = [
13378 'default' => true,
13379 'type' => 'boolean',
13380 ];
13381
13388 public const OutputPipelineStages = [
13389 'default' => [],
13390 'type' => 'map',
13391 ];
13392
13420 public const FeatureShutdown = [
13421 'default' => [],
13422 'type' => 'list',
13423 ];
13424
13431 public const CloneArticleParserOutput = [
13432 'default' => true,
13433 'type' => 'boolean',
13434 ];
13435
13442 public const UseLeximorph = [
13443 'default' => false,
13444 'type' => 'boolean',
13445 ];
13446
13454 public const UsePostprocCache = [
13455 'default' => false,
13456 'type' => 'boolean',
13457 ];
13458
13465 public const UsePostprocCacheLegacy = [
13466 'default' => false,
13467 'type' => 'boolean'
13468 ];
13469
13476 public const UsePostprocCacheParsoid = [
13477 'default' => false,
13478 'type' => 'boolean'
13479 ];
13480
13491 public const ParserOptionsLogUnsafeSampleRate = [
13492 'default' => 0,
13493 'type' => 'integer'
13494 ];
13495
13496 // endregion -- End Miscellaneous
13497}
const SCHEMA_COMPAT_WRITE_BOTH
Definition Defines.php:301
const SCHEMA_COMPAT_OLD
Definition Defines.php:305
const AV_SCAN_FAILED
Definition Defines.php:86
const SCHEMA_COMPAT_READ_NEW
Definition Defines.php:298
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 add recent change entries mentioning category membership changes.
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.
Send recent change to a Redis Pub/Sub channel.
Send recent change notifications to a destination address over UDP.
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, 250, 300,], 'ThumbnailNamespaces'=>[6,], 'ThumbnailSteps'=> null, 'ThumbnailStepsRatio'=> null, 'ThumbnailBuckets'=> null, 'ThumbnailMinimumBucketDistance'=> 50, 'UploadThumbnailRenderMap'=>[], 'UploadThumbnailRenderMethod'=> 'jobqueue', 'UploadThumbnailRenderHttpCustomHost'=> false, 'UploadThumbnailRenderHttpCustomDomain'=> false, 'UseTinyRGBForJPGThumbnails'=> false, 'GalleryOptions'=>[], 'ThumbUpright'=> 0.75, 'DirectoryMode'=> 511, 'ResponsiveImages'=> true, 'ImagePreconnect'=> 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, 'UserEmailConfirmationUseHTML'=> false, 'PasswordExpirationDays'=> false, 'PasswordExpireGrace'=> 604800, 'SMTP'=> false, 'AdditionalMailParams'=> null, 'AllowHTMLEmail'=> false, 'EnotifFromEditor'=> false, 'EmailAuthentication'=> true, '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, 'ImageLinksSchemaMigrationStage'=> 769, '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,],], 'parsoid-pcache'=>['default'=>['minCpuTime'=> 0,],], 'postproc-pcache'=>['default'=>['minCpuTime'=> 9223372036854775807,],], 'postproc-parsoid-pcache'=>['default'=>['minCpuTime'=> 9223372036854775807,],],], 'ChronologyProtectorSecret'=> '', 'ParserCacheExpireTime'=> 86400, 'ParserCacheAsyncExpireTime'=> 60, 'ParserCacheAsyncRefreshJobs'=> true, 'OldRevisionParserCacheExpireTime'=> 3600, 'ObjectCacheSessionExpiry'=> 3600, 'PHPSessionHandling'=> 'warn', 'SuspiciousIpExpiry'=> false, 'SessionPbkdf2Iterations'=> 10001, 'UseSessionCookieJwt'=> false, '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, ], '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, ], ], '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, ], '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, '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, 'pagelang' => true, ], 'editprotected' => [ 'edit' => true, 'minoredit' => true, 'applychangetags' => true, 'changetags' => true, 'editcontentmodel' => true, 'editprotected' => true, ], 'editmycssjs' => [ 'edit' => true, 'minoredit' => true, 'applychangetags' => true, 'changetags' => true, 'editcontentmodel' => true, 'editmyusercss' => true, 'editmyuserjson' => true, 'editmyuserjs' => true, ], 'editmyoptions' => [ 'editmyoptions' => true, 'editmyuserjson' => true, ], 'editinterface' => [ 'edit' => true, 'minoredit' => true, 'applychangetags' => true, 'changetags' => true, 'editcontentmodel' => true, 'editinterface' => true, 'edituserjson' => true, 'editsitejson' => true, ], 'editsiteconfig' => [ 'edit' => true, 'minoredit' => true, 'applychangetags' => true, 'changetags' => true, 'editcontentmodel' => 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, '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, '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, '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, '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, '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, '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' => [ ], 'RCEngines' => [ 'redis' => 'MediaWiki\\RCFeed\\RedisPubSubFeedEngine', 'udp' => 'MediaWiki\\RCFeed\\UDPRCFeedEngine', ], '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, ], '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, '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\\JobQueue\\Jobs\\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', '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, '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, 'UsePostprocCache' => false, 'UsePostprocCacheLegacy' => false, 'UsePostprocCacheParsoid' => false, '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', ], 'ThumbnailStepsRatio' => [ 'number', 'null', ], 'ThumbnailBuckets' => [ 'array', 'null', ], 'UploadThumbnailRenderMap' => 'object', 'GalleryOptions' => 'object', 'DjvuDump' => [ 'string', 'null', ], 'DjvuRenderer' => [ 'string', 'null', ], 'DjvuTxt' => [ 'string', 'null', ], 'DjvuPostProcessor' => [ 'string', 'null', ], 'UserEmailConfirmationUseHTML' => 'boolean', 'SMTP' => [ 'boolean', 'object', ], 'EnotifFromEditor' => 'boolean', 'EnotifRevealEditorAddress' => 'boolean', 'UsersNotifiedOnAllChanges' => 'object', 'DBmwschema' => [ 'string', 'null', ], 'SharedTables' => 'array', 'DBservers' => [ 'boolean', 'array', ], 'LBFactoryConf' => 'object', 'LocalDatabases' => 'array', 'VirtualDomainsMapping' => 'object', 'FileSchemaMigrationStage' => 'integer', 'ImageLinksSchemaMigrationStage' => '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', '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', ], 'CSPHeader' => [ 'boolean', 'object', ], 'CSPReportOnlyHeader' => [ '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', 'RCEngines' => 'object', 'OverrideSiteFeed' => 'object', 'FeedClasses' => 'object', 'AdvertisedFeedTypes' => 'array', 'SoftwareTags' => 'object', 'RecentChangesFlags' => 'object', 'WatchlistExpiry' => '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', ], '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', 'UsePostprocCache' => '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', ], 'msg' => [ 'type' => 'string', 'description' => 'a message key', ], ], 'required' => [ 'url', ], ], ], '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.