From e89b499351c5d581522bbdc933f8a1cad91c0b31 Mon Sep 17 00:00:00 2001 From: Brad Jorsch Date: Sat, 4 Feb 2017 10:22:01 -0500 Subject: [PATCH] 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 --- includes/Title.php | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) 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(); -- 2.20.1