setHeaders(); $this->outputHeader(); $out = $this->getOutput(); $out->addModuleStyles( 'mediawiki.special' ); // TODO: Have specific user documentation page for this feature $this->addHelpLink( 'Manual:$wgPasswordPolicy' ); $out->addHTML( Xml::openElement( 'table', [ 'class' => 'wikitable mw-passwordpolicies-table' ] ) . '' . Xml::element( 'th', null, $this->msg( 'passwordpolicies-group' )->text() ) . Xml::element( 'th', null, $this->msg( 'passwordpolicies-policies' )->text() ) . '' ); $config = $this->getConfig(); $policies = $config->get( 'PasswordPolicy' ); $groupPermissions = $config->get( 'GroupPermissions' ); $revokePermissions = $config->get( 'RevokePermissions' ); $addGroups = $config->get( 'AddGroups' ); $removeGroups = $config->get( 'RemoveGroups' ); $groupsAddToSelf = $config->get( 'GroupsAddToSelf' ); $groupsRemoveFromSelf = $config->get( 'GroupsRemoveFromSelf' ); $allGroups = array_unique( array_merge( array_keys( $groupPermissions ), array_keys( $revokePermissions ), array_keys( $addGroups ), array_keys( $removeGroups ), array_keys( $groupsAddToSelf ), array_keys( $groupsRemoveFromSelf ) ) ); asort( $allGroups ); $linkRenderer = $this->getLinkRenderer(); foreach ( $allGroups as $group ) { if ( $group == '*' ) { continue; } $groupnameLocalized = UserGroupMembership::getGroupName( $group ); $grouppageLocalizedTitle = UserGroupMembership::getGroupPage( $group ) ?: Title::newFromText( MediaWikiServices::getInstance()->getNamespaceInfo()-> getCanonicalName( NS_PROJECT ) . ':' . $group ); $grouppage = $linkRenderer->makeLink( $grouppageLocalizedTitle, $groupnameLocalized ); if ( $group === 'user' ) { // Link to Special:listusers for implicit group 'user' $grouplink = '
' . $linkRenderer->makeKnownLink( SpecialPage::getTitleFor( 'Listusers' ), $this->msg( 'listgrouprights-members' )->text() ); } elseif ( !in_array( $group, $config->get( 'ImplicitGroups' ) ) ) { $grouplink = '
' . $linkRenderer->makeKnownLink( SpecialPage::getTitleFor( 'Listusers' ), $this->msg( 'listgrouprights-members' )->text(), [], [ 'group' => $group ] ); } else { // No link to Special:listusers for other implicit groups as they are unlistable $grouplink = ''; } $out->addHTML( Html::rawElement( 'tr', [ 'id' => Sanitizer::escapeIdForAttribute( $group ) ], " $grouppage$grouplink " . $this->formatPolicies( $policies, $group ) . ' ' ) ); } $out->addHTML( Xml::closeElement( 'table' ) ); } /** * Create a HTML list of password policies for $group * * @param array $policies Original $wgPasswordPolicy array * @param string $group Group to format password policies for * * @return string HTML list of all applied password policies */ private function formatPolicies( $policies, $group ) { $groupPolicies = UserPasswordPolicy::getPoliciesForGroups( $policies['policies'], [ $group ], $policies['policies']['default'] ); $ret = []; foreach ( $groupPolicies as $gp => $settings ) { if ( !is_array( $settings ) ) { $settings = [ 'value' => $settings ]; } $val = $settings['value']; $flags = array_diff_key( $settings, [ 'value' => true ] ); if ( !$val ) { // Policy isn't enabled, so no need to display it continue; } $msg = $this->msg( 'passwordpolicies-policy-' . strtolower( $gp ) )->numParams( $val ); $flagMsgs = []; foreach ( array_filter( $flags ) as $flag => $value ) { $flagMsg = $this->msg( 'passwordpolicies-policyflag-' . strtolower( $flag ) ); $flagMsg->params( $value ); $flagMsgs[] = $flagMsg; } if ( $flagMsgs ) { $ret[] = $this->msg( 'passwordpolicies-policy-displaywithflags', $msg, '' . $gp . '', $this->getLanguage()->commaList( $flagMsgs ) )->parse(); } else { $ret[] = $this->msg( 'passwordpolicies-policy-display', $msg, '' . $gp . '' )->parse(); } } if ( $ret === [] ) { return ''; } else { return ''; } } protected function getGroupName() { return 'users'; } }