MediaWiki master
ApiPageSet.php
Go to the documentation of this file.
1<?php
9namespace MediaWiki\Api;
10
13use MediaWiki\Cache\LinkBatch;
14use MediaWiki\Cache\LinkBatchFactory;
15use MediaWiki\Cache\LinkCache;
33use stdClass;
38
53class ApiPageSet extends ApiBase {
58 private const DISABLE_GENERATORS = 1;
59
61 private $mDbSource;
62
64 private $mParams;
65
67 private $mResolveRedirects;
68
70 private $mConvertTitles;
71
73 private $mAllowGenerator;
74
76 private $mAllPages = [];
77
79 private $mTitles = [];
80
82 private $mGoodAndMissingPages = [];
83
85 private $mGoodPages = [];
86
88 private $mGoodTitles = [];
89
91 private $mMissingPages = [];
92
94 private $mMissingTitles = [];
95
97 private $mInvalidTitles = [];
98
100 private $mMissingPageIDs = [];
101
103 private $mRedirectTitles = [];
104
106 private $mSpecialTitles = [];
107
109 private $mAllSpecials = [];
110
112 private $mNormalizedTitles = [];
113
115 private $mInterwikiTitles = [];
116
118 private $mPendingRedirectIDs = [];
119
121 private $mPendingRedirectSpecialPages = [];
122
124 private $mResolvedRedirectTitles = [];
125
127 private $mConvertedTitles = [];
128
130 private $mGoodRevIDs = [];
131
133 private $mLiveRevIDs = [];
134
136 private $mDeletedRevIDs = [];
137
139 private $mMissingRevIDs = [];
140
142 private $mGeneratorData = [];
143
145 private $mFakePageId = -1;
146
148 private $mCacheMode = 'public';
149
151 private $mRequestedPageFields = [];
152
154 private $mDefaultNamespace;
155
157 private $mRedirectMergePolicy;
158
160 private static $generators = null;
161
162 private Language $contentLanguage;
163 private LinkCache $linkCache;
164 private NamespaceInfo $namespaceInfo;
165 private GenderCache $genderCache;
166 private LinkBatchFactory $linkBatchFactory;
167 private TitleFactory $titleFactory;
168 private ILanguageConverter $languageConverter;
169 private SpecialPageFactory $specialPageFactory;
170
178 private static function addValues( array &$result, $values, $flags = [], $name = null ) {
179 foreach ( $values as $val ) {
180 if ( $val instanceof Title ) {
181 $v = [];
182 ApiQueryBase::addTitleInfo( $v, $val );
183 } elseif ( $name !== null ) {
184 $v = [ $name => $val ];
185 } else {
186 $v = $val;
187 }
188 foreach ( $flags as $flag ) {
189 $v[$flag] = true;
190 }
191 $result[] = $v;
192 }
193 }
194
202 public function __construct( ApiBase $dbSource, $flags = 0, $defaultNamespace = NS_MAIN ) {
203 parent::__construct( $dbSource->getMain(), $dbSource->getModuleName() );
204 $this->mDbSource = $dbSource;
205 $this->mAllowGenerator = ( $flags & self::DISABLE_GENERATORS ) == 0;
206 $this->mDefaultNamespace = $defaultNamespace;
207
208 $this->mParams = $this->extractRequestParams();
209 $this->mResolveRedirects = $this->mParams['redirects'];
210 $this->mConvertTitles = $this->mParams['converttitles'];
211
212 // Needs service injection - T283314
213 $services = MediaWikiServices::getInstance();
214 $this->contentLanguage = $services->getContentLanguage();
215 $this->linkCache = $services->getLinkCache();
216 $this->namespaceInfo = $services->getNamespaceInfo();
217 $this->genderCache = $services->getGenderCache();
218 $this->linkBatchFactory = $services->getLinkBatchFactory();
219 $this->titleFactory = $services->getTitleFactory();
220 $this->languageConverter = $services->getLanguageConverterFactory()
221 ->getLanguageConverter( $this->contentLanguage );
222 $this->specialPageFactory = $services->getSpecialPageFactory();
223 }
224
229 public function executeDryRun() {
230 $this->executeInternal( true );
231 }
232
236 public function execute() {
237 $this->executeInternal( false );
238 }
239
245 private function executeInternal( $isDryRun ) {
246 $generatorName = $this->mAllowGenerator ? $this->mParams['generator'] : null;
247 if ( $generatorName !== null ) {
248 $dbSource = $this->mDbSource;
249 if ( !$dbSource instanceof ApiQuery ) {
250 // If the parent container of this pageset is not ApiQuery, we must create it to run generator
251 $dbSource = $this->getMain()->getModuleManager()->getModule( 'query' );
252 }
253 $generator = $dbSource->getModuleManager()->getModule( $generatorName, null, true );
254 if ( $generator === null ) {
255 $this->dieWithError( [ 'apierror-badgenerator-unknown', $generatorName ], 'badgenerator' );
256 }
257 if ( !$generator instanceof ApiQueryGeneratorBase ) {
258 $this->dieWithError( [ 'apierror-badgenerator-notgenerator', $generatorName ], 'badgenerator' );
259 }
260 // Create a temporary pageset to store generator's output,
261 // add any additional fields generator may need, and execute pageset to populate titles/pageids
262 // @phan-suppress-next-line PhanTypeMismatchArgumentNullable T240141
263 $tmpPageSet = new ApiPageSet( $dbSource, self::DISABLE_GENERATORS );
264 $generator->setGeneratorMode( $tmpPageSet );
265 $this->mCacheMode = $generator->getCacheMode( $generator->extractRequestParams() );
266
267 if ( !$isDryRun ) {
268 $generator->requestExtraData( $tmpPageSet );
269 }
270 $tmpPageSet->executeInternal( $isDryRun );
271
272 // populate this pageset with the generator output
273 if ( !$isDryRun ) {
274 $generator->executeGenerator( $this );
275
276 // @phan-suppress-next-line PhanTypeMismatchArgumentNullable T240141
277 $this->getHookRunner()->onAPIQueryGeneratorAfterExecute( $generator, $this );
278 } else {
279 // Prevent warnings from being reported on these parameters
280 $main = $this->getMain();
281 foreach ( $generator->extractRequestParams() as $paramName => $param ) {
282 $main->markParamsUsed( $generator->encodeParamName( $paramName ) );
283 }
284 }
285
286 if ( !$isDryRun ) {
287 $this->resolvePendingRedirects();
288 }
289 } else {
290 // Only one of the titles/pageids/revids is allowed at the same time
291 $dataSource = null;
292 if ( isset( $this->mParams['titles'] ) ) {
293 $dataSource = 'titles';
294 }
295 if ( isset( $this->mParams['pageids'] ) ) {
296 if ( $dataSource !== null ) {
297 $this->dieWithError(
298 [
299 'apierror-invalidparammix-cannotusewith',
300 $this->encodeParamName( 'pageids' ),
301 $this->encodeParamName( $dataSource )
302 ],
303 'multisource'
304 );
305 }
306 $dataSource = 'pageids';
307 }
308 if ( isset( $this->mParams['revids'] ) ) {
309 if ( $dataSource !== null ) {
310 $this->dieWithError(
311 [
312 'apierror-invalidparammix-cannotusewith',
313 $this->encodeParamName( 'revids' ),
314 $this->encodeParamName( $dataSource )
315 ],
316 'multisource'
317 );
318 }
319 $dataSource = 'revids';
320 }
321
322 if ( !$isDryRun ) {
323 // Populate page information with the original user input
324 switch ( $dataSource ) {
325 case 'titles':
326 $this->initFromTitles( $this->mParams['titles'] );
327 break;
328 case 'pageids':
329 $this->initFromPageIds( $this->mParams['pageids'] );
330 break;
331 case 'revids':
332 if ( $this->mResolveRedirects ) {
333 $this->addWarning( 'apiwarn-redirectsandrevids' );
334 }
335 $this->mResolveRedirects = false;
336 $this->initFromRevIDs( $this->mParams['revids'] );
337 break;
338 default:
339 // Do nothing - some queries do not need any of the data sources.
340 break;
341 }
342 }
343 }
344 }
345
350 public function isResolvingRedirects() {
351 return $this->mResolveRedirects;
352 }
353
362 public function getDataSource() {
363 if ( $this->mAllowGenerator && isset( $this->mParams['generator'] ) ) {
364 return 'generator';
365 }
366 if ( isset( $this->mParams['titles'] ) ) {
367 return 'titles';
368 }
369 if ( isset( $this->mParams['pageids'] ) ) {
370 return 'pageids';
371 }
372 if ( isset( $this->mParams['revids'] ) ) {
373 return 'revids';
374 }
375
376 return null;
377 }
378
384 public function requestField( $fieldName ) {
385 $this->mRequestedPageFields[$fieldName] = [];
386 }
387
394 public function getCustomField( $fieldName ) {
395 return $this->mRequestedPageFields[$fieldName];
396 }
397
404 public function getPageTableFields() {
405 // Ensure we get minimum required fields
406 // DON'T change this order
407 $pageFlds = [
408 'page_namespace' => null,
409 'page_title' => null,
410 'page_id' => null,
411 ];
412
413 if ( $this->mResolveRedirects ) {
414 $pageFlds['page_is_redirect'] = null;
415 }
416
417 $pageFlds['page_content_model'] = null;
418
419 if ( $this->getConfig()->get( MainConfigNames::PageLanguageUseDB ) ) {
420 $pageFlds['page_lang'] = null;
421 }
422
423 foreach ( LinkCache::getSelectFields() as $field ) {
424 $pageFlds[$field] = null;
425 }
426
427 $pageFlds = array_merge( $pageFlds, $this->mRequestedPageFields );
428
429 return array_keys( $pageFlds );
430 }
431
438 public function getAllTitlesByNamespace() {
439 return $this->mAllPages;
440 }
441
450 public function getPages(): array {
451 return $this->mTitles;
452 }
453
458 public function getTitleCount() {
459 return count( $this->mTitles );
460 }
461
466 public function getGoodTitlesByNamespace() {
467 return $this->mGoodPages;
468 }
469
476 public function getGoodPages(): array {
477 return $this->mGoodTitles;
478 }
479
484 public function getGoodTitleCount() {
485 return count( $this->mGoodTitles );
486 }
487
493 public function getMissingTitlesByNamespace() {
494 return $this->mMissingPages;
495 }
496
504 public function getMissingPages(): array {
505 return $this->mMissingTitles;
506 }
507
513 return $this->mGoodAndMissingPages;
514 }
515
521 public function getGoodAndMissingPages(): array {
522 return $this->mGoodTitles + $this->mMissingTitles;
523 }
524
530 public function getInvalidTitlesAndReasons() {
531 return $this->mInvalidTitles;
532 }
533
538 public function getMissingPageIDs() {
539 return $this->mMissingPageIDs;
540 }
541
548 public function getRedirectTargets(): array {
549 return $this->mRedirectTitles;
550 }
551
559 public function getRedirectTitlesAsResult( $result = null ) {
560 $values = [];
561 foreach ( $this->mRedirectTitles as $titleStrFrom => $titleTo ) {
562 $r = [
563 'from' => strval( $titleStrFrom ),
564 'to' => $titleTo->getPrefixedText(),
565 ];
566 if ( $titleTo->hasFragment() ) {
567 $r['tofragment'] = $titleTo->getFragment();
568 }
569 if ( $titleTo->isExternal() ) {
570 $r['tointerwiki'] = $titleTo->getInterwiki();
571 }
572 if ( isset( $this->mResolvedRedirectTitles[$titleStrFrom] ) ) {
573 $titleFrom = $this->mResolvedRedirectTitles[$titleStrFrom];
574 $ns = $titleFrom->getNamespace();
575 $dbkey = $titleFrom->getDBkey();
576 if ( isset( $this->mGeneratorData[$ns][$dbkey] ) ) {
577 $r = array_merge( $this->mGeneratorData[$ns][$dbkey], $r );
578 }
579 }
580
581 $values[] = $r;
582 }
583 if ( $values && $result ) {
584 ApiResult::setIndexedTagName( $values, 'r' );
585 }
586
587 return $values;
588 }
589
595 public function getNormalizedTitles() {
596 return $this->mNormalizedTitles;
597 }
598
606 public function getNormalizedTitlesAsResult( $result = null ) {
607 $values = [];
608 foreach ( $this->getNormalizedTitles() as $rawTitleStr => $titleStr ) {
609 $encode = $this->contentLanguage->normalize( $rawTitleStr ) !== $rawTitleStr;
610 $values[] = [
611 'fromencoded' => $encode,
612 'from' => $encode ? rawurlencode( $rawTitleStr ) : $rawTitleStr,
613 'to' => $titleStr
614 ];
615 }
616 if ( $values && $result ) {
617 ApiResult::setIndexedTagName( $values, 'n' );
618 }
619
620 return $values;
621 }
622
628 public function getConvertedTitles() {
629 return $this->mConvertedTitles;
630 }
631
639 public function getConvertedTitlesAsResult( $result = null ) {
640 $values = [];
641 foreach ( $this->getConvertedTitles() as $rawTitleStr => $titleStr ) {
642 $values[] = [
643 'from' => $rawTitleStr,
644 'to' => $titleStr
645 ];
646 }
647 if ( $values && $result ) {
648 ApiResult::setIndexedTagName( $values, 'c' );
649 }
650
651 return $values;
652 }
653
659 public function getInterwikiTitles() {
660 return $this->mInterwikiTitles;
661 }
662
671 public function getInterwikiTitlesAsResult( $result = null, $iwUrl = false ) {
672 $values = [];
673 foreach ( $this->getInterwikiTitles() as $rawTitleStr => $interwikiStr ) {
674 $item = [
675 'title' => $rawTitleStr,
676 'iw' => $interwikiStr,
677 ];
678 if ( $iwUrl ) {
679 $title = $this->titleFactory->newFromText( $rawTitleStr );
680 $item['url'] = $title->getFullURL( '', false, PROTO_CURRENT );
681 }
682 $values[] = $item;
683 }
684 if ( $values && $result ) {
685 ApiResult::setIndexedTagName( $values, 'i' );
686 }
687
688 return $values;
689 }
690
705 public function getInvalidTitlesAndRevisions( $invalidChecks = [ 'invalidTitles',
706 'special', 'missingIds', 'missingRevIds', 'missingTitles', 'interwikiTitles' ]
707 ) {
708 $result = [];
709 if ( in_array( 'invalidTitles', $invalidChecks ) ) {
710 self::addValues( $result, $this->getInvalidTitlesAndReasons(), [ 'invalid' ] );
711 }
712 if ( in_array( 'special', $invalidChecks ) ) {
713 $known = [];
714 $unknown = [];
715 foreach ( $this->mSpecialTitles as $title ) {
716 if ( $title->isKnown() ) {
717 $known[] = $title;
718 } else {
719 $unknown[] = $title;
720 }
721 }
722 self::addValues( $result, $unknown, [ 'special', 'missing' ] );
723 self::addValues( $result, $known, [ 'special' ] );
724 }
725 if ( in_array( 'missingIds', $invalidChecks ) ) {
726 self::addValues( $result, $this->getMissingPageIDs(), [ 'missing' ], 'pageid' );
727 }
728 if ( in_array( 'missingRevIds', $invalidChecks ) ) {
729 self::addValues( $result, $this->getMissingRevisionIDs(), [ 'missing' ], 'revid' );
730 }
731 if ( in_array( 'missingTitles', $invalidChecks ) ) {
732 $known = [];
733 $unknown = [];
734 foreach ( $this->mMissingTitles as $title ) {
735 if ( $title->isKnown() ) {
736 $known[] = $title;
737 } else {
738 $unknown[] = $title;
739 }
740 }
741 self::addValues( $result, $unknown, [ 'missing' ] );
742 self::addValues( $result, $known, [ 'missing', 'known' ] );
743 }
744 if ( in_array( 'interwikiTitles', $invalidChecks ) ) {
745 self::addValues( $result, $this->getInterwikiTitlesAsResult() );
746 }
747
748 return $result;
749 }
750
755 public function getRevisionIDs() {
756 return $this->mGoodRevIDs;
757 }
758
763 public function getLiveRevisionIDs() {
764 return $this->mLiveRevIDs;
765 }
766
771 public function getDeletedRevisionIDs() {
772 return $this->mDeletedRevIDs;
773 }
774
779 public function getMissingRevisionIDs() {
780 return $this->mMissingRevIDs;
781 }
782
789 public function getMissingRevisionIDsAsResult( $result = null ) {
790 $values = [];
791 foreach ( $this->getMissingRevisionIDs() as $revid ) {
792 $values[$revid] = [
793 'revid' => $revid,
794 'missing' => true,
795 ];
796 }
797 if ( $values && $result ) {
798 ApiResult::setIndexedTagName( $values, 'rev' );
799 }
800
801 return $values;
802 }
803
809 public function getSpecialPages(): array {
810 return $this->mSpecialTitles;
811 }
812
817 public function getRevisionCount() {
818 return count( $this->getRevisionIDs() );
819 }
820
825 public function populateFromTitles( $titles ) {
826 $this->initFromTitles( $titles );
827 }
828
833 public function populateFromPageIDs( $pageIDs ) {
834 $this->initFromPageIds( $pageIDs );
835 }
836
846 public function populateFromQueryResult( $db, $queryResult ) {
847 $this->initFromQueryResult( $queryResult );
848 }
849
854 public function populateFromRevisionIDs( $revIDs ) {
855 $this->initFromRevIDs( $revIDs );
856 }
857
862 public function processDbRow( $row ) {
863 // Store Title object in various data structures
864 $title = $this->titleFactory->newFromRow( $row );
865
866 $this->linkCache->addGoodLinkObjFromRow( $title, $row );
867
868 $pageId = (int)$row->page_id;
869 $this->mAllPages[$row->page_namespace][$row->page_title] = $pageId;
870 $this->mTitles[] = $title;
871
872 if ( $this->mResolveRedirects && $row->page_is_redirect == '1' ) {
873 $this->mPendingRedirectIDs[$pageId] = $title;
874 } else {
875 $this->mGoodPages[$row->page_namespace][$row->page_title] = $pageId;
876 $this->mGoodAndMissingPages[$row->page_namespace][$row->page_title] = $pageId;
877 $this->mGoodTitles[$pageId] = $title;
878 }
879
880 foreach ( $this->mRequestedPageFields as $fieldName => &$fieldValues ) {
881 $fieldValues[$pageId] = $row->$fieldName;
882 }
883 }
884
901 private function initFromTitles( $titles ) {
902 // Get validated and normalized title objects
903 $linkBatch = $this->processTitlesArray( $titles );
904 if ( $linkBatch->isEmpty() ) {
905 // There might be special-page redirects
906 $this->resolvePendingRedirects();
907 return;
908 }
909
910 $db = $this->getDB();
911
912 // Get pageIDs data from the `page` table
913 $res = $db->newSelectQueryBuilder()
914 ->select( $this->getPageTableFields() )
915 ->from( 'page' )
916 ->where( $linkBatch->constructSet( 'page', $db ) )
917 ->caller( __METHOD__ )
918 ->fetchResultSet();
919
920 // Hack: get the ns:titles stored in [ ns => [ titles ] ] format
921 $this->initFromQueryResult( $res, $linkBatch->data, true ); // process Titles
922
923 // Resolve any found redirects
924 $this->resolvePendingRedirects();
925 }
926
932 private function initFromPageIds( $pageids, $filterIds = true ) {
933 if ( !$pageids ) {
934 return;
935 }
936
937 $pageids = array_map( 'intval', $pageids ); // paranoia
938 $remaining = array_fill_keys( $pageids, true );
939
940 if ( $filterIds ) {
941 $pageids = $this->filterIDs( [ [ 'page', 'page_id' ] ], $pageids );
942 }
943
944 $res = null;
945 if ( $pageids ) {
946 $db = $this->getDB();
947
948 // Get pageIDs data from the `page` table
949 $res = $db->newSelectQueryBuilder()
950 ->select( $this->getPageTableFields() )
951 ->from( 'page' )
952 ->where( [ 'page_id' => $pageids ] )
953 ->caller( __METHOD__ )
954 ->fetchResultSet();
955 }
956
957 $this->initFromQueryResult( $res, $remaining, false ); // process PageIDs
958
959 // Resolve any found redirects
960 $this->resolvePendingRedirects();
961 }
962
973 private function initFromQueryResult( $res, &$remaining = null, $processTitles = null ) {
974 if ( $remaining !== null && $processTitles === null ) {
975 ApiBase::dieDebug( __METHOD__, 'Missing $processTitles parameter when $remaining is provided' );
976 }
977
978 $usernames = [];
979 if ( $res ) {
980 foreach ( $res as $row ) {
981 $pageId = (int)$row->page_id;
982
983 // Remove found page from the list of remaining items
984 if ( $remaining ) {
985 if ( $processTitles ) {
986 unset( $remaining[$row->page_namespace][$row->page_title] );
987 } else {
988 unset( $remaining[$pageId] );
989 }
990 }
991
992 // Store any extra fields requested by modules
993 $this->processDbRow( $row );
994
995 // Need gender information
996 if ( $this->namespaceInfo->hasGenderDistinction( $row->page_namespace ) ) {
997 $usernames[] = $row->page_title;
998 }
999 }
1000 }
1001
1002 if ( $remaining ) {
1003 // Any items left in the $remaining list are added as missing
1004 if ( $processTitles ) {
1005 // The remaining titles in $remaining are non-existent pages
1006 foreach ( $remaining as $ns => $dbkeys ) {
1007 foreach ( $dbkeys as $dbkey => $_ ) {
1008 $title = $this->titleFactory->makeTitle( $ns, $dbkey );
1009 $this->linkCache->addBadLinkObj( $title );
1010 $this->mAllPages[$ns][$dbkey] = $this->mFakePageId;
1011 $this->mMissingPages[$ns][$dbkey] = $this->mFakePageId;
1012 $this->mGoodAndMissingPages[$ns][$dbkey] = $this->mFakePageId;
1013 $this->mMissingTitles[$this->mFakePageId] = $title;
1014 $this->mFakePageId--;
1015 $this->mTitles[] = $title;
1016
1017 // need gender information
1018 if ( $this->namespaceInfo->hasGenderDistinction( $ns ) ) {
1019 $usernames[] = $dbkey;
1020 }
1021 }
1022 }
1023 } else {
1024 // The remaining pageids do not exist
1025 if ( !$this->mMissingPageIDs ) {
1026 $this->mMissingPageIDs = array_keys( $remaining );
1027 } else {
1028 $this->mMissingPageIDs = array_merge( $this->mMissingPageIDs, array_keys( $remaining ) );
1029 }
1030 }
1031 }
1032
1033 // Get gender information
1034 $this->genderCache->doQuery( $usernames, __METHOD__ );
1035 }
1036
1042 private function initFromRevIDs( $revids ) {
1043 if ( !$revids ) {
1044 return;
1045 }
1046
1047 $revids = array_map( 'intval', $revids ); // paranoia
1048 $db = $this->getDB();
1049 $pageids = [];
1050 $remaining = array_fill_keys( $revids, true );
1051
1052 $revids = $this->filterIDs( [ [ 'revision', 'rev_id' ], [ 'archive', 'ar_rev_id' ] ], $revids );
1053 $goodRemaining = array_fill_keys( $revids, true );
1054
1055 if ( $revids ) {
1056 $fields = [ 'rev_id', 'rev_page' ];
1057
1058 // Get pageIDs data from the `page` table
1059 $res = $db->newSelectQueryBuilder()
1060 ->select( $fields )
1061 ->from( 'page' )
1062 ->where( [ 'rev_id' => $revids ] )
1063 ->join( 'revision', null, [ 'rev_page = page_id' ] )
1064 ->caller( __METHOD__ )
1065 ->fetchResultSet();
1066 foreach ( $res as $row ) {
1067 $revid = (int)$row->rev_id;
1068 $pageid = (int)$row->rev_page;
1069 $this->mGoodRevIDs[$revid] = $pageid;
1070 $this->mLiveRevIDs[$revid] = $pageid;
1071 $pageids[$pageid] = '';
1072 unset( $remaining[$revid] );
1073 unset( $goodRemaining[$revid] );
1074 }
1075 }
1076
1077 // Populate all the page information
1078 $this->initFromPageIds( array_keys( $pageids ), false );
1079
1080 // If the user can see deleted revisions, pull out the corresponding
1081 // titles from the archive table and include them too. We ignore
1082 // ar_page_id because deleted revisions are tied by title, not page_id.
1083 if ( $goodRemaining &&
1084 $this->getAuthority()->isAllowed( 'deletedhistory' ) ) {
1085
1086 $res = $db->newSelectQueryBuilder()
1087 ->select( [ 'ar_rev_id', 'ar_namespace', 'ar_title' ] )
1088 ->from( 'archive' )
1089 ->where( [ 'ar_rev_id' => array_keys( $goodRemaining ) ] )
1090 ->caller( __METHOD__ )
1091 ->fetchResultSet();
1092
1093 $titles = [];
1094 foreach ( $res as $row ) {
1095 $revid = (int)$row->ar_rev_id;
1096 $titles[$revid] = $this->titleFactory->makeTitle( $row->ar_namespace, $row->ar_title );
1097 unset( $remaining[$revid] );
1098 }
1099
1100 $this->initFromTitles( $titles );
1101
1102 foreach ( $titles as $revid => $title ) {
1103 $ns = $title->getNamespace();
1104 $dbkey = $title->getDBkey();
1105
1106 // Handle converted titles
1107 if ( !isset( $this->mAllPages[$ns][$dbkey] ) &&
1108 isset( $this->mConvertedTitles[$title->getPrefixedText()] )
1109 ) {
1110 $title = $this->titleFactory->newFromText( $this->mConvertedTitles[$title->getPrefixedText()] );
1111 $ns = $title->getNamespace();
1112 $dbkey = $title->getDBkey();
1113 }
1114
1115 if ( isset( $this->mAllPages[$ns][$dbkey] ) ) {
1116 $this->mGoodRevIDs[$revid] = $this->mAllPages[$ns][$dbkey];
1117 $this->mDeletedRevIDs[$revid] = $this->mAllPages[$ns][$dbkey];
1118 } else {
1119 $remaining[$revid] = true;
1120 }
1121 }
1122 }
1123
1124 $this->mMissingRevIDs = array_keys( $remaining );
1125 }
1126
1132 private function resolvePendingRedirects() {
1133 if ( $this->mResolveRedirects ) {
1134 $db = $this->getDB();
1135
1136 // Repeat until all redirects have been resolved
1137 // The infinite loop is prevented by keeping all known pages in $this->mAllPages
1138 while ( $this->mPendingRedirectIDs || $this->mPendingRedirectSpecialPages ) {
1139 // Resolve redirects by querying the pagelinks table, and repeat the process
1140 // Create a new linkBatch object for the next pass
1141 $linkBatch = $this->loadRedirectTargets();
1142
1143 if ( $linkBatch->isEmpty() ) {
1144 break;
1145 }
1146
1147 $set = $linkBatch->constructSet( 'page', $db );
1148 if ( $set === false ) {
1149 break;
1150 }
1151
1152 // Get pageIDs data from the `page` table
1153 $res = $db->newSelectQueryBuilder()
1154 ->select( $this->getPageTableFields() )
1155 ->from( 'page' )
1156 ->where( $set )
1157 ->caller( __METHOD__ )
1158 ->fetchResultSet();
1159
1160 // Hack: get the ns:titles stored in [ns => array(titles)] format
1161 $this->initFromQueryResult( $res, $linkBatch->data, true );
1162 }
1163 }
1164 }
1165
1173 private function loadRedirectTargets() {
1174 $titlesToResolve = [];
1175 $db = $this->getDB();
1176
1177 if ( $this->mPendingRedirectIDs ) {
1178 $res = $db->newSelectQueryBuilder()
1179 ->select( [
1180 'rd_from',
1181 'rd_namespace',
1182 'rd_fragment',
1183 'rd_interwiki',
1184 'rd_title'
1185 ] )
1186 ->from( 'redirect' )
1187 ->where( [ 'rd_from' => array_keys( $this->mPendingRedirectIDs ) ] )
1188 ->caller( __METHOD__ )
1189 ->fetchResultSet();
1190
1191 foreach ( $res as $row ) {
1192 $rdfrom = (int)$row->rd_from;
1193 $from = $this->mPendingRedirectIDs[$rdfrom]->getPrefixedText();
1194 $to = $this->titleFactory->makeTitle(
1195 $row->rd_namespace,
1196 $row->rd_title,
1197 $row->rd_fragment,
1198 $row->rd_interwiki
1199 );
1200 $this->mResolvedRedirectTitles[$from] = $this->mPendingRedirectIDs[$rdfrom];
1201 unset( $this->mPendingRedirectIDs[$rdfrom] );
1202 if ( $to->isExternal() ) {
1203 $this->mInterwikiTitles[$to->getPrefixedText()] = $to->getInterwiki();
1204 } elseif ( !isset( $this->mAllPages[$to->getNamespace()][$to->getDBkey()] )
1205 && !( $this->mConvertTitles && isset( $this->mConvertedTitles[$to->getPrefixedText()] ) )
1206 ) {
1207 $titlesToResolve[] = $to;
1208 }
1209 $this->mRedirectTitles[$from] = $to;
1210 }
1211 }
1212
1213 if ( $this->mPendingRedirectSpecialPages ) {
1214 foreach ( $this->mPendingRedirectSpecialPages as [ $from, $to ] ) {
1216 $fromKey = $from->getPrefixedText();
1217 $this->mResolvedRedirectTitles[$fromKey] = $from;
1218 $this->mRedirectTitles[$fromKey] = $to;
1219 if ( $to->isExternal() ) {
1220 $this->mInterwikiTitles[$to->getPrefixedText()] = $to->getInterwiki();
1221 } elseif ( !isset( $this->mAllPages[$to->getNamespace()][$to->getDBkey()] ) ) {
1222 $titlesToResolve[] = $to;
1223 }
1224 }
1225 $this->mPendingRedirectSpecialPages = [];
1226
1227 // Set private caching since we don't know what criteria the
1228 // special pages used to decide on these redirects.
1229 $this->mCacheMode = 'private';
1230 }
1231
1232 return $this->processTitlesArray( $titlesToResolve );
1233 }
1234
1248 public function getCacheMode( $params = null ) {
1249 return $this->mCacheMode;
1250 }
1251
1261 private function processTitlesArray( $titles ) {
1262 $linkBatch = $this->linkBatchFactory->newLinkBatch();
1263
1265 $titleObjects = [];
1266 foreach ( $titles as $index => $title ) {
1267 if ( is_string( $title ) ) {
1268 try {
1270 $titleObj = $this->titleFactory->newFromTextThrow( $title, $this->mDefaultNamespace );
1271 } catch ( MalformedTitleException $ex ) {
1272 // Handle invalid titles gracefully
1273 if ( !isset( $this->mAllPages[0][$title] ) ) {
1274 $this->mAllPages[0][$title] = $this->mFakePageId;
1275 $this->mInvalidTitles[$this->mFakePageId] = [
1276 'title' => $title,
1277 'invalidreason' => $this->getErrorFormatter()->formatException( $ex, [ 'bc' => true ] ),
1278 ];
1279 $this->mFakePageId--;
1280 }
1281 continue; // There's nothing else we can do
1282 }
1283 } elseif ( $title instanceof LinkTarget ) {
1284 $titleObj = $this->titleFactory->newFromLinkTarget( $title );
1285 } else {
1286 $titleObj = $this->titleFactory->newFromPageReference( $title );
1287 }
1288
1289 $titleObjects[$index] = $titleObj;
1290 }
1291
1292 // Get gender information
1293 $this->genderCache->doTitlesArray( $titleObjects, __METHOD__ );
1294
1295 foreach ( $titleObjects as $index => $titleObj ) {
1296 $title = is_string( $titles[$index] ) ? $titles[$index] : false;
1297 $unconvertedTitle = $titleObj->getPrefixedText();
1298 $titleWasConverted = false;
1299 if ( $titleObj->isExternal() ) {
1300 // This title is an interwiki link.
1301 $this->mInterwikiTitles[$unconvertedTitle] = $titleObj->getInterwiki();
1302 } else {
1303 // Variants checking
1304 if (
1305 $this->mConvertTitles
1306 && $this->languageConverter->hasVariants()
1307 && !$titleObj->exists()
1308 ) {
1309 // ILanguageConverter::findVariantLink will modify titleText and
1310 // titleObj into the canonical variant if possible
1311 $titleText = $title !== false ? $title : $titleObj->getPrefixedText();
1312 $this->languageConverter->findVariantLink( $titleText, $titleObj );
1313 $titleWasConverted = $unconvertedTitle !== $titleObj->getPrefixedText();
1314 }
1315
1316 if ( $titleObj->getNamespace() < 0 ) {
1317 // Handle Special and Media pages
1318 $titleObj = $titleObj->fixSpecialName();
1319 $ns = $titleObj->getNamespace();
1320 $dbkey = $titleObj->getDBkey();
1321 if ( !isset( $this->mAllSpecials[$ns][$dbkey] ) ) {
1322 $this->mAllSpecials[$ns][$dbkey] = $this->mFakePageId;
1323 $target = null;
1324 if ( $ns === NS_SPECIAL && $this->mResolveRedirects ) {
1325 $special = $this->specialPageFactory->getPage( $dbkey );
1326 if ( $special instanceof RedirectSpecialArticle ) {
1327 // Only RedirectSpecialArticle is intended to redirect to an article, other kinds of
1328 // RedirectSpecialPage are probably applying weird URL parameters we don't want to
1329 // handle.
1330 $context = new DerivativeContext( $this );
1331 $context->setTitle( $titleObj );
1332 $context->setRequest( new FauxRequest );
1333 $special->setContext( $context );
1334 [ /* $alias */, $subpage ] = $this->specialPageFactory->resolveAlias( $dbkey );
1335 $target = $special->getRedirect( $subpage );
1336 }
1337 }
1338 if ( $target ) {
1339 $this->mPendingRedirectSpecialPages[$dbkey] = [ $titleObj, $target ];
1340 } else {
1341 $this->mSpecialTitles[$this->mFakePageId] = $titleObj;
1342 $this->mFakePageId--;
1343 }
1344 }
1345 } else {
1346 // Regular page
1347 $linkBatch->addObj( $titleObj );
1348 }
1349 }
1350
1351 // Make sure we remember the original title that was
1352 // given to us. This way the caller can correlate new
1353 // titles with the originally requested when e.g. the
1354 // namespace is localized or the capitalization is
1355 // different
1356 if ( $titleWasConverted ) {
1357 $this->mConvertedTitles[$unconvertedTitle] = $titleObj->getPrefixedText();
1358 // In this case the page can't be Special.
1359 if ( $title !== false && $title !== $unconvertedTitle ) {
1360 $this->mNormalizedTitles[$title] = $unconvertedTitle;
1361 }
1362 } elseif ( $title !== false && $title !== $titleObj->getPrefixedText() ) {
1363 $this->mNormalizedTitles[$title] = $titleObj->getPrefixedText();
1364 }
1365 }
1366
1367 return $linkBatch;
1368 }
1369
1385 public function setGeneratorData( $title, array $data ) {
1386 $ns = $title->getNamespace();
1387 $dbkey = $title->getDBkey();
1388 $this->mGeneratorData[$ns][$dbkey] = $data;
1389 }
1390
1410 public function setRedirectMergePolicy( $callable ) {
1411 $this->mRedirectMergePolicy = $callable;
1412 }
1413
1425 private function resolveRedirectTitleDest( Title $titleFrom ): Title {
1426 $seen = [];
1427 $dest = $titleFrom;
1428 while ( isset( $this->mRedirectTitles[$dest->getPrefixedText()] ) ) {
1429 $dest = $this->mRedirectTitles[$dest->getPrefixedText()];
1430 if ( isset( $seen[$dest->getPrefixedText()] ) ) {
1431 return $titleFrom;
1432 }
1433 $seen[$dest->getPrefixedText()] = true;
1434 }
1435 return $dest;
1436 }
1437
1458 public function populateGeneratorData( &$result, array $path = [] ) {
1459 if ( $result instanceof ApiResult ) {
1460 $data = $result->getResultData( $path );
1461 if ( $data === null ) {
1462 return true;
1463 }
1464 } else {
1465 $data = &$result;
1466 foreach ( $path as $key ) {
1467 if ( !isset( $data[$key] ) ) {
1468 // Path isn't in $result, so nothing to add, so everything
1469 // "fits"
1470 return true;
1471 }
1472 $data = &$data[$key];
1473 }
1474 }
1475 foreach ( $this->mGeneratorData as $ns => $dbkeys ) {
1476 if ( $ns === NS_SPECIAL ) {
1477 $pages = [];
1478 foreach ( $this->mSpecialTitles as $id => $title ) {
1479 $pages[$title->getDBkey()] = $id;
1480 }
1481 } else {
1482 if ( !isset( $this->mAllPages[$ns] ) ) {
1483 // No known titles in the whole namespace. Skip it.
1484 continue;
1485 }
1486 $pages = $this->mAllPages[$ns];
1487 }
1488 foreach ( $dbkeys as $dbkey => $genData ) {
1489 if ( !isset( $pages[$dbkey] ) ) {
1490 // Unknown title. Forget it.
1491 continue;
1492 }
1493 $pageId = $pages[$dbkey];
1494 if ( !isset( $data[$pageId] ) ) {
1495 // $pageId didn't make it into the result. Ignore it.
1496 continue;
1497 }
1498
1499 if ( $result instanceof ApiResult ) {
1500 $path2 = array_merge( $path, [ $pageId ] );
1501 foreach ( $genData as $key => $value ) {
1502 if ( !$result->addValue( $path2, $key, $value ) ) {
1503 return false;
1504 }
1505 }
1506 } else {
1507 $data[$pageId] = array_merge( $data[$pageId], $genData );
1508 }
1509 }
1510 }
1511
1512 // Merge data generated about redirect titles into the redirect destination
1513 if ( $this->mRedirectMergePolicy ) {
1514 foreach ( $this->mResolvedRedirectTitles as $titleFrom ) {
1515 $dest = $this->resolveRedirectTitleDest( $titleFrom );
1516 $fromNs = $titleFrom->getNamespace();
1517 $fromDBkey = $titleFrom->getDBkey();
1518 $toPageId = $dest->getArticleID();
1519 if ( isset( $data[$toPageId] ) &&
1520 isset( $this->mGeneratorData[$fromNs][$fromDBkey] )
1521 ) {
1522 // It is necessary to set both $data and add to $result, if an ApiResult,
1523 // to ensure multiple redirects to the same destination are all merged.
1524 $data[$toPageId] = ( $this->mRedirectMergePolicy )(
1525 $data[$toPageId],
1526 $this->mGeneratorData[$fromNs][$fromDBkey]
1527 );
1528 if ( $result instanceof ApiResult &&
1529 !$result->addValue( $path, $toPageId, $data[$toPageId], ApiResult::OVERRIDE )
1530 ) {
1531 return false;
1532 }
1533 }
1534 }
1535 }
1536
1537 return true;
1538 }
1539
1544 protected function getDB() {
1545 return $this->mDbSource->getDB();
1546 }
1547
1549 public function getAllowedParams( $flags = 0 ) {
1550 $result = [
1551 'titles' => [
1552 ParamValidator::PARAM_ISMULTI => true,
1553 ApiBase::PARAM_HELP_MSG => 'api-pageset-param-titles',
1554 ],
1555 'pageids' => [
1556 ParamValidator::PARAM_TYPE => 'integer',
1557 ParamValidator::PARAM_ISMULTI => true,
1558 ApiBase::PARAM_HELP_MSG => 'api-pageset-param-pageids',
1559 ],
1560 'revids' => [
1561 ParamValidator::PARAM_TYPE => 'integer',
1562 ParamValidator::PARAM_ISMULTI => true,
1563 ApiBase::PARAM_HELP_MSG => 'api-pageset-param-revids',
1564 ],
1565 'generator' => [
1566 ParamValidator::PARAM_TYPE => null,
1567 ApiBase::PARAM_HELP_MSG => 'api-pageset-param-generator',
1568 SubmoduleDef::PARAM_SUBMODULE_PARAM_PREFIX => 'g',
1569 ],
1570 'redirects' => [
1571 ParamValidator::PARAM_DEFAULT => false,
1572 ApiBase::PARAM_HELP_MSG => $this->mAllowGenerator
1573 ? 'api-pageset-param-redirects-generator'
1574 : 'api-pageset-param-redirects-nogenerator',
1575 ],
1576 'converttitles' => [
1577 ParamValidator::PARAM_DEFAULT => false,
1578 ApiBase::PARAM_HELP_MSG => [
1579 'api-pageset-param-converttitles',
1580 Message::listParam( LanguageConverter::$languagesWithVariants, ListType::AND ),
1581 ],
1582 ],
1583 ];
1584
1585 if ( !$this->mAllowGenerator ) {
1586 unset( $result['generator'] );
1587 } elseif ( $flags & ApiBase::GET_VALUES_FOR_HELP ) {
1588 $result['generator'][ParamValidator::PARAM_TYPE] = 'submodule';
1589 $result['generator'][SubmoduleDef::PARAM_SUBMODULE_MAP] = $this->getGenerators();
1590 }
1591
1592 return $result;
1593 }
1594
1596 public function handleParamNormalization( $paramName, $value, $rawValue ) {
1597 parent::handleParamNormalization( $paramName, $value, $rawValue );
1598
1599 if ( $paramName === 'titles' ) {
1600 // For the 'titles' parameter, we want to split it like ApiBase would
1601 // and add any changed titles to $this->mNormalizedTitles
1602 $value = ParamValidator::explodeMultiValue( $value, self::LIMIT_SML2 + 1 );
1603 $l = count( $value );
1604 $rawValue = ParamValidator::explodeMultiValue( $rawValue, $l );
1605 for ( $i = 0; $i < $l; $i++ ) {
1606 if ( $value[$i] !== $rawValue[$i] ) {
1607 $this->mNormalizedTitles[$rawValue[$i]] = $value[$i];
1608 }
1609 }
1610 }
1611 }
1612
1617 private function getGenerators() {
1618 if ( self::$generators === null ) {
1619 $query = $this->mDbSource;
1620 if ( !( $query instanceof ApiQuery ) ) {
1621 // If the parent container of this pageset is not ApiQuery,
1622 // we must create it to get module manager
1623 $query = $this->getMain()->getModuleManager()->getModule( 'query' );
1624 }
1625 $gens = [];
1626 $prefix = $query->getModulePath() . '+';
1627 $mgr = $query->getModuleManager();
1628 foreach ( $mgr->getNamesWithClasses() as $name => $class ) {
1629 if ( is_subclass_of( $class, ApiQueryGeneratorBase::class ) ) {
1630 $gens[$name] = $prefix . $name;
1631 }
1632 }
1633 ksort( $gens );
1634 self::$generators = $gens;
1635 }
1636
1637 return self::$generators;
1638 }
1639}
1640
1642class_alias( ApiPageSet::class, 'ApiPageSet' );
const PROTO_CURRENT
Definition Defines.php:222
const NS_MAIN
Definition Defines.php:51
const NS_SPECIAL
Definition Defines.php:40
This abstract class implements many basic API functions, and is the base of all API classes.
Definition ApiBase.php:61
dieWithError( $msg, $code=null, $data=null, $httpCode=0)
Abort execution with an error.
Definition ApiBase.php:1511
getModuleName()
Get the name of the module being executed by this instance.
Definition ApiBase.php:543
getHookRunner()
Get an ApiHookRunner for running core API hooks.
Definition ApiBase.php:767
getMain()
Get the main module.
Definition ApiBase.php:561
addWarning( $msg, $code=null, $data=null)
Add a warning for this module.
Definition ApiBase.php:1429
encodeParamName( $paramName)
This method mangles parameter name based on the prefix supplied to the constructor.
Definition ApiBase.php:801
extractRequestParams( $options=[])
Using getAllowedParams(), this function makes an array of the values provided by the user,...
Definition ApiBase.php:823
This class contains a list of pages that the client has requested.
getMissingRevisionIDsAsResult( $result=null)
Revision IDs that were not found in the database as result array.
getInterwikiTitlesAsResult( $result=null, $iwUrl=false)
Get a list of interwiki titles - maps a title to its interwiki prefix as result.
execute()
Populate the PageSet from the request parameters.
getCustomField( $fieldName)
Get the values of one of the previously requested page table fields.
getMissingPages()
Pages that were NOT found in the database.
getMissingTitlesByNamespace()
Returns an array [ns][dbkey] => fake_page_id for all missing titles.
getGoodAndMissingPages()
Pages for good and missing titles.
processDbRow( $row)
Extract all requested fields from the row received from the database.
getTitleCount()
Returns the number of unique pages (not revisions) in the set.
getGoodPages()
Pages that were found in the database, including redirects.
getPageTableFields()
Get the fields that have to be queried from the page table: the ones requested through requestField()...
populateFromQueryResult( $db, $queryResult)
Populate this PageSet from a rowset returned from the database.
getInvalidTitlesAndRevisions( $invalidChecks=[ 'invalidTitles', 'special', 'missingIds', 'missingRevIds', 'missingTitles', 'interwikiTitles'])
Get an array of invalid/special/missing titles.
getLiveRevisionIDs()
Get the list of non-deleted revision IDs (requested with the revids= parameter)
getInvalidTitlesAndReasons()
Titles that were deemed invalid by Title::newFromText() The array's index will be unique and negative...
getRedirectTargets()
Get a list of redirect resolutions - maps a title to its redirect target.
getCacheMode( $params=null)
Get the cache mode for the data generated by this module.
getGoodTitleCount()
Returns the number of found unique pages (not revisions) in the set.
setRedirectMergePolicy( $callable)
Controls how generator data about a redirect source is merged into the generator data for the redirec...
getRedirectTitlesAsResult( $result=null)
Get a list of redirect resolutions - maps a title to its redirect target.
getInterwikiTitles()
Get a list of interwiki titles - maps a title to its interwiki prefix.
getPages()
All existing and missing pages including redirects.
getSpecialPages()
Get the list of pages with negative namespace.
populateFromTitles( $titles)
Populate this PageSet.
getMissingPageIDs()
Page IDs that were not found in the database.
getDeletedRevisionIDs()
Get the list of revision IDs that were associated with deleted titles.
getRevisionCount()
Returns the number of revisions (requested with revids= parameter).
getGoodTitlesByNamespace()
Returns an array [ns][dbkey] => page_id for all good titles.
isResolvingRedirects()
Check whether this PageSet is resolving redirects.
populateGeneratorData(&$result, array $path=[])
Populate the generator data for all titles in the result.
getAllTitlesByNamespace()
Returns an array [ns][dbkey] => page_id for all requested titles.
requestField( $fieldName)
Request an additional field from the page table.
getConvertedTitles()
Get a list of title conversions - maps a title to its converted version.
__construct(ApiBase $dbSource, $flags=0, $defaultNamespace=NS_MAIN)
getGoodAndMissingTitlesByNamespace()
Returns an array [ns][dbkey] => page_id for all good and missing titles.
getConvertedTitlesAsResult( $result=null)
Get a list of title conversions - maps a title to its converted version as a result array.
getDB()
Get the database connection (read-only)
getMissingRevisionIDs()
Revision IDs that were not found in the database.
getRevisionIDs()
Get the list of valid revision IDs (requested with the revids= parameter)
setGeneratorData( $title, array $data)
Set data for a title.
populateFromPageIDs( $pageIDs)
Populate this PageSet from a list of page IDs.
getNormalizedTitles()
Get a list of title normalizations - maps a title to its normalized version.
handleParamNormalization( $paramName, $value, $rawValue)
Handle when a parameter was Unicode-normalized.1.28 1.35 $paramName is prefixed For overriding by sub...
executeDryRun()
In case execute() is not called, call this method to mark all relevant parameters as used This preven...
getDataSource()
Return the parameter name that is the source of data for this PageSet.
populateFromRevisionIDs( $revIDs)
Populate this PageSet from a list of revision IDs.
getNormalizedTitlesAsResult( $result=null)
Get a list of title normalizations - maps a title to its normalized version in the form of result arr...
static addTitleInfo(&$arr, $title, $prefix='')
Add information (title and namespace) about a Title object to a result array.
This is the main query class.
Definition ApiQuery.php:36
This class represents the result of the API operations.
Definition ApiResult.php:33
addValue( $path, $name, $value, $flags=0)
Add value to the output data at the given path.
Type definition for submodule types.
Look up "gender" user preference.
An IContextSource implementation which will inherit context from another source but allow individual ...
Base class for multi-variant language conversion.
Base class for language-specific code.
Definition Language.php:70
A class containing constants representing the names of configuration variables.
const PageLanguageUseDB
Name constant for the PageLanguageUseDB setting, for use with Config::get()
Service locator for MediaWiki core services.
static getInstance()
Returns the global default instance of the top level service locator.
The Message class deals with fetching and processing of interface message into a variety of formats.
Definition Message.php:144
WebRequest clone which takes values from a provided array.
Helper for any RedirectSpecialPage which redirects the user to a particular article (as opposed to us...
Factory for handling the special page list and generating SpecialPage objects.
MalformedTitleException is thrown when a TitleParser is unable to parse a title string.
This is a utility class for dealing with namespaces that encodes all the "magic" behaviors of them ba...
Creates Title objects.
Represents a title within MediaWiki.
Definition Title.php:69
getNamespace()
Get the namespace index, i.e.
Definition Title.php:1037
getDBkey()
Get the main part with underscores.
Definition Title.php:1028
Service for formatting and validating API parameters.
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'=> false, '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, 'EnableSpecialMute'=> false, 'EnableUserEmailMuteList'=> false, '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'=> 3, 'ExternalLinksDomainGaps'=>[], 'ContentHandlers'=>['wikitext'=>['class'=> 'MediaWiki\\Content\\WikitextContentHandler', 'services'=>['TitleFactory', 'ParserFactory', 'GlobalIdGenerator', 'LanguageNameUtils', 'LinkRenderer', 'MagicWordFactory', 'ParsoidParserFactory',],], 'javascript'=>['class'=> 'MediaWiki\\Content\\JavaScriptContentHandler', 'services'=>['MainConfig', 'ParserFactory', 'UserOptionsLookup',],], 'json'=>['class'=> 'MediaWiki\\Content\\JsonContentHandler', 'services'=>['ParsoidParserFactory', 'TitleFactory',],], 'css'=>['class'=> 'MediaWiki\\Content\\CssContentHandler', 'services'=>['MainConfig', 'ParserFactory', 'UserOptionsLookup',],], 'vue'=>['class'=> 'MediaWiki\\Content\\VueContentHandler', 'services'=>['MainConfig', 'ParserFactory',],], 'text'=> 'MediaWiki\\Content\\TextContentHandler', 'unknown'=> 'MediaWiki\\Content\\FallbackContentHandler',], 'NamespaceContentModels'=>[], 'TextModelsToParse'=>['wikitext', 'javascript', 'css',], 'CompressRevisions'=> false, 'ExternalStores'=>[], 'ExternalServers'=>[], 'DefaultExternalStore'=> false, 'RevisionCacheExpiry'=> 604800, 'PageLanguageUseDB'=> false, 'DiffEngine'=> null, 'ExternalDiffEngine'=> false, 'Wikidiff2Options'=>[], 'RequestTimeLimit'=> null, 'TransactionalTimeLimit'=> 120, 'CriticalSectionTimeLimit'=> 180.0, 'MiserMode'=> false, 'DisableQueryPages'=> false, 'QueryCacheLimit'=> 1000, 'WantedPagesThreshold'=> 1, 'AllowSlowParserFunctions'=> false, 'AllowSchemaUpdates'=> true, 'MaxArticleSize'=> 2048, 'MemoryLimit'=> '50M', 'PoolCounterConf'=> null, 'PoolCountClientConf'=>['servers'=>['127.0.0.1',], 'timeout'=> 0.1,], 'MaxUserDBWriteDuration'=> false, 'MaxJobDBWriteDuration'=> false, 'LinkHolderBatchSize'=> 1000, 'MaximumMovedPages'=> 100, 'ForceDeferredUpdatesPreSend'=> false, 'MultiShardSiteStats'=> false, 'CacheDirectory'=> false, 'MainCacheType'=> 0, 'MessageCacheType'=> -1, 'ParserCacheType'=> -1, 'SessionCacheType'=> -1, 'AnonSessionCacheType'=> false, 'LanguageConverterCacheType'=> -1, 'ObjectCaches'=>[0=>['class'=> 'Wikimedia\\ObjectCache\\EmptyBagOStuff', 'reportDupes'=> false,], 1=>['class'=> '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'=> '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' => [ ], '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, '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', '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', '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.', ],]
The shared interface for all language converters.
Represents the target of a wiki link.
Interface for objects (potentially) representing an editable wiki page.
Interface for objects (potentially) representing a page that can be viewable and linked to on a wiki.
A database connection without write operations.
Result wrapper for grabbing data queried from an IDatabase object.
ListType
The constants used to specify list types.
Definition ListType.php:9