123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- <?php
- /**
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
- use MediaWiki\MediaWikiServices;
- /**
- * A collection of public static functions to deal with grants.
- */
- class MWGrants {
- /**
- * List all known grants.
- * @return array
- */
- public static function getValidGrants() {
- global $wgGrantPermissions;
- return array_keys( $wgGrantPermissions );
- }
- /**
- * Map all grants to corresponding user rights.
- * @return array grant => array of rights
- */
- public static function getRightsByGrant() {
- global $wgGrantPermissions;
- $res = [];
- foreach ( $wgGrantPermissions as $grant => $rights ) {
- $res[$grant] = array_keys( array_filter( $rights ) );
- }
- return $res;
- }
- /**
- * Fetch the display name of the grant
- * @param string $grant
- * @param Language|string|null $lang
- * @return string Grant description
- */
- public static function grantName( $grant, $lang = null ) {
- // Give grep a chance to find the usages:
- // grant-blockusers, grant-createeditmovepage, grant-delete,
- // grant-editinterface, grant-editmycssjs, grant-editmywatchlist,
- // grant-editsiteconfig, grant-editpage, grant-editprotected,
- // grant-highvolume, grant-oversight, grant-patrol, grant-protect,
- // grant-rollback, grant-sendemail, grant-uploadeditmovefile,
- // grant-uploadfile, grant-basic, grant-viewdeleted,
- // grant-viewmywatchlist, grant-createaccount
- $msg = wfMessage( "grant-$grant" );
- if ( $lang !== null ) {
- if ( is_string( $lang ) ) {
- $lang = Language::factory( $lang );
- }
- $msg->inLanguage( $lang );
- }
- if ( !$msg->exists() ) {
- $msg = wfMessage( 'grant-generic', $grant );
- if ( $lang ) {
- $msg->inLanguage( $lang );
- }
- }
- return $msg->text();
- }
- /**
- * Fetch the display names for the grants.
- * @param string[] $grants
- * @param Language|string|null $lang
- * @return string[] Corresponding grant descriptions
- */
- public static function grantNames( array $grants, $lang = null ) {
- if ( $lang !== null && is_string( $lang ) ) {
- $lang = Language::factory( $lang );
- }
- $ret = [];
- foreach ( $grants as $grant ) {
- $ret[] = self::grantName( $grant, $lang );
- }
- return $ret;
- }
- /**
- * Fetch the rights allowed by a set of grants.
- * @param string[]|string $grants
- * @return string[]
- */
- public static function getGrantRights( $grants ) {
- global $wgGrantPermissions;
- $rights = [];
- foreach ( (array)$grants as $grant ) {
- if ( isset( $wgGrantPermissions[$grant] ) ) {
- $rights = array_merge( $rights, array_keys( array_filter( $wgGrantPermissions[$grant] ) ) );
- }
- }
- return array_unique( $rights );
- }
- /**
- * Test that all grants in the list are known.
- * @param string[] $grants
- * @return bool
- */
- public static function grantsAreValid( array $grants ) {
- return array_diff( $grants, self::getValidGrants() ) === [];
- }
- /**
- * Divide the grants into groups.
- * @param string[]|null $grantsFilter
- * @return array Map of (group => (grant list))
- */
- public static function getGrantGroups( $grantsFilter = null ) {
- global $wgGrantPermissions, $wgGrantPermissionGroups;
- if ( is_array( $grantsFilter ) ) {
- $grantsFilter = array_flip( $grantsFilter );
- }
- $groups = [];
- foreach ( $wgGrantPermissions as $grant => $rights ) {
- if ( $grantsFilter !== null && !isset( $grantsFilter[$grant] ) ) {
- continue;
- }
- if ( isset( $wgGrantPermissionGroups[$grant] ) ) {
- $groups[$wgGrantPermissionGroups[$grant]][] = $grant;
- } else {
- $groups['other'][] = $grant;
- }
- }
- return $groups;
- }
- /**
- * Get the list of grants that are hidden and should always be granted
- * @return string[]
- */
- public static function getHiddenGrants() {
- global $wgGrantPermissionGroups;
- $grants = [];
- foreach ( $wgGrantPermissionGroups as $grant => $group ) {
- if ( $group === 'hidden' ) {
- $grants[] = $grant;
- }
- }
- return $grants;
- }
- /**
- * Generate a link to Special:ListGrants for a particular grant name.
- *
- * This should be used to link end users to a full description of what
- * rights they are giving when they authorize a grant.
- *
- * @param string $grant the grant name
- * @param Language|string|null $lang
- * @return string (proto-relative) HTML link
- */
- public static function getGrantsLink( $grant, $lang = null ) {
- $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
- return $linkRenderer->makeKnownLink(
- \SpecialPage::getTitleFor( 'Listgrants', false, $grant ),
- self::grantName( $grant, $lang )
- );
- }
- /**
- * Generate wikitext to display a list of grants
- * @param string[]|null $grantsFilter If non-null, only display these grants.
- * @param Language|string|null $lang
- * @return string Wikitext
- */
- public static function getGrantsWikiText( $grantsFilter, $lang = null ) {
- if ( is_string( $lang ) ) {
- $lang = Language::factory( $lang );
- } elseif ( $lang === null ) {
- $lang = MediaWikiServices::getInstance()->getContentLanguage();
- }
- $s = '';
- foreach ( self::getGrantGroups( $grantsFilter ) as $group => $grants ) {
- if ( $group === 'hidden' ) {
- continue; // implicitly granted
- }
- $s .= "*<span class=\"mw-grantgroup\">" .
- wfMessage( "grant-group-$group" )->inLanguage( $lang )->text() . "</span>\n";
- $s .= ":" . $lang->semicolonList( self::grantNames( $grants, $lang ) ) . "\n";
- }
- return "$s\n";
- }
- }
|