Preparations for Oracle database abstraction update.
[lhc/web/wiklou.git] / includes / FileRevertForm.php
index 68b3b67..c7c7324 100644 (file)
@@ -3,15 +3,17 @@
 /**
  * File reversion user interface
  *
- * @addtogroup Media
+ * @ingroup Media
  * @author Rob Church <robchur@gmail.com>
  */
 class FileRevertForm {
 
-       private $title = null;
-       private $file = null;
-       private $oldimage = '';
-       
+       protected $title = null;
+       protected $file = null;
+       protected $archiveName = '';
+       protected $timestamp = false;
+       protected $oldFile;
+
        /**
         * Constructor
         *
@@ -21,13 +23,13 @@ class FileRevertForm {
                $this->title = $file->getTitle();
                $this->file = $file;
        }
-       
+
        /**
         * Fulfil the request; shows the form or reverts the file,
         * pending authentication, confirmation, etc.
         */
        public function execute() {
-               global $wgOut, $wgRequest, $wgUser, $wgLang, $wgServer;
+               global $wgOut, $wgRequest, $wgUser, $wgLang;
                $this->setHeaders();
 
                if( wfReadOnly() ) {
@@ -36,148 +38,134 @@ class FileRevertForm {
                } elseif( !$wgUser->isLoggedIn() ) {
                        $wgOut->showErrorPage( 'uploadnologin', 'uploadnologintext' );
                        return;
-               } elseif( !$this->title->userCan( 'edit' ) ) {
+               } elseif( !$this->title->userCan( 'edit' ) || !$this->title->userCan( 'upload' ) ) {
                        // The standard read-only thing doesn't make a whole lot of sense
                        // here; surely it should show the image or something? -- RC
                        $article = new Article( $this->title );
                        $wgOut->readOnlyPage( $article->getContent(), true );
-                       //$wgOut->readOnlyPage( new Article( $this->title )->getContent(), true );
                        return;
                } elseif( $wgUser->isBlocked() ) {
                        $wgOut->blockedPage();
                        return;
                }
-               
-               $this->oldimage = $wgRequest->getText( 'oldimage' );
+
+               $this->archiveName = $wgRequest->getText( 'oldimage' );
                $token = $wgRequest->getText( 'wpEditToken' );
                if( !$this->isValidOldSpec() ) {
-                       $wgOut->showUnexpectedValueError( 'oldimage', htmlspecialchars( $this->oldimage ) );
+                       $wgOut->showUnexpectedValueError( 'oldimage', htmlspecialchars( $this->archiveName ) );
                        return;
                }
-               
+
                if( !$this->haveOldVersion() ) {
-                       $wgOut->addHtml( wfMsgExt( 'filerevert-badversion', 'parse' ) );
+                       $wgOut->addHTML( wfMsgExt( 'filerevert-badversion', 'parse' ) );
                        $wgOut->returnToMain( false, $this->title );
                        return;
                }
-               
+
                // Perform the reversion if appropriate
-               if( $wgRequest->wasPosted() && $wgUser->matchEditToken( $token, $this->oldimage ) ) {
-                       $source = $this->file->getArchiveVirtualUrl( $this->oldimage );
+               if( $wgRequest->wasPosted() && $wgUser->matchEditToken( $token, $this->archiveName ) ) {
+                       $source = $this->file->getArchiveVirtualUrl( $this->archiveName );
                        $comment = $wgRequest->getText( 'wpComment' );
                        // TODO: Preserve file properties from database instead of reloading from file
                        $status = $this->file->upload( $source, $comment, $comment );
                        if( $status->isGood() ) {
-                               $wgOut->addHtml( wfMsgExt( 'filerevert-success', 'parse', $this->title->getText(),
-                                       $wgLang->timeAndDate( $this->getTimestamp() ),
-                                       $wgServer . $this->file->getArchiveUrl( $this->oldimage ) ) );
+                               $wgOut->addHTML( wfMsgExt( 'filerevert-success', 'parse', $this->title->getText(),
+                                       $wgLang->date( $this->getTimestamp(), true ),
+                                       $wgLang->time( $this->getTimestamp(), true ),
+                                       wfExpandUrl( $this->file->getArchiveUrl( $this->archiveName ) ) ) );
                                $wgOut->returnToMain( false, $this->title );
                        } else {
                                $wgOut->addWikiText( $status->getWikiText() );
                        }
                        return;
                }
-               
+
                // Show the form
-               $this->showForm();              
+               $this->showForm();
        }
-       
+
        /**
         * Show the confirmation form
         */
-       private function showForm() {
-               global $wgOut, $wgUser, $wgRequest, $wgLang, $wgContLang, $wgServer;
-               
-               /*
-               $cur = wfFindFile( $this->title );
-               $old = wfFindFile( $this->title, substr( $this->oldimage, 0, 14 ) );
-                */
+       protected function showForm() {
+               global $wgOut, $wgUser, $wgRequest, $wgLang, $wgContLang;
                $timestamp = $this->getTimestamp();
 
                $form  = Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getAction() ) );
-               $form .= Xml::hidden( 'wpEditToken', $wgUser->editToken( $this->oldimage ) );
+               $form .= Xml::hidden( 'wpEditToken', $wgUser->editToken( $this->archiveName ) );
                $form .= '<fieldset><legend>' . wfMsgHtml( 'filerevert-legend' ) . '</legend>';
                $form .= wfMsgExt( 'filerevert-intro', 'parse', $this->title->getText(),
-                       $wgLang->timeAndDate( $timestamp ), $wgServer . $this->file->getArchiveUrl( $this->oldimage ) );
-               
-               /*
-                * I was going to do a little comparison (current vs. old) here,
-                * but realised it wasn't too straightforward to do a media transform
-                * with an *old* file version using the current mechanism. Leaving
-                * this here in case it becomes possible in the future. -- RC
-                *
-               $form .= '<table class="compare-files">';
-               $form .= '<tr>';
-               $form .= '<th>' . wfMsgHtml( 'filerevert-current' ) . '</th>';
-               $form .= '<th>' . wfMsgHtml( 'filerevert-old', $old->getTimestamp() ) . '</th>';
-               $form .= '</tr><tr>';
-               // FIXME: Hard-coding magic numbers makes baby Jesus cry...
-               $form .= '<td>' . $this->getThumbnail( $cur, 180 ) . '</td>';
-               $form .= '<td>' . $this->getThumbnail( $old, 180 ) . '</td>';
-               $form .= '</tr>';               
-               $form .= '</table>';
-                */
-               
+                       $wgLang->date( $timestamp, true ), $wgLang->time( $timestamp, true ),
+                       wfExpandUrl( $this->file->getArchiveUrl( $this->archiveName ) ) );
                $form .= '<p>' . Xml::inputLabel( wfMsg( 'filerevert-comment' ), 'wpComment', 'wpComment',
-                       40, wfMsgForContent( 'filerevert-defaultcomment',
-                       $wgContLang->timeAndDate( $timestamp, false, false ) ) ) . '</p>';
+                       60, wfMsgForContent( 'filerevert-defaultcomment',
+                       $wgContLang->date( $timestamp, false, false ), $wgContLang->time( $timestamp, false, false ) ) ) . '</p>';
                $form .= '<p>' . Xml::submitButton( wfMsg( 'filerevert-submit' ) ) . '</p>';
                $form .= '</fieldset>';
                $form .= '</form>';
-               
-               $wgOut->addHtml( $form );
+
+               $wgOut->addHTML( $form );
        }
