Fix for ArticleRevisionViewCustom hook in DifferenceEngine.php
[lhc/web/wiklou.git] / includes / diff / DifferenceEngine.php
index 9723d5a..4235488 100644 (file)
@@ -22,7 +22,6 @@
  */
 
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Permissions\PermissionManager;
 use MediaWiki\Revision\RevisionRecord;
 use MediaWiki\Revision\SlotRecord;
 use MediaWiki\Storage\NameTableAccessException;
@@ -542,10 +541,10 @@ class DifferenceEngine extends ContextSource {
 
                        $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
 
-                       if ( $samePage && $this->mNewPage && $permissionManager->userCan(
-                               'edit', $user, $this->mNewPage, PermissionManager::RIGOR_QUICK
+                       if ( $samePage && $this->mNewPage && $permissionManager->quickUserCan(
+                               'edit', $user, $this->mNewPage
                        ) ) {
-                               if ( $this->mNewRev->isCurrent() && $permissionManager->userCan(
+                               if ( $this->mNewRev->isCurrent() && $permissionManager->quickUserCan(
                                        'rollback', $user, $this->mNewPage
                                ) ) {
                                        $rollbackLink = Linker::generateRollback( $this->mNewRev, $this->getContext(),
@@ -766,12 +765,14 @@ class DifferenceEngine extends ContextSource {
        protected function getMarkPatrolledLinkInfo() {
                $user = $this->getUser();
                $config = $this->getConfig();
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
 
                // Prepare a change patrol link, if applicable
                if (
                        // Is patrolling enabled and the user allowed to?
                        $config->get( 'UseRCPatrol' ) &&
-                       $this->mNewPage && $this->mNewPage->quickUserCan( 'patrol', $user ) &&
+                       $this->mNewPage &&
+                       $permissionManager->quickUserCan( 'patrol', $user, $this->mNewPage ) &&
                        // Only do this if the revision isn't more than 6 hours older
                        // than the Max RC age (6h because the RC might not be cleaned out regularly)
                        RecentChange::isInRCLifespan( $this->mNewRev->getTimestamp(), 21600 )
@@ -804,8 +805,7 @@ class DifferenceEngine extends ContextSource {
                        // Build the link
                        if ( $rcid ) {
                                $this->getOutput()->preventClickjacking();
-                               if ( MediaWikiServices::getInstance()->getPermissionManager()
-                                               ->userHasRight( $user, 'writeapi' ) ) {
+                               if ( $permissionManager->userHasRight( $user, 'writeapi' ) ) {
                                        $this->getOutput()->addModules( 'mediawiki.page.patrol.ajax' );
                                }
 
@@ -869,7 +869,7 @@ class DifferenceEngine extends ContextSource {
                        $out->setArticleFlag( true );
 
                        if ( !Hooks::run( 'ArticleRevisionViewCustom',
-                               [ $this->mNewRev->getRevisionRecord(), $this->mNewPage, $out ] )
+                               [ $this->mNewRev->getRevisionRecord(), $this->mNewPage, $this->mOldid, $out ] )
                        ) {
                                // Handled by extension
                                // NOTE: sync with hooks called in Article::view()
@@ -900,7 +900,11 @@ class DifferenceEngine extends ContextSource {
                                        ) {
                                                $out->addParserOutput( $parserOutput, [
                                                        'enableSectionEditLinks' => $this->mNewRev->isCurrent()
-                                                               && $this->mNewRev->getTitle()->quickUserCan( 'edit', $this->getUser() ),
+                                                               && MediaWikiServices::getInstance()->getPermissionManager()->quickUserCan(
+                                                                       'edit',
+                                                                       $this->getUser(),
+                                                                       $this->mNewRev->getTitle()
+                                                               )
                                                ] );
                                        }
                                }
@@ -1284,35 +1288,32 @@ class DifferenceEngine extends ContextSource {
        }
 
        /**
-        * Process $wgExternalDiffEngine and get a sane, usable engine
+        * Process ExternalDiffEngine config and get a sane, usable engine
         *
         * @return bool|string 'wikidiff2', path to an executable, or false
         * @internal For use by this class and TextSlotDiffRenderer only.
         */
        public static function getEngine() {
-               global $wgExternalDiffEngine;
-               // We use the global here instead of Config because we write to the value,
-               // and Config is not mutable.
-               if ( $wgExternalDiffEngine == 'wikidiff' || $wgExternalDiffEngine == 'wikidiff3' ) {
-                       wfDeprecated( "\$wgExternalDiffEngine = '{$wgExternalDiffEngine}'", '1.27' );
-                       $wgExternalDiffEngine = false;
-               } elseif ( $wgExternalDiffEngine == 'wikidiff2' ) {
-                       wfDeprecated( "\$wgExternalDiffEngine = '{$wgExternalDiffEngine}'", '1.32' );
-                       $wgExternalDiffEngine = false;
-               } elseif ( !is_string( $wgExternalDiffEngine ) && $wgExternalDiffEngine !== false ) {
-                       // And prevent people from shooting themselves in the foot...
-                       wfWarn( '$wgExternalDiffEngine is set to a non-string value, forcing it to false' );
-                       $wgExternalDiffEngine = false;
-               }
-
-               if ( is_string( $wgExternalDiffEngine ) && is_executable( $wgExternalDiffEngine ) ) {
-                       return $wgExternalDiffEngine;
-               } elseif ( $wgExternalDiffEngine === false && function_exists( 'wikidiff2_do_diff' ) ) {
+               $externalDiffEngine = MediaWikiServices::getInstance()->getMainConfig()
+                       ->get( 'ExternalDiffEngine' );
+
+               if ( $externalDiffEngine ) {
+                       if ( is_string( $externalDiffEngine ) ) {
+                               if ( is_executable( $externalDiffEngine ) ) {
+                                       return $externalDiffEngine;
+                               }
+                               wfDebug( 'ExternalDiffEngine config points to a non-executable, ignoring' );
+                       } else {
+                               wfWarn( 'ExternalDiffEngine config is set to a non-string value, ignoring' );
+                       }
+               }
+
+               if ( function_exists( 'wikidiff2_do_diff' ) ) {
                        return 'wikidiff2';
-               } else {
-                       // Native PHP
-                       return false;
                }
+
+               // Native PHP
+               return false;
        }
 
        /**
@@ -1507,10 +1508,6 @@ class DifferenceEngine extends ContextSource {
        private function userCanEdit( Revision $rev ) {
                $user = $this->getUser();
 
-               if ( !$rev->getContentHandler()->supportsDirectEditing() ) {
-                       return false;
-               }
-
                if ( !$rev->userCan( RevisionRecord::DELETED_TEXT, $user ) ) {
                        return false;
                }
@@ -1557,7 +1554,8 @@ class DifferenceEngine extends ContextSource {
                                $editQuery['oldid'] = $rev->getId();
                        }
 
-                       $key = $title->quickUserCan( 'edit', $user ) ? 'editold' : 'viewsourceold';
+                       $key = MediaWikiServices::getInstance()->getPermissionManager()
+                               ->quickUserCan( 'edit', $user, $title ) ? 'editold' : 'viewsourceold';
                        $msg = $this->msg( $key )->escaped();
                        $editLink = $this->msg( 'parentheses' )->rawParams(
                                Linker::linkKnown( $title, $msg, [], $editQuery ) )->escaped();
@@ -1712,14 +1710,29 @@ class DifferenceEngine extends ContextSource {
         *     false signifies that there is no previous/next revision ($old is the oldest/newest one).
         */
        public function mapDiffPrevNext( $old, $new ) {
+               $rl = MediaWikiServices::getInstance()->getRevisionLookup();
                if ( $new === 'prev' ) {
                        // Show diff between revision $old and the previous one. Get previous one from DB.
                        $newid = intval( $old );
-                       $oldid = $this->getTitle()->getPreviousRevisionID( $newid );
+                       $oldid = false;
+                       $newRev = $rl->getRevisionById( $newid );
+                       if ( $newRev ) {
+                               $oldRev = $rl->getPreviousRevision( $newRev );
+                               if ( $oldRev ) {
+                                       $oldid = $oldRev->getId();
+                               }
+                       }
                } elseif ( $new === 'next' ) {
                        // Show diff between revision $old and the next one. Get next one from DB.
                        $oldid = intval( $old );
-                       $newid = $this->getTitle()->getNextRevisionID( $oldid );
+                       $newid = false;
+                       $oldRev = $rl->getRevisionById( $oldid );
+                       if ( $oldRev ) {
+                               $newRev = $rl->getNextRevision( $oldRev );
+                               if ( $newRev ) {
+                                       $newid = $newRev->getId();
+                               }
+                       }
                } else {
                        $oldid = intval( $old );
                        $newid = intval( $new );