X-Git-Url: http://git.cyclocoop.org/?a=blobdiff_plain;f=includes%2FTitle.php;h=7fdeb055113dce7d77a663e3954438c2bd24acf7;hb=1e78807f0d2b42fa4c9e788a1b7cca6d39f0e842;hp=a1b2352f5e111f7f4f7affef82bc86deb6b60402;hpb=bda0f626aabfb9e25d515e41bd9a3cfe6c849c80;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/Title.php b/includes/Title.php index a1b2352f5e..7fdeb05511 100644 --- a/includes/Title.php +++ b/includes/Title.php @@ -158,6 +158,9 @@ class Title { /** @var TitleValue A corresponding TitleValue object */ private $mTitleValue = null; + + /** @var bool Would deleting this page be a big deletion? */ + private $mIsBigDeletion = null; // @} /** @@ -941,10 +944,12 @@ class Title { * Get the page's content model id, see the CONTENT_MODEL_XXX constants. * * @throws MWException + * @param int $flags A bit field; may be Title::GAID_FOR_UPDATE to select for update * @return string Content model id */ - public function getContentModel() { - if ( !$this->mContentModel ) { + public function getContentModel( $flags = 0 ) { + # Calling getArticleID() loads the field from cache as needed + if ( !$this->mContentModel && $this->getArticleID( $flags ) ) { $linkCache = LinkCache::singleton(); $this->mContentModel = $linkCache->getGoodLinkFieldObj( $this, 'model' ); } @@ -2075,7 +2080,7 @@ class Title { $ns = $this->mNamespace == NS_MAIN ? wfMessage( 'nstab-main' )->text() : $this->getNsText(); $errors[] = $this->mNamespace == NS_MEDIAWIKI ? - array( 'protectedinterface' ) : array( 'namespaceprotected', $ns ); + array( 'protectedinterface', $action ) : array( 'namespaceprotected', $ns, $action ); } return $errors; @@ -2099,15 +2104,15 @@ class Title { if ( $action != 'patrol' && !$user->isAllowed( 'editusercssjs' ) ) { if ( preg_match( '/^' . preg_quote( $user->getName(), '/' ) . '\//', $this->mTextform ) ) { if ( $this->isCssSubpage() && !$user->isAllowedAny( 'editmyusercss', 'editusercss' ) ) { - $errors[] = array( 'mycustomcssprotected' ); + $errors[] = array( 'mycustomcssprotected', $action ); } elseif ( $this->isJsSubpage() && !$user->isAllowedAny( 'editmyuserjs', 'edituserjs' ) ) { - $errors[] = array( 'mycustomjsprotected' ); + $errors[] = array( 'mycustomjsprotected', $action ); } } else { if ( $this->isCssSubpage() && !$user->isAllowed( 'editusercss' ) ) { - $errors[] = array( 'customcssprotected' ); + $errors[] = array( 'customcssprotected', $action ); } elseif ( $this->isJsSubpage() && !$user->isAllowed( 'edituserjs' ) ) { - $errors[] = array( 'customjsprotected' ); + $errors[] = array( 'customjsprotected', $action ); } } } @@ -2142,9 +2147,9 @@ class Title { continue; } if ( !$user->isAllowed( $right ) ) { - $errors[] = array( 'protectedpagetext', $right ); + $errors[] = array( 'protectedpagetext', $right, $action ); } elseif ( $this->mCascadeRestriction && !$user->isAllowed( 'protect' ) ) { - $errors[] = array( 'protectedpagetext', 'protect' ); + $errors[] = array( 'protectedpagetext', 'protect', $action ); } } @@ -2191,7 +2196,7 @@ class Title { foreach ( $cascadingSources as $page ) { $pages .= '* [[:' . $page->getPrefixedText() . "]]\n"; } - $errors[] = array( 'cascadeprotected', count( $cascadingSources ), $pages ); + $errors[] = array( 'cascadeprotected', count( $cascadingSources ), $pages, $action ); } } } @@ -2258,11 +2263,15 @@ class Title { $errors[] = array( 'immobile-target-page' ); } } elseif ( $action == 'delete' ) { - if ( count( $this->getUserPermissionsErrorsInternal( 'edit', - $user, $doExpensiveQueries, true ) ) - ) { - // If they can't edit, they shouldn't delete. - $errors[] = array( 'delete-cantedit' ); + $tempErrors = $this->checkPageRestrictions( 'edit', + $user, array(), $doExpensiveQueries, true ); + if ( !$tempErrors ) { + $tempErrors = $this->checkCascadingSourcesRestrictions( 'edit', + $user, $tempErrors, $doExpensiveQueries, true ); + } + if ( $tempErrors ) { + // If protection keeps them from editing, they shouldn't be able to delete. + $errors[] = array( 'deleteprotected' ); } if ( $doExpensiveQueries && $wgDeleteRevisionsLimit && !$this->userCan( 'bigdelete', $user ) && $this->isBigDeletion() @@ -2437,6 +2446,19 @@ class Title { 'checkPermissionHooks', 'checkReadPermissions', ); + # Don't call checkSpecialsAndNSPermissions or checkCSSandJSPermissions + # here as it will lead to duplicate error messages. This is okay to do + # since anywhere that checks for create will also check for edit, and + # those checks are called for edit. + } elseif ( $action == 'create' ) { + $checks = array( + 'checkQuickPermissions', + 'checkPermissionHooks', + 'checkPageRestrictions', + 'checkCascadingSourcesRestrictions', + 'checkActionPermissions', + 'checkUserBlock' + ); } else { $checks = array( 'checkQuickPermissions', @@ -3258,6 +3280,7 @@ class Title { $this->mEstimateRevisions = null; $this->mPageLanguage = false; $this->mDbPageLanguage = null; + $this->mIsBigDeletion = null; } /** @@ -3300,8 +3323,8 @@ class Title { // @note: splitTitleString() is a temporary hack to allow MediaWikiTitleCodec to share // the parsing code with Title, while avoiding massive refactoring. // @todo: get rid of secureAndSplit, refactor parsing code. - $parser = self::getTitleParser(); - $parts = $parser->splitTitleString( $dbkey, $this->getDefaultNamespace() ); + $titleParser = self::getTitleParser(); + $parts = $titleParser->splitTitleString( $dbkey, $this->getDefaultNamespace() ); } catch ( MalformedTitleException $ex ) { return false; } @@ -4364,12 +4387,32 @@ class Title { return false; } - $revCount = $this->estimateRevisionCount(); - return $revCount > $wgDeleteRevisionsLimit; + if ( $this->mIsBigDeletion === null ) { + $dbr = wfGetDB( DB_SLAVE ); + + $innerQuery = $dbr->selectSQLText( + 'revision', + '1', + array( 'rev_page' => $this->getArticleID() ), + __METHOD__, + array( 'LIMIT' => $wgDeleteRevisionsLimit + 1 ) + ); + + $revCount = $dbr->query( + 'SELECT COUNT(*) FROM (' . $innerQuery . ') AS innerQuery', + __METHOD__ + ); + $revCount = $revCount->fetchRow(); + $revCount = $revCount['COUNT(*)']; + + $this->mIsBigDeletion = $revCount > $wgDeleteRevisionsLimit; + } + + return $this->mIsBigDeletion; } /** - * Get the approximate revision count of this page. + * Get the approximate revision count of this page. * * @return int */