Fix numerous class/function casing
[lhc/web/wiklou.git] / includes / specials / SpecialRedirect.php
index 72d21eb..c0ed4c9 100644 (file)
@@ -99,18 +99,18 @@ class SpecialRedirect extends FormSpecialPage {
                        return null;
                }
                // Default behavior: Use the direct link to the file.
-               $url = $file->getURL();
+               $url = $file->getUrl();
                $request = $this->getRequest();
                $width = $request->getInt( 'width', -1 );
                $height = $request->getInt( 'height', -1 );
 
                // If a width is requested...
                if ( $width != -1 ) {
-                       $mto = $file->transform( array( 'width' => $width, 'height' => $height ) );
+                       $mto = $file->transform( [ 'width' => $width, 'height' => $height ] );
                        // ... and we can
                        if ( $mto && !$mto->isError() ) {
                                // ... change the URL to point to a thumbnail.
-                               $url = $mto->getURL();
+                               $url = $mto->getUrl();
                        }
                }
 
@@ -133,9 +133,9 @@ class SpecialRedirect extends FormSpecialPage {
                        return null;
                }
 
-               return wfAppendQuery( wfScript( 'index' ), array(
+               return wfAppendQuery( wfScript( 'index' ), [
                        'oldid' => $oldid
-               ) );
+               ] );
        }
 
        /**
@@ -153,9 +153,96 @@ class SpecialRedirect extends FormSpecialPage {
                        return null;
                }
 
-               return wfAppendQuery( wfScript( 'index' ), array(
+               return wfAppendQuery( wfScript( 'index' ), [
                        'curid' => $curid
-               ) );
+               ] );
+       }
+
+       /**
+        * Handle Special:Redirect/logid/xxx
+        * (by redirecting to index.php?title=Special:Log)
+        *
+        * @since 1.27
+        * @return string|null Url to redirect to, or null if $mValue is invalid.
+        */
+       function dispatchLog() {
+               $logid = $this->mValue;
+               if ( !ctype_digit( $logid ) ) {
+                       return null;
+               }
+               $logid = (int)$logid;
+               if ( $logid === 0 ) {
+                       return null;
+               }
+
+               $logparams = [
+                       'log_id',
+                       'log_timestamp',
+                       'log_type',
+                       'log_user_text',
+               ];
+
+               $dbr = wfGetDB( DB_SLAVE );
+
+               // Gets the nested SQL statement which
+               // returns timestamp of the log with the given log ID
+               $inner = $dbr->selectSQLText(
+                       'logging',
+                       [ 'log_timestamp' ],
+                       [ 'log_id' => $logid ]
+               );
+
+               // Returns all fields mentioned in $logparams of the logs
+               // with the same timestamp as the one returned by the statement above
+               $logsSameTimestamps = $dbr->select(
+                       'logging',
+                       $logparams,
+                       [ "log_timestamp = ($inner)" ]
+               );
+               if ( $logsSameTimestamps->numRows() === 0 ) {
+                       return null;
+               }
+
+               // Stores the row with the same log ID as the one given
+               $rowMain = [];
+               foreach ( $logsSameTimestamps as $row ) {
+                       if ( (int)$row->log_id === $logid ) {
+                               $rowMain = $row;
+                       }
+               }
+
+               array_shift( $logparams );
+
+               // Stores all the rows with the same values in each column
+               // as $rowMain
+               foreach ( $logparams as $cond ) {
+                       $matchedRows = [];
+                       foreach ( $logsSameTimestamps as $row ) {
+                               if ( $row->$cond === $rowMain->$cond ) {
+                                       $matchedRows[] = $row;
+                               }
+                       }
+                       if ( count( $matchedRows ) === 1 ) {
+                               break;
+                       }
+                       $logsSameTimestamps = $matchedRows;
+               }
+               $query = [ 'title' => 'Special:Log', 'limit' => count( $matchedRows ) ];
+
+               // A map of database field names from table 'logging' to the values of $logparams
+               $keys = [
+                       'log_timestamp' => 'offset',
+                       'log_type' => 'type',
+                       'log_user_text' => 'user'
+               ];
+
+               foreach ( $logparams as $logKey ) {
+                       $query[$keys[$logKey]] = $matchedRows[0]->$logKey;
+               }
+               $query['offset'] = $query['offset'] + 1;
+               $url = $query;
+
+               return wfAppendQuery( wfScript( 'index' ), $url );
        }
 
        /**
@@ -181,6 +268,9 @@ class SpecialRedirect extends FormSpecialPage {
                        case 'page':
                                $url = $this->dispatchPage();
                                break;
+                       case 'logid':
+                               $url = $this->dispatchLog();
+                               break;
                        default:
                                $this->getOutput()->setStatusCode( 404 );
                                $url = null;
@@ -204,30 +294,31 @@ class SpecialRedirect extends FormSpecialPage {
 
        protected function getFormFields() {
                $mp = $this->getMessagePrefix();
-               $ns = array(
+               $ns = [
                        // subpage => message
                        // Messages: redirect-user, redirect-page, redirect-revision,
-                       // redirect-file
+                       // redirect-file, redirect-logid
                        'user' => $mp . '-user',
                        'page' => $mp . '-page',
                        'revision' => $mp . '-revision',
                        'file' => $mp . '-file',
-               );
-               $a = array();
-               $a['type'] = array(
+                       'logid' => $mp . '-logid',
+               ];
+               $a = [];
+               $a['type'] = [
                        'type' => 'select',
                        'label-message' => $mp . '-lookup', // Message: redirect-lookup
-                       'options' => array(),
+                       'options' => [],
                        'default' => current( array_keys( $ns ) ),
-               );
+               ];
                foreach ( $ns as $n => $m ) {
                        $m = $this->msg( $m )->text();
                        $a['type']['options'][$m] = $n;
                }
-               $a['value'] = array(
+               $a['value'] = [
                        'type' => 'text',
                        'label-message' => $mp . '-value' // Message: redirect-value
-               );
+               ];
                // set the defaults according to the parsed subpage path
                if ( !empty( $this->mType ) ) {
                        $a['type']['default'] = $this->mType;
@@ -268,12 +359,27 @@ class SpecialRedirect extends FormSpecialPage {
         * @return string[] subpages
         */
        protected function getSubpagesForPrefixSearch() {
-               return array(
-                       "file",
-                       "page",
-                       "revision",
-                       "user",
-               );
+               return [
+                       'file',
+                       'page',
+                       'revision',
+                       'user',
+                       'logid',
+               ];
+       }
+
+       /**
+        * @return bool
+        */
+       public function requiresWrite() {
+               return false;
+       }
+
+       /**
+        * @return bool
+        */
+       public function requiresUnblock() {
+               return false;
        }
 
        protected function getGroupName() {