MediaWiki  master
SpecialPasswordPolicies.php
Go to the documentation of this file.
1 <?php
25 
34  public function __construct() {
35  parent::__construct( 'PasswordPolicies' );
36  }
37 
42  public function execute( $par ) {
43  $this->setHeaders();
44  $this->outputHeader();
45 
46  $out = $this->getOutput();
47  $out->addModuleStyles( 'mediawiki.special' );
48 
49  // TODO: Have specific user documentation page for this feature
50  $this->addHelpLink( 'Manual:$wgPasswordPolicy' );
51 
52  $out->addHTML(
53  Xml::openElement( 'table', [ 'class' => 'wikitable mw-passwordpolicies-table' ] ) .
54  '<tr>' .
55  Xml::element( 'th', null, $this->msg( 'passwordpolicies-group' )->text() ) .
56  Xml::element( 'th', null, $this->msg( 'passwordpolicies-policies' )->text() ) .
57  '</tr>'
58  );
59 
60  $config = $this->getConfig();
61  $policies = $config->get( 'PasswordPolicy' );
62 
63  $groupPermissions = $config->get( 'GroupPermissions' );
64  $revokePermissions = $config->get( 'RevokePermissions' );
65  $addGroups = $config->get( 'AddGroups' );
66  $removeGroups = $config->get( 'RemoveGroups' );
67  $groupsAddToSelf = $config->get( 'GroupsAddToSelf' );
68  $groupsRemoveFromSelf = $config->get( 'GroupsRemoveFromSelf' );
69  $allGroups = array_unique( array_merge(
70  array_keys( $groupPermissions ),
71  array_keys( $revokePermissions ),
72  array_keys( $addGroups ),
73  array_keys( $removeGroups ),
74  array_keys( $groupsAddToSelf ),
75  array_keys( $groupsRemoveFromSelf )
76  ) );
77  asort( $allGroups );
78 
79  $linkRenderer = $this->getLinkRenderer();
80 
81  foreach ( $allGroups as $group ) {
82  if ( $group == '*' ) {
83  continue;
84  }
85 
86  $groupnameLocalized = UserGroupMembership::getGroupName( $group );
87 
88  $grouppageLocalizedTitle = UserGroupMembership::getGroupPage( $group )
89  ?: Title::newFromText( MediaWikiServices::getInstance()->getNamespaceInfo()->
90  getCanonicalName( NS_PROJECT ) . ':' . $group );
91 
92  $grouppage = $linkRenderer->makeLink(
93  $grouppageLocalizedTitle,
94  $groupnameLocalized
95  );
96 
97  if ( $group === 'user' ) {
98  // Link to Special:listusers for implicit group 'user'
99  $grouplink = '<br />' . $linkRenderer->makeKnownLink(
100  SpecialPage::getTitleFor( 'Listusers' ),
101  $this->msg( 'listgrouprights-members' )->text()
102  );
103  } elseif ( !in_array( $group, $config->get( 'ImplicitGroups' ) ) ) {
104  $grouplink = '<br />' . $linkRenderer->makeKnownLink(
105  SpecialPage::getTitleFor( 'Listusers' ),
106  $this->msg( 'listgrouprights-members' )->text(),
107  [],
108  [ 'group' => $group ]
109  );
110  } else {
111  // No link to Special:listusers for other implicit groups as they are unlistable
112  $grouplink = '';
113  }
114 
115  $out->addHTML( Html::rawElement( 'tr', [ 'id' => Sanitizer::escapeIdForAttribute( $group ) ], "
116  <td>$grouppage$grouplink</td>
117  <td>" . $this->formatPolicies( $policies, $group ) . '</td>
118  '
119  ) );
120 
121  }
122 
123  $out->addHTML( Xml::closeElement( 'table' ) );
124  }
125 
134  private function formatPolicies( $policies, $group ) {
136  $policies['policies'],
137  [ $group ],
138  $policies['policies']['default']
139  );
140 
141  $ret = [];
142  foreach ( $groupPolicies as $gp => $settings ) {
143  if ( !is_array( $settings ) ) {
144  $settings = [ 'value' => $settings ];
145  }
146  $val = $settings['value'];
147  $flags = array_diff_key( $settings, [ 'value' => true ] );
148  if ( !$val ) {
149  // Policy isn't enabled, so no need to display it
150  continue;
151  }
152  $msg = $this->msg( 'passwordpolicies-policy-' . strtolower( $gp ) )->numParams( $val );
153  $flagMsgs = [];
154  foreach ( array_filter( $flags ) as $flag => $value ) {
155  $flagMsg = $this->msg( 'passwordpolicies-policyflag-' . strtolower( $flag ) );
156  $flagMsg->params( $value );
157  $flagMsgs[] = $flagMsg;
158  }
159  if ( $flagMsgs ) {
160  $ret[] = $this->msg(
161  'passwordpolicies-policy-displaywithflags',
162  $msg,
163  '<span class="mw-passwordpolicies-policy-name">' . $gp . '</span>',
164  $this->getLanguage()->commaList( $flagMsgs )
165  )->parse();
166  } else {
167  $ret[] = $this->msg(
168  'passwordpolicies-policy-display',
169  $msg,
170  '<span class="mw-passwordpolicies-policy-name">' . $gp . '</span>'
171  )->parse();
172  }
173  }
174  if ( $ret === [] ) {
175  return '';
176  } else {
177  return '<ul><li>' . implode( "</li>\n<li>", $ret ) . '</li></ul>';
178  }
179  }
180 
181  protected function getGroupName() {
182  return 'users';
183  }
184 }
static rawElement( $element, $attribs=[], $contents='')
Returns an HTML element in a string.
Definition: Html.php:209
addHelpLink( $to, $overrideBaseUrl=false)
Adds help link with an icon via page indicators.
formatPolicies( $policies, $group)
Create a HTML list of password policies for $group.
execute( $par)
Show the special page.
getOutput()
Get the OutputPage being used for this instance.
msg( $key,... $params)
Wrapper around wfMessage that sets the current context.
const NS_PROJECT
Definition: Defines.php:64
static openElement( $element, $attribs=null)
This opens an XML element.
Definition: Xml.php:108
static escapeIdForAttribute( $id, $mode=self::ID_PRIMARY)
Given a section name or other user-generated or otherwise unsafe string, escapes it to be a valid HTM...
Definition: Sanitizer.php:1295
static getGroupName( $group)
Gets the localized friendly name for a group, if it exists.
static getPoliciesForGroups(array $policies, array $userGroups, array $defaultPolicy)
Utility function to get the effective policy from a list of policies, based on a list of groups...
setHeaders()
Sets headers - this should be called from the execute() method of all derived classes! ...
static getTitleFor( $name, $subpage=false, $fragment='')
Get a localised Title object for a specified special page name If you don&#39;t need a full Title object...
Definition: SpecialPage.php:83
static getGroupPage( $group)
Gets the title of a page describing a particular user group.
static closeElement( $element)
Shortcut to close an XML element.
Definition: Xml.php:117
getConfig()
Shortcut to get main config object.
static element( $element, $attribs=null, $contents='', $allowShortTag=true)
Format an XML element with given attributes and, optionally, text content.
Definition: Xml.php:41
getLanguage()
Shortcut to get user&#39;s language.
outputHeader( $summaryMessageKey='')
Outputs a summary message on top of special pages Per default the message key is the canonical name o...
This special page lists the defined password policies for user groups.
MediaWiki Linker LinkRenderer null $linkRenderer
Definition: SpecialPage.php:67
static newFromText( $text, $defaultNamespace=NS_MAIN)
Create a new Title from text, such as what one would find in a link.
Definition: Title.php:319