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
$suggestedDurations = self::getSuggestedDurations();
$conf = $this->getConfig();
- $oldCommentSchema = $conf->get( 'CommentTableSchemaMigrationStage' ) === MIGRATION_OLD;
$enablePartialBlocks = $conf->get( 'EnablePartialBlocks' );
$a = [];
'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',
];
'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
],
'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',
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 );
}
}
}
$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'] );
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
$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' ];
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 );
}
$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
* @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() );
}