Refactored unmaintainable userCan() code by making central userCanBitfield() functions
authorAaron Schulz <aaron@users.mediawiki.org>
Thu, 15 Oct 2009 11:31:33 +0000 (11:31 +0000)
committerAaron Schulz <aaron@users.mediawiki.org>
Thu, 15 Oct 2009 11:31:33 +0000 (11:31 +0000)
includes/ChangesList.php
includes/LogEventsList.php
includes/Revision.php
includes/filerepo/ArchivedFile.php
includes/filerepo/OldLocalFile.php
includes/specials/SpecialLog.php

index 1126c53..70a5dcb 100644 (file)
@@ -446,20 +446,10 @@ class ChangesList {
         * @return bool
         */
        public static function userCan( $rc, $field ) {
-               if( $rc->mAttribs['rc_deleted'] & $field ) {
-                       global $wgUser;
-                       $permission = '';
-                       if ( $rc->mAttribs['rc_deleted'] & Revision::DELETED_RESTRICTED ) {
-                               $permission = 'suppressrevision';
-                       } elseif ( $field & Revision::DELETED_TEXT ) {
-                               $permission = 'deletedtext';
-                       } else {
-                               $permission = 'deletedhistory';
-                       }
-                       wfDebug( "Checking for $permission due to $field match on {$rc->mAttribs['rc_deleted']}\n" );
-                       return $wgUser->isAllowed( $permission );
+               if( $rc->mAttribs['rc_type'] == RC_LOG ) {
+                       return LogEventsList::userCanBitfield( $rc->mAttribs['rc_deleted'], $field );
                } else {
-                       return true;
+                       return Revision::userCanBitfield( $rc->mAttribs['rc_deleted'], $field );
                }
        }
 
index 216a40e..83c3eb7 100644 (file)
@@ -552,15 +552,26 @@ class LogEventsList {
         * @return Boolean
         */
        public static function userCan( $row, $field ) {
-               if( $row->log_deleted & $field ) {
+               return self::userCanBitfield( $row->log_deleted, $field );
+       }
+       
+       /**
+        * Determine if the current user is allowed to view a particular
+        * field of this log row, if it's marked as deleted.
+        * @param $bitfield Integer (current field)
+        * @param $field Integer
+        * @return Boolean
+        */
+       public static function userCanBitfield( $bitfield, $field ) {
+               if( $bitfield & $field ) {
                        global $wgUser;
                        $permission = '';
-                       if ( $row->log_deleted & LogPage::DELETED_RESTRICTED ) {
+                       if ( $bitfield & LogPage::DELETED_RESTRICTED ) {
                                $permission = 'suppressrevision';
                        } else {
                                $permission = 'deletedhistory';
                        }
-                       wfDebug( "Checking for $permission due to $field match on $row->log_deleted\n" );
+                       wfDebug( "Checking for $permission due to $field match on $bitfield\n" );
                        return $wgUser->isAllowed( $permission );
                } else {
                        return true;
index b7fb269..c4f8d61 100644 (file)
@@ -977,24 +977,37 @@ class Revision {
         * @return bool
         */
        public function userCan( $field ) {
-               if( $this->mDeleted & $field ) {
+               return self::userCanBitfield( $this->mDeleted, $field );
+       }
+
+       /**
+        * Determine if the current user is allowed to view a particular
+        * field of this revision, if it's marked as deleted. This is used
+        * by various classes to avoid duplication.
+        * @param int $bitfield (current field)
+        * @param int $field one of self::DELETED_TEXT = File::DELETED_FILE,
+        *                          self::DELETED_COMMENT = File::DELETED_COMMENT,
+        *                          self::DELETED_USER = File::DELETED_USER
+        * @return bool
+        */
+       public static function userCanBitfield( $bitfield, $field ) {
+               if( $bitfield & $field ) { // aspect is deleted
                        global $wgUser;
                        $permission = '';
-                       if ( $this->mDeleted & self::DELETED_RESTRICTED ) {
+                       if ( $bitfield & self::DELETED_RESTRICTED ) {
                                $permission = 'suppressrevision';
                        } elseif ( $field & self::DELETED_TEXT ) {
                                $permission = 'deletedtext';
                        } else {
                                $permission = 'deletedhistory';
                        }
-                       wfDebug( "Checking for $permission due to $field match on $this->mDeleted\n" );
+                       wfDebug( "Checking for $permission due to $field match on $bitfield\n" );
                        return $wgUser->isAllowed( $permission );
                } else {
                        return true;
                }
        }
 
-
        /**
         * Get rev_timestamp from rev_id, without loading the rest of the row
         * @param Title $title
index ebee2b6..4e9d554 100644 (file)
@@ -377,20 +377,6 @@ class ArchivedFile
         */
        public function userCan( $field ) {
                $this->load();
-               if( $this->deleted & $field ) {
-                       global $wgUser;
-                       $permission = '';
-                       if ( $this->deleted & File::DELETED_RESTRICTED ) {
-                               $permission = 'suppressrevision';
-                       } elseif ( $field & File::DELETED_FILE ) {
-                               $permission = 'deletedtext';
-                       } else {
-                               $permission = 'deletedhistory';
-                       }
-                       wfDebug( "Checking for $permission due to $field match on $this->deleted\n" );
-                       return $wgUser->isAllowed( $permission );
-               } else {
-                       return true;
-               }
+               return Revision::userCanBitfield( $this->deleted, $field );
        }
 }
index d2d78c9..35f3f9f 100644 (file)
@@ -198,20 +198,6 @@ class OldLocalFile extends LocalFile {
         */
        function userCan( $field ) {
                $this->load();
-               if( isset($this->deleted) && ($this->deleted & $field) ) {
-                       global $wgUser;
-                       $permission = '';
-                       if ( $this->deleted & File::DELETED_RESTRICTED ) {
-                               $permission = 'suppressrevision';
-                       } elseif ( $field & File::DELETED_FILE ) {
-                               $permission = 'deletedtext';
-                       } else {
-                               $permission = 'deletedhistory';
-                       }
-                       wfDebug( "Checking for $permission due to $field match on $this->mDeleted\n" );
-                       return $wgUser->isAllowed( $permission );
-               } else {
-                       return true;
-               }
+               return Revision::userCanBitfield( $this->deleted, $field );
        }
 }
index d1ccc8c..700cd59 100644 (file)
@@ -60,6 +60,8 @@ function wfSpecialLog( $par = '' ) {
                        $qc = array( 'ls_field' => 'target_author_id', 'ls_value' => $offender->getId() );
                } else if( $offender && IP::isIPAddress( $offender->getName() ) ) {
                        $qc = array( 'ls_field' => 'target_author_ip', 'ls_value' => $offender->getName() );
+               } else {
+                       $qc = array( "1 = 0" ); // empty
                }
        }
        # Create a LogPager item to get the results and a LogEventsList item to format them...