-       
+
        /**
         * Set headers, titles and other bits
         */
-       private function setHeaders() {
-               global $wgOut;
+       protected function setHeaders() {
+               global $wgOut, $wgUser;
                $wgOut->setPageTitle( wfMsg( 'filerevert', $this->title->getText() ) );
                $wgOut->setRobotPolicy( 'noindex,nofollow' );
+               $wgOut->setSubtitle( wfMsg( 'filerevert-backlink', $wgUser->getSkin()->makeKnownLinkObj( $this->title ) ) );
        }
-       
+
        /**
         * Is the provided `oldimage` value valid?
         *
         * @return bool
         */
-       private function isValidOldSpec() {
-               return strlen( $this->oldimage ) >= 16
-                       && strpos( $this->oldimage, '/' ) === false
-                       && strpos( $this->oldimage, '\\' ) === false;
+       protected function isValidOldSpec() {
+               return strlen( $this->archiveName ) >= 16
+                       && strpos( $this->archiveName, '/' ) === false
+                       && strpos( $this->archiveName, '\\' ) === false;
        }
-       
+
        /**
         * Does the provided `oldimage` value correspond
         * to an existing, local, old version of this file?
         *
         * @return bool
         */
-       private function haveOldVersion() {
-               $file = wfFindFile( $this->title, $this->oldimage );
-               return $file && $file->exists() && $file->isLocal();
+       protected function haveOldVersion() {
+               return $this->getOldFile()->exists();
        }
-       
+
        /**
         * Prepare the form action
         *
         * @return string
         */
-       private function getAction() {
+       protected function getAction() {
                $q = array();
                $q[] = 'action=revert';
-               $q[] = 'oldimage=' . urlencode( $this->oldimage );
+               $q[] = 'oldimage=' . urlencode( $this->archiveName );
                return $this->title->getLocalUrl( implode( '&', $q ) );
        }
-       
+
        /**
         * Extract the timestamp of the old version
         *
         * @return string
         */
-       private function getTimestamp() {
-               return substr( $this->oldimage, 0, 14 );
+       protected function getTimestamp() {
+               if( $this->timestamp === false ) {
+                       $this->timestamp = $this->getOldFile()->getTimestamp();
+               }
+               return $this->timestamp;
+       }
+
+       protected function getOldFile() {
+               if ( !isset( $this->oldFile ) ) {
+                       $this->oldFile = RepoGroup::singleton()->getLocalRepo()->newFromArchiveName( $this->title, $this->archiveName );
+               }
+               return $this->oldFile;
        }
-       
-}
\ No newline at end of file
+}