From 8027310503e4a0d43f611f128177937d3a18fc2a Mon Sep 17 00:00:00 2001 From: Raimond Spekking Date: Thu, 21 Jun 2007 15:51:28 +0000 Subject: [PATCH] * (bug 9415) Added options to Special:Protect to allow setting of per-page robot policies. This can be done only by users with the 'editrobots' permission Based on a patch of AmiDaniel --- RELEASE-NOTES | 2 ++ includes/Article.php | 7 +++++- includes/DefaultSettings.php | 1 + includes/ProtectionForm.php | 39 ++++++++++++++++++++++++++----- includes/Title.php | 3 +++ languages/messages/MessagesDe.php | 1 + languages/messages/MessagesEn.php | 1 + maintenance/language/messages.inc | 1 + 8 files changed, 48 insertions(+), 7 deletions(-) diff --git a/RELEASE-NOTES b/RELEASE-NOTES index d739a0094b..ca3f8b2330 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -95,6 +95,8 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN * Throw a showstopper exception when a hook function fails to return a value. Forgetting to give a 'true' return value is a very common error which tends to cause hard-to-track-down interactions between extensions. +* (bug 9415) Added options to Special:Protect to allow setting of per-page robot + policies. This can be done only by users with the 'editrobots' permission == Bugfixes since 1.10 == diff --git a/includes/Article.php b/includes/Article.php index ddf5b25d8b..286e97fdd5 100644 --- a/includes/Article.php +++ b/includes/Article.php @@ -641,6 +641,8 @@ class Article { } elseif( isset( $wgNamespaceRobotPolicies[$ns] ) ) { # Honour customised robot policies for this namespace $policy = $wgNamespaceRobotPolicies[$ns]; + } elseif ( $this->mTitle->getRestrictions( 'robots' ) ) { + $policy = implode( ',', $this->mTitle->getRestrictions( 'robots' ) ); } else { # Default to encourage indexing and following links $policy = 'index,follow'; @@ -1675,6 +1677,7 @@ class Article { $current = array(); foreach( $wgRestrictionTypes as $action ) $current[$action] = implode( '', $this->mTitle->getRestrictions( $action ) ); + $current['robots'] = implode( '', $this->mTitle->getRestrictions( 'robots' ) ); $current = Article::flattenRestrictions( $current ); $updated = Article::flattenRestrictions( $limit ); @@ -1710,7 +1713,9 @@ class Article { foreach( $limit as $action => $restrictions ) { # Check if the group level required to edit also can protect pages # Otherwise, people who cannot normally protect can "protect" pages via transclusion - $cascade = ( $cascade && isset($wgGroupPermissions[$restrictions]['protect']) && $wgGroupPermissions[$restrictions]['protect'] ); + if ( in_array( $restrictions, $wgRestrictionTypes ) ) { + $cascade = ( $cascade && isset($wgGroupPermissions[$restrictions]['protect']) && $wgGroupPermissions[$restrictions]['protect'] ); + } } $cascade_description = ''; diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php index 6315c4d8c9..2c28d13d22 100644 --- a/includes/DefaultSettings.php +++ b/includes/DefaultSettings.php @@ -1063,6 +1063,7 @@ $wgGroupPermissions['sysop']['autoconfirmed'] = true; $wgGroupPermissions['sysop']['upload_by_url'] = true; $wgGroupPermissions['sysop']['ipblock-exempt'] = true; $wgGroupPermissions['sysop']['blockemail'] = true; +$wgGroupPermissions['sysop']['editrobots'] = true; // Permission to change users' group assignments $wgGroupPermissions['bureaucrat']['userrights'] = true; diff --git a/includes/ProtectionForm.php b/includes/ProtectionForm.php index 22533ef2a9..c8bb191ce8 100644 --- a/includes/ProtectionForm.php +++ b/includes/ProtectionForm.php @@ -43,6 +43,7 @@ class ProtectionForm { // but the db allows multiples separated by commas. $this->mRestrictions[$action] = implode( '', $this->mTitle->getRestrictions( $action ) ); } + $this->mRestrictions['robots'] = implode( ',', $this->mTitle->getRestrictions( 'robots' ) ); $this->mCascade = $this->mTitle->areRestrictionsCascading(); @@ -72,9 +73,17 @@ class ProtectionForm { $this->mRestrictions[$action] = $val; } } + + // Read checkboxex only if user is allowed to change robots policy, otherwise keep previous policy + if ( $wgUser->isAllowed( 'editrobots' ) ) { + $robotspolicy = $wgRequest->getBool( 'mwProtect-robots-noindex' ) ? 'noindex' : 'index'; + $robotspolicy .= $wgRequest->getBool( 'mwProtect-robots-nofollow' ) ? ',nofollow' : ',follow'; + // 'index,follow' is default, no need to set this explicitly at this point; is done at Article::View + $this->mRestrictions['robots'] = ( $robotspolicy == 'index,follow' ) ? '' : $robotspolicy; + } } } - + function execute() { global $wgRequest; if( $wgRequest->wasPosted() ) { @@ -199,7 +208,7 @@ class ProtectionForm { } function buildForm() { - global $wgUser; + global $wgUser, $wgRestrictionTypes; $out = ''; if( !$this->disabled ) { @@ -223,14 +232,17 @@ class ProtectionForm { $out .= "\n"; foreach( $this->mRestrictions as $action => $required ) { /* Not all languages have V_x <-> N_x relation */ - $out .= "" . wfMsgHtml( 'restriction-' . $action ) . "\n"; + if ( in_array( $action, $wgRestrictionTypes ) ) + $out .= "" . wfMsgHtml( 'restriction-' . $action ) . "\n"; } $out .= "\n"; $out .= "\n"; foreach( $this->mRestrictions as $action => $selected ) { - $out .= "\n"; - $out .= $this->buildSelector( $action, $selected ); - $out .= "\n"; + if ( in_array( $action, $wgRestrictionTypes ) ) { + $out .= "\n"; + $out .= $this->buildSelector( $action, $selected ); + $out .= "\n"; + } } $out .= "\n"; @@ -249,6 +261,7 @@ class ProtectionForm { if( !$this->disabled ) $out .= '' . $this->buildWatchInput() . "\n"; + $out .= $this->buildRobotsInput(); $out .= $this->buildExpiryInput(); if( !$this->disabled ) { @@ -317,6 +330,20 @@ class ProtectionForm { return $ci; } + function buildRobotsInput() { + global $wgUser; + $robotsallowed = $wgUser->isAllowed( 'editrobots' ) ? array() : array( 'disabled' => 'disabled' ); + $noindexset = ( isset( $this->mRestrictions['robots'] ) && strstr( $this->mRestrictions['robots'], 'noindex' ) ) ? true : false; + $nofollowset = ( isset( $this->mRestrictions['robots'] ) && strstr( $this->mRestrictions['robots'], 'nofollow' ) ) ? true : false; + $ret = ""; + $ret .= Xml::label( wfMsg( 'protect-robotspolicy' ), 'mwProtect-robots-label' ); + $ret .= " "; + $ret .= Xml::checkLabel( 'noindex', 'mwProtect-robots-noindex', 'mwProtect-robots-noindex', $noindexset, $robotsallowed ); + $ret .= Xml::checkLabel( 'nofollow', 'mwProtect-robots-nofollow', 'mwProtect-robots-nofollow', $nofollowset, $robotsallowed ); + $ret .= ""; + return $ret; + } + function buildExpiryInput() { $attribs = array( 'id' => 'expires' ) + $this->disabledAttrib; return '' diff --git a/includes/Title.php b/includes/Title.php index 8a21ab3954..b875f855c0 100644 --- a/includes/Title.php +++ b/includes/Title.php @@ -940,6 +940,9 @@ class Title { if( $this->getNamespace() == NS_SPECIAL ) return true; + if ( $this->getRestrictions( 'robots' ) && $this->getRestrictions( 'robots' ) != '' ) + return true; + # Check regular protection levels if( $action == 'edit' || $action == '' ) { $r = $this->getRestrictions( 'edit' ); diff --git a/languages/messages/MessagesDe.php b/languages/messages/MessagesDe.php index b0846a62c3..ab20739af3 100644 --- a/languages/messages/MessagesDe.php +++ b/languages/messages/MessagesDe.php @@ -1442,6 +1442,7 @@ Bitte gehen Sie zurück und versuchen den Vorgang erneut auszuführen.', 'protect-summary-cascade' => 'kaskadierend', 'protect-expiring' => 'bis $1 (UTC)', 'protect-cascade' => 'Kaskadierende Sperre – alle in diese Seite eingebundenen Vorlagen werden ebenfalls gesperrt.', +'protect-robotspolicy' => 'Anweisung für Suchroboter:', 'restriction-type' => 'Schutzstatus', 'restriction-level' => 'Schutzhöhe', 'minimum-size' => 'Mindestgröße:', diff --git a/languages/messages/MessagesEn.php b/languages/messages/MessagesEn.php index c25e3cf68e..984554ab91 100644 --- a/languages/messages/MessagesEn.php +++ b/languages/messages/MessagesEn.php @@ -1839,6 +1839,7 @@ Here are the current settings for the page $1:', 'protect-summary-cascade' => 'cascading', 'protect-expiring' => 'expires $1 (UTC)', 'protect-cascade' => 'Protect pages included in this page (cascading protection)', +'protect-robotspolicy' => 'Robot policy:', 'restriction-type' => 'Permission:', 'restriction-level' => 'Restriction level:', 'minimum-size' => 'Min size', diff --git a/maintenance/language/messages.inc b/maintenance/language/messages.inc index 0707ba2bb9..8c9c74f5f7 100644 --- a/maintenance/language/messages.inc +++ b/maintenance/language/messages.inc @@ -1182,6 +1182,7 @@ $wgMessageStructure = array( 'protect-summary-cascade', 'protect-expiring', 'protect-cascade', + 'protect-robotspolicy', 'restriction-type', 'restriction-level', 'minimum-size', -- 2.20.1