From: Brad Jorsch Date: Sat, 4 Feb 2017 15:22:01 +0000 (-0500) Subject: Fix Title::loadRestrictions() for create-protected titles X-Git-Tag: 1.31.0-rc.0~3882^2 X-Git-Url: http://git.cyclocoop.org/%22%20.%20generer_url_ecrire%28%22suivi_revisions%22%29%20.%20%22?a=commitdiff_plain;h=e89b499351c5d581522bbdc933f8a1cad91c0b31;p=lhc%2Fweb%2Fwiklou.git Fix Title::loadRestrictions() for create-protected titles Title::loadRestrictions() returns restriction levels, not the corresponding user rights. These are mostly identical except for the backwards-compatibility levels "sysop" and "autoconfirmed". For create protection it calls Title::getTitleProtection() to fetch them, but Ic5026384 changed that to return rights. Split that function into two, an internal method that returns restriction levels for loadRestrictions() to call and the public method that converts levels into rights. Bug: T85108 Change-Id: I3ea4cb9c5e37b746402744dd7a883763ee07195a --- diff --git a/includes/Title.php b/includes/Title.php index 13a6f56206..3ed6b8bb6e 100644 --- a/includes/Title.php +++ b/includes/Title.php @@ -2549,6 +2549,29 @@ class Title implements LinkTarget { * protection, or false if there's none. */ public function getTitleProtection() { + $protection = $this->getTitleProtectionInternal(); + if ( $protection ) { + if ( $protection['permission'] == 'sysop' ) { + $protection['permission'] = 'editprotected'; // B/C + } + if ( $protection['permission'] == 'autoconfirmed' ) { + $protection['permission'] = 'editsemiprotected'; // B/C + } + } + return $protection; + } + + /** + * Fetch title protection settings + * + * To work correctly, $this->loadRestrictions() needs to have access to the + * actual protections in the database without munging 'sysop' => + * 'editprotected' and 'autoconfirmed' => 'editsemiprotected'. Other + * callers probably want $this->getTitleProtection() instead. + * + * @return array|bool + */ + protected function getTitleProtectionInternal() { // Can't protect pages in special namespaces if ( $this->getNamespace() < 0 ) { return false; @@ -2576,12 +2599,6 @@ class Title implements LinkTarget { // fetchRow returns false if there are no rows. $row = $dbr->fetchRow( $res ); if ( $row ) { - if ( $row['permission'] == 'sysop' ) { - $row['permission'] = 'editprotected'; // B/C - } - if ( $row['permission'] == 'autoconfirmed' ) { - $row['permission'] = 'editsemiprotected'; // B/C - } $row['expiry'] = $dbr->decodeExpiry( $row['expiry'] ); } $this->mTitleProtection = $row; @@ -2979,7 +2996,7 @@ class Title implements LinkTarget { $this->loadRestrictionsFromRows( $rows, $oldFashionedRestrictions ); } else { - $title_protection = $this->getTitleProtection(); + $title_protection = $this->getTitleProtectionInternal(); if ( $title_protection ) { $now = wfTimestampNow();