113 parent::__construct( $query, $moduleName,
'si' );
114 $this->userOptionsLookup = $userOptionsLookup;
115 $this->userGroupManager = $userGroupManager;
116 $this->languageConverterFactory = $languageConverterFactory;
117 $this->languageFactory = $languageFactory;
118 $this->languageNameUtils = $languageNameUtils;
119 $this->contentLanguage = $contentLanguage;
120 $this->namespaceInfo = $namespaceInfo;
121 $this->interwikiLookup = $interwikiLookup;
122 $this->parserFactory = $parserFactory;
123 $this->magicWordFactory = $magicWordFactory;
124 $this->specialPageFactory = $specialPageFactory;
125 $this->skinFactory = $skinFactory;
126 $this->loadBalancer = $loadBalancer;
127 $this->readOnlyMode = $readOnlyMode;
128 $this->urlUtils = $urlUtils;
129 $this->tempUserConfig = $tempUserConfig;
135 foreach (
$params[
'prop'] as $p ) {
143 case 'namespacealiases':
146 case 'specialpagealiases':
164 case 'autocreatetempuser':
167 case 'clientlibraries':
176 case 'fileextensions':
188 case 'languagevariants':
194 case 'extensiontags':
197 case 'functionhooks':
209 case 'defaultoptions':
216 $fit = $this->appendAutoPromote( $p );
218 case 'autopromoteonce':
219 $fit = $this->appendAutoPromoteOnce( $p );
228 array_diff(
$params[
'prop'], $done ) ) );
237 $mainPage = Title::newMainPage();
238 $logo = SkinModule::getAvailableLogos( $config, $this->
getLanguage()->getCode() );
241 'mainpage' => $mainPage->getPrefixedText(),
242 'base' => (string)$this->urlUtils->expand( $mainPage->getFullURL(),
PROTO_CURRENT ),
243 'sitename' => $config->get( MainConfigNames::Sitename ),
244 'mainpageisdomainroot' => (bool)$config->get( MainConfigNames::MainPageIsDomainRoot ),
248 'logo' => (string)$this->urlUtils->expand( $logo[
'1x'],
PROTO_RELATIVE ),
252 'phpversion' => PHP_VERSION,
253 'phpsapi' => PHP_SAPI,
254 'dbtype' => $config->get( MainConfigNames::DBtype ),
255 'dbversion' => $this->
getDB()->getServerVersion(),
259 $allowException =
true;
260 if ( !$config->get( MainConfigNames::AllowExternalImages ) ) {
261 $data[
'imagewhitelistenabled'] =
262 (bool)$config->get( MainConfigNames::EnableImageWhitelist );
263 $allowFrom = $config->get( MainConfigNames::AllowExternalImagesFrom );
264 $allowException = (bool)$allowFrom;
266 if ( $allowException ) {
267 $data[
'externalimages'] = (array)$allowFrom;
268 ApiResult::setIndexedTagName( $data[
'externalimages'],
'prefix' );
271 $data[
'langconversion'] = !$this->languageConverterFactory->isConversionDisabled();
272 $data[
'linkconversion'] = !$this->languageConverterFactory->isLinkConversionDisabled();
274 $data[
'titleconversion'] = $data[
'linkconversion'];
276 $contLangConverter = $this->languageConverterFactory->getLanguageConverter( $this->contentLanguage );
277 if ( $this->contentLanguage->linkPrefixExtension() ) {
281 $data[
'linkprefix'] =
"/^((?>.*[^$linkPrefixCharset]|))(.+)$/sDu";
283 $data[
'linkprefixcharset'] =
'';
284 $data[
'linkprefix'] =
'';
287 $data[
'linktrail'] = $this->contentLanguage->linkTrail() ?:
'';
289 $data[
'legaltitlechars'] = Title::legalChars();
290 $data[
'invalidusernamechars'] = $config->get( MainConfigNames::InvalidUsernameCharacters );
292 $data[
'allunicodefixes'] = (bool)$config->get( MainConfigNames::AllUnicodeFixes );
293 $data[
'fixarabicunicode'] =
true;
294 $data[
'fixmalayalamunicode'] =
true;
296 $git = GitInfo::repo()->getHeadSHA1();
298 $data[
'git-hash'] = $git;
299 $data[
'git-branch'] = GitInfo::repo()->getCurrentBranch();
304 $config->get( MainConfigNames::CapitalLinks ) ?
'first-letter' :
'case-sensitive';
305 $data[
'lang'] = $config->get( MainConfigNames::LanguageCode );
307 $data[
'fallback'] = [];
308 foreach ( $this->contentLanguage->getFallbackLanguages() as $code ) {
309 $data[
'fallback'][] = [
'code' => $code ];
311 ApiResult::setIndexedTagName( $data[
'fallback'],
'lang' );
313 if ( $contLangConverter->hasVariants() ) {
314 $data[
'variants'] = [];
315 foreach ( $contLangConverter->getVariants() as $code ) {
316 $data[
'variants'][] = [
318 'name' => $this->contentLanguage->getVariantname( $code ),
321 ApiResult::setIndexedTagName( $data[
'variants'],
'lang' );
324 $data[
'rtl'] = $this->contentLanguage->isRTL();
325 $data[
'fallback8bitEncoding'] = $this->contentLanguage->fallback8bitEncoding();
327 $data[
'readonly'] = $this->readOnlyMode->isReadOnly();
328 if ( $data[
'readonly'] ) {
329 $data[
'readonlyreason'] = $this->readOnlyMode->getReason();
331 $data[
'writeapi'] =
true;
333 $data[
'maxarticlesize'] = $config->get( MainConfigNames::MaxArticleSize ) * 1024;
335 $data[
'timezone'] = $config->get( MainConfigNames::Localtimezone );
336 $data[
'timeoffset'] = (int)( $config->get( MainConfigNames::LocalTZoffset ) );
337 $data[
'articlepath'] = $config->get( MainConfigNames::ArticlePath );
338 $data[
'scriptpath'] = $config->get( MainConfigNames::ScriptPath );
339 $data[
'script'] = $config->get( MainConfigNames::Script );
340 $data[
'variantarticlepath'] = $config->get( MainConfigNames::VariantArticlePath );
341 $data[ApiResult::META_BC_BOOLS][] =
'variantarticlepath';
342 $data[
'server'] = $config->get( MainConfigNames::Server );
343 $data[
'servername'] = $config->get( MainConfigNames::ServerName );
344 $data[
'wikiid'] = WikiMap::getCurrentWikiId();
345 $data[
'time'] =
wfTimestamp( TS_ISO_8601, time() );
347 $data[
'misermode'] = (bool)$config->get( MainConfigNames::MiserMode );
349 $data[
'uploadsenabled'] = UploadBase::isEnabled();
350 $data[
'maxuploadsize'] = UploadBase::getMaxUploadSize();
353 $data[
'galleryoptions'] = $config->get( MainConfigNames::GalleryOptions );
355 $data[
'thumblimits'] = $config->get( MainConfigNames::ThumbLimits );
356 ApiResult::setArrayType( $data[
'thumblimits'],
'BCassoc' );
357 ApiResult::setIndexedTagName( $data[
'thumblimits'],
'limit' );
358 $data[
'imagelimits'] = [];
359 foreach ( $config->get( MainConfigNames::ImageLimits ) as $k => $limit ) {
360 $data[
'imagelimits'][$k] = [
'width' => $limit[0],
'height' => $limit[1] ];
362 ApiResult::setArrayType( $data[
'imagelimits'],
'BCassoc' );
363 ApiResult::setIndexedTagName( $data[
'imagelimits'],
'limit' );
365 $favicon = $config->get( MainConfigNames::Favicon );
368 $data[
'favicon'] = (string)$this->urlUtils->expand( $favicon );
371 $data[
'centralidlookupprovider'] = $config->get( MainConfigNames::CentralIdLookupProvider );
372 $providerIds = array_keys( $config->get( MainConfigNames::CentralIdLookupProviders ) );
373 $data[
'allcentralidlookupproviders'] = $providerIds;
375 $data[
'interwikimagic'] = (bool)$config->get( MainConfigNames::InterwikiMagic );
376 $data[
'magiclinks'] = $config->get( MainConfigNames::EnableMagicLinks );
378 $data[
'categorycollation'] = $config->get( MainConfigNames::CategoryCollation );
380 $data[
'nofollowlinks'] = $config->get( MainConfigNames::NoFollowLinks );
381 $data[
'nofollownsexceptions'] = $config->get( MainConfigNames::NoFollowNsExceptions );
382 $data[
'nofollowdomainexceptions'] = $config->get( MainConfigNames::NoFollowDomainExceptions );
383 $data[
'externallinktarget'] = $config->get( MainConfigNames::ExternalLinkTarget );
385 $this->
getHookRunner()->onAPIQuerySiteInfoGeneralInfo( $this, $data );
387 return $this->
getResult()->addValue(
'query', $property, $data );
391 $nsProtection = $this->
getConfig()->get( MainConfigNames::NamespaceProtection );
393 $data = [ ApiResult::META_TYPE =>
'assoc' ];
394 foreach ( $this->contentLanguage->getFormattedNamespaces() as $ns => $title ) {
397 'case' => $this->namespaceInfo->isCapitalized( $ns ) ?
'first-letter' :
'case-sensitive',
399 ApiResult::setContentValue( $data[$ns],
'name', $title );
400 $canonical = $this->namespaceInfo->getCanonicalName( $ns );
402 $data[$ns][
'subpages'] = $this->namespaceInfo->hasSubpages( $ns );
405 $data[$ns][
'canonical'] = strtr( $canonical,
'_',
' ' );
408 $data[$ns][
'content'] = $this->namespaceInfo->isContent( $ns );
409 $data[$ns][
'nonincludable'] = $this->namespaceInfo->isNonincludable( $ns );
411 $specificNs = $nsProtection[$ns] ??
'';
412 if ( is_array( $specificNs ) ) {
413 $specificNs = implode(
"|", array_filter( $specificNs ) );
415 if ( $specificNs !==
'' ) {
416 $data[$ns][
'namespaceprotection'] = $specificNs;
419 $contentmodel = $this->namespaceInfo->getNamespaceContentModel( $ns );
420 if ( $contentmodel ) {
421 $data[$ns][
'defaultcontentmodel'] = $contentmodel;
425 ApiResult::setArrayType( $data,
'assoc' );
426 ApiResult::setIndexedTagName( $data,
'ns' );
428 return $this->
getResult()->addValue(
'query', $property, $data );
432 $aliases = $this->contentLanguage->getNamespaceAliases();
433 $namespaces = $this->contentLanguage->getNamespaces();
435 foreach ( $aliases as $title => $ns ) {
436 if ( $namespaces[$ns] == $title ) {
440 $item = [
'id' => (int)$ns ];
441 ApiResult::setContentValue( $item,
'alias', strtr( $title,
'_',
' ' ) );
447 ApiResult::setIndexedTagName( $data,
'ns' );
449 return $this->
getResult()->addValue(
'query', $property, $data );
454 $aliases = $this->contentLanguage->getSpecialPageAliases();
455 foreach ( $this->specialPageFactory->getNames() as $specialpage ) {
456 if ( isset( $aliases[$specialpage] ) ) {
457 $arr = [
'realname' => $specialpage,
'aliases' => $aliases[$specialpage] ];
458 ApiResult::setIndexedTagName( $arr[
'aliases'],
'alias' );
462 ApiResult::setIndexedTagName( $data,
'specialpage' );
464 return $this->
getResult()->addValue(
'query', $property, $data );
469 foreach ( $this->contentLanguage->getMagicWords() as $name => $aliases ) {
470 $caseSensitive = (bool)array_shift( $aliases );
473 'aliases' => $aliases,
474 'case-sensitive' => $caseSensitive,
476 ApiResult::setIndexedTagName( $arr[
'aliases'],
'alias' );
479 ApiResult::setIndexedTagName( $data,
'magicword' );
481 return $this->
getResult()->addValue(
'query', $property, $data );
485 $local = $filter ? $filter ===
'local' :
null;
488 $langCode =
$params[
'inlanguagecode'] ??
'';
489 $interwikiMagic = $this->
getConfig()->get( MainConfigNames::InterwikiMagic );
491 if ( $interwikiMagic ) {
492 $langNames = $this->languageNameUtils->getLanguageNames( $langCode );
495 $extraLangPrefixes = $this->
getConfig()->get( MainConfigNames::ExtraInterlanguageLinkPrefixes );
496 $extraLangCodeMap = $this->
getConfig()->get( MainConfigNames::InterlanguageLinkCodeMap );
497 $localInterwikis = $this->
getConfig()->get( MainConfigNames::LocalInterwikis );
500 foreach ( $this->interwikiLookup->getAllPrefixes( $local ) as $row ) {
501 $prefix = $row[
'iw_prefix'];
503 $val[
'prefix'] = $prefix;
504 if ( $row[
'iw_local'] ??
false ) {
505 $val[
'local'] =
true;
507 if ( $row[
'iw_trans'] ??
false ) {
508 $val[
'trans'] =
true;
511 if ( $interwikiMagic && isset( $langNames[$prefix] ) ) {
512 $val[
'language'] = $langNames[$prefix];
513 $standard = LanguageCode::replaceDeprecatedCodes( $prefix );
514 if ( $standard !== $prefix ) {
515 # Note that even if this code is deprecated, it should
516 # only be remapped if extralanglink (set below) is false.
517 $val[
'deprecated'] = $standard;
519 $val[
'bcp47'] = LanguageCode::bcp47( $standard );
521 if ( in_array( $prefix, $localInterwikis ) ) {
522 $val[
'localinterwiki'] =
true;
524 if ( $interwikiMagic && in_array( $prefix, $extraLangPrefixes ) ) {
525 $val[
'extralanglink'] =
true;
526 $val[
'code'] = $extraLangCodeMap[$prefix] ?? $prefix;
527 $val[
'bcp47'] = LanguageCode::bcp47( $val[
'code'] );
529 $linktext = $this->
msg(
"interlanguage-link-$prefix" );
530 if ( !$linktext->isDisabled() ) {
531 $val[
'linktext'] = $linktext->text();
534 $sitename = $this->
msg(
"interlanguage-link-sitename-$prefix" );
535 if ( !$sitename->isDisabled() ) {
536 $val[
'sitename'] = $sitename->text();
540 $val[
'url'] = (string)$this->urlUtils->expand( $row[
'iw_url'],
PROTO_CURRENT );
541 $val[
'protorel'] = str_starts_with( $row[
'iw_url'],
'//' );
542 if ( ( $row[
'iw_wikiid'] ??
'' ) !==
'' ) {
543 $val[
'wikiid'] = $row[
'iw_wikiid'];
545 if ( ( $row[
'iw_api'] ??
'' ) !==
'' ) {
546 $val[
'api'] = $row[
'iw_api'];
552 ApiResult::setIndexedTagName( $data,
'iw' );
554 return $this->
getResult()->addValue(
'query', $property, $data );
559 $showHostnames = $this->
getConfig()->get( MainConfigNames::ShowHostnames );
561 if ( !$showHostnames ) {
562 $this->
dieWithError(
'apierror-siteinfo-includealldenied',
'includeAllDenied' );
565 foreach ( $this->loadBalancer->getLagTimes() as $i => $lag ) {
567 'host' => $this->loadBalancer->getServerName( $i ),
572 [ , $lag, $index ] = $this->loadBalancer->getMaxLag();
574 'host' => $showHostnames ? $this->loadBalancer->getServerName( $index ) :
'',
579 ApiResult::setIndexedTagName( $data,
'db' );
581 return $this->
getResult()->addValue(
'query', $property, $data );
586 'pages' => SiteStats::pages(),
587 'articles' => SiteStats::articles(),
588 'edits' => SiteStats::edits(),
589 'images' => SiteStats::images(),
590 'users' => SiteStats::users(),
591 'activeusers' => SiteStats::activeUsers(),
592 'admins' => SiteStats::numberingroup(
'sysop' ),
593 'jobs' => SiteStats::jobs(),
596 $this->
getHookRunner()->onAPIQuerySiteInfoStatisticsInfo( $data );
598 return $this->
getResult()->addValue(
'query', $property, $data );
606 $allGroups = array_values( $this->userGroupManager->listAllGroups() );
607 foreach ( $config->get( MainConfigNames::GroupPermissions ) as $group => $permissions ) {
610 'rights' => array_keys( $permissions,
true ),
613 if ( $numberInGroup ) {
614 $autopromote = $config->get( MainConfigNames::Autopromote );
616 if ( $group ==
'user' ) {
617 $arr[
'number'] = SiteStats::users();
619 } elseif ( $group !==
'*' && !isset( $autopromote[$group] ) ) {
620 $arr[
'number'] = SiteStats::numberingroup( $group );
625 'add' => $config->get( MainConfigNames::AddGroups ),
626 'remove' => $config->get( MainConfigNames::RemoveGroups ),
627 'add-self' => $config->get( MainConfigNames::GroupsAddToSelf ),
628 'remove-self' => $config->get( MainConfigNames::GroupsRemoveFromSelf )
631 foreach ( $groupArr as $type => $rights ) {
632 if ( isset( $rights[$group] ) ) {
633 if ( $rights[$group] ===
true ) {
634 $groups = $allGroups;
636 $groups = array_intersect( $rights[$group], $allGroups );
639 $arr[$type] = $groups;
640 ApiResult::setArrayType( $arr[$type],
'BCarray' );
641 ApiResult::setIndexedTagName( $arr[$type],
'group' );
646 ApiResult::setIndexedTagName( $arr[
'rights'],
'permission' );
650 ApiResult::setIndexedTagName( $data,
'group' );
652 return $result->addValue(
'query', $property, $data );
656 $data = [
'enabled' => $this->tempUserConfig->isEnabled() ];
657 if ( $this->tempUserConfig->isKnown() ) {
658 $data[
'matchPatterns'] = $this->tempUserConfig->getMatchPatterns();
660 return $this->
getResult()->addValue(
'query', $property, $data );
666 array_unique( $this->
getConfig()->
get( MainConfigNames::FileExtensions ) ) as $ext
668 $data[] = [
'ext' => $ext ];
670 ApiResult::setIndexedTagName( $data,
'fe' );
672 return $this->
getResult()->addValue(
'query', $property, $data );
677 foreach ( SpecialVersion::parseForeignResources() as $name => $info ) {
681 'name' => $info[
'name'],
682 'version' => $info[
'version'],
685 ApiResult::setIndexedTagName( $data,
'library' );
686 return $this->
getResult()->addValue(
'query', $property, $data );
690 $path = MW_INSTALL_PATH .
'/vendor/composer/installed.json';
691 if ( !file_exists(
$path ) ) {
697 foreach ( $installed->getInstalledDependencies() as $name => $info ) {
698 if ( str_starts_with( $info[
'type'],
'mediawiki-' ) ) {
705 'version' => $info[
'version'],
708 ApiResult::setIndexedTagName( $data,
'library' );
710 return $this->
getResult()->addValue(
'query', $property, $data );
715 $credits = SpecialVersion::getCredits(
716 ExtensionRegistry::getInstance(),
719 foreach ( $credits as $type => $extensions ) {
720 foreach ( $extensions as $ext ) {
721 $ret = [
'type' => $type ];
722 if ( isset( $ext[
'name'] ) ) {
723 $ret[
'name'] = $ext[
'name'];
725 if ( isset( $ext[
'namemsg'] ) ) {
726 $ret[
'namemsg'] = $ext[
'namemsg'];
728 if ( isset( $ext[
'description'] ) ) {
729 $ret[
'description'] = $ext[
'description'];
731 if ( isset( $ext[
'descriptionmsg'] ) ) {
733 if ( is_array( $ext[
'descriptionmsg'] ) ) {
734 $ret[
'descriptionmsg'] = $ext[
'descriptionmsg'][0];
735 $ret[
'descriptionmsgparams'] = array_slice( $ext[
'descriptionmsg'], 1 );
736 ApiResult::setIndexedTagName( $ret[
'descriptionmsgparams'],
'param' );
738 $ret[
'descriptionmsg'] = $ext[
'descriptionmsg'];
741 if ( isset( $ext[
'author'] ) ) {
742 $ret[
'author'] = is_array( $ext[
'author'] ) ?
743 implode(
', ', $ext[
'author'] ) : $ext[
'author'];
745 if ( isset( $ext[
'url'] ) ) {
746 $ret[
'url'] = $ext[
'url'];
748 if ( isset( $ext[
'version'] ) ) {
749 $ret[
'version'] = $ext[
'version'];
751 if ( isset( $ext[
'path'] ) ) {
752 $extensionPath = dirname( $ext[
'path'] );
753 $gitInfo =
new GitInfo( $extensionPath );
754 $vcsVersion = $gitInfo->getHeadSHA1();
755 if ( $vcsVersion !==
false ) {
756 $ret[
'vcs-system'] =
'git';
757 $ret[
'vcs-version'] = $vcsVersion;
758 $ret[
'vcs-url'] = $gitInfo->getHeadViewUrl();
759 $vcsDate = $gitInfo->getHeadCommitDate();
760 if ( $vcsDate !==
false ) {
761 $ret[
'vcs-date'] =
wfTimestamp( TS_ISO_8601, $vcsDate );
765 if ( ExtensionInfo::getLicenseFileNames( $extensionPath ) ) {
766 $ret[
'license-name'] = $ext[
'license-name'] ??
'';
767 $ret[
'license'] = SpecialPage::getTitleFor(
769 "License/{$ext['name']}"
773 if ( ExtensionInfo::getAuthorsFileName( $extensionPath ) ) {
774 $ret[
'credits'] = SpecialPage::getTitleFor(
776 "Credits/{$ext['name']}"
784 ApiResult::setIndexedTagName( $data,
'ext' );
786 return $this->
getResult()->addValue(
'query', $property, $data );
791 $title = Title::newFromText( $config->get( MainConfigNames::RightsPage ) );
795 $url = $config->get( MainConfigNames::RightsUrl );
797 $text = $config->get( MainConfigNames::RightsText ) ??
'';
798 if ( $text ===
'' && $title ) {
799 $text = $title->getPrefixedText();
803 'url' => (string)
$url,
804 'text' => (
string)$text,
807 return $this->
getResult()->addValue(
'query', $property, $data );
813 'types' => $config->get( MainConfigNames::RestrictionTypes ),
814 'levels' => $config->get( MainConfigNames::RestrictionLevels ),
815 'cascadinglevels' => $config->get( MainConfigNames::CascadingRestrictionLevels ),
816 'semiprotectedlevels' => $config->get( MainConfigNames::SemiprotectedRestrictionLevels ),
819 ApiResult::setArrayType( $data[
'types'],
'BCarray' );
820 ApiResult::setArrayType( $data[
'levels'],
'BCarray' );
821 ApiResult::setArrayType( $data[
'cascadinglevels'],
'BCarray' );
822 ApiResult::setArrayType( $data[
'semiprotectedlevels'],
'BCarray' );
824 ApiResult::setIndexedTagName( $data[
'types'],
'type' );
825 ApiResult::setIndexedTagName( $data[
'levels'],
'level' );
826 ApiResult::setIndexedTagName( $data[
'cascadinglevels'],
'level' );
827 ApiResult::setIndexedTagName( $data[
'semiprotectedlevels'],
'level' );
829 return $this->
getResult()->addValue(
'query', $property, $data );
834 $langCode =
$params[
'inlanguagecode'] ??
'';
835 $langNames = $this->languageNameUtils->getLanguageNames( $langCode );
839 foreach ( $langNames as $code => $name ) {
842 'bcp47' => LanguageCode::bcp47( $code ),
844 ApiResult::setContentValue( $lang,
'name', $name );
847 ApiResult::setIndexedTagName( $data,
'lang' );
849 return $this->
getResult()->addValue(
'query', $property, $data );
855 $langNames = $this->languageConverterFactory->isConversionDisabled() ? [] :
856 LanguageConverter::$languagesWithVariants;
860 foreach ( $langNames as $langCode ) {
861 $lang = $this->languageFactory->getLanguage( $langCode );
862 $langConverter = $this->languageConverterFactory->getLanguageConverter( $lang );
863 if ( !$langConverter->hasVariants() ) {
867 $data[$langCode] = [];
868 ApiResult::setIndexedTagName( $data[$langCode],
'variant' );
869 ApiResult::setArrayType( $data[$langCode],
'kvp',
'code' );
871 $variants = $langConverter->getVariants();
873 foreach ( $variants as $v ) {
874 $data[$langCode][$v] = [
875 'fallbacks' => (array)$langConverter->getVariantFallbacks( $v ),
877 ApiResult::setIndexedTagName(
878 $data[$langCode][$v][
'fallbacks'],
'variant'
882 ApiResult::setIndexedTagName( $data,
'lang' );
883 ApiResult::setArrayType( $data,
'kvp',
'code' );
885 return $this->
getResult()->addValue(
'query', $property, $data );
890 $allowed = $this->skinFactory->getAllowedSkins();
893 foreach ( $this->skinFactory->getInstalledSkins() as $name => $displayName ) {
894 $msg = $this->
msg(
"skinname-{$name}" );
896 if ( $code && $this->languageNameUtils->isValidCode( $code ) ) {
897 $msg->inLanguage( $code );
899 $msg->inContentLanguage();
901 if ( $msg->exists() ) {
902 $displayName = $msg->text();
904 $skin = [
'code' => $name ];
905 ApiResult::setContentValue( $skin,
'name', $displayName );
906 if ( !isset( $allowed[$name] ) ) {
907 $skin[
'unusable'] =
true;
909 if ( $name === $default ) {
910 $skin[
'default'] =
true;
914 ApiResult::setIndexedTagName( $data,
'skin' );
916 return $this->
getResult()->addValue(
'query', $property, $data );
921 static function ( $item ) {
924 $this->parserFactory->getMainInstance()->getTags()
926 ApiResult::setArrayType( $tags,
'BCarray' );
927 ApiResult::setIndexedTagName( $tags,
't' );
929 return $this->
getResult()->addValue(
'query', $property, $tags );
933 $hooks = $this->parserFactory->getMainInstance()->getFunctionHooks();
934 ApiResult::setArrayType( $hooks,
'BCarray' );
935 ApiResult::setIndexedTagName( $hooks,
'h' );
937 return $this->
getResult()->addValue(
'query', $property, $hooks );
941 $variables = $this->magicWordFactory->getVariableIDs();
942 ApiResult::setArrayType( $variables,
'BCarray' );
943 ApiResult::setIndexedTagName( $variables,
'v' );
945 return $this->
getResult()->addValue(
'query', $property, $variables );
950 $protocols = array_values( $this->
getConfig()->
get( MainConfigNames::UrlProtocols ) );
951 ApiResult::setArrayType( $protocols,
'BCarray' );
952 ApiResult::setIndexedTagName( $protocols,
'p' );
954 return $this->
getResult()->addValue(
'query', $property, $protocols );
958 $options = $this->userOptionsLookup->getDefaultOptions(
null );
959 $options[ApiResult::META_BC_BOOLS] = array_keys( $options );
960 return $this->
getResult()->addValue(
'query', $property, $options );
964 $config = $this->
getConfig()->get( MainConfigNames::UploadDialog );
965 return $this->
getResult()->addValue(
'query', $property, $config );
968 private function getAutoPromoteConds() {
969 $allowedConditions = [];
970 foreach ( get_defined_constants() as $constantName => $constantValue ) {
971 if ( strpos( $constantName,
'APCOND_' ) !==
false ) {
972 $allowedConditions[$constantName] = $constantValue;
975 return $allowedConditions;
978 private function processAutoPromote( $input, $allowedConditions ) {
980 foreach ( $input as $groupName => $conditions ) {
981 $row = $this->recAutopromote( $conditions, $allowedConditions );
982 if ( !isset( $row[0] ) || is_string( $row ) ) {
985 $data[$groupName] = $row;
990 private function appendAutoPromote( $property ) {
994 $this->processAutoPromote(
995 $this->
getConfig()->
get( MainConfigNames::Autopromote ),
996 $this->getAutoPromoteConds()
1001 private function appendAutoPromoteOnce( $property ) {
1002 $allowedConditions = $this->getAutoPromoteConds();
1004 foreach ( $this->
getConfig()->
get( MainConfigNames::AutopromoteOnce ) as $key => $value ) {
1005 $data[$key] = $this->processAutoPromote( $value, $allowedConditions );
1007 return $this->
getResult()->addValue(
'query', $property, $data );
1015 private function recAutopromote( $cond, $allowedConditions ) {
1018 if ( is_array( $cond ) ) {
1020 if ( in_array( $cond[0], UserGroupManager::VALID_OPS,
true ) ) {
1021 $config[
'operand'] = $cond[0];
1023 foreach ( array_slice( $cond, 1 ) as $value ) {
1024 $config[] = $this->recAutopromote( $value, $allowedConditions );
1026 } elseif ( is_string( $cond[0] ) ) {
1031 $params = array_slice( $cond, 1 );
1036 $params = [ $this->
getConfig()->get( MainConfigNames::AutoConfirmCount ) ];
1042 'condname' => array_search( $cond[0], $allowedConditions ),
1047 } elseif ( is_string( $cond ) ) {
1052 'condname' => array_search( $cond, $allowedConditions ),
1062 $hookContainer = MediaWikiServices::getInstance()->getHookContainer();
1063 $hookNames = $hookContainer->getHookNames();
1067 foreach ( $hookNames as $name ) {
1070 'subscribers' => $hookContainer->getHandlerDescriptions( $name ),
1073 ApiResult::setArrayType( $arr[
'subscribers'],
'array' );
1074 ApiResult::setIndexedTagName( $arr[
'subscribers'],
's' );
1078 ApiResult::setIndexedTagName( $data,
'hook' );
1080 return $this->
getResult()->addValue(
'query', $property, $data );
1085 if ( $this->
getConfig()->
get( MainConfigNames::ExtraInterlanguageLinkPrefixes ) &&
1086 in_array(
'interwikimap',
$params[
'prop'] ?? [] )
1088 return 'anon-public-user-private';
1097 ParamValidator::PARAM_DEFAULT =>
'general',
1098 ParamValidator::PARAM_ISMULTI =>
true,
1099 ParamValidator::PARAM_TYPE => [
1103 'specialpagealiases',
1109 'autocreatetempuser',
1132 ParamValidator::PARAM_TYPE => [
1137 'showalldb' =>
false,
1138 'numberingroup' =>
false,
1139 'inlanguagecode' =>
null,
1145 'action=query&meta=siteinfo&siprop=general|namespaces|namespacealiases|statistics'
1146 =>
'apihelp-query+siteinfo-example-simple',
1147 'action=query&meta=siteinfo&siprop=interwikimap&sifilteriw=local'
1148 =>
'apihelp-query+siteinfo-example-interwiki',
1149 'action=query&meta=siteinfo&siprop=dbrepllag&sishowalldb='
1150 =>
'apihelp-query+siteinfo-example-replag',
1155 return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Siteinfo';
const MW_VERSION
The running version of MediaWiki.
wfTimestamp( $outputtype=TS_UNIX, $ts=0)
Get a timestamp string in one of various formats.
array $params
The job parameters.
dieWithError( $msg, $code=null, $data=null, $httpCode=0)
Abort execution with an error.
getParameter( $paramName, $parseLimit=true)
Get a value for the given parameter.
static dieDebug( $method, $message)
Internal code errors should be reported with this method.
const PARAM_HELP_MSG_PER_VALUE
((string|array|Message)[]) When PARAM_TYPE is an array, or 'string' with PARAM_ISMULTI,...
getResult()
Get the result object.
extractRequestParams( $options=[])
Using getAllowedParams(), this function makes an array of the values provided by the user,...
getHookRunner()
Get an ApiHookRunner for running core API hooks.
This is a base class for all Query modules.
setContinueEnumParameter( $paramName, $paramValue)
Set a query-continue value.
A query action to return meta information about the wiki site.
appendLanguageVariants( $property)
appendLanguages( $property)
appendInterwikiMap( $property, $filter)
appendGeneralInfo( $property)
appendRightsInfo( $property)
getExamplesMessages()
Returns usage examples for this module.
appendInstalledLibraries( $property)
appendVariables( $property)
appendAutoCreateTempUser( $property)
appendInstalledClientLibraries( $property)
__construct(ApiQuery $query, $moduleName, UserOptionsLookup $userOptionsLookup, UserGroupManager $userGroupManager, LanguageConverterFactory $languageConverterFactory, LanguageFactory $languageFactory, LanguageNameUtils $languageNameUtils, Language $contentLanguage, NamespaceInfo $namespaceInfo, InterwikiLookup $interwikiLookup, ParserFactory $parserFactory, MagicWordFactory $magicWordFactory, SpecialPageFactory $specialPageFactory, SkinFactory $skinFactory, ILoadBalancer $loadBalancer, ReadOnlyMode $readOnlyMode, UrlUtils $urlUtils, TempUserConfig $tempUserConfig)
appendUserGroups( $property, $numberInGroup)
appendFileExtensions( $property)
appendNamespaces( $property)
appendDefaultOptions( $property)
appendMagicWords( $property)
getHelpUrls()
Return links to more detailed help pages about the module.
appendExtensions( $property)
getCacheMode( $params)
Get the cache mode for the data generated by this module.
execute()
Evaluates the parameters, performs the requested query, and sets up the result.
appendRestrictions( $property)
appendExtensionTags( $property)
appendUploadDialog( $property)
appendProtocols( $property)
appendStatistics( $property)
appendSpecialPageAliases( $property)
appendDbReplLagInfo( $property, $includeAll)
getAllowedParams()
Returns an array of allowed parameters (parameter name) => (default value) or (parameter name) => (ar...
appendSubscribedHooks( $property)
appendFunctionHooks( $property)
appendNamespaceAliases( $property)
This is the main query class.
static setIndexedTagName(array &$arr, $tag)
Set the tag name for numeric-keyed values in XML format.
static getMinUploadChunkSize(Config $config)
Base class for language-specific code.
msg( $key,... $params)
Get a Message object with context set Parameters are the same as wfMessage()
A class containing constants representing the names of configuration variables.
Factory for handling the special page list and generating SpecialPage objects.
Parent class for all special pages.
Factory class to create Skin objects.
static normalizeKey(string $key)
Normalize a skin preference value to a form that can be loaded.