Merge "Remove suggestions for negative namespaces in Page Restrictions"
[lhc/web/wiklou.git] / includes / specials / SpecialBlock.php
index 47d61b8..0b37910 100644 (file)
@@ -23,6 +23,7 @@
 
 use MediaWiki\Block\BlockRestriction;
 use MediaWiki\Block\Restriction\PageRestriction;
+use MediaWiki\Block\Restriction\NamespaceRestriction;
 
 /**
  * A special page that allows users with 'block' right to block users from
@@ -147,7 +148,6 @@ class SpecialBlock extends FormSpecialPage {
                $suggestedDurations = self::getSuggestedDurations();
 
                $conf = $this->getConfig();
-               $oldCommentSchema = $conf->get( 'CommentTableSchemaMigrationStage' ) === MIGRATION_OLD;
                $enablePartialBlocks = $conf->get( 'EnablePartialBlocks' );
 
                $a = [];
@@ -177,8 +177,8 @@ class SpecialBlock extends FormSpecialPage {
                                'type' => 'radio',
                                'cssclass' => 'mw-block-editing-restriction',
                                'options' => [
-                                       $this->msg( 'ipb-sitewide' )->text() => 'sitewide',
-                                       $this->msg( 'ipb-partial' )->text() => 'partial',
+                                       $this->msg( 'ipb-sitewide' )->escaped() => 'sitewide',
+                                       $this->msg( 'ipb-partial' )->escaped() => 'partial',
                                ],
                                'section' => 'actions',
                        ];
@@ -187,8 +187,19 @@ class SpecialBlock extends FormSpecialPage {
                                'label' => $this->msg( 'ipb-pages-label' )->text(),
                                'exists' => true,
                                'max' => 10,
-                               'cssclass' => 'mw-block-page-restrictions',
+                               'cssclass' => 'mw-block-restriction',
                                'showMissing' => false,
+                               'excludeDynamicNamespaces' => true,
+                               'input' => [
+                                       'autocomplete' => false
+                               ],
+                               'section' => 'actions',
+                       ];
+                       $a['NamespaceRestrictions'] = [
+                               'type' => 'namespacesmultiselect',
+                               'label' => $this->msg( 'ipb-namespaces-label' )->text(),
+                               'exists' => true,
+                               'cssclass' => 'mw-block-restriction',
                                'input' => [
                                        'autocomplete' => false
                                ],
@@ -232,8 +243,8 @@ class SpecialBlock extends FormSpecialPage {
                        'type' => 'selectandother',
                        // HTML maxlength uses "UTF-16 code units", which means that characters outside BMP
                        // (e.g. emojis) count for two each. This limit is overridden in JS to instead count
-                       // Unicode codepoints (or 255 UTF-8 bytes for old schema).
-                       'maxlength' => $oldCommentSchema ? 255 : CommentStore::COMMENT_CHARACTER_LIMIT,
+                       // Unicode codepoints.
+                       'maxlength' => CommentStore::COMMENT_CHARACTER_LIMIT,
                        'maxlength-unit' => 'codepoints',
                        'options-message' => 'ipbreason-dropdown',
                        'section' => 'reason',
@@ -391,17 +402,33 @@ class SpecialBlock extends FormSpecialPage {
 
                        if ( $block instanceof Block ) {
                                $pageRestrictions = [];
+                               $namespaceRestrictions = [];
                                foreach ( $block->getRestrictions() as $restriction ) {
-                                       if ( $restriction->getType() !== 'page' ) {
-                                               continue;
+                                       switch ( $restriction->getType() ) {
+                                               case PageRestriction::TYPE:
+                                                       if ( $restriction->getTitle() ) {
+                                                               $pageRestrictions[] = $restriction->getTitle()->getPrefixedText();
+                                                       }
+                                                       break;
+                                               case NamespaceRestriction::TYPE:
+                                                       $namespaceRestrictions[] = $restriction->getValue();
+                                                       break;
                                        }
+                               }
 
-                                       $pageRestrictions[] = $restriction->getTitle()->getPrefixedText();
+                               if (
+                                       !$block->isSitewide() &&
+                                       empty( $pageRestrictions ) &&
+                                       empty( $namespaceRestrictions )
+                               ) {
+                                       $fields['Editing']['default'] = false;
                                }
 
                                // Sort the restrictions so they are in alphabetical order.
                                sort( $pageRestrictions );
                                $fields['PageRestrictions']['default'] = implode( "\n", $pageRestrictions );
+                               sort( $namespaceRestrictions );
+                               $fields['NamespaceRestrictions']['default'] = implode( "\n", $namespaceRestrictions );
                        }
                }
        }
@@ -714,6 +741,9 @@ class SpecialBlock extends FormSpecialPage {
 
                $performer = $context->getUser();
                $enablePartialBlocks = $context->getConfig()->get( 'EnablePartialBlocks' );
+               $isPartialBlock = $enablePartialBlocks &&
+                       isset( $data['EditingRestriction'] ) &&
+                       $data['EditingRestriction'] === 'partial';
 
                // Handled by field validator callback
                // self::validateTargetField( $data['Target'] );
@@ -791,6 +821,10 @@ class SpecialBlock extends FormSpecialPage {
                                return [ 'badaccess-group0' ];
                        }
 
+                       if ( $isPartialBlock ) {
+                               return [ 'ipb_hide_partial' ];
+                       }
+
                        # Recheck params here...
                        if ( $type != Block::TYPE_USER ) {
                                $data['HideUser'] = false; # IP users should not be hidden
@@ -822,12 +856,8 @@ class SpecialBlock extends FormSpecialPage {
                $block->isAutoblocking( $data['AutoBlock'] );
                $block->mHideName = $data['HideUser'];
 
-               if (
-                       $enablePartialBlocks &&
-                       isset( $data['EditingRestriction'] ) &&
-                       $data['EditingRestriction'] === 'partial'
-                ) {
-                        $block->isSitewide( false );
+               if ( $isPartialBlock ) {
+                       $block->isSitewide( false );
                }
 
                $reason = [ 'hookaborted' ];
@@ -835,19 +865,26 @@ class SpecialBlock extends FormSpecialPage {
                        return $reason;
                }
 
-               $restrictions = [];
+               $pageRestrictions = [];
+               $namespaceRestrictions = [];
                if ( $enablePartialBlocks ) {
-                       if ( !empty( $data['PageRestrictions'] ) ) {
-                               $restrictions = array_map( function ( $text ) {
+                       if ( $data['PageRestrictions'] !== '' ) {
+                               $pageRestrictions = array_map( function ( $text ) {
                                        $title = Title::newFromText( $text );
                                        // Use the link cache since the title has already been loaded when
                                        // the field was validated.
-                                       $restriction = new PageRestriction( 0, $title->getArticleId() );
+                                       $restriction = new PageRestriction( 0, $title->getArticleID() );
                                        $restriction->setTitle( $title );
                                        return $restriction;
                                }, explode( "\n", $data['PageRestrictions'] ) );
                        }
+                       if ( $data['NamespaceRestrictions'] !== '' ) {
+                               $namespaceRestrictions = array_map( function ( $id ) {
+                                       return new NamespaceRestriction( 0, $id );
+                               }, explode( "\n", $data['NamespaceRestrictions'] ) );
+                       }
 
+                       $restrictions = ( array_merge( $pageRestrictions, $namespaceRestrictions ) );
                        $block->setRestrictions( $restrictions );
                }
 
@@ -948,10 +985,14 @@ class SpecialBlock extends FormSpecialPage {
                $logParams['6::flags'] = self::blockLogFlags( $data, $type );
                $logParams['sitewide'] = $block->isSitewide();
 
-               if ( $enablePartialBlocks && !empty( $data['PageRestrictions'] ) ) {
-                       $logParams['7::restrictions'] = [
-                               'pages' => explode( "\n", $data['PageRestrictions'] ),
-                       ];
+               if ( $enablePartialBlocks && !$block->isSitewide() ) {
+                       if ( $data['PageRestrictions'] !== '' ) {
+                               $logParams['7::restrictions']['pages'] = explode( "\n", $data['PageRestrictions'] );
+                       }
+
+                       if ( $data['NamespaceRestrictions'] !== '' ) {
+                               $logParams['7::restrictions']['namespaces'] = explode( "\n", $data['NamespaceRestrictions'] );
+                       }
                }
 
                # Make log entry, if the name is hidden, put it in the suppression log
@@ -1158,6 +1199,13 @@ class SpecialBlock extends FormSpecialPage {
         * @return bool|array True for success, false for didn't-try, array of errors on failure
         */
        public function onSubmit( array $data, HTMLForm $form = null ) {
+               // If "Editing" checkbox is unchecked, the block must be a partial block affecting
+               // actions other than editing, and there must be no restrictions.
+               if ( isset( $data['Editing'] ) && $data['Editing'] === false ) {
+                       $data['EditingRestriction'] = 'partial';
+                       $data['PageRestrictions'] = '';
+                       $data['NamespaceRestrictions'] = '';
+               }
                return self::processForm( $data, $form->getContext() );
        }