MediaWiki master
ApiPageSet.php
Go to the documentation of this file.
1<?php
9namespace MediaWiki\Api;
10
33use stdClass;
38
53class ApiPageSet extends ApiBase {
58 private const DISABLE_GENERATORS = 1;
59
61 private $mParams;
62
64 private $mResolveRedirects;
65
67 private $mConvertTitles;
68
70 private $mAllowGenerator;
71
73 private $mAllPages = [];
74
76 private $mTitles = [];
77
79 private $mGoodAndMissingPages = [];
80
82 private $mGoodPages = [];
83
85 private $mGoodTitles = [];
86
88 private $mMissingPages = [];
89
91 private $mMissingTitles = [];
92
94 private $mInvalidTitles = [];
95
97 private $mMissingPageIDs = [];
98
100 private $mRedirectTitles = [];
101
103 private $mSpecialTitles = [];
104
106 private $mAllSpecials = [];
107
109 private $mNormalizedTitles = [];
110
112 private $mInterwikiTitles = [];
113
115 private $mPendingRedirectIDs = [];
116
118 private $mPendingRedirectSpecialPages = [];
119
121 private $mResolvedRedirectTitles = [];
122
124 private $mConvertedTitles = [];
125
127 private $mGoodRevIDs = [];
128
130 private $mLiveRevIDs = [];
131
133 private $mDeletedRevIDs = [];
134
136 private $mMissingRevIDs = [];
137
139 private $mGeneratorData = [];
140
142 private $mFakePageId = -1;
143
145 private $mCacheMode = 'public';
146
148 private $mRequestedPageFields = [];
149
151 private $mRedirectMergePolicy;
152
154 private static $generators = null;
155
156 private Language $contentLanguage;
157 private LinkCache $linkCache;
158 private NamespaceInfo $namespaceInfo;
159 private GenderCache $genderCache;
160 private LinkBatchFactory $linkBatchFactory;
161 private TitleFactory $titleFactory;
162 private ILanguageConverter $languageConverter;
163 private SpecialPageFactory $specialPageFactory;
164
172 private static function addValues( array &$result, $values, $flags = [], $name = null ) {
173 foreach ( $values as $val ) {
174 if ( $val instanceof Title ) {
175 $v = [];
176 ApiQueryBase::addTitleInfo( $v, $val );
177 } elseif ( $name !== null ) {
178 $v = [ $name => $val ];
179 } else {
180 $v = $val;
181 }
182 foreach ( $flags as $flag ) {
183 $v[$flag] = true;
184 }
185 $result[] = $v;
186 }
187 }
188
196 public function __construct(
197 private readonly ApiBase $mDbSource,
198 $flags = 0,
199 private readonly int $mDefaultNamespace = NS_MAIN,
200 ) {
201 parent::__construct( $mDbSource->getMain(), $mDbSource->getModuleName() );
202 $this->mAllowGenerator = ( $flags & self::DISABLE_GENERATORS ) == 0;
203
204 $this->mParams = $this->extractRequestParams();
205 $this->mResolveRedirects = $this->mParams['redirects'];
206 $this->mConvertTitles = $this->mParams['converttitles'];
207
208 // Needs service injection - T283314
209 $services = MediaWikiServices::getInstance();
210 $this->contentLanguage = $services->getContentLanguage();
211 $this->linkCache = $services->getLinkCache();
212 $this->namespaceInfo = $services->getNamespaceInfo();
213 $this->genderCache = $services->getGenderCache();
214 $this->linkBatchFactory = $services->getLinkBatchFactory();
215 $this->titleFactory = $services->getTitleFactory();
216 $this->languageConverter = $services->getLanguageConverterFactory()
217 ->getLanguageConverter( $this->contentLanguage );
218 $this->specialPageFactory = $services->getSpecialPageFactory();
219 }
220
225 public function executeDryRun() {
226 $this->executeInternal( true );
227 }
228
232 public function execute() {
233 $this->executeInternal( false );
234 }
235
241 private function executeInternal( $isDryRun ) {
242 $generatorName = $this->mAllowGenerator ? $this->mParams['generator'] : null;
243 if ( $generatorName !== null ) {
244 $dbSource = $this->mDbSource;
245 if ( !$dbSource instanceof ApiQuery ) {
246 // If the parent container of this pageset is not ApiQuery, we must create it to run generator
247 $dbSource = $this->getMain()->getModuleManager()->getModule( 'query' );
248 }
249 $generator = $dbSource->getModuleManager()->getModule( $generatorName, null, true );
250 if ( $generator === null ) {
251 $this->dieWithError( [ 'apierror-badgenerator-unknown', $generatorName ], 'badgenerator' );
252 }
253 if ( !$generator instanceof ApiQueryGeneratorBase ) {
254 $this->dieWithError( [ 'apierror-badgenerator-notgenerator', $generatorName ], 'badgenerator' );
255 }
256 // Create a temporary pageset to store generator's output,
257 // add any additional fields generator may need, and execute pageset to populate titles/pageids
258 // @phan-suppress-next-line PhanTypeMismatchArgumentNullable
259 $tmpPageSet = new ApiPageSet( $dbSource, self::DISABLE_GENERATORS );
260 $generator->setGeneratorMode( $tmpPageSet );
261 $this->mCacheMode = $generator->getCacheMode( $generator->extractRequestParams() );
262
263 if ( !$isDryRun ) {
264 $generator->requestExtraData( $tmpPageSet );
265 }
266 $tmpPageSet->executeInternal( $isDryRun );
267
268 // populate this pageset with the generator output
269 if ( !$isDryRun ) {
270 $generator->executeGenerator( $this );
271
272 $this->getHookRunner()->onAPIQueryGeneratorAfterExecute( $generator, $this );
273 } else {
274 // Prevent warnings from being reported on these parameters
275 $main = $this->getMain();
276 foreach ( $generator->extractRequestParams() as $paramName => $param ) {
277 $main->markParamsUsed( $generator->encodeParamName( $paramName ) );
278 }
279 }
280
281 if ( !$isDryRun ) {
282 $this->resolvePendingRedirects();
283 }
284 } else {
285 // Only one of the titles/pageids/revids is allowed at the same time
286 $dataSource = null;
287 if ( isset( $this->mParams['titles'] ) ) {
288 $dataSource = 'titles';
289 }
290 if ( isset( $this->mParams['pageids'] ) ) {
291 if ( $dataSource !== null ) {
292 $this->dieWithError(
293 [
294 'apierror-invalidparammix-cannotusewith',
295 $this->encodeParamName( 'pageids' ),
296 $this->encodeParamName( $dataSource )
297 ],
298 'multisource'
299 );
300 }
301 $dataSource = 'pageids';
302 }
303 if ( isset( $this->mParams['revids'] ) ) {
304 if ( $dataSource !== null ) {
305 $this->dieWithError(
306 [
307 'apierror-invalidparammix-cannotusewith',
308 $this->encodeParamName( 'revids' ),
309 $this->encodeParamName( $dataSource )
310 ],
311 'multisource'
312 );
313 }
314 $dataSource = 'revids';
315 }
316
317 if ( !$isDryRun ) {
318 // Populate page information with the original user input
319 switch ( $dataSource ) {
320 case 'titles':
321 $this->initFromTitles( $this->mParams['titles'] );
322 break;
323 case 'pageids':
324 $this->initFromPageIds( $this->mParams['pageids'] );
325 break;
326 case 'revids':
327 if ( $this->mResolveRedirects ) {
328 $this->addWarning( 'apiwarn-redirectsandrevids' );
329 }
330 $this->mResolveRedirects = false;
331 $this->initFromRevIDs( $this->mParams['revids'] );
332 break;
333 default:
334 // Do nothing - some queries do not need any of the data sources.
335 break;
336 }
337 }
338 }
339 }
340
345 public function isResolvingRedirects() {
346 return $this->mResolveRedirects;
347 }
348
357 public function getDataSource() {
358 if ( $this->mAllowGenerator && isset( $this->mParams['generator'] ) ) {
359 return 'generator';
360 }
361 if ( isset( $this->mParams['titles'] ) ) {
362 return 'titles';
363 }
364 if ( isset( $this->mParams['pageids'] ) ) {
365 return 'pageids';
366 }
367 if ( isset( $this->mParams['revids'] ) ) {
368 return 'revids';
369 }
370
371 return null;
372 }
373
379 public function requestField( $fieldName ) {
380 $this->mRequestedPageFields[$fieldName] = [];
381 }
382
389 public function getCustomField( $fieldName ) {
390 return $this->mRequestedPageFields[$fieldName];
391 }
392
399 public function getPageTableFields() {
400 // Ensure we get minimum required fields
401 // DON'T change this order
402 $pageFlds = [
403 'page_namespace' => null,
404 'page_title' => null,
405 'page_id' => null,
406 ];
407
408 if ( $this->mResolveRedirects ) {
409 $pageFlds['page_is_redirect'] = null;
410 }
411
412 $pageFlds['page_content_model'] = null;
413
414 if ( $this->getConfig()->get( MainConfigNames::PageLanguageUseDB ) ) {
415 $pageFlds['page_lang'] = null;
416 }
417
418 foreach ( LinkCache::getSelectFields() as $field ) {
419 $pageFlds[$field] = null;
420 }
421
422 $pageFlds = array_merge( $pageFlds, $this->mRequestedPageFields );
423
424 return array_keys( $pageFlds );
425 }
426
433 public function getAllTitlesByNamespace() {
434 return $this->mAllPages;
435 }
436
445 public function getPages(): array {
446 return $this->mTitles;
447 }
448
453 public function getTitleCount() {
454 return count( $this->mTitles );
455 }
456
461 public function getGoodTitlesByNamespace() {
462 return $this->mGoodPages;
463 }
464
471 public function getGoodPages(): array {
472 return $this->mGoodTitles;
473 }
474
479 public function getGoodTitleCount() {
480 return count( $this->mGoodTitles );
481 }
482
488 public function getMissingTitlesByNamespace() {
489 return $this->mMissingPages;
490 }
491
499 public function getMissingPages(): array {
500 return $this->mMissingTitles;
501 }
502
508 return $this->mGoodAndMissingPages;
509 }
510
516 public function getGoodAndMissingPages(): array {
517 return $this->mGoodTitles + $this->mMissingTitles;
518 }
519
525 public function getInvalidTitlesAndReasons() {
526 return $this->mInvalidTitles;
527 }
528
533 public function getMissingPageIDs() {
534 return $this->mMissingPageIDs;
535 }
536
543 public function getRedirectTargets(): array {
544 return $this->mRedirectTitles;
545 }
546
554 public function getRedirectTitlesAsResult( $result = null ) {
555 $values = [];
556 foreach ( $this->mRedirectTitles as $titleStrFrom => $titleTo ) {
557 $r = [
558 'from' => strval( $titleStrFrom ),
559 'to' => $titleTo->getPrefixedText(),
560 ];
561 if ( $titleTo->hasFragment() ) {
562 $r['tofragment'] = $titleTo->getFragment();
563 }
564 if ( $titleTo->isExternal() ) {
565 $r['tointerwiki'] = $titleTo->getInterwiki();
566 }
567 if ( isset( $this->mResolvedRedirectTitles[$titleStrFrom] ) ) {
568 $titleFrom = $this->mResolvedRedirectTitles[$titleStrFrom];
569 $ns = $titleFrom->getNamespace();
570 $dbkey = $titleFrom->getDBkey();
571 if ( isset( $this->mGeneratorData[$ns][$dbkey] ) ) {
572 $r = array_merge( $this->mGeneratorData[$ns][$dbkey], $r );
573 }
574 }
575
576 $values[] = $r;
577 }
578 if ( $values && $result ) {
579 ApiResult::setIndexedTagName( $values, 'r' );
580 }
581
582 return $values;
583 }
584
590 public function getNormalizedTitles() {
591 return $this->mNormalizedTitles;
592 }
593
601 public function getNormalizedTitlesAsResult( $result = null ) {
602 $values = [];
603 foreach ( $this->getNormalizedTitles() as $rawTitleStr => $titleStr ) {
604 $encode = $this->contentLanguage->normalize( $rawTitleStr ) !== $rawTitleStr;
605 $values[] = [
606 'fromencoded' => $encode,
607 'from' => $encode ? rawurlencode( $rawTitleStr ) : $rawTitleStr,
608 'to' => $titleStr
609 ];
610 }
611 if ( $values && $result ) {
612 ApiResult::setIndexedTagName( $values, 'n' );
613 }
614
615 return $values;
616 }
617
623 public function getConvertedTitles() {
624 return $this->mConvertedTitles;
625 }
626
634 public function getConvertedTitlesAsResult( $result = null ) {
635 $values = [];
636 foreach ( $this->getConvertedTitles() as $rawTitleStr => $titleStr ) {
637 $values[] = [
638 'from' => $rawTitleStr,
639 'to' => $titleStr
640 ];
641 }
642 if ( $values && $result ) {
643 ApiResult::setIndexedTagName( $values, 'c' );
644 }
645
646 return $values;
647 }
648
654 public function getInterwikiTitles() {
655 return $this->mInterwikiTitles;
656 }
657
666 public function getInterwikiTitlesAsResult( $result = null, $iwUrl = false ) {
667 $values = [];
668 foreach ( $this->getInterwikiTitles() as $rawTitleStr => $interwikiStr ) {
669 $item = [
670 'title' => $rawTitleStr,
671 'iw' => $interwikiStr,
672 ];
673 if ( $iwUrl ) {
674 $title = $this->titleFactory->newFromText( $rawTitleStr );
675 $item['url'] = $title->getFullURL( '', false, PROTO_CURRENT );
676 }
677 $values[] = $item;
678 }
679 if ( $values && $result ) {
680 ApiResult::setIndexedTagName( $values, 'i' );
681 }
682
683 return $values;
684 }
685
700 public function getInvalidTitlesAndRevisions( $invalidChecks = [ 'invalidTitles',
701 'special', 'missingIds', 'missingRevIds', 'missingTitles', 'interwikiTitles' ]
702 ) {
703 $result = [];
704 if ( in_array( 'invalidTitles', $invalidChecks ) ) {
705 self::addValues( $result, $this->getInvalidTitlesAndReasons(), [ 'invalid' ] );
706 }
707 if ( in_array( 'special', $invalidChecks ) ) {
708 $known = [];
709 $unknown = [];
710 foreach ( $this->mSpecialTitles as $title ) {
711 if ( $title->isKnown() ) {
712 $known[] = $title;
713 } else {
714 $unknown[] = $title;
715 }
716 }
717 self::addValues( $result, $unknown, [ 'special', 'missing' ] );
718 self::addValues( $result, $known, [ 'special' ] );
719 }
720 if ( in_array( 'missingIds', $invalidChecks ) ) {
721 self::addValues( $result, $this->getMissingPageIDs(), [ 'missing' ], 'pageid' );
722 }
723 if ( in_array( 'missingRevIds', $invalidChecks ) ) {
724 self::addValues( $result, $this->getMissingRevisionIDs(), [ 'missing' ], 'revid' );
725 }
726 if ( in_array( 'missingTitles', $invalidChecks ) ) {
727 $known = [];
728 $unknown = [];
729 foreach ( $this->mMissingTitles as $title ) {
730 if ( $title->isKnown() ) {
731 $known[] = $title;
732 } else {
733 $unknown[] = $title;
734 }
735 }
736 self::addValues( $result, $unknown, [ 'missing' ] );
737 self::addValues( $result, $known, [ 'missing', 'known' ] );
738 }
739 if ( in_array( 'interwikiTitles', $invalidChecks ) ) {
740 self::addValues( $result, $this->getInterwikiTitlesAsResult() );
741 }
742
743 return $result;
744 }
745
750 public function getRevisionIDs() {
751 return $this->mGoodRevIDs;
752 }
753
758 public function getLiveRevisionIDs() {
759 return $this->mLiveRevIDs;
760 }
761
766 public function getDeletedRevisionIDs() {
767 return $this->mDeletedRevIDs;
768 }
769
774 public function getMissingRevisionIDs() {
775 return $this->mMissingRevIDs;
776 }
777
784 public function getMissingRevisionIDsAsResult( $result = null ) {
785 $values = [];
786 foreach ( $this->getMissingRevisionIDs() as $revid ) {
787 $values[$revid] = [
788 'revid' => $revid,
789 'missing' => true,
790 ];
791 }
792 if ( $values && $result ) {
793 ApiResult::setIndexedTagName( $values, 'rev' );
794 }
795
796 return $values;
797 }
798
804 public function getSpecialPages(): array {
805 return $this->mSpecialTitles;
806 }
807
812 public function getRevisionCount() {
813 return count( $this->getRevisionIDs() );
814 }
815
820 public function populateFromTitles( $titles ) {
821 $this->initFromTitles( $titles );
822 }
823
828 public function populateFromPageIDs( $pageIDs ) {
829 $this->initFromPageIds( $pageIDs );
830 }
831
841 public function populateFromQueryResult( $db, $queryResult ) {
842 $this->initFromQueryResult( $queryResult );
843 }
844
849 public function populateFromRevisionIDs( $revIDs ) {
850 $this->initFromRevIDs( $revIDs );
851 }
852
857 public function processDbRow( $row ) {
858 // Store Title object in various data structures
859 $title = $this->titleFactory->newFromRow( $row );
860
861 $this->linkCache->addGoodLinkObjFromRow( $title, $row );
862
863 $pageId = (int)$row->page_id;
864 $this->mAllPages[$row->page_namespace][$row->page_title] = $pageId;
865 $this->mTitles[] = $title;
866
867 if ( $this->mResolveRedirects && $row->page_is_redirect == '1' ) {
868 $this->mPendingRedirectIDs[$pageId] = $title;
869 } else {
870 $this->mGoodPages[$row->page_namespace][$row->page_title] = $pageId;
871 $this->mGoodAndMissingPages[$row->page_namespace][$row->page_title] = $pageId;
872 $this->mGoodTitles[$pageId] = $title;
873 }
874
875 foreach ( $this->mRequestedPageFields as $fieldName => &$fieldValues ) {
876 $fieldValues[$pageId] = $row->$fieldName;
877 }
878 }
879
896 private function initFromTitles( $titles ) {
897 // Get validated and normalized title objects
898 $linkBatch = $this->processTitlesArray( $titles );
899 if ( $linkBatch->isEmpty() ) {
900 // There might be special-page redirects
901 $this->resolvePendingRedirects();
902 return;
903 }
904
905 $db = $this->getDB();
906
907 // Get pageIDs data from the `page` table
908 $res = $db->newSelectQueryBuilder()
909 ->select( $this->getPageTableFields() )
910 ->from( 'page' )
911 ->where( $linkBatch->constructSet( 'page', $db ) )
912 ->caller( __METHOD__ )
913 ->fetchResultSet();
914
915 // Hack: get the ns:titles stored in [ ns => [ titles ] ] format
916 $this->initFromQueryResult( $res, $linkBatch->data, true ); // process Titles
917
918 // Resolve any found redirects
919 $this->resolvePendingRedirects();
920 }
921
927 private function initFromPageIds( $pageids, $filterIds = true ) {
928 if ( !$pageids ) {
929 return;
930 }
931
932 $pageids = array_map( 'intval', $pageids ); // paranoia
933 $remaining = array_fill_keys( $pageids, true );
934
935 if ( $filterIds ) {
936 $pageids = $this->filterIDs( [ [ 'page', 'page_id' ] ], $pageids );
937 }
938
939 $res = null;
940 if ( $pageids ) {
941 $db = $this->getDB();
942
943 // Get pageIDs data from the `page` table
944 $res = $db->newSelectQueryBuilder()
945 ->select( $this->getPageTableFields() )
946 ->from( 'page' )
947 ->where( [ 'page_id' => $pageids ] )
948 ->caller( __METHOD__ )
949 ->fetchResultSet();
950 }
951
952 $this->initFromQueryResult( $res, $remaining, false ); // process PageIDs
953
954 // Resolve any found redirects
955 $this->resolvePendingRedirects();
956 }
957
968 private function initFromQueryResult( $res, &$remaining = null, $processTitles = null ) {
969 if ( $remaining !== null && $processTitles === null ) {
970 ApiBase::dieDebug( __METHOD__, 'Missing $processTitles parameter when $remaining is provided' );
971 }
972
973 $usernames = [];
974 if ( $res ) {
975 foreach ( $res as $row ) {
976 $pageId = (int)$row->page_id;
977
978 // Remove found page from the list of remaining items
979 if ( $remaining ) {
980 if ( $processTitles ) {
981 unset( $remaining[$row->page_namespace][$row->page_title] );
982 } else {
983 unset( $remaining[$pageId] );
984 }
985 }
986
987 // Store any extra fields requested by modules
988 $this->processDbRow( $row );
989
990 // Need gender information
991 if ( $this->namespaceInfo->hasGenderDistinction( $row->page_namespace ) ) {
992 $usernames[] = $row->page_title;
993 }
994 }
995 }
996
997 if ( $remaining ) {
998 // Any items left in the $remaining list are added as missing
999 if ( $processTitles ) {
1000 // The remaining titles in $remaining are non-existent pages
1001 foreach ( $remaining as $ns => $dbkeys ) {
1002 foreach ( $dbkeys as $dbkey => $_ ) {
1003 $title = $this->titleFactory->makeTitle( $ns, $dbkey );
1004 $this->linkCache->addBadLinkObj( $title );
1005 $this->mAllPages[$ns][$dbkey] = $this->mFakePageId;
1006 $this->mMissingPages[$ns][$dbkey] = $this->mFakePageId;
1007 $this->mGoodAndMissingPages[$ns][$dbkey] = $this->mFakePageId;
1008 $this->mMissingTitles[$this->mFakePageId] = $title;
1009 $this->mFakePageId--;
1010 $this->mTitles[] = $title;
1011
1012 // need gender information
1013 if ( $this->namespaceInfo->hasGenderDistinction( $ns ) ) {
1014 $usernames[] = $dbkey;
1015 }
1016 }
1017 }
1018 } else {
1019 // The remaining pageids do not exist
1020 if ( !$this->mMissingPageIDs ) {
1021 $this->mMissingPageIDs = array_keys( $remaining );
1022 } else {
1023 $this->mMissingPageIDs = array_merge( $this->mMissingPageIDs, array_keys( $remaining ) );
1024 }
1025 }
1026 }
1027
1028 // Get gender information
1029 $this->genderCache->doQuery( $usernames, __METHOD__ );
1030 }
1031
1037 private function initFromRevIDs( $revids ) {
1038 if ( !$revids ) {
1039 return;
1040 }
1041
1042 $revids = array_map( 'intval', $revids ); // paranoia
1043 $db = $this->getDB();
1044 $pageids = [];
1045 $remaining = array_fill_keys( $revids, true );
1046
1047 $revids = $this->filterIDs( [ [ 'revision', 'rev_id' ], [ 'archive', 'ar_rev_id' ] ], $revids );
1048 $goodRemaining = array_fill_keys( $revids, true );
1049
1050 if ( $revids ) {
1051 $fields = [ 'rev_id', 'rev_page' ];
1052
1053 // Get pageIDs data from the `page` table
1054 $res = $db->newSelectQueryBuilder()
1055 ->select( $fields )
1056 ->from( 'page' )
1057 ->where( [ 'rev_id' => $revids ] )
1058 ->join( 'revision', null, [ 'rev_page = page_id' ] )
1059 ->caller( __METHOD__ )
1060 ->fetchResultSet();
1061 foreach ( $res as $row ) {
1062 $revid = (int)$row->rev_id;
1063 $pageid = (int)$row->rev_page;
1064 $this->mGoodRevIDs[$revid] = $pageid;
1065 $this->mLiveRevIDs[$revid] = $pageid;
1066 $pageids[$pageid] = '';
1067 unset( $remaining[$revid] );
1068 unset( $goodRemaining[$revid] );
1069 }
1070 }
1071
1072 // Populate all the page information
1073 $this->initFromPageIds( array_keys( $pageids ), false );
1074
1075 // If the user can see deleted revisions, pull out the corresponding
1076 // titles from the archive table and include them too. We ignore
1077 // ar_page_id because deleted revisions are tied by title, not page_id.
1078 if ( $goodRemaining &&
1079 $this->getAuthority()->isAllowed( 'deletedhistory' ) ) {
1080
1081 $res = $db->newSelectQueryBuilder()
1082 ->select( [ 'ar_rev_id', 'ar_namespace', 'ar_title' ] )
1083 ->from( 'archive' )
1084 ->where( [ 'ar_rev_id' => array_keys( $goodRemaining ) ] )
1085 ->caller( __METHOD__ )
1086 ->fetchResultSet();
1087
1088 $titles = [];
1089 foreach ( $res as $row ) {
1090 $revid = (int)$row->ar_rev_id;
1091 $titles[$revid] = $this->titleFactory->makeTitle( $row->ar_namespace, $row->ar_title );
1092 unset( $remaining[$revid] );
1093 }
1094
1095 $this->initFromTitles( $titles );
1096
1097 foreach ( $titles as $revid => $title ) {
1098 $ns = $title->getNamespace();
1099 $dbkey = $title->getDBkey();
1100
1101 // Handle converted titles
1102 if ( !isset( $this->mAllPages[$ns][$dbkey] ) &&
1103 isset( $this->mConvertedTitles[$title->getPrefixedText()] )
1104 ) {
1105 $title = $this->titleFactory->newFromText( $this->mConvertedTitles[$title->getPrefixedText()] );
1106 $ns = $title->getNamespace();
1107 $dbkey = $title->getDBkey();
1108 }
1109
1110 if ( isset( $this->mAllPages[$ns][$dbkey] ) ) {
1111 $this->mGoodRevIDs[$revid] = $this->mAllPages[$ns][$dbkey];
1112 $this->mDeletedRevIDs[$revid] = $this->mAllPages[$ns][$dbkey];
1113 } else {
1114 $remaining[$revid] = true;
1115 }
1116 }
1117 }
1118
1119 $this->mMissingRevIDs = array_keys( $remaining );
1120 }
1121
1127 private function resolvePendingRedirects() {
1128 if ( $this->mResolveRedirects ) {
1129 $db = $this->getDB();
1130
1131 // Repeat until all redirects have been resolved
1132 // The infinite loop is prevented by keeping all known pages in $this->mAllPages
1133 while ( $this->mPendingRedirectIDs || $this->mPendingRedirectSpecialPages ) {
1134 // Resolve redirects by querying the pagelinks table, and repeat the process
1135 // Create a new linkBatch object for the next pass
1136 $linkBatch = $this->loadRedirectTargets();
1137
1138 if ( $linkBatch->isEmpty() ) {
1139 break;
1140 }
1141
1142 $set = $linkBatch->constructSet( 'page', $db );
1143 if ( $set === false ) {
1144 break;
1145 }
1146
1147 // Get pageIDs data from the `page` table
1148 $res = $db->newSelectQueryBuilder()
1149 ->select( $this->getPageTableFields() )
1150 ->from( 'page' )
1151 ->where( $set )
1152 ->caller( __METHOD__ )
1153 ->fetchResultSet();
1154
1155 // Hack: get the ns:titles stored in [ns => array(titles)] format
1156 $this->initFromQueryResult( $res, $linkBatch->data, true );
1157 }
1158 }
1159 }
1160
1168 private function loadRedirectTargets() {
1169 $titlesToResolve = [];
1170 $db = $this->getDB();
1171
1172 if ( $this->mPendingRedirectIDs ) {
1173 $res = $db->newSelectQueryBuilder()
1174 ->select( [
1175 'rd_from',
1176 'rd_namespace',
1177 'rd_fragment',
1178 'rd_interwiki',
1179 'rd_title'
1180 ] )
1181 ->from( 'redirect' )
1182 ->where( [ 'rd_from' => array_keys( $this->mPendingRedirectIDs ) ] )
1183 ->caller( __METHOD__ )
1184 ->fetchResultSet();
1185
1186 foreach ( $res as $row ) {
1187 $rdfrom = (int)$row->rd_from;
1188 $from = $this->mPendingRedirectIDs[$rdfrom]->getPrefixedText();
1189 $to = $this->titleFactory->makeTitle(
1190 $row->rd_namespace,
1191 $row->rd_title,
1192 $row->rd_fragment,
1193 $row->rd_interwiki
1194 );
1195 $this->mResolvedRedirectTitles[$from] = $this->mPendingRedirectIDs[$rdfrom];
1196 unset( $this->mPendingRedirectIDs[$rdfrom] );
1197 if ( $to->isExternal() ) {
1198 $this->mInterwikiTitles[$to->getPrefixedText()] = $to->getInterwiki();
1199 } elseif ( !isset( $this->mAllPages[$to->getNamespace()][$to->getDBkey()] )
1200 && !( $this->mConvertTitles && isset( $this->mConvertedTitles[$to->getPrefixedText()] ) )
1201 ) {
1202 $titlesToResolve[] = $to;
1203 }
1204 $this->mRedirectTitles[$from] = $to;
1205 }
1206 }
1207
1208 if ( $this->mPendingRedirectSpecialPages ) {
1209 foreach ( $this->mPendingRedirectSpecialPages as [ $from, $to ] ) {
1211 $fromKey = $from->getPrefixedText();
1212 $this->mResolvedRedirectTitles[$fromKey] = $from;
1213 $this->mRedirectTitles[$fromKey] = $to;
1214 if ( $to->isExternal() ) {
1215 $this->mInterwikiTitles[$to->getPrefixedText()] = $to->getInterwiki();
1216 } elseif ( !isset( $this->mAllPages[$to->getNamespace()][$to->getDBkey()] ) ) {
1217 $titlesToResolve[] = $to;
1218 }
1219 }
1220 $this->mPendingRedirectSpecialPages = [];
1221
1222 // Set private caching since we don't know what criteria the
1223 // special pages used to decide on these redirects.
1224 $this->mCacheMode = 'private';
1225 }
1226
1227 return $this->processTitlesArray( $titlesToResolve );
1228 }
1229
1243 public function getCacheMode( $params = null ) {
1244 return $this->mCacheMode;
1245 }
1246
1256 private function processTitlesArray( $titles ) {
1257 $linkBatch = $this->linkBatchFactory->newLinkBatch();
1258
1260 $titleObjects = [];
1261 foreach ( $titles as $index => $title ) {
1262 if ( is_string( $title ) ) {
1263 try {
1265 $titleObj = $this->titleFactory->newFromTextThrow( $title, $this->mDefaultNamespace );
1266 } catch ( MalformedTitleException $ex ) {
1267 // Handle invalid titles gracefully
1268 if ( !isset( $this->mAllPages[0][$title] ) ) {
1269 $this->mAllPages[0][$title] = $this->mFakePageId;
1270 $this->mInvalidTitles[$this->mFakePageId] = [
1271 'title' => $title,
1272 'invalidreason' => $this->getErrorFormatter()->formatException( $ex, [ 'bc' => true ] ),
1273 ];
1274 $this->mFakePageId--;
1275 }
1276 continue; // There's nothing else we can do
1277 }
1278 } elseif ( $title instanceof LinkTarget ) {
1279 $titleObj = $this->titleFactory->newFromLinkTarget( $title );
1280 } else {
1281 $titleObj = $this->titleFactory->newFromPageReference( $title );
1282 }
1283
1284 $titleObjects[$index] = $titleObj;
1285 }
1286
1287 // Get gender information
1288 $this->genderCache->doTitlesArray( $titleObjects, __METHOD__ );
1289
1290 foreach ( $titleObjects as $index => $titleObj ) {
1291 $title = is_string( $titles[$index] ) ? $titles[$index] : false;
1292 $unconvertedTitle = $titleObj->getPrefixedText();
1293 $titleWasConverted = false;
1294 if ( $titleObj->isExternal() ) {
1295 // This title is an interwiki link.
1296 $this->mInterwikiTitles[$unconvertedTitle] = $titleObj->getInterwiki();
1297 } else {
1298 // Variants checking
1299 if (
1300 $this->mConvertTitles
1301 && $this->languageConverter->hasVariants()
1302 && !$titleObj->exists()
1303 ) {
1304 // ILanguageConverter::findVariantLink will modify titleText and
1305 // titleObj into the canonical variant if possible
1306 $titleText = $title !== false ? $title : $titleObj->getPrefixedText();
1307 $this->languageConverter->findVariantLink( $titleText, $titleObj );
1308 $titleWasConverted = $unconvertedTitle !== $titleObj->getPrefixedText();
1309 }
1310
1311 if ( $titleObj->getNamespace() < 0 ) {
1312 // Handle Special and Media pages
1313 $titleObj = $titleObj->fixSpecialName();
1314 $ns = $titleObj->getNamespace();
1315 $dbkey = $titleObj->getDBkey();
1316 if ( !isset( $this->mAllSpecials[$ns][$dbkey] ) ) {
1317 $this->mAllSpecials[$ns][$dbkey] = $this->mFakePageId;
1318 $target = null;
1319 if ( $ns === NS_SPECIAL && $this->mResolveRedirects ) {
1320 $special = $this->specialPageFactory->getPage( $dbkey );
1321 if ( $special instanceof RedirectSpecialArticle ) {
1322 // Only RedirectSpecialArticle is intended to redirect to an article, other kinds of
1323 // RedirectSpecialPage are probably applying weird URL parameters we don't want to
1324 // handle.
1325 $context = new DerivativeContext( $this );
1326 $context->setTitle( $titleObj );
1327 $context->setRequest( new FauxRequest );
1328 $special->setContext( $context );
1329 [ /* $alias */, $subpage ] = $this->specialPageFactory->resolveAlias( $dbkey );
1330 $target = $special->getRedirect( $subpage );
1331 }
1332 }
1333 if ( $target ) {
1334 $this->mPendingRedirectSpecialPages[$dbkey] = [ $titleObj, $target ];
1335 } else {
1336 $this->mSpecialTitles[$this->mFakePageId] = $titleObj;
1337 $this->mFakePageId--;
1338 }
1339 }
1340 } else {
1341 // Regular page
1342 $linkBatch->addObj( $titleObj );
1343 }
1344 }
1345
1346 // Make sure we remember the original title that was
1347 // given to us. This way the caller can correlate new
1348 // titles with the originally requested when e.g. the
1349 // namespace is localized or the capitalization is
1350 // different
1351 if ( $titleWasConverted ) {
1352 $this->mConvertedTitles[$unconvertedTitle] = $titleObj->getPrefixedText();
1353 // In this case the page can't be Special.
1354 if ( $title !== false && $title !== $unconvertedTitle ) {
1355 $this->mNormalizedTitles[$title] = $unconvertedTitle;
1356 }
1357 } elseif ( $title !== false && $title !== $titleObj->getPrefixedText() ) {
1358 $this->mNormalizedTitles[$title] = $titleObj->getPrefixedText();
1359 }
1360 }
1361
1362 return $linkBatch;
1363 }
1364
1380 public function setGeneratorData( $title, array $data ) {
1381 $ns = $title->getNamespace();
1382 $dbkey = $title->getDBkey();
1383 $this->mGeneratorData[$ns][$dbkey] = $data;
1384 }
1385
1405 public function setRedirectMergePolicy( $callable ) {
1406 $this->mRedirectMergePolicy = $callable;
1407 }
1408
1420 private function resolveRedirectTitleDest( Title $titleFrom ): Title {
1421 $seen = [];
1422 $dest = $titleFrom;
1423 while ( isset( $this->mRedirectTitles[$dest->getPrefixedText()] ) ) {
1424 $dest = $this->mRedirectTitles[$dest->getPrefixedText()];
1425 if ( isset( $seen[$dest->getPrefixedText()] ) ) {
1426 return $titleFrom;
1427 }
1428 $seen[$dest->getPrefixedText()] = true;
1429 }
1430 return $dest;
1431 }
1432
1453 public function populateGeneratorData( &$result, array $path = [] ) {
1454 if ( $result instanceof ApiResult ) {
1455 $data = $result->getResultData( $path );
1456 if ( $data === null ) {
1457 return true;
1458 }
1459 } else {
1460 $data = &$result;
1461 foreach ( $path as $key ) {
1462 if ( !isset( $data[$key] ) ) {
1463 // Path isn't in $result, so nothing to add, so everything
1464 // "fits"
1465 return true;
1466 }
1467 $data = &$data[$key];
1468 }
1469 }
1470 foreach ( $this->mGeneratorData as $ns => $dbkeys ) {
1471 if ( $ns === NS_SPECIAL ) {
1472 $pages = [];
1473 foreach ( $this->mSpecialTitles as $id => $title ) {
1474 $pages[$title->getDBkey()] = $id;
1475 }
1476 } else {
1477 if ( !isset( $this->mAllPages[$ns] ) ) {
1478 // No known titles in the whole namespace. Skip it.
1479 continue;
1480 }
1481 $pages = $this->mAllPages[$ns];
1482 }
1483 foreach ( $dbkeys as $dbkey => $genData ) {
1484 if ( !isset( $pages[$dbkey] ) ) {
1485 // Unknown title. Forget it.
1486 continue;
1487 }
1488 $pageId = $pages[$dbkey];
1489 if ( !isset( $data[$pageId] ) ) {
1490 // $pageId didn't make it into the result. Ignore it.
1491 continue;
1492 }
1493
1494 if ( $result instanceof ApiResult ) {
1495 $path2 = array_merge( $path, [ $pageId ] );
1496 foreach ( $genData as $key => $value ) {
1497 if ( !$result->addValue( $path2, $key, $value ) ) {
1498 return false;
1499 }
1500 }
1501 } else {
1502 $data[$pageId] = array_merge( $data[$pageId], $genData );
1503 }
1504 }
1505 }
1506
1507 // Merge data generated about redirect titles into the redirect destination
1508 if ( $this->mRedirectMergePolicy ) {
1509 foreach ( $this->mResolvedRedirectTitles as $titleFrom ) {
1510 $dest = $this->resolveRedirectTitleDest( $titleFrom );
1511 $fromNs = $titleFrom->getNamespace();
1512 $fromDBkey = $titleFrom->getDBkey();
1513 $toPageId = $dest->getArticleID();
1514 if ( isset( $data[$toPageId] ) &&
1515 isset( $this->mGeneratorData[$fromNs][$fromDBkey] )
1516 ) {
1517 // It is necessary to set both $data and add to $result, if an ApiResult,
1518 // to ensure multiple redirects to the same destination are all merged.
1519 $data[$toPageId] = ( $this->mRedirectMergePolicy )(
1520 $data[$toPageId],
1521 $this->mGeneratorData[$fromNs][$fromDBkey]
1522 );
1523 if ( $result instanceof ApiResult &&
1524 !$result->addValue( $path, $toPageId, $data[$toPageId], ApiResult::OVERRIDE )
1525 ) {
1526 return false;
1527 }
1528 }
1529 }
1530 }
1531
1532 return true;
1533 }
1534
1539 protected function getDB() {
1540 return $this->mDbSource->getDB();
1541 }
1542
1544 public function getAllowedParams( $flags = 0 ) {
1545 $result = [
1546 'titles' => [
1547 ParamValidator::PARAM_ISMULTI => true,
1548 ApiBase::PARAM_HELP_MSG => 'api-pageset-param-titles',
1549 ],
1550 'pageids' => [
1551 ParamValidator::PARAM_TYPE => 'integer',
1552 ParamValidator::PARAM_ISMULTI => true,
1553 ApiBase::PARAM_HELP_MSG => 'api-pageset-param-pageids',
1554 ],
1555 'revids' => [
1556 ParamValidator::PARAM_TYPE => 'integer',
1557 ParamValidator::PARAM_ISMULTI => true,
1558 ApiBase::PARAM_HELP_MSG => 'api-pageset-param-revids',
1559 ],
1560 'generator' => [
1561 ParamValidator::PARAM_TYPE => null,
1562 ApiBase::PARAM_HELP_MSG => 'api-pageset-param-generator',
1563 SubmoduleDef::PARAM_SUBMODULE_PARAM_PREFIX => 'g',
1564 ],
1565 'redirects' => [
1566 ParamValidator::PARAM_DEFAULT => false,
1567 ApiBase::PARAM_HELP_MSG => $this->mAllowGenerator
1568 ? 'api-pageset-param-redirects-generator'
1569 : 'api-pageset-param-redirects-nogenerator',
1570 ],
1571 'converttitles' => [
1572 ParamValidator::PARAM_DEFAULT => false,
1573 ApiBase::PARAM_HELP_MSG => [
1574 'api-pageset-param-converttitles',
1575 Message::listParam( LanguageConverter::$languagesWithVariants, ListType::AND ),
1576 ],
1577 ],
1578 ];
1579
1580 if ( !$this->mAllowGenerator ) {
1581 unset( $result['generator'] );
1582 } elseif ( $flags & ApiBase::GET_VALUES_FOR_HELP ) {
1583 $result['generator'][ParamValidator::PARAM_TYPE] = 'submodule';
1584 $result['generator'][SubmoduleDef::PARAM_SUBMODULE_MAP] = $this->getGenerators();
1585 }
1586
1587 return $result;
1588 }
1589
1591 public function handleParamNormalization( $paramName, $value, $rawValue ) {
1592 parent::handleParamNormalization( $paramName, $value, $rawValue );
1593
1594 if ( $paramName === 'titles' ) {
1595 // For the 'titles' parameter, we want to split it like ApiBase would
1596 // and add any changed titles to $this->mNormalizedTitles
1597 $value = ParamValidator::explodeMultiValue( $value, self::LIMIT_SML2 + 1 );
1598 $l = count( $value );
1599 $rawValue = ParamValidator::explodeMultiValue( $rawValue, $l );
1600 for ( $i = 0; $i < $l; $i++ ) {
1601 if ( $value[$i] !== $rawValue[$i] ) {
1602 $this->mNormalizedTitles[$rawValue[$i]] = $value[$i];
1603 }
1604 }
1605 }
1606 }
1607
1612 private function getGenerators() {
1613 if ( self::$generators === null ) {
1614 $query = $this->mDbSource;
1615 if ( !( $query instanceof ApiQuery ) ) {
1616 // If the parent container of this pageset is not ApiQuery,
1617 // we must create it to get module manager
1618 $query = $this->getMain()->getModuleManager()->getModule( 'query' );
1619 }
1620 $gens = [];
1621 $prefix = $query->getModulePath() . '+';
1622 $mgr = $query->getModuleManager();
1623 foreach ( $mgr->getNamesWithClasses() as $name => $class ) {
1624 if ( is_subclass_of( $class, ApiQueryGeneratorBase::class ) ) {
1625 $gens[$name] = $prefix . $name;
1626 }
1627 }
1628 ksort( $gens );
1629 self::$generators = $gens;
1630 }
1631
1632 return self::$generators;
1633 }
1634}
1635
1637class_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:60
dieWithError( $msg, $code=null, $data=null, $httpCode=0)
Abort execution with an error.
Definition ApiBase.php:1522
getHookRunner()
Get an ApiHookRunner for running core API hooks.
Definition ApiBase.php:781
getMain()
Get the main module.
Definition ApiBase.php:575
addWarning( $msg, $code=null, $data=null)
Add a warning for this module.
Definition ApiBase.php:1439
encodeParamName( $paramName)
This method mangles parameter name based on the prefix supplied to the constructor.
Definition ApiBase.php:815
extractRequestParams( $options=[])
Using getAllowedParams(), this function makes an array of the values provided by the user,...
Definition ApiBase.php:837
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.
__construct(private readonly ApiBase $mDbSource, $flags=0, private readonly int $mDefaultNamespace=NS_MAIN,)
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.
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:34
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:65
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
Factory for LinkBatch objects to batch query page metadata.
Batch query for page metadata and feed to LinkCache.
Definition LinkBatch.php:36
Page existence and metadata cache.
Definition LinkCache.php:54
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'=> true, 'SVGNativeRenderingSizeLimit'=> 51200, 'MediaInTargetLanguage'=> true, 'MaxImageArea'=> 12500000, 'MaxAnimatedGifArea'=> 12500000, 'TiffThumbnailType'=>[], 'ThumbnailEpoch'=> '20030516000000', 'AttemptFailureEpoch'=> 1, 'IgnoreImageErrors'=> false, 'GenerateThumbnailOnParse'=> true, 'ShowArchiveThumbnails'=> true, 'EnableAutoRotation'=> null, 'Antivirus'=> null, 'AntivirusSetup'=>['clamav'=>['command'=> 'clamscan --no-summary ', 'codemap'=>[0=> 0, 1=> 1, 52=> -1, ' *'=> false,], 'messagepattern'=> '/.*?:(.*)/sim',],], 'AntivirusRequired'=> true, 'VerifyMimeType'=> true, 'MimeTypeFile'=> 'internal', 'MimeInfoFile'=> 'internal', 'MimeDetectorCommand'=> null, 'TrivialMimeDetection'=> false, 'XMLMimeTypes'=>['http:'svg'=> 'image/svg+xml', 'http:'http:'html'=> 'text/html',], 'ImageLimits'=>[[320, 240,], [640, 480,], [800, 600,], [1024, 768,], [1280, 1024,], [2560, 2048,],], 'ThumbLimits'=>[120, 150, 180, 200, 220, 250, 300, 400,], 'ThumbnailNamespaces'=>[6,], 'ThumbnailSteps'=> null, 'ThumbnailBuckets'=> null, 'ThumbnailMinimumBucketDistance'=> 50, 'UploadThumbnailRenderMap'=>[], 'UploadThumbnailRenderMethod'=> 'jobqueue', 'UploadThumbnailRenderHttpCustomHost'=> false, 'UploadThumbnailRenderHttpCustomDomain'=> false, 'UseTinyRGBForJPGThumbnails'=> false, 'GalleryOptions'=>[], 'ThumbUpright'=> 0.75, 'DirectoryMode'=> 511, 'ResponsiveImages'=> true, 'ImagePreconnect'=> false, 'TrackMediaRequestProvenance'=> false, 'DjvuUseBoxedCommand'=> false, 'DjvuDump'=> null, 'DjvuRenderer'=> null, 'DjvuTxt'=> null, 'DjvuPostProcessor'=> 'pnmtojpeg', 'DjvuOutputExtension'=> 'jpg', 'EmergencyContact'=> false, 'PasswordSender'=> false, 'NoReplyAddress'=> false, 'EnableEmail'=> true, 'EnableUserEmail'=> true, 'UserEmailUseReplyTo'=> true, 'PasswordReminderResendTime'=> 24, 'NewPasswordExpiry'=> 604800, 'UserEmailConfirmationTokenExpiry'=> 604800, 'PasswordExpirationDays'=> false, 'PasswordExpireGrace'=> 604800, 'SMTP'=> false, 'AdditionalMailParams'=> null, 'AllowHTMLEmail'=> false, 'EnotifFromEditor'=> false, 'EmailAuthentication'=> true, 'EmailConfirmationBanner'=> false, 'EnotifWatchlist'=> false, 'EnotifUserTalk'=> false, 'EnotifRevealEditorAddress'=> false, 'EnotifMinorEdits'=> true, 'EnotifUseRealName'=> false, 'UsersNotifiedOnAllChanges'=>[], 'DBname'=> 'my_wiki', 'DBmwschema'=> null, 'DBprefix'=> '', 'DBserver'=> 'localhost', 'DBport'=> 5432, 'DBuser'=> 'wikiuser', 'DBpassword'=> '', 'DBtype'=> 'mysql', 'DBssl'=> false, 'DBcompress'=> false, 'DBStrictWarnings'=> false, 'DBadminuser'=> null, 'DBadminpassword'=> null, 'SearchType'=> null, 'SearchTypeAlternatives'=> null, 'DBTableOptions'=> 'ENGINE=InnoDB, DEFAULT CHARSET=binary', 'SQLMode'=> '', 'SQLiteDataDir'=> '', 'SharedDB'=> null, 'SharedPrefix'=> false, 'SharedTables'=>['user', 'user_properties', 'user_autocreate_serial',], 'SharedSchema'=> false, 'DBservers'=> false, 'LBFactoryConf'=>['class'=> 'Wikimedia\\Rdbms\\LBFactorySimple',], 'DataCenterUpdateStickTTL'=> 10, 'DBerrorLog'=> false, 'DBerrorLogTZ'=> false, 'LocalDatabases'=>[], 'DatabaseReplicaLagWarning'=> 10, 'DatabaseReplicaLagCritical'=> 30, 'MaxExecutionTimeForExpensiveQueries'=> 0, 'VirtualDomainsMapping'=>[], 'FileSchemaMigrationStage'=> 3, 'ExternalLinksDomainGaps'=>[], 'ContentHandlers'=>['wikitext'=>['class'=> 'MediaWiki\\Content\\WikitextContentHandler', 'services'=>['TitleFactory', 'ParserFactory', 'GlobalIdGenerator', 'LanguageNameUtils', 'LinkRenderer', 'MagicWordFactory', 'ParsoidParserFactory',],], 'javascript'=>['class'=> 'MediaWiki\\Content\\JavaScriptContentHandler', 'services'=>['MainConfig', 'ParserFactory', 'UserOptionsLookup',],], 'json'=>['class'=> 'MediaWiki\\Content\\JsonContentHandler', 'services'=>['ParsoidParserFactory', 'TitleFactory',],], 'css'=>['class'=> 'MediaWiki\\Content\\CssContentHandler', 'services'=>['MainConfig', 'ParserFactory', 'UserOptionsLookup',],], 'vue'=>['class'=> 'MediaWiki\\Content\\VueContentHandler', 'services'=>['MainConfig', 'ParserFactory',],], 'text'=> 'MediaWiki\\Content\\TextContentHandler', 'unknown'=> 'MediaWiki\\Content\\FallbackContentHandler',], 'NamespaceContentModels'=>[], 'TextModelsToParse'=>['wikitext', 'javascript', 'css',], 'CompressRevisions'=> false, 'ExternalStores'=>[], 'ExternalServers'=>[], 'DefaultExternalStore'=> false, 'RevisionCacheExpiry'=> 604800, 'PageLanguageUseDB'=> false, 'DiffEngine'=> null, 'ExternalDiffEngine'=> false, 'Wikidiff2Options'=>[], 'RequestTimeLimit'=> null, 'TransactionalTimeLimit'=> 120, 'CriticalSectionTimeLimit'=> 180.0, 'MiserMode'=> false, 'DisableQueryPages'=> false, 'QueryCacheLimit'=> 1000, 'WantedPagesThreshold'=> 1, 'AllowSlowParserFunctions'=> false, 'AllowSchemaUpdates'=> true, 'MaxArticleSize'=> 2048, 'MemoryLimit'=> '50M', 'PoolCounterConf'=> null, 'PoolCountClientConf'=>['servers'=>['127.0.0.1',], 'timeout'=> 0.1,], 'MaxUserDBWriteDuration'=> false, 'MaxJobDBWriteDuration'=> false, 'LinkHolderBatchSize'=> 1000, 'MaximumMovedPages'=> 100, 'ForceDeferredUpdatesPreSend'=> false, 'MultiShardSiteStats'=> false, 'CacheDirectory'=> false, 'MainCacheType'=> 0, 'MessageCacheType'=> -1, 'ParserCacheType'=> -1, 'SessionCacheType'=> -1, 'AnonSessionCacheType'=> false, 'LanguageConverterCacheType'=> -1, 'ObjectCaches'=>[0=>['class'=> 'Wikimedia\\ObjectCache\\EmptyBagOStuff', 'reportDupes'=> false,], 1=>['class'=> 'MediaWiki\\ObjectCache\\SqlBagOStuff', 'loggroup'=> 'SQLBagOStuff',], 'memcached-php'=>['class'=> 'Wikimedia\\ObjectCache\\MemcachedPhpBagOStuff', 'loggroup'=> 'memcached',], 'memcached-pecl'=>['class'=> 'Wikimedia\\ObjectCache\\MemcachedPeclBagOStuff', 'loggroup'=> 'memcached',], 'hash'=>['class'=> 'Wikimedia\\ObjectCache\\HashBagOStuff', 'reportDupes'=> false,], 'apc'=>['class'=> 'Wikimedia\\ObjectCache\\APCUBagOStuff', 'reportDupes'=> false,], 'apcu'=>['class'=> 'Wikimedia\\ObjectCache\\APCUBagOStuff', 'reportDupes'=> false,],], 'WANObjectCache'=>[], 'MicroStashType'=> -1, 'MainStash'=> 1, 'ParsoidCacheConfig'=>['StashType'=> null, 'StashDuration'=> 86400, 'WarmParsoidParserCache'=> false,], 'ParsoidSelectiveUpdateSampleRate'=> 0, 'ParserCacheFilterConfig'=>['pcache'=>['default'=>['minCpuTime'=> 0,],], 'postproc-pcache'=>['default'=>['minCpuTime'=> 9223372036854775807,],], 'parsoid-pcache'=>['default'=>['minCpuTime'=> 0,],], 'postproc-parsoid-pcache'=>['default'=>['minCpuTime'=> 0,],],], 'ChronologyProtectorSecret'=> '', 'ParserCacheExpireTime'=> 86400, 'ParserCacheAsyncExpireTime'=> 60, 'ParserCacheAsyncRefreshJobs'=> true, 'OldRevisionParserCacheExpireTime'=> 3600, 'ObjectCacheSessionExpiry'=> 3600, 'PHPSessionHandling'=> 'warn', 'SuspiciousIpExpiry'=> false, 'SessionPbkdf2Iterations'=> 10001, 'UseSessionCookieJwt'=> false, 'JwtSessionCookieIssuer'=> null, 'MemCachedServers'=>['127.0.0.1:11211',], 'MemCachedPersistent'=> false, 'MemCachedTimeout'=> 500000, 'UseLocalMessageCache'=> false, 'AdaptiveMessageCache'=> false, 'LocalisationCacheConf'=>['class'=> 'MediaWiki\\Language\\LocalisationCache', 'store'=> 'detect', 'storeClass'=> false, 'storeDirectory'=> false, 'storeServer'=>[], 'forceRecache'=> false, 'manualRecache'=> false,], 'CachePages'=> true, 'CacheEpoch'=> '20030516000000', 'GitInfoCacheDirectory'=> false, 'UseFileCache'=> false, 'FileCacheDepth'=> 2, 'RenderHashAppend'=> '', 'EnableSidebarCache'=> false, 'SidebarCacheExpiry'=> 86400, 'UseGzip'=> false, 'InvalidateCacheOnLocalSettingsChange'=> true, 'ExtensionInfoMTime'=> false, 'EnableRemoteBagOStuffTests'=> false, 'UseCdn'=> false, 'VaryOnXFP'=> false, 'InternalServer'=> false, 'CdnMaxAge'=> 18000, 'CdnMaxageLagged'=> 30, 'CdnMaxageStale'=> 10, 'CdnReboundPurgeDelay'=> 0, 'CdnMaxageSubstitute'=> 60, 'ForcedRawSMaxage'=> 300, 'CdnServers'=>[], 'CdnServersNoPurge'=>[], 'HTCPRouting'=>[], 'HTCPMulticastTTL'=> 1, 'UsePrivateIPs'=> false, 'CdnMatchParameterOrder'=> true, 'LanguageCode'=> 'en', 'GrammarForms'=>[], 'InterwikiMagic'=> true, 'HideInterlanguageLinks'=> false, 'ExtraInterlanguageLinkPrefixes'=>[], 'InterlanguageLinkCodeMap'=>[], 'ExtraLanguageNames'=>[], 'ExtraLanguageCodes'=>['bh'=> 'bho', 'no'=> 'nb', 'simple'=> 'en',], 'DummyLanguageCodes'=>[], 'AllUnicodeFixes'=> false, 'LegacyEncoding'=> false, 'AmericanDates'=> false, 'TranslateNumerals'=> true, 'UseDatabaseMessages'=> true, 'MaxMsgCacheEntrySize'=> 10000, 'DisableLangConversion'=> false, 'DisableTitleConversion'=> false, 'DefaultLanguageVariant'=> false, 'UsePigLatinVariant'=> false, 'DisabledVariants'=>[], 'VariantArticlePath'=> false, 'UseXssLanguage'=> false, 'LoginLanguageSelector'=> false, 'ForceUIMsgAsContentMsg'=>[], 'RawHtmlMessages'=>[], 'Localtimezone'=> null, 'LocalTZoffset'=> null, 'OverrideUcfirstCharacters'=>[], 'MimeType'=> 'text/html', 'Html5Version'=> null, 'EditSubmitButtonLabelPublish'=> false, 'XhtmlNamespaces'=>[], 'SiteNotice'=> '', 'BrowserFormatDetection'=> 'telephone=no', 'SkinMetaTags'=>[], 'DefaultSkin'=> 'vector-2022', 'FallbackSkin'=> 'fallback', 'SkipSkins'=>[], 'DisableOutputCompression'=> false, 'FragmentMode'=>['html5', 'legacy',], 'ExternalInterwikiFragmentMode'=> 'legacy', 'FooterIcons'=>['copyright'=>['copyright'=>[],], 'poweredby'=>['mediawiki'=>['src'=> null, 'url'=> 'https:'alt'=> 'Powered by MediaWiki', 'lang'=> 'en',],],], 'UseCombinedLoginLink'=> false, 'Edititis'=> false, 'Send404Code'=> true, 'ShowRollbackEditCount'=> 10, 'EnableCanonicalServerLink'=> false, 'InterwikiLogoOverride'=>[], 'ResourceModules'=>[], 'ResourceModuleSkinStyles'=>[], 'ResourceLoaderSources'=>[], 'ResourceBasePath'=> null, 'ResourceLoaderMaxage'=>[], 'ResourceLoaderDebug'=> false, 'ResourceLoaderMaxQueryLength'=> false, 'ResourceLoaderValidateJS'=> true, 'ResourceLoaderEnableJSProfiler'=> false, 'ResourceLoaderStorageEnabled'=> true, 'ResourceLoaderStorageVersion'=> 1, 'ResourceLoaderEnableSourceMapLinks'=> true, 'AllowSiteCSSOnRestrictedPages'=> false, 'VueDevelopmentMode'=> false, 'CodexDevelopmentDir'=> null, 'MetaNamespace'=> false, 'MetaNamespaceTalk'=> false, 'CanonicalNamespaceNames'=>[-2=> 'Media', -1=> 'Special', 0=> '', 1=> 'Talk', 2=> 'User', 3=> 'User_talk', 4=> 'Project', 5=> 'Project_talk', 6=> 'File', 7=> 'File_talk', 8=> 'MediaWiki', 9=> 'MediaWiki_talk', 10=> 'Template', 11=> 'Template_talk', 12=> 'Help', 13=> 'Help_talk', 14=> 'Category', 15=> 'Category_talk',], 'ExtraNamespaces'=>[], 'ExtraGenderNamespaces'=>[], 'NamespaceAliases'=>[], 'LegalTitleChars'=> ' %!"$&\'()*,\\-.\\/0-9:;=?@A-Z\\\\^_`a-z~\\x80-\\xFF+', 'CapitalLinks' => true, 'CapitalLinkOverrides' => [ ], 'NamespacesWithSubpages' => [ 1 => true, 2 => true, 3 => true, 4 => true, 5 => true, 7 => true, 8 => true, 9 => true, 10 => true, 11 => true, 12 => true, 13 => true, 15 => true, ], 'NamespacesWithoutAutoSummaries' => [ ], 'ContentNamespaces' => [ 0, ], 'ShortPagesNamespaceExclusions' => [ ], 'ExtraSignatureNamespaces' => [ ], 'InvalidRedirectTargets' => [ 'Filepath', 'Mypage', 'Mytalk', 'Redirect', 'Mylog', ], 'DisableHardRedirects' => false, 'FixDoubleRedirects' => false, 'LocalInterwikis' => [ ], 'InterwikiExpiry' => 10800, 'InterwikiCache' => false, 'InterwikiScopes' => 3, 'InterwikiFallbackSite' => 'wiki', 'RedirectSources' => false, 'SiteTypes' => [ 'mediawiki' => 'MediaWiki\\Site\\MediaWikiSite', ], 'MaxTocLevel' => 999, 'MaxPPNodeCount' => 1000000, 'MaxTemplateDepth' => 100, 'MaxPPExpandDepth' => 100, 'UrlProtocols' => [ 'bitcoin:', 'ftp: 'ftps: 'geo:', 'git: 'gopher: 'http: 'https: 'irc: 'ircs: 'magnet:', 'mailto:', 'matrix:', 'mms: 'news:', 'nntp: 'redis: 'sftp: 'sip:', 'sips:', 'sms:', 'ssh: 'svn: 'tel:', 'telnet: 'urn:', 'wikipedia: 'worldwind: 'xmpp:', ' ], 'CleanSignatures' => true, 'AllowExternalImages' => false, 'AllowExternalImagesFrom' => '', 'EnableImageWhitelist' => false, 'TidyConfig' => [ ], 'ParsoidSettings' => [ 'useSelser' => true, ], 'ParsoidExperimentalParserFunctionOutput' => false, 'RawHtml' => false, 'ExternalLinkTarget' => false, 'NoFollowLinks' => true, 'NoFollowNsExceptions' => [ ], 'NoFollowDomainExceptions' => [ 'mediawiki.org', ], 'RegisterInternalExternals' => false, 'ExternalLinksIgnoreDomains' => [ ], 'AllowDisplayTitle' => true, 'RestrictDisplayTitle' => true, 'ExpensiveParserFunctionLimit' => 100, 'PreprocessorCacheThreshold' => 1000, 'EnableScaryTranscluding' => false, 'TranscludeCacheExpiry' => 3600, 'EnableMagicLinks' => [ 'ISBN' => false, 'PMID' => false, 'RFC' => false, ], 'ParserEnableUserLanguage' => false, 'ArticleCountMethod' => 'link', 'ActiveUserDays' => 30, 'LearnerEdits' => 10, 'LearnerMemberSince' => 4, 'ExperiencedUserEdits' => 500, 'ExperiencedUserMemberSince' => 30, 'ManualRevertSearchRadius' => 15, 'RevertedTagMaxDepth' => 15, 'CentralIdLookupProviders' => [ 'local' => [ 'class' => 'MediaWiki\\User\\CentralId\\LocalIdLookup', 'services' => [ 'MainConfig', 'DBLoadBalancerFactory', 'HideUserUtils', ], ], ], 'CentralIdLookupProvider' => 'local', 'UserRegistrationProviders' => [ 'local' => [ 'class' => 'MediaWiki\\User\\Registration\\LocalUserRegistrationProvider', 'services' => [ 'ConnectionProvider', ], ], ], 'PasswordPolicy' => [ 'policies' => [ 'bureaucrat' => [ 'MinimalPasswordLength' => 10, 'MinimumPasswordLengthToLogin' => 1, ], 'sysop' => [ 'MinimalPasswordLength' => 10, 'MinimumPasswordLengthToLogin' => 1, ], 'interface-admin' => [ 'MinimalPasswordLength' => 10, 'MinimumPasswordLengthToLogin' => 1, ], 'bot' => [ 'MinimalPasswordLength' => 10, 'MinimumPasswordLengthToLogin' => 1, ], 'default' => [ 'MinimalPasswordLength' => [ 'value' => 8, 'suggestChangeOnLogin' => true, ], 'PasswordCannotBeSubstringInUsername' => [ 'value' => true, 'suggestChangeOnLogin' => true, ], 'PasswordCannotMatchDefaults' => [ 'value' => true, 'suggestChangeOnLogin' => true, ], 'MaximalPasswordLength' => [ 'value' => 4096, 'suggestChangeOnLogin' => true, ], 'PasswordNotInCommonList' => [ 'value' => true, 'suggestChangeOnLogin' => true, ], ], ], 'checks' => [ 'MinimalPasswordLength' => [ 'MediaWiki\\Password\\PasswordPolicyChecks', 'checkMinimalPasswordLength', ], 'MinimumPasswordLengthToLogin' => [ 'MediaWiki\\Password\\PasswordPolicyChecks', 'checkMinimumPasswordLengthToLogin', ], 'PasswordCannotBeSubstringInUsername' => [ 'MediaWiki\\Password\\PasswordPolicyChecks', 'checkPasswordCannotBeSubstringInUsername', ], 'PasswordCannotMatchDefaults' => [ 'MediaWiki\\Password\\PasswordPolicyChecks', 'checkPasswordCannotMatchDefaults', ], 'MaximalPasswordLength' => [ 'MediaWiki\\Password\\PasswordPolicyChecks', 'checkMaximalPasswordLength', ], 'PasswordNotInCommonList' => [ 'MediaWiki\\Password\\PasswordPolicyChecks', 'checkPasswordNotInCommonList', ], ], ], 'AuthManagerConfig' => null, 'AuthManagerAutoConfig' => [ 'preauth' => [ 'MediaWiki\\Auth\\ThrottlePreAuthenticationProvider' => [ 'class' => 'MediaWiki\\Auth\\ThrottlePreAuthenticationProvider', 'sort' => 0, ], 'MediaWiki\\Auth\\PreviouslyRenamedAccountPreAuthenticationProvider' => [ 'class' => 'MediaWiki\\Auth\\PreviouslyRenamedAccountPreAuthenticationProvider', 'services' => [ 'ConnectionProvider', 'UserFactory', ], 'sort' => 0, ], ], 'primaryauth' => [ 'MediaWiki\\Auth\\TemporaryPasswordPrimaryAuthenticationProvider' => [ 'class' => 'MediaWiki\\Auth\\TemporaryPasswordPrimaryAuthenticationProvider', 'services' => [ 'DBLoadBalancerFactory', 'UserOptionsLookup', ], 'args' => [ [ 'authoritative' => false, ], ], 'sort' => 0, ], 'MediaWiki\\Auth\\LocalPasswordPrimaryAuthenticationProvider' => [ 'class' => 'MediaWiki\\Auth\\LocalPasswordPrimaryAuthenticationProvider', 'services' => [ 'DBLoadBalancerFactory', ], 'args' => [ [ 'authoritative' => true, ], ], 'sort' => 100, ], ], 'secondaryauth' => [ 'MediaWiki\\Auth\\CheckBlocksSecondaryAuthenticationProvider' => [ 'class' => 'MediaWiki\\Auth\\CheckBlocksSecondaryAuthenticationProvider', 'sort' => 0, ], 'MediaWiki\\Auth\\ResetPasswordSecondaryAuthenticationProvider' => [ 'class' => 'MediaWiki\\Auth\\ResetPasswordSecondaryAuthenticationProvider', 'sort' => 100, ], 'MediaWiki\\Auth\\EmailNotificationSecondaryAuthenticationProvider' => [ 'class' => 'MediaWiki\\Auth\\EmailNotificationSecondaryAuthenticationProvider', 'services' => [ 'DBLoadBalancerFactory', ], 'sort' => 200, ], ], ], 'RememberMe' => 'choose', 'ReauthenticateTime' => [ 'default' => 3600, ], 'AllowSecuritySensitiveOperationIfCannotReauthenticate' => [ 'default' => true, ], 'ChangeCredentialsBlacklist' => [ 'MediaWiki\\Auth\\TemporaryPasswordAuthenticationRequest', ], 'RemoveCredentialsBlacklist' => [ 'MediaWiki\\Auth\\PasswordAuthenticationRequest', ], 'InvalidPasswordReset' => true, 'PasswordDefault' => 'pbkdf2', 'PasswordConfig' => [ 'A' => [ 'class' => 'MediaWiki\\Password\\MWOldPassword', ], 'B' => [ 'class' => 'MediaWiki\\Password\\MWSaltedPassword', ], 'pbkdf2-legacyA' => [ 'class' => 'MediaWiki\\Password\\LayeredParameterizedPassword', 'types' => [ 'A', 'pbkdf2', ], ], 'pbkdf2-legacyB' => [ 'class' => 'MediaWiki\\Password\\LayeredParameterizedPassword', 'types' => [ 'B', 'pbkdf2', ], ], 'bcrypt' => [ 'class' => 'MediaWiki\\Password\\BcryptPassword', 'cost' => 9, ], 'pbkdf2' => [ 'class' => 'MediaWiki\\Password\\Pbkdf2PasswordUsingOpenSSL', 'algo' => 'sha512', 'cost' => '30000', 'length' => '64', ], 'argon2' => [ 'class' => 'MediaWiki\\Password\\Argon2Password', 'algo' => 'auto', ], ], 'PasswordResetRoutes' => [ 'username' => true, 'email' => true, ], 'MaxSigChars' => 255, 'SignatureValidation' => 'warning', 'SignatureAllowedLintErrors' => [ 'obsolete-tag', ], 'MaxNameChars' => 255, 'ReservedUsernames' => [ 'MediaWiki default', 'Conversion script', 'Maintenance script', 'Template namespace initialisation script', 'ScriptImporter', 'Delete page script', 'Move page script', 'Command line script', 'Unknown user', 'msg:double-redirect-fixer', 'msg:usermessage-editor', 'msg:proxyblocker', 'msg:sorbs', 'msg:spambot_username', 'msg:autochange-username', ], 'DefaultUserOptions' => [ 'ccmeonemails' => 0, 'date' => 'default', 'diffonly' => 0, 'diff-type' => 'table', 'disablemail' => 0, 'editfont' => 'monospace', 'editondblclick' => 0, 'editrecovery' => 0, 'editsectiononrightclick' => 0, 'email-allow-new-users' => 1, 'enotifminoredits' => 0, 'enotifrevealaddr' => 0, 'enotifusertalkpages' => 1, 'enotifwatchlistpages' => 1, 'extendwatchlist' => 1, 'fancysig' => 0, 'forceeditsummary' => 0, 'forcesafemode' => 0, 'gender' => 'unknown', 'hidecategorization' => 1, 'hideminor' => 0, 'hidepatrolled' => 0, 'imagesize' => 2, 'minordefault' => 0, 'newpageshidepatrolled' => 0, 'nickname' => '', 'norollbackdiff' => 0, 'prefershttps' => 1, 'previewonfirst' => 0, 'previewontop' => 1, 'pst-cssjs' => 1, 'rcdays' => 7, 'rcenhancedfilters-disable' => 0, 'rclimit' => 50, 'requireemail' => 0, 'search-match-redirect' => true, 'search-special-page' => 'Search', 'search-thumbnail-extra-namespaces' => true, 'searchlimit' => 20, 'showhiddencats' => 0, 'shownumberswatching' => 1, 'showrollbackconfirmation' => 0, 'skin' => false, 'skin-responsive' => 1, 'thumbsize' => 5, 'underline' => 2, 'useeditwarning' => 1, 'uselivepreview' => 0, 'usenewrc' => 1, 'watchcreations' => 1, 'watchcreations-expiry' => 'infinite', 'watchdefault' => 1, 'watchdefault-expiry' => 'infinite', 'watchdeletion' => 0, 'watchlistdays' => 7, 'watchlisthideanons' => 0, 'watchlisthidebots' => 0, 'watchlisthidecategorization' => 1, 'watchlisthideliu' => 0, 'watchlisthideminor' => 0, 'watchlisthideown' => 0, 'watchlisthidepatrolled' => 0, 'watchlistreloadautomatically' => 0, 'watchlistunwatchlinks' => 0, 'watchmoves' => 0, 'watchrollback' => 0, 'watchuploads' => 1, 'watchrollback-expiry' => 'infinite', 'watchstar-expiry' => 'infinite', 'wlenhancedfilters-disable' => 0, 'wllimit' => 250, ], 'ConditionalUserOptions' => [ ], 'HiddenPrefs' => [ ], 'UserJsPrefLimit' => 100, 'InvalidUsernameCharacters' => '@:>=', 'UserrightsInterwikiDelimiter' => '@', 'SecureLogin' => false, 'AuthenticationTokenVersion' => null, 'SessionProviders' => [ 'MediaWiki\\Session\\CookieSessionProvider' => [ 'class' => 'MediaWiki\\Session\\CookieSessionProvider', 'args' => [ [ 'priority' => 30, ], ], 'services' => [ 'JwtCodec', 'UrlUtils', ], ], 'MediaWiki\\Session\\BotPasswordSessionProvider' => [ 'class' => 'MediaWiki\\Session\\BotPasswordSessionProvider', 'args' => [ [ 'priority' => 75, ], ], 'services' => [ 'GrantsInfo', ], ], ], 'AutoCreateTempUser' => [ 'known' => false, 'enabled' => false, 'actions' => [ 'edit', ], 'genPattern' => '~$1', 'matchPattern' => null, 'reservedPattern' => '~$1', 'serialProvider' => [ 'type' => 'local', 'useYear' => true, ], 'serialMapping' => [ 'type' => 'readable-numeric', ], 'expireAfterDays' => 90, 'notifyBeforeExpirationDays' => 10, ], 'AutoblockExemptions' => [ ], 'AutoblockExpiry' => 86400, 'BlockAllowsUTEdit' => true, 'BlockCIDRLimit' => [ 'IPv4' => 16, 'IPv6' => 19, ], 'BlockDisablesLogin' => false, 'EnableMultiBlocks' => false, 'WhitelistRead' => false, 'WhitelistReadRegexp' => false, 'EmailConfirmToEdit' => false, 'HideIdentifiableRedirects' => true, 'GroupPermissions' => [ '*' => [ 'createaccount' => true, 'read' => true, 'edit' => true, 'createpage' => true, 'createtalk' => true, 'viewmyprivateinfo' => true, 'editmyprivateinfo' => true, 'editmyoptions' => true, ], 'user' => [ 'move' => true, 'move-subpages' => true, 'move-rootuserpages' => true, 'move-categorypages' => true, 'movefile' => true, 'read' => true, 'edit' => true, 'createpage' => true, 'createtalk' => true, 'upload' => true, 'reupload' => true, 'reupload-shared' => true, 'minoredit' => true, 'editmyusercss' => true, 'editmyuserjson' => true, 'editmyuserjs' => true, 'editmyuserjsredirect' => true, 'sendemail' => true, 'applychangetags' => true, 'changetags' => true, 'viewmywatchlist' => true, 'editmywatchlist' => true, 'createwithcontentmodel' => true, ], 'autoconfirmed' => [ 'autoconfirmed' => true, 'editsemiprotected' => true, ], 'bot' => [ 'bot' => true, 'autoconfirmed' => true, 'editsemiprotected' => true, 'nominornewtalk' => true, 'autopatrol' => true, 'suppressredirect' => true, 'apihighlimits' => true, ], 'sysop' => [ 'block' => true, 'createaccount' => true, 'createpreviouslyrenamedaccount' => true, 'delete' => true, 'bigdelete' => true, 'deletedhistory' => true, 'deletedtext' => true, 'undelete' => true, 'editcontentmodel' => true, 'editinterface' => true, 'editsitejson' => true, 'edituserjson' => true, 'import' => true, 'importupload' => true, 'move' => true, 'move-subpages' => true, 'move-rootuserpages' => true, 'move-categorypages' => true, 'patrol' => true, 'autopatrol' => true, 'protect' => true, 'editprotected' => true, 'rollback' => true, 'upload' => true, 'reupload' => true, 'reupload-shared' => true, 'unwatchedpages' => true, 'autoconfirmed' => true, 'editsemiprotected' => true, 'ipblock-exempt' => true, 'blockemail' => true, 'markbotedits' => true, 'apihighlimits' => true, 'browsearchive' => true, 'noratelimit' => true, 'movefile' => true, 'unblockself' => true, 'suppressredirect' => true, 'mergehistory' => true, 'managechangetags' => true, 'deletechangetags' => true, ], 'interface-admin' => [ 'editinterface' => true, 'editsitecss' => true, 'editsitejson' => true, 'editsitejs' => true, 'editusercss' => true, 'edituserjson' => true, 'edituserjs' => true, ], 'bureaucrat' => [ 'userrights' => true, 'noratelimit' => true, 'renameuser' => true, ], 'suppress' => [ 'hideuser' => true, 'suppressrevision' => true, 'viewsuppressed' => true, 'suppressionlog' => true, 'deleterevision' => true, 'deletelogentry' => true, ], ], 'PrivilegedGroups' => [ 'bureaucrat', 'interface-admin', 'suppress', 'sysop', ], 'RevokePermissions' => [ ], 'GroupInheritsPermissions' => [ ], 'ImplicitGroups' => [ '*', 'user', 'autoconfirmed', ], 'GroupsAddToSelf' => [ ], 'GroupsRemoveFromSelf' => [ ], 'RestrictedGroups' => [ ], 'UserRequirementsPrivateConditions' => [ ], 'RestrictionTypes' => [ 'create', 'edit', 'move', 'upload', ], 'RestrictionLevels' => [ '', 'autoconfirmed', 'sysop', ], 'CascadingRestrictionLevels' => [ 'sysop', ], 'SemiprotectedRestrictionLevels' => [ 'autoconfirmed', ], 'NamespaceProtection' => [ ], 'NonincludableNamespaces' => [ ], 'AutoConfirmAge' => 0, 'AutoConfirmCount' => 0, 'Autopromote' => [ 'autoconfirmed' => [ '&', [ 1, null, ], [ 2, null, ], ], ], 'AutopromoteOnce' => [ 'onEdit' => [ ], ], 'AutopromoteOnceLogInRC' => true, 'AutopromoteOnceRCExcludedGroups' => [ ], 'AddGroups' => [ ], 'RemoveGroups' => [ ], 'AvailableRights' => [ ], 'ImplicitRights' => [ ], 'DeleteRevisionsLimit' => 0, 'DeleteRevisionsBatchSize' => 1000, 'HideUserContribLimit' => 1000, 'AccountCreationThrottle' => [ [ 'count' => 0, 'seconds' => 86400, ], ], 'TempAccountCreationThrottle' => [ [ 'count' => 1, 'seconds' => 600, ], [ 'count' => 6, 'seconds' => 86400, ], ], 'TempAccountNameAcquisitionThrottle' => [ [ 'count' => 60, 'seconds' => 86400, ], ], 'SpamRegex' => [ ], 'SummarySpamRegex' => [ ], 'EnableDnsBlacklist' => false, 'DnsBlacklistUrls' => [ ], 'ProxyList' => [ ], 'ProxyWhitelist' => [ ], 'SoftBlockRanges' => [ ], 'ApplyIpBlocksToXff' => false, 'RateLimits' => [ 'edit' => [ 'ip' => [ 8, 60, ], 'newbie' => [ 8, 60, ], 'user' => [ 90, 60, ], ], 'move' => [ 'newbie' => [ 2, 120, ], 'user' => [ 8, 60, ], ], 'upload' => [ 'ip' => [ 8, 60, ], 'newbie' => [ 8, 60, ], ], 'rollback' => [ 'user' => [ 10, 60, ], 'newbie' => [ 5, 120, ], ], 'mailpassword' => [ 'ip' => [ 5, 3600, ], ], 'sendemail' => [ 'ip' => [ 5, 86400, ], 'newbie' => [ 5, 86400, ], 'user' => [ 20, 86400, ], ], 'changeemail' => [ 'ip-all' => [ 10, 3600, ], 'user' => [ 4, 86400, ], ], 'confirmemail' => [ 'ip-all' => [ 10, 3600, ], 'user' => [ 4, 86400, ], ], 'purge' => [ 'ip' => [ 30, 60, ], 'user' => [ 30, 60, ], ], 'linkpurge' => [ 'ip' => [ 30, 60, ], 'user' => [ 30, 60, ], ], 'renderfile' => [ 'ip' => [ 700, 30, ], 'user' => [ 700, 30, ], ], 'renderfile-nonstandard' => [ 'ip' => [ 70, 30, ], 'user' => [ 70, 30, ], ], 'stashedit' => [ 'ip' => [ 30, 60, ], 'newbie' => [ 30, 60, ], ], 'stashbasehtml' => [ 'ip' => [ 5, 60, ], 'newbie' => [ 5, 60, ], ], 'changetags' => [ 'ip' => [ 8, 60, ], 'newbie' => [ 8, 60, ], ], 'editcontentmodel' => [ 'newbie' => [ 2, 120, ], 'user' => [ 8, 60, ], ], ], 'RateLimitsExcludedIPs' => [ ], 'PutIPinRC' => true, 'QueryPageDefaultLimit' => 50, 'ExternalQuerySources' => [ ], 'PasswordAttemptThrottle' => [ [ 'count' => 5, 'seconds' => 300, ], [ 'count' => 150, 'seconds' => 172800, ], ], 'GrantPermissions' => [ 'basic' => [ 'autocreateaccount' => true, 'autoconfirmed' => true, 'autopatrol' => true, 'editsemiprotected' => true, 'ipblock-exempt' => true, 'nominornewtalk' => true, 'patrolmarks' => true, 'read' => true, 'unwatchedpages' => true, ], 'highvolume' => [ 'bot' => true, 'apihighlimits' => true, 'noratelimit' => true, 'markbotedits' => true, ], 'import' => [ 'import' => true, 'importupload' => true, ], 'editpage' => [ 'edit' => true, 'minoredit' => true, 'applychangetags' => true, 'changetags' => true, 'editcontentmodel' => true, 'createwithcontentmodel' => true, 'pagelang' => true, ], 'editprotected' => [ 'edit' => true, 'minoredit' => true, 'applychangetags' => true, 'changetags' => true, 'editcontentmodel' => true, 'createwithcontentmodel' => true, 'editprotected' => true, ], 'editmycssjs' => [ 'edit' => true, 'minoredit' => true, 'applychangetags' => true, 'changetags' => true, 'editcontentmodel' => true, 'createwithcontentmodel' => true, 'editmyusercss' => true, 'editmyuserjson' => true, 'editmyuserjs' => true, ], 'editmyoptions' => [ 'editmyoptions' => true, 'editmyuserjson' => true, ], 'editinterface' => [ 'edit' => true, 'minoredit' => true, 'applychangetags' => true, 'changetags' => true, 'editcontentmodel' => true, 'createwithcontentmodel' => true, 'editinterface' => true, 'edituserjson' => true, 'editsitejson' => true, ], 'editsiteconfig' => [ 'edit' => true, 'minoredit' => true, 'applychangetags' => true, 'changetags' => true, 'editcontentmodel' => true, 'createwithcontentmodel' => true, 'editinterface' => true, 'edituserjson' => true, 'editsitejson' => true, 'editusercss' => true, 'edituserjs' => true, 'editsitecss' => true, 'editsitejs' => true, ], 'createeditmovepage' => [ 'edit' => true, 'minoredit' => true, 'applychangetags' => true, 'changetags' => true, 'editcontentmodel' => true, 'createwithcontentmodel' => true, 'createpage' => true, 'createtalk' => true, 'delete-redirect' => true, 'move' => true, 'move-rootuserpages' => true, 'move-subpages' => true, 'move-categorypages' => true, 'suppressredirect' => true, ], 'uploadfile' => [ 'upload' => true, 'reupload-own' => true, ], 'uploadeditmovefile' => [ 'upload' => true, 'reupload-own' => true, 'reupload' => true, 'reupload-shared' => true, 'upload_by_url' => true, 'movefile' => true, 'suppressredirect' => true, ], 'patrol' => [ 'patrol' => true, ], 'rollback' => [ 'rollback' => true, ], 'blockusers' => [ 'block' => true, 'blockemail' => true, ], 'viewdeleted' => [ 'browsearchive' => true, 'deletedhistory' => true, 'deletedtext' => true, ], 'viewrestrictedlogs' => [ 'suppressionlog' => true, ], 'delete' => [ 'edit' => true, 'minoredit' => true, 'applychangetags' => true, 'changetags' => true, 'editcontentmodel' => true, 'createwithcontentmodel' => true, 'browsearchive' => true, 'deletedhistory' => true, 'deletedtext' => true, 'delete' => true, 'bigdelete' => true, 'deletelogentry' => true, 'deleterevision' => true, 'undelete' => true, ], 'oversight' => [ 'suppressrevision' => true, 'viewsuppressed' => true, ], 'protect' => [ 'edit' => true, 'minoredit' => true, 'applychangetags' => true, 'changetags' => true, 'editcontentmodel' => true, 'createwithcontentmodel' => true, 'editprotected' => true, 'protect' => true, ], 'viewmywatchlist' => [ 'viewmywatchlist' => true, ], 'editmywatchlist' => [ 'editmywatchlist' => true, ], 'sendemail' => [ 'sendemail' => true, ], 'createaccount' => [ 'createaccount' => true, ], 'privateinfo' => [ 'viewmyprivateinfo' => true, ], 'mergehistory' => [ 'mergehistory' => true, ], ], 'GrantPermissionGroups' => [ 'basic' => 'hidden', 'editpage' => 'page-interaction', 'createeditmovepage' => 'page-interaction', 'editprotected' => 'page-interaction', 'patrol' => 'page-interaction', 'uploadfile' => 'file-interaction', 'uploadeditmovefile' => 'file-interaction', 'sendemail' => 'email', 'viewmywatchlist' => 'watchlist-interaction', 'editviewmywatchlist' => 'watchlist-interaction', 'editmycssjs' => 'customization', 'editmyoptions' => 'customization', 'editinterface' => 'administration', 'editsiteconfig' => 'administration', 'rollback' => 'administration', 'blockusers' => 'administration', 'delete' => 'administration', 'viewdeleted' => 'administration', 'viewrestrictedlogs' => 'administration', 'protect' => 'administration', 'oversight' => 'administration', 'createaccount' => 'administration', 'mergehistory' => 'administration', 'import' => 'administration', 'highvolume' => 'high-volume', 'privateinfo' => 'private-information', ], 'GrantRiskGroups' => [ 'basic' => 'low', 'editpage' => 'low', 'createeditmovepage' => 'low', 'editprotected' => 'vandalism', 'patrol' => 'low', 'uploadfile' => 'low', 'uploadeditmovefile' => 'low', 'sendemail' => 'security', 'viewmywatchlist' => 'low', 'editviewmywatchlist' => 'low', 'editmycssjs' => 'security', 'editmyoptions' => 'security', 'editinterface' => 'vandalism', 'editsiteconfig' => 'security', 'rollback' => 'low', 'blockusers' => 'vandalism', 'delete' => 'vandalism', 'viewdeleted' => 'vandalism', 'viewrestrictedlogs' => 'security', 'protect' => 'vandalism', 'oversight' => 'security', 'createaccount' => 'low', 'mergehistory' => 'vandalism', 'import' => 'security', 'highvolume' => 'low', 'privateinfo' => 'low', ], 'EnableBotPasswords' => true, 'BotPasswordsCluster' => false, 'BotPasswordsDatabase' => false, 'BotPasswordsLimit' => 100, 'SecretKey' => false, 'JwtPrivateKey' => false, 'JwtPublicKey' => false, 'AllowUserJs' => false, 'AllowUserCss' => false, 'AllowUserCssPrefs' => true, 'UseSiteJs' => true, 'UseSiteCss' => true, 'BreakFrames' => false, 'EditPageFrameOptions' => 'DENY', 'ApiFrameOptions' => 'DENY', 'CSPHeader' => false, 'CSPReportOnlyHeader' => false, 'CSPUseReportURIDirective' => false, 'CSPFalsePositiveUrls' => [ 'https: 'https: 'https: 'https: 'https: 'https: 'https: 'https: 'https: 'https: 'https: 'https: 'https: 'https: 'chrome-extension' => true, ], 'AllowCrossOrigin' => false, 'RestAllowCrossOriginCookieAuth' => false, 'SessionSecret' => false, 'CookieExpiration' => 2592000, 'ExtendedLoginCookieExpiration' => 15552000, 'SessionCookieJwtExpiration' => 14400, 'CookieDomain' => '', 'CookiePath' => '/', 'CookieSecure' => 'detect', 'CookiePrefix' => false, 'CookieHttpOnly' => true, 'CookieSameSite' => null, 'CacheVaryCookies' => [ ], 'SessionName' => false, 'CookieSetOnAutoblock' => true, 'CookieSetOnIpBlock' => true, 'DebugLogFile' => '', 'DebugLogPrefix' => '', 'DebugRedirects' => false, 'DebugRawPage' => false, 'DebugComments' => false, 'DebugDumpSql' => false, 'TrxProfilerLimits' => [ 'GET' => [ 'masterConns' => 0, 'writes' => 0, 'readQueryTime' => 5, 'readQueryRows' => 10000, ], 'POST' => [ 'readQueryTime' => 5, 'writeQueryTime' => 1, 'readQueryRows' => 100000, 'maxAffected' => 1000, ], 'POST-nonwrite' => [ 'writes' => 0, 'readQueryTime' => 5, 'readQueryRows' => 10000, ], 'PostSend-GET' => [ 'readQueryTime' => 5, 'writeQueryTime' => 1, 'readQueryRows' => 10000, 'maxAffected' => 1000, 'masterConns' => 0, 'writes' => 0, ], 'PostSend-POST' => [ 'readQueryTime' => 5, 'writeQueryTime' => 1, 'readQueryRows' => 100000, 'maxAffected' => 1000, ], 'JobRunner' => [ 'readQueryTime' => 30, 'writeQueryTime' => 5, 'readQueryRows' => 100000, 'maxAffected' => 500, ], 'Maintenance' => [ 'writeQueryTime' => 5, 'maxAffected' => 1000, ], ], 'DebugLogGroups' => [ ], 'MWLoggerDefaultSpi' => [ 'class' => 'MediaWiki\\Logger\\LegacySpi', ], 'ShowDebug' => false, 'SpecialVersionShowHooks' => false, 'ShowExceptionDetails' => false, 'LogExceptionBacktrace' => true, 'PropagateErrors' => true, 'ShowHostnames' => false, 'OverrideHostname' => false, 'DevelopmentWarnings' => false, 'DeprecationReleaseLimit' => false, 'Profiler' => [ ], 'StatsdServer' => false, 'StatsdMetricPrefix' => 'MediaWiki', 'StatsTarget' => null, 'StatsFormat' => null, 'StatsPrefix' => 'mediawiki', 'OpenTelemetryConfig' => null, 'PageInfoTransclusionLimit' => 50, 'EnableJavaScriptTest' => false, 'CachePrefix' => false, 'DebugToolbar' => false, 'ApiClientErrorSampleRate' => 1.0, 'DisableTextSearch' => false, 'AdvancedSearchHighlighting' => false, 'SearchHighlightBoundaries' => '[\\p{Z}\\p{P}\\p{C}]', 'OpenSearchTemplates' => [ 'application/x-suggestions+json' => false, 'application/x-suggestions+xml' => false, ], 'OpenSearchDefaultLimit' => 10, 'OpenSearchDescriptionLength' => 100, 'SearchSuggestCacheExpiry' => 1200, 'DisableSearchUpdate' => false, 'NamespacesToBeSearchedDefault' => [ true, ], 'DisableInternalSearch' => false, 'SearchForwardUrl' => null, 'SitemapNamespaces' => false, 'SitemapNamespacesPriorities' => false, 'SitemapApiConfig' => [ ], 'SpecialSearchFormOptions' => [ ], 'SearchMatchRedirectPreference' => false, 'SearchRunSuggestedQuery' => true, 'Diff3' => '/usr/bin/diff3', 'Diff' => '/usr/bin/diff', 'PreviewOnOpenNamespaces' => [ 14 => true, ], 'UniversalEditButton' => true, 'UseAutomaticEditSummaries' => true, 'CommandLineDarkBg' => false, 'ReadOnly' => null, 'ReadOnlyWatchedItemStore' => false, 'ReadOnlyFile' => false, 'UpgradeKey' => false, 'GitBin' => '/usr/bin/git', 'GitRepositoryViewers' => [ 'https: 'ssh: ], 'InstallerInitialPages' => [ [ 'titlemsg' => 'mainpage', 'text' => '{{subst:int:mainpagetext}}{{subst:int:mainpagedocfooter}}', ], ], 'RCMaxAge' => 7776000, 'WatchersMaxAge' => 15552000, 'UnwatchedPageSecret' => 1, 'RCFilterByAge' => false, 'RCLinkLimits' => [ 50, 100, 250, 500, ], 'RCLinkDays' => [ 1, 3, 7, 14, 30, ], 'RCFeeds' => [ ], 'RCWatchCategoryMembership' => false, 'UseRCPatrol' => true, 'StructuredChangeFiltersLiveUpdatePollingRate' => 3, 'UseNPPatrol' => true, 'UseFilePatrol' => true, 'Feed' => true, 'FeedLimit' => 50, 'FeedCacheTimeout' => 60, 'FeedDiffCutoff' => 32768, 'OverrideSiteFeed' => [ ], 'FeedClasses' => [ 'rss' => 'MediaWiki\\Feed\\RSSFeed', 'atom' => 'MediaWiki\\Feed\\AtomFeed', ], 'AdvertisedFeedTypes' => [ 'atom', ], 'RCShowWatchingUsers' => false, 'RCShowChangedSize' => true, 'RCChangedSizeThreshold' => 500, 'ShowUpdatedMarker' => true, 'DisableAnonTalk' => false, 'UseTagFilter' => true, 'SoftwareTags' => [ 'mw-contentmodelchange' => true, 'mw-new-redirect' => true, 'mw-removed-redirect' => true, 'mw-changed-redirect-target' => true, 'mw-blank' => true, 'mw-replace' => true, 'mw-recreated' => true, 'mw-rollback' => true, 'mw-undo' => true, 'mw-manual-revert' => true, 'mw-reverted' => true, 'mw-server-side-upload' => true, 'mw-ipblock-appeal' => true, 'mw-edited-other-users-js' => true, 'mw-edited-other-users-css' => true, ], 'UnwatchedPageThreshold' => false, 'RecentChangesFlags' => [ 'newpage' => [ 'letter' => 'newpageletter', 'title' => 'recentchanges-label-newpage', 'legend' => 'recentchanges-legend-newpage', 'grouping' => 'any', ], 'minor' => [ 'letter' => 'minoreditletter', 'title' => 'recentchanges-label-minor', 'legend' => 'recentchanges-legend-minor', 'class' => 'minoredit', 'grouping' => 'all', ], 'bot' => [ 'letter' => 'boteditletter', 'title' => 'recentchanges-label-bot', 'legend' => 'recentchanges-legend-bot', 'class' => 'botedit', 'grouping' => 'all', ], 'unpatrolled' => [ 'letter' => 'unpatrolledletter', 'title' => 'recentchanges-label-unpatrolled', 'legend' => 'recentchanges-legend-unpatrolled', 'grouping' => 'any', ], ], 'WatchlistExpiry' => false, 'EnableWatchstarPopover' => false, 'EnableWatchlistLabels' => false, 'WatchlistLabelsMaxPerUser' => 100, 'WatchlistPurgeRate' => 0.1, 'WatchlistExpiryMaxDuration' => '1 year', 'EnableChangesListQueryPartitioning' => false, 'RightsPage' => null, 'RightsUrl' => null, 'RightsText' => null, 'RightsIcon' => null, 'UseCopyrightUpload' => false, 'MaxCredits' => 0, 'ShowCreditsIfMax' => true, 'ImportSources' => [ ], 'ImportTargetNamespace' => null, 'ExportAllowHistory' => true, 'ExportMaxHistory' => 0, 'ExportAllowListContributors' => false, 'ExportMaxLinkDepth' => 0, 'ExportFromNamespaces' => false, 'ExportAllowAll' => false, 'ExportPagelistLimit' => 5000, 'XmlDumpSchemaVersion' => '0.11', 'WikiFarmSettingsDirectory' => null, 'WikiFarmSettingsExtension' => 'yaml', 'ExtensionFunctions' => [ ], 'ExtensionMessagesFiles' => [ ], 'MessagesDirs' => [ ], 'TranslationAliasesDirs' => [ ], 'ExtensionEntryPointListFiles' => [ ], 'EnableParserLimitReporting' => true, 'ValidSkinNames' => [ ], 'SpecialPages' => [ ], 'ExtensionCredits' => [ ], 'Hooks' => [ ], 'ServiceWiringFiles' => [ ], 'JobClasses' => [ 'deletePage' => 'MediaWiki\\Page\\DeletePageJob', 'refreshLinks' => 'MediaWiki\\JobQueue\\Jobs\\RefreshLinksJob', 'deleteLinks' => 'MediaWiki\\Page\\DeleteLinksJob', 'htmlCacheUpdate' => 'MediaWiki\\JobQueue\\Jobs\\HTMLCacheUpdateJob', 'sendMail' => [ 'class' => 'MediaWiki\\Mail\\EmaillingJob', 'services' => [ 'Emailer', ], ], 'enotifNotify' => [ 'class' => 'MediaWiki\\RecentChanges\\RecentChangeNotifyJob', 'services' => [ 'RecentChangeLookup', ], ], 'fixDoubleRedirect' => [ 'class' => 'MediaWiki\\JobQueue\\Jobs\\DoubleRedirectJob', 'services' => [ 'RevisionLookup', 'MagicWordFactory', 'WikiPageFactory', ], 'needsPage' => true, ], 'AssembleUploadChunks' => 'MediaWiki\\JobQueue\\Jobs\\AssembleUploadChunksJob', 'PublishStashedFile' => 'MediaWiki\\JobQueue\\Jobs\\PublishStashedFileJob', 'ThumbnailRender' => 'MediaWiki\\JobQueue\\Jobs\\ThumbnailRenderJob', 'UploadFromUrl' => 'MediaWiki\\JobQueue\\Jobs\\UploadFromUrlJob', 'recentChangesUpdate' => 'MediaWiki\\RecentChanges\\RecentChangesUpdateJob', 'refreshLinksPrioritized' => 'MediaWiki\\JobQueue\\Jobs\\RefreshLinksJob', 'refreshLinksDynamic' => 'MediaWiki\\JobQueue\\Jobs\\RefreshLinksJob', 'activityUpdateJob' => 'MediaWiki\\Watchlist\\ActivityUpdateJob', 'categoryMembershipChange' => [ 'class' => 'MediaWiki\\RecentChanges\\CategoryMembershipChangeJob', 'services' => [ 'RecentChangeFactory', ], ], 'CategoryCountUpdateJob' => [ 'class' => 'MediaWiki\\JobQueue\\Jobs\\CategoryCountUpdateJob', 'services' => [ 'ConnectionProvider', 'NamespaceInfo', ], ], 'clearUserWatchlist' => 'MediaWiki\\Watchlist\\ClearUserWatchlistJob', 'watchlistExpiry' => 'MediaWiki\\Watchlist\\WatchlistExpiryJob', 'cdnPurge' => 'MediaWiki\\JobQueue\\Jobs\\CdnPurgeJob', 'userGroupExpiry' => 'MediaWiki\\User\\UserGroupExpiryJob', 'clearWatchlistNotifications' => 'MediaWiki\\Watchlist\\ClearWatchlistNotificationsJob', 'userOptionsUpdate' => 'MediaWiki\\User\\Options\\UserOptionsUpdateJob', 'revertedTagUpdate' => 'MediaWiki\\JobQueue\\Jobs\\RevertedTagUpdateJob', 'null' => 'MediaWiki\\JobQueue\\Jobs\\NullJob', 'userEditCountInit' => 'MediaWiki\\User\\UserEditCountInitJob', 'parsoidCachePrewarm' => [ 'class' => 'MediaWiki\\JobQueue\\Jobs\\ParsoidCachePrewarmJob', 'services' => [ 'ParserOutputAccess', 'PageStore', 'RevisionLookup', 'ParsoidSiteConfig', ], 'needsPage' => false, ], 'renameUserTable' => [ 'class' => 'MediaWiki\\RenameUser\\Job\\RenameUserTableJob', 'services' => [ 'MainConfig', 'DBLoadBalancerFactory', ], ], 'renameUserDerived' => [ 'class' => 'MediaWiki\\RenameUser\\Job\\RenameUserDerivedJob', 'services' => [ 'RenameUserFactory', 'UserFactory', ], ], 'renameUser' => [ 'class' => 'MediaWiki\\RenameUser\\Job\\RenameUserTableJob', 'services' => [ 'MainConfig', 'DBLoadBalancerFactory', ], ], ], 'JobTypesExcludedFromDefaultQueue' => [ 'AssembleUploadChunks', 'PublishStashedFile', 'UploadFromUrl', ], 'JobBackoffThrottling' => [ ], 'JobTypeConf' => [ 'default' => [ 'class' => 'MediaWiki\\JobQueue\\JobQueueDB', 'order' => 'random', 'claimTTL' => 3600, ], ], 'JobQueueIncludeInMaxLagFactor' => false, 'SpecialPageCacheUpdates' => [ 'Statistics' => [ 'MediaWiki\\Deferred\\SiteStatsUpdate', 'cacheUpdate', ], ], 'PagePropLinkInvalidations' => [ 'hiddencat' => 'categorylinks', ], 'CategoryMagicGallery' => true, 'CategoryPagingLimit' => 200, 'CategoryCollation' => 'uppercase', 'TempCategoryCollations' => [ ], 'SortedCategories' => false, 'TrackingCategories' => [ ], 'LogTypes' => [ '', 'block', 'protect', 'rights', 'delete', 'upload', 'move', 'import', 'interwiki', 'patrol', 'merge', 'suppress', 'tag', 'managetags', 'contentmodel', 'renameuser', ], 'LogRestrictions' => [ 'suppress' => 'suppressionlog', ], 'FilterLogTypes' => [ 'patrol' => true, 'tag' => true, 'newusers' => false, ], 'LogNames' => [ '' => 'all-logs-page', 'block' => 'blocklogpage', 'protect' => 'protectlogpage', 'rights' => 'rightslog', 'delete' => 'dellogpage', 'upload' => 'uploadlogpage', 'move' => 'movelogpage', 'import' => 'importlogpage', 'patrol' => 'patrol-log-page', 'merge' => 'mergelog', 'suppress' => 'suppressionlog', ], 'LogHeaders' => [ '' => 'alllogstext', 'block' => 'blocklogtext', 'delete' => 'dellogpagetext', 'import' => 'importlogpagetext', 'merge' => 'mergelogpagetext', 'move' => 'movelogpagetext', 'patrol' => 'patrol-log-header', 'protect' => 'protectlogtext', 'rights' => 'rightslogtext', 'suppress' => 'suppressionlogtext', 'upload' => 'uploadlogpagetext', ], 'LogActions' => [ ], 'LogActionsHandlers' => [ 'block/block' => [ 'class' => 'MediaWiki\\Logging\\BlockLogFormatter', 'services' => [ 'TitleParser', 'NamespaceInfo', ], ], 'block/reblock' => [ 'class' => 'MediaWiki\\Logging\\BlockLogFormatter', 'services' => [ 'TitleParser', 'NamespaceInfo', ], ], 'block/unblock' => [ 'class' => 'MediaWiki\\Logging\\BlockLogFormatter', 'services' => [ 'TitleParser', 'NamespaceInfo', ], ], 'contentmodel/change' => 'MediaWiki\\Logging\\ContentModelLogFormatter', 'contentmodel/new' => 'MediaWiki\\Logging\\ContentModelLogFormatter', 'delete/delete' => 'MediaWiki\\Logging\\DeleteLogFormatter', 'delete/delete_redir' => 'MediaWiki\\Logging\\DeleteLogFormatter', 'delete/delete_redir2' => 'MediaWiki\\Logging\\DeleteLogFormatter', 'delete/event' => 'MediaWiki\\Logging\\DeleteLogFormatter', 'delete/restore' => 'MediaWiki\\Logging\\DeleteLogFormatter', 'delete/revision' => 'MediaWiki\\Logging\\DeleteLogFormatter', 'import/interwiki' => 'MediaWiki\\Logging\\ImportLogFormatter', 'import/upload' => 'MediaWiki\\Logging\\ImportLogFormatter', 'interwiki/iw_add' => 'MediaWiki\\Logging\\InterwikiLogFormatter', 'interwiki/iw_delete' => 'MediaWiki\\Logging\\InterwikiLogFormatter', 'interwiki/iw_edit' => 'MediaWiki\\Logging\\InterwikiLogFormatter', 'managetags/activate' => 'MediaWiki\\Logging\\LogFormatter', 'managetags/create' => 'MediaWiki\\Logging\\LogFormatter', 'managetags/deactivate' => 'MediaWiki\\Logging\\LogFormatter', 'managetags/delete' => 'MediaWiki\\Logging\\LogFormatter', 'merge/merge' => [ 'class' => 'MediaWiki\\Logging\\MergeLogFormatter', 'services' => [ 'TitleParser', ], ], 'merge/merge-into' => [ 'class' => 'MediaWiki\\Logging\\MergeLogFormatter', 'services' => [ 'TitleParser', ], ], 'move/move' => [ 'class' => 'MediaWiki\\Logging\\MoveLogFormatter', 'services' => [ 'TitleParser', ], ], 'move/move_redir' => [ 'class' => 'MediaWiki\\Logging\\MoveLogFormatter', 'services' => [ 'TitleParser', ], ], 'patrol/patrol' => 'MediaWiki\\Logging\\PatrolLogFormatter', 'patrol/autopatrol' => 'MediaWiki\\Logging\\PatrolLogFormatter', 'protect/modify' => [ 'class' => 'MediaWiki\\Logging\\ProtectLogFormatter', 'services' => [ 'TitleParser', ], ], 'protect/move_prot' => [ 'class' => 'MediaWiki\\Logging\\ProtectLogFormatter', 'services' => [ 'TitleParser', ], ], 'protect/protect' => [ 'class' => 'MediaWiki\\Logging\\ProtectLogFormatter', 'services' => [ 'TitleParser', ], ], 'protect/unprotect' => [ 'class' => 'MediaWiki\\Logging\\ProtectLogFormatter', 'services' => [ 'TitleParser', ], ], 'renameuser/renameuser' => [ 'class' => 'MediaWiki\\Logging\\RenameuserLogFormatter', 'services' => [ 'TitleParser', ], ], 'rights/autopromote' => 'MediaWiki\\Logging\\RightsLogFormatter', 'rights/rights' => 'MediaWiki\\Logging\\RightsLogFormatter', 'suppress/block' => [ 'class' => 'MediaWiki\\Logging\\BlockLogFormatter', 'services' => [ 'TitleParser', 'NamespaceInfo', ], ], 'suppress/delete' => 'MediaWiki\\Logging\\DeleteLogFormatter', 'suppress/event' => 'MediaWiki\\Logging\\DeleteLogFormatter', 'suppress/reblock' => [ 'class' => 'MediaWiki\\Logging\\BlockLogFormatter', 'services' => [ 'TitleParser', 'NamespaceInfo', ], ], 'suppress/revision' => 'MediaWiki\\Logging\\DeleteLogFormatter', 'tag/update' => 'MediaWiki\\Logging\\TagLogFormatter', 'upload/overwrite' => 'MediaWiki\\Logging\\UploadLogFormatter', 'upload/revert' => 'MediaWiki\\Logging\\UploadLogFormatter', 'upload/upload' => 'MediaWiki\\Logging\\UploadLogFormatter', ], 'ActionFilteredLogs' => [ 'block' => [ 'block' => [ 'block', ], 'reblock' => [ 'reblock', ], 'unblock' => [ 'unblock', ], ], 'contentmodel' => [ 'change' => [ 'change', ], 'new' => [ 'new', ], ], 'delete' => [ 'delete' => [ 'delete', ], 'delete_redir' => [ 'delete_redir', 'delete_redir2', ], 'restore' => [ 'restore', ], 'event' => [ 'event', ], 'revision' => [ 'revision', ], ], 'import' => [ 'interwiki' => [ 'interwiki', ], 'upload' => [ 'upload', ], ], 'managetags' => [ 'create' => [ 'create', ], 'delete' => [ 'delete', ], 'activate' => [ 'activate', ], 'deactivate' => [ 'deactivate', ], ], 'move' => [ 'move' => [ 'move', ], 'move_redir' => [ 'move_redir', ], ], 'newusers' => [ 'create' => [ 'create', 'newusers', ], 'create2' => [ 'create2', ], 'autocreate' => [ 'autocreate', ], 'byemail' => [ 'byemail', ], ], 'protect' => [ 'protect' => [ 'protect', ], 'modify' => [ 'modify', ], 'unprotect' => [ 'unprotect', ], 'move_prot' => [ 'move_prot', ], ], 'rights' => [ 'rights' => [ 'rights', ], 'autopromote' => [ 'autopromote', ], ], 'suppress' => [ 'event' => [ 'event', ], 'revision' => [ 'revision', ], 'delete' => [ 'delete', ], 'block' => [ 'block', ], 'reblock' => [ 'reblock', ], ], 'upload' => [ 'upload' => [ 'upload', ], 'overwrite' => [ 'overwrite', ], 'revert' => [ 'revert', ], ], ], 'NewUserLog' => true, 'PageCreationLog' => true, 'AllowSpecialInclusion' => true, 'DisableQueryPageUpdate' => false, 'CountCategorizedImagesAsUsed' => false, 'MaxRedirectLinksRetrieved' => 500, 'RangeContributionsCIDRLimit' => [ 'IPv4' => 16, 'IPv6' => 32, ], 'Actions' => [ ], 'DefaultRobotPolicy' => 'index,follow', 'NamespaceRobotPolicies' => [ ], 'ArticleRobotPolicies' => [ ], 'ExemptFromUserRobotsControl' => null, 'DebugAPI' => false, 'APIModules' => [ ], 'APIFormatModules' => [ ], 'APIMetaModules' => [ ], 'APIPropModules' => [ ], 'APIListModules' => [ ], 'APIMaxDBRows' => 5000, 'APIMaxResultSize' => 8388608, 'APIMaxUncachedDiffs' => 1, 'APIMaxLagThreshold' => 7, 'APICacheHelpTimeout' => 3600, 'APIUselessQueryPages' => [ 'MIMEsearch', 'LinkSearch', ], 'AjaxLicensePreview' => true, 'CrossSiteAJAXdomains' => [ ], 'CrossSiteAJAXdomainExceptions' => [ ], 'AllowedCorsHeaders' => [ 'Accept', 'Accept-Language', 'Content-Language', 'Content-Type', 'Accept-Encoding', 'DNT', 'Origin', 'User-Agent', 'Api-User-Agent', 'Promise-Non-Write-API-Action', 'Access-Control-Max-Age', 'Authorization', ], 'RestAPIAdditionalRouteFiles' => [ ], 'RestSandboxSpecs' => [ ], 'MaxShellMemory' => 307200, 'MaxShellFileSize' => 102400, 'MaxShellTime' => 180, 'MaxShellWallClockTime' => 180, 'ShellCgroup' => false, 'PhpCli' => '/usr/bin/php', 'ShellRestrictionMethod' => 'autodetect', 'ShellboxUrls' => [ 'default' => null, ], 'ShellboxSecretKey' => null, 'ShellboxShell' => '/bin/sh', 'HTTPTimeout' => 25, 'HTTPConnectTimeout' => 5.0, 'HTTPMaxTimeout' => 0, 'HTTPMaxConnectTimeout' => 0, 'HTTPImportTimeout' => 25, 'AsyncHTTPTimeout' => 25, 'HTTPProxy' => '', 'LocalVirtualHosts' => [ ], 'LocalHTTPProxy' => false, 'AllowExternalReqID' => false, 'GenerateReqIDFormat' => 'rand24', 'JobRunRate' => 1, 'RunJobsAsync' => false, 'UpdateRowsPerJob' => 300, 'UpdateRowsPerQuery' => 100, 'RedirectOnLogin' => null, 'VirtualRestConfig' => [ 'paths' => [ ], 'modules' => [ ], 'global' => [ 'timeout' => 360, 'forwardCookies' => false, 'HTTPProxy' => null, ], ], 'EventRelayerConfig' => [ 'default' => [ 'class' => 'Wikimedia\\EventRelayer\\EventRelayerNull', ], ], 'Pingback' => false, 'OriginTrials' => [ ], 'ReportToExpiry' => 86400, 'ReportToEndpoints' => [ ], 'FeaturePolicyReportOnly' => [ ], 'SkinsPreferred' => [ 'vector-2022', 'vector', ], 'SpecialContributeSkinsEnabled' => [ ], 'SpecialContributeNewPageTarget' => null, 'EnableEditRecovery' => false, 'EditRecoveryExpiry' => 2592000, 'UseCodexSpecialBlock' => false, 'ShowLogoutConfirmation' => false, 'EnableProtectionIndicators' => true, 'OutputPipelineStages' => [ ], 'FeatureShutdown' => [ ], 'CloneArticleParserOutput' => true, 'UseLeximorph' => false, 'UsePostprocCacheLegacy' => false, 'UsePostprocCacheParsoid' => true, 'ParserOptionsLogUnsafeSampleRate' => 0, ], 'type' => [ 'ConfigRegistry' => 'object', 'AssumeProxiesUseDefaultProtocolPorts' => 'boolean', 'ForceHTTPS' => 'boolean', 'ExtensionDirectory' => [ 'string', 'null', ], 'StyleDirectory' => [ 'string', 'null', ], 'UploadDirectory' => [ 'string', 'boolean', 'null', ], 'Logos' => [ 'object', 'boolean', ], 'ReferrerPolicy' => [ 'array', 'string', 'boolean', ], 'ActionPaths' => 'object', 'MainPageIsDomainRoot' => 'boolean', 'ImgAuthUrlPathMap' => 'object', 'LocalFileRepo' => 'object', 'ForeignFileRepos' => 'array', 'UseSharedUploads' => 'boolean', 'SharedUploadDirectory' => [ 'string', 'null', ], 'SharedUploadPath' => [ 'string', 'null', ], 'HashedSharedUploadDirectory' => 'boolean', 'FetchCommonsDescriptions' => 'boolean', 'SharedUploadDBname' => [ 'boolean', 'string', ], 'SharedUploadDBprefix' => 'string', 'CacheSharedUploads' => 'boolean', 'ForeignUploadTargets' => 'array', 'UploadDialog' => 'object', 'FileBackends' => 'object', 'LockManagers' => 'array', 'CopyUploadsDomains' => 'array', 'CopyUploadTimeout' => [ 'boolean', 'integer', ], 'SharedThumbnailScriptPath' => [ 'string', 'boolean', ], 'HashedUploadDirectory' => 'boolean', 'CSPUploadEntryPoint' => 'boolean', 'FileExtensions' => 'array', 'ProhibitedFileExtensions' => 'array', 'MimeTypeExclusions' => 'array', 'TrustedMediaFormats' => 'array', 'MediaHandlers' => 'object', 'NativeImageLazyLoading' => 'boolean', 'ParserTestMediaHandlers' => 'object', 'MaxInterlacingAreas' => 'object', 'SVGConverters' => 'object', 'SVGNativeRendering' => [ 'string', 'boolean', ], 'MaxImageArea' => [ 'string', 'integer', 'boolean', ], 'TiffThumbnailType' => 'array', 'GenerateThumbnailOnParse' => 'boolean', 'EnableAutoRotation' => [ 'boolean', 'null', ], 'Antivirus' => [ 'string', 'null', ], 'AntivirusSetup' => 'object', 'MimeDetectorCommand' => [ 'string', 'null', ], 'XMLMimeTypes' => 'object', 'ImageLimits' => 'array', 'ThumbLimits' => 'array', 'ThumbnailNamespaces' => 'array', 'ThumbnailSteps' => [ 'array', 'null', ], 'ThumbnailBuckets' => [ 'array', 'null', ], 'UploadThumbnailRenderMap' => 'object', 'GalleryOptions' => 'object', 'DjvuDump' => [ 'string', 'null', ], 'DjvuRenderer' => [ 'string', 'null', ], 'DjvuTxt' => [ 'string', 'null', ], 'DjvuPostProcessor' => [ 'string', 'null', ], 'SMTP' => [ 'boolean', 'object', ], 'EnotifFromEditor' => 'boolean', 'EmailConfirmationBanner' => 'boolean', 'EnotifRevealEditorAddress' => 'boolean', 'UsersNotifiedOnAllChanges' => 'object', 'DBmwschema' => [ 'string', 'null', ], 'SharedTables' => 'array', 'DBservers' => [ 'boolean', 'array', ], 'LBFactoryConf' => 'object', 'LocalDatabases' => 'array', 'VirtualDomainsMapping' => 'object', 'FileSchemaMigrationStage' => 'integer', 'ExternalLinksDomainGaps' => 'object', 'ContentHandlers' => 'object', 'NamespaceContentModels' => 'object', 'TextModelsToParse' => 'array', 'ExternalStores' => 'array', 'ExternalServers' => 'object', 'DefaultExternalStore' => [ 'array', 'boolean', ], 'RevisionCacheExpiry' => 'integer', 'PageLanguageUseDB' => 'boolean', 'DiffEngine' => [ 'string', 'null', ], 'ExternalDiffEngine' => [ 'string', 'boolean', ], 'Wikidiff2Options' => 'object', 'RequestTimeLimit' => [ 'integer', 'null', ], 'CriticalSectionTimeLimit' => 'number', 'PoolCounterConf' => [ 'object', 'null', ], 'PoolCountClientConf' => 'object', 'MaxUserDBWriteDuration' => [ 'integer', 'boolean', ], 'MaxJobDBWriteDuration' => [ 'integer', 'boolean', ], 'MultiShardSiteStats' => 'boolean', 'ObjectCaches' => 'object', 'WANObjectCache' => 'object', 'MicroStashType' => [ 'string', 'integer', ], 'ParsoidCacheConfig' => 'object', 'ParsoidSelectiveUpdateSampleRate' => 'integer', 'ParserCacheFilterConfig' => 'object', 'ChronologyProtectorSecret' => 'string', 'PHPSessionHandling' => 'string', 'SuspiciousIpExpiry' => [ 'integer', 'boolean', ], 'MemCachedServers' => 'array', 'LocalisationCacheConf' => 'object', 'ExtensionInfoMTime' => [ 'integer', 'boolean', ], 'CdnServers' => 'object', 'CdnServersNoPurge' => 'object', 'HTCPRouting' => 'object', 'GrammarForms' => 'object', 'ExtraInterlanguageLinkPrefixes' => 'array', 'InterlanguageLinkCodeMap' => 'object', 'ExtraLanguageNames' => 'object', 'ExtraLanguageCodes' => 'object', 'DummyLanguageCodes' => 'object', 'DisabledVariants' => 'object', 'ForceUIMsgAsContentMsg' => 'object', 'RawHtmlMessages' => 'array', 'OverrideUcfirstCharacters' => 'object', 'XhtmlNamespaces' => 'object', 'BrowserFormatDetection' => 'string', 'SkinMetaTags' => 'object', 'SkipSkins' => 'object', 'FragmentMode' => 'array', 'FooterIcons' => 'object', 'InterwikiLogoOverride' => 'array', 'ResourceModules' => 'object', 'ResourceModuleSkinStyles' => 'object', 'ResourceLoaderSources' => 'object', 'ResourceLoaderMaxage' => 'object', 'ResourceLoaderMaxQueryLength' => [ 'integer', 'boolean', ], 'CanonicalNamespaceNames' => 'object', 'ExtraNamespaces' => 'object', 'ExtraGenderNamespaces' => 'object', 'NamespaceAliases' => 'object', 'CapitalLinkOverrides' => 'object', 'NamespacesWithSubpages' => 'object', 'NamespacesWithoutAutoSummaries' => 'array', 'ContentNamespaces' => 'array', 'ShortPagesNamespaceExclusions' => 'array', 'ExtraSignatureNamespaces' => 'array', 'InvalidRedirectTargets' => 'array', 'LocalInterwikis' => 'array', 'InterwikiCache' => [ 'boolean', 'object', ], 'SiteTypes' => 'object', 'UrlProtocols' => 'array', 'TidyConfig' => 'object', 'ParsoidSettings' => 'object', 'ParsoidExperimentalParserFunctionOutput' => 'boolean', 'NoFollowNsExceptions' => 'array', 'NoFollowDomainExceptions' => 'array', 'ExternalLinksIgnoreDomains' => 'array', 'EnableMagicLinks' => 'object', 'ManualRevertSearchRadius' => 'integer', 'RevertedTagMaxDepth' => 'integer', 'CentralIdLookupProviders' => 'object', 'CentralIdLookupProvider' => 'string', 'UserRegistrationProviders' => 'object', 'PasswordPolicy' => 'object', 'AuthManagerConfig' => [ 'object', 'null', ], 'AuthManagerAutoConfig' => 'object', 'RememberMe' => 'string', 'ReauthenticateTime' => 'object', 'AllowSecuritySensitiveOperationIfCannotReauthenticate' => 'object', 'ChangeCredentialsBlacklist' => 'array', 'RemoveCredentialsBlacklist' => 'array', 'PasswordConfig' => 'object', 'PasswordResetRoutes' => 'object', 'SignatureAllowedLintErrors' => 'array', 'ReservedUsernames' => 'array', 'DefaultUserOptions' => 'object', 'ConditionalUserOptions' => 'object', 'HiddenPrefs' => 'array', 'UserJsPrefLimit' => 'integer', 'AuthenticationTokenVersion' => [ 'string', 'null', ], 'SessionProviders' => 'object', 'AutoCreateTempUser' => 'object', 'AutoblockExemptions' => 'array', 'BlockCIDRLimit' => 'object', 'EnableMultiBlocks' => 'boolean', 'GroupPermissions' => 'object', 'PrivilegedGroups' => 'array', 'RevokePermissions' => 'object', 'GroupInheritsPermissions' => 'object', 'ImplicitGroups' => 'array', 'GroupsAddToSelf' => 'object', 'GroupsRemoveFromSelf' => 'object', 'RestrictedGroups' => 'object', 'UserRequirementsPrivateConditions' => 'array', 'RestrictionTypes' => 'array', 'RestrictionLevels' => 'array', 'CascadingRestrictionLevels' => 'array', 'SemiprotectedRestrictionLevels' => 'array', 'NamespaceProtection' => 'object', 'NonincludableNamespaces' => 'object', 'Autopromote' => 'object', 'AutopromoteOnce' => 'object', 'AutopromoteOnceRCExcludedGroups' => 'array', 'AddGroups' => 'object', 'RemoveGroups' => 'object', 'AvailableRights' => 'array', 'ImplicitRights' => 'array', 'AccountCreationThrottle' => [ 'integer', 'array', ], 'TempAccountCreationThrottle' => 'array', 'TempAccountNameAcquisitionThrottle' => 'array', 'SpamRegex' => 'array', 'SummarySpamRegex' => 'array', 'DnsBlacklistUrls' => 'array', 'ProxyList' => [ 'string', 'array', ], 'ProxyWhitelist' => 'array', 'SoftBlockRanges' => 'array', 'RateLimits' => 'object', 'RateLimitsExcludedIPs' => 'array', 'ExternalQuerySources' => 'object', 'PasswordAttemptThrottle' => 'array', 'GrantPermissions' => 'object', 'GrantPermissionGroups' => 'object', 'GrantRiskGroups' => 'object', 'EnableBotPasswords' => 'boolean', 'BotPasswordsCluster' => [ 'string', 'boolean', ], 'BotPasswordsDatabase' => [ 'string', 'boolean', ], 'BotPasswordsLimit' => 'integer', 'CSPHeader' => [ 'boolean', 'object', ], 'CSPReportOnlyHeader' => [ 'boolean', 'object', ], 'CSPUseReportURIDirective' => [ 'boolean', 'object', ], 'CSPFalsePositiveUrls' => 'object', 'AllowCrossOrigin' => 'boolean', 'RestAllowCrossOriginCookieAuth' => 'boolean', 'CookieSameSite' => [ 'string', 'null', ], 'CacheVaryCookies' => 'array', 'TrxProfilerLimits' => 'object', 'DebugLogGroups' => 'object', 'MWLoggerDefaultSpi' => 'object', 'Profiler' => 'object', 'StatsTarget' => [ 'string', 'null', ], 'StatsFormat' => [ 'string', 'null', ], 'StatsPrefix' => 'string', 'OpenTelemetryConfig' => [ 'object', 'null', ], 'OpenSearchTemplates' => 'object', 'NamespacesToBeSearchedDefault' => 'object', 'SitemapNamespaces' => [ 'boolean', 'array', ], 'SitemapNamespacesPriorities' => [ 'boolean', 'object', ], 'SitemapApiConfig' => 'object', 'SpecialSearchFormOptions' => 'object', 'SearchMatchRedirectPreference' => 'boolean', 'SearchRunSuggestedQuery' => 'boolean', 'PreviewOnOpenNamespaces' => 'object', 'ReadOnlyWatchedItemStore' => 'boolean', 'GitRepositoryViewers' => 'object', 'InstallerInitialPages' => 'array', 'RCLinkLimits' => 'array', 'RCLinkDays' => 'array', 'RCFeeds' => 'object', 'OverrideSiteFeed' => 'object', 'FeedClasses' => 'object', 'AdvertisedFeedTypes' => 'array', 'SoftwareTags' => 'object', 'RecentChangesFlags' => 'object', 'WatchlistExpiry' => 'boolean', 'EnableWatchstarPopover' => 'boolean', 'EnableWatchlistLabels' => 'boolean', 'WatchlistLabelsMaxPerUser' => 'integer', 'WatchlistPurgeRate' => 'number', 'WatchlistExpiryMaxDuration' => [ 'string', 'null', ], 'EnableChangesListQueryPartitioning' => 'boolean', 'ImportSources' => 'object', 'ExtensionFunctions' => 'array', 'ExtensionMessagesFiles' => 'object', 'MessagesDirs' => 'object', 'TranslationAliasesDirs' => 'object', 'ExtensionEntryPointListFiles' => 'object', 'ValidSkinNames' => 'object', 'SpecialPages' => 'object', 'ExtensionCredits' => 'object', 'Hooks' => 'object', 'ServiceWiringFiles' => 'array', 'JobClasses' => 'object', 'JobTypesExcludedFromDefaultQueue' => 'array', 'JobBackoffThrottling' => 'object', 'JobTypeConf' => 'object', 'SpecialPageCacheUpdates' => 'object', 'PagePropLinkInvalidations' => 'object', 'TempCategoryCollations' => 'array', 'SortedCategories' => 'boolean', 'TrackingCategories' => 'array', 'LogTypes' => 'array', 'LogRestrictions' => 'object', 'FilterLogTypes' => 'object', 'LogNames' => 'object', 'LogHeaders' => 'object', 'LogActions' => 'object', 'LogActionsHandlers' => 'object', 'ActionFilteredLogs' => 'object', 'RangeContributionsCIDRLimit' => 'object', 'Actions' => 'object', 'NamespaceRobotPolicies' => 'object', 'ArticleRobotPolicies' => 'object', 'ExemptFromUserRobotsControl' => [ 'array', 'null', ], 'APIModules' => 'object', 'APIFormatModules' => 'object', 'APIMetaModules' => 'object', 'APIPropModules' => 'object', 'APIListModules' => 'object', 'APIUselessQueryPages' => 'array', 'CrossSiteAJAXdomains' => 'object', 'CrossSiteAJAXdomainExceptions' => 'object', 'AllowedCorsHeaders' => 'array', 'RestAPIAdditionalRouteFiles' => 'array', 'RestSandboxSpecs' => 'object', 'ShellRestrictionMethod' => [ 'string', 'boolean', ], 'ShellboxUrls' => 'object', 'ShellboxSecretKey' => [ 'string', 'null', ], 'ShellboxShell' => [ 'string', 'null', ], 'HTTPTimeout' => 'number', 'HTTPConnectTimeout' => 'number', 'HTTPMaxTimeout' => 'number', 'HTTPMaxConnectTimeout' => 'number', 'LocalVirtualHosts' => 'object', 'LocalHTTPProxy' => [ 'string', 'boolean', ], 'GenerateReqIDFormat' => 'string', 'VirtualRestConfig' => 'object', 'EventRelayerConfig' => 'object', 'Pingback' => 'boolean', 'OriginTrials' => 'array', 'ReportToExpiry' => 'integer', 'ReportToEndpoints' => 'array', 'FeaturePolicyReportOnly' => 'array', 'SkinsPreferred' => 'array', 'SpecialContributeSkinsEnabled' => 'array', 'SpecialContributeNewPageTarget' => [ 'string', 'null', ], 'EnableEditRecovery' => 'boolean', 'EditRecoveryExpiry' => 'integer', 'UseCodexSpecialBlock' => 'boolean', 'ShowLogoutConfirmation' => 'boolean', 'EnableProtectionIndicators' => 'boolean', 'OutputPipelineStages' => 'object', 'FeatureShutdown' => 'array', 'CloneArticleParserOutput' => 'boolean', 'UseLeximorph' => 'boolean', 'UsePostprocCacheLegacy' => 'boolean', 'UsePostprocCacheParsoid' => 'boolean', 'ParserOptionsLogUnsafeSampleRate' => 'integer', ], 'mergeStrategy' => [ 'TiffThumbnailType' => 'replace', 'LBFactoryConf' => 'replace', 'InterwikiCache' => 'replace', 'PasswordPolicy' => 'array_replace_recursive', 'AuthManagerAutoConfig' => 'array_plus_2d', 'GroupPermissions' => 'array_plus_2d', 'RevokePermissions' => 'array_plus_2d', 'AddGroups' => 'array_merge_recursive', 'RemoveGroups' => 'array_merge_recursive', 'RateLimits' => 'array_plus_2d', 'GrantPermissions' => 'array_plus_2d', 'MWLoggerDefaultSpi' => 'replace', 'Profiler' => 'replace', 'Hooks' => 'array_merge_recursive', 'VirtualRestConfig' => 'array_plus_2d', ], 'dynamicDefault' => [ 'UsePathInfo' => [ 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultUsePathInfo', ], ], 'Script' => [ 'use' => [ 'ScriptPath', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultScript', ], ], 'LoadScript' => [ 'use' => [ 'ScriptPath', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultLoadScript', ], ], 'RestPath' => [ 'use' => [ 'ScriptPath', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultRestPath', ], ], 'StylePath' => [ 'use' => [ 'ResourceBasePath', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultStylePath', ], ], 'LocalStylePath' => [ 'use' => [ 'ScriptPath', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultLocalStylePath', ], ], 'ExtensionAssetsPath' => [ 'use' => [ 'ResourceBasePath', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultExtensionAssetsPath', ], ], 'ArticlePath' => [ 'use' => [ 'Script', 'UsePathInfo', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultArticlePath', ], ], 'UploadPath' => [ 'use' => [ 'ScriptPath', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultUploadPath', ], ], 'FileCacheDirectory' => [ 'use' => [ 'UploadDirectory', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultFileCacheDirectory', ], ], 'Logo' => [ 'use' => [ 'ResourceBasePath', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultLogo', ], ], 'DeletedDirectory' => [ 'use' => [ 'UploadDirectory', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultDeletedDirectory', ], ], 'ShowEXIF' => [ 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultShowEXIF', ], ], 'SharedPrefix' => [ 'use' => [ 'DBprefix', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultSharedPrefix', ], ], 'SharedSchema' => [ 'use' => [ 'DBmwschema', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultSharedSchema', ], ], 'DBerrorLogTZ' => [ 'use' => [ 'Localtimezone', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultDBerrorLogTZ', ], ], 'Localtimezone' => [ 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultLocaltimezone', ], ], 'LocalTZoffset' => [ 'use' => [ 'Localtimezone', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultLocalTZoffset', ], ], 'ResourceBasePath' => [ 'use' => [ 'ScriptPath', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultResourceBasePath', ], ], 'MetaNamespace' => [ 'use' => [ 'Sitename', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultMetaNamespace', ], ], 'CookieSecure' => [ 'use' => [ 'ForceHTTPS', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultCookieSecure', ], ], 'CookiePrefix' => [ 'use' => [ 'SharedDB', 'SharedPrefix', 'SharedTables', 'DBname', 'DBprefix', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultCookiePrefix', ], ], 'ReadOnlyFile' => [ 'use' => [ 'UploadDirectory', ], 'callback' => [ 'MediaWiki\\MainConfigSchema', 'getDefaultReadOnlyFile', ], ], ], ], 'config-schema' => [ 'UploadStashScalerBaseUrl' => [ 'deprecated' => 'since 1.36 Use thumbProxyUrl in $wgLocalFileRepo', ], 'IllegalFileChars' => [ 'deprecated' => 'since 1.41; no longer customizable', ], 'ThumbnailNamespaces' => [ 'items' => [ 'type' => 'integer', ], ], 'LocalDatabases' => [ 'items' => [ 'type' => 'string', ], ], 'ParserCacheFilterConfig' => [ 'additionalProperties' => [ 'type' => 'object', 'description' => 'A map of namespace IDs to filter definitions.', 'additionalProperties' => [ 'type' => 'object', 'description' => 'A map of filter names to values.', 'properties' => [ 'minCpuTime' => [ 'type' => 'number', ], ], ], ], ], 'PHPSessionHandling' => [ 'deprecated' => 'since 1.45 Integration with PHP session handling will be removed in the future', ], 'RawHtmlMessages' => [ 'items' => [ 'type' => 'string', ], ], 'InterwikiLogoOverride' => [ 'items' => [ 'type' => 'string', ], ], 'LegalTitleChars' => [ 'deprecated' => 'since 1.41; use Extension:TitleBlacklist to customize', ], 'ReauthenticateTime' => [ 'additionalProperties' => [ 'type' => 'integer', ], ], 'AllowSecuritySensitiveOperationIfCannotReauthenticate' => [ 'additionalProperties' => [ 'type' => 'boolean', ], ], 'ChangeCredentialsBlacklist' => [ 'items' => [ 'type' => 'string', ], ], 'RemoveCredentialsBlacklist' => [ 'items' => [ 'type' => 'string', ], ], 'GroupPermissions' => [ 'additionalProperties' => [ 'type' => 'object', 'additionalProperties' => [ 'type' => 'boolean', ], ], ], 'GroupInheritsPermissions' => [ 'additionalProperties' => [ 'type' => 'string', ], ], 'AvailableRights' => [ 'items' => [ 'type' => 'string', ], ], 'ImplicitRights' => [ 'items' => [ 'type' => 'string', ], ], 'SoftBlockRanges' => [ 'items' => [ 'type' => 'string', ], ], 'ExternalQuerySources' => [ 'additionalProperties' => [ 'type' => 'object', 'properties' => [ 'enabled' => [ 'type' => 'boolean', 'default' => false, ], 'url' => [ 'type' => 'string', 'format' => 'uri', ], 'timeout' => [ 'type' => 'integer', 'default' => 10, ], ], 'required' => [ 'enabled', 'url', ], 'additionalProperties' => false, ], ], 'GrantPermissions' => [ 'additionalProperties' => [ 'type' => 'object', 'additionalProperties' => [ 'type' => 'boolean', ], ], ], 'GrantPermissionGroups' => [ 'additionalProperties' => [ 'type' => 'string', ], ], 'SitemapNamespacesPriorities' => [ 'deprecated' => 'since 1.45 and ignored', ], 'SitemapApiConfig' => [ 'additionalProperties' => [ 'enabled' => [ 'type' => 'bool', ], 'sitemapsPerIndex' => [ 'type' => 'int', ], 'pagesPerSitemap' => [ 'type' => 'int', ], 'expiry' => [ 'type' => 'int', ], ], ], 'SoftwareTags' => [ 'additionalProperties' => [ 'type' => 'boolean', ], ], 'JobBackoffThrottling' => [ 'additionalProperties' => [ 'type' => 'number', ], ], 'JobTypeConf' => [ 'additionalProperties' => [ 'type' => 'object', 'properties' => [ 'class' => [ 'type' => 'string', ], 'order' => [ 'type' => 'string', ], 'claimTTL' => [ 'type' => 'integer', ], ], ], ], 'TrackingCategories' => [ 'deprecated' => 'since 1.25 Extensions should now register tracking categories using the new extension registration system.', ], 'RangeContributionsCIDRLimit' => [ 'additionalProperties' => [ 'type' => 'integer', ], ], 'RestSandboxSpecs' => [ 'additionalProperties' => [ 'type' => 'object', 'properties' => [ 'url' => [ 'type' => 'string', 'format' => 'url', ], 'name' => [ 'type' => 'string', ], 'file' => [ 'type' => 'string', ], 'msg' => [ 'type' => 'string', 'description' => 'a message key', ], ], ], ], 'ShellboxUrls' => [ 'additionalProperties' => [ 'type' => [ 'string', 'boolean', 'null', ], ], ], ], 'obsolete-config' => [ 'MangleFlashPolicy' => 'Since 1.39; no longer has any effect.', 'EnableOpenSearchSuggest' => 'Since 1.35, no longer used', 'AutoloadAttemptLowercase' => 'Since 1.40; no longer has any effect.', ],]
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