htaccessing some directories for dev using cvs tree as www tree ;)
[lhc/web/wiklou.git] / includes / Article.php
index a57b040..7f1aacf 100644 (file)
@@ -64,7 +64,12 @@ class Article {
        # Return the text of this revision
        function getContent( $noredir = false )
        {
-               global $action,$section,$count; # From query string
+               global $wgRequest;
+
+               # Get variables from query string :P
+               $action = $wgRequest->getText( 'action', 'view' );
+               $section = $wgRequest->getText( 'section' );
+
                $fname =  "Article::getContent"; 
                wfProfileIn( $fname );
 
@@ -116,8 +121,11 @@ class Article {
        # Load the revision (including cur_text) into this object
        function loadContent( $noredir = false )
        {
-               global $wgOut, $wgMwRedir;
-               global $oldid, $redirect; # From query
+               global $wgOut, $wgMwRedir, $wgRequest;
+               
+               # Query variables :P
+               $oldid = $wgRequest->getVal( 'oldid' );
+               $redirect = $wgRequest->getVal( 'redirect' );
 
                if ( $this->mContentLoaded ) return;
                $fname = "Article::loadContent";
@@ -377,28 +385,31 @@ class Article {
 
        function view()
        {
-               global $wgUser, $wgOut, $wgLang;
-               global $oldid, $diff; # From query
+               global $wgUser, $wgOut, $wgLang, $wgRequest;
                global $wgLinkCache, $IP, $wgEnableParserCache;
                
                $fname = "Article::view";
                wfProfileIn( $fname );
 
+               # Get variables from query string :P
+               $oldid = $wgRequest->getVal( 'oldid' );
+               $diff = $wgRequest->getVal( 'diff' );
+
                $wgOut->setArticleFlag( true );
                $wgOut->setRobotpolicy( "index,follow" );
 
                # If we got diff and oldid in the query, we want to see a
                # diff page instead of the article.
 
-               if ( isset( $diff ) ) {
+               if ( !is_null( $diff ) ) {
                        $wgOut->setPageTitle( $this->mTitle->getPrefixedText() );
-                       $de = new DifferenceEngine( $oldid, $diff );
+                       $de = new DifferenceEngine( intval($oldid), intval($diff) );
                        $de->showDiffPage();
                        wfProfileOut( $fname );
                        return;
                }
 
-               if ( !isset( $oldid ) and $this->checkTouched() ) {
+               if ( !is_null( $oldid ) and $this->checkTouched() ) {
                        if( $wgOut->checkLastModified( $this->mTouched ) ){
                                return;
                        } else if ( $this->tryFileCache() ) {
@@ -416,7 +427,7 @@ class Article {
 
                # We're looking at an old revision
 
-               if ( $oldid ) {
+               if ( !empty( $oldid ) ) {
                        $this->setOldSubtitle();
                        $wgOut->setRobotpolicy( "noindex,follow" );
                }
@@ -682,13 +693,13 @@ class Article {
                $wgOut->setRobotpolicy( "noindex,follow" );
 
                $sk = $wgUser->getSkin() ;
-               $link = $sk->makeKnownLink ( $this->mTitle->getPrefixedText() ) ;
+               $link = $this->mTitle->getPrefixedText();
 
                if($add)
                        $text = wfMsg( "addedwatchtext", $link );
                else
                        $text = wfMsg( "removedwatchtext", $link );
-               $wgOut->addHTML( $text );
+               $wgOut->addWikiText( $text );
 
                $up = new UserUpdate();
                array_push( $wgDeferredUpdateList, $up );
@@ -703,7 +714,7 @@ class Article {
 
        function protect( $limit = "sysop" )
        {
-               global $wgUser, $wgOut;
+               global $wgUser, $wgOut, $wgRequest;
 
                if ( ! $wgUser->isSysop() ) {
                        $wgOut->sysopRequired();
@@ -718,17 +729,91 @@ class Article {
                        $wgOut->fatalEror( wfMsg( "badarticleerror" ) );
                        return;
                }
+
+               $confirm = $wgRequest->getBool( 'wpConfirmProtect' ) && $wgRequest->wasPosted();
+               $reason = $wgRequest->getText( 'wpReasonProtect' );
+
+               if ( $confirm ) {
+
         $sql = "UPDATE cur SET cur_touched='" . wfTimestampNow() . "'," .
                        "cur_restrictions='{$limit}' WHERE cur_id={$id}";
                wfQuery( $sql, DB_WRITE, "Article::protect" );
 
                $log = new LogPage( wfMsg( "protectlogpage" ), wfMsg( "protectlogtext" ) );
                if ( $limit === "" ) {
-                       $log->addEntry( wfMsg( "unprotectedarticle", $this->mTitle->getPrefixedText() ), "" );          
+                               $log->addEntry( wfMsg( "unprotectedarticle", $this->mTitle->getPrefixedText() ), $reason );
                } else {
-                       $log->addEntry( wfMsg( "protectedarticle", $this->mTitle->getPrefixedText() ), "" );
+                               $log->addEntry( wfMsg( "protectedarticle", $this->mTitle->getPrefixedText() ), $reason );
                }
                $wgOut->redirect( $this->mTitle->getFullURL() );
+                       return;
+               } else {
+                       $reason = htmlspecialchars( wfMsg( "protectreason" ) );
+                       return $this->confirmProtect( "", $reason, $limit );
+               }
+       }
+
+               # Output protection confirmation dialog
+       function confirmProtect( $par, $reason, $limit = "sysop"  )
+       {
+               global $wgOut;
+
+               wfDebug( "Article::confirmProtect\n" );
+
+               $sub = htmlspecialchars( $this->mTitle->getPrefixedText() );
+               $wgOut->setRobotpolicy( "noindex,nofollow" );
+
+               $check = "";
+               $protcom = "";
+
+               if ( $limit === "" ) {
+                       $wgOut->setSubtitle( wfMsg( "unprotectsub", $sub ) );
+                       $wgOut->addWikiText( wfMsg( "confirmunprotecttext" ) );
+                       $check = htmlspecialchars( wfMsg( "confirmunprotect" ) );
+                       $protcom = htmlspecialchars( wfMsg( "unprotectcomment" ) );
+                       $formaction = $this->mTitle->escapeLocalURL( "action=unprotect" . $par );
+               } else {
+                       $wgOut->setSubtitle( wfMsg( "protectsub", $sub ) );
+                       $wgOut->addWikiText( wfMsg( "confirmprotecttext" ) );
+                       $check = htmlspecialchars( wfMsg( "confirmprotect" ) );
+                       $protcom = htmlspecialchars( wfMsg( "protectcomment" ) );
+                       $formaction = $this->mTitle->escapeLocalURL( "action=protect" . $par );
+               }
+
+               $confirm = htmlspecialchars( wfMsg( "confirm" ) );
+
+               $wgOut->addHTML( "
+<form id='protectconfirm' method='post' action=\"{$formaction}\">
+       <table border='0'>
+               <tr>
+                       <td align='right'>
+                               <label for='wpReasonProtect'>{$protcom}:</label>
+                       </td>
+                       <td align='left'>
+                               <input type='text' size='60' name='wpReasonProtect' id='wpReasonProtect' value=\"" . htmlspecialchars( $reason ) . "\" />
+                       </td>
+               </tr>
+               <tr>
+                       <td>&nbsp;</td>
+               </tr>
+               <tr>
+                       <td align='right'>
+                               <input type='checkbox' name='wpConfirmProtect' value='1' id='wpConfirmProtect' />
+                       </td>
+                       <td>
+                               <label for='wpConfirmProtect'>{$check}</label>
+                       </td>
+               </tr>
+               <tr>
+                       <td>&nbsp;</td>
+                       <td>
+                               <input type='submit' name='wpConfirmProtectB' value=\"{$confirm}\" />
+                       </td>
+               </tr>
+       </table>
+</form>\n" );
+
+               $wgOut->returnToMain( false );
        }
 
        function unprotect()
@@ -736,14 +821,17 @@ class Article {
                return $this->protect( "" );
        }
 
+       # UI entry point for page deletion 
        function delete()
        {
-               global $wgUser, $wgOut, $wgMessageCache;
-               global $wpConfirm, $wpReason, $image, $oldimage;
+               global $wgUser, $wgOut, $wgMessageCache, $wgRequest;
                $fname = "Article::delete";
-
+               $confirm = $wgRequest->getBool( 'wpConfirm' ) && $wgRequest->wasPosted();
+               $reason = $wgRequest->getText( 'wpReason' );
+               
                # This code desperately needs to be totally rewritten
                
+               # Check permissions
                if ( ( ! $wgUser->isSysop() ) ) {
                        $wgOut->sysopRequired();
                        return;
@@ -761,8 +849,8 @@ class Article {
                        return;
                }
 
-               if ( @$_POST["wpConfirm"] ) {
-                       $this->doDelete();
+               if ( $confirm ) {
+                       $this->doDelete( $reason );
                        return;
                }
 
@@ -774,10 +862,10 @@ class Article {
                $etitle = wfStrencode( $title );
                $sql = "SELECT old_text,old_flags FROM old WHERE old_namespace=$ns and old_title='$etitle' ORDER BY inverse_timestamp LIMIT 1";
                $res = wfQuery( $sql, DB_READ, $fname );
-               if( ($old=wfFetchObject($res)) && !$wpConfirm ) {
+               if( ($old=wfFetchObject($res)) && !$confirm ) {
                        $skin=$wgUser->getSkin();
-                       $wgOut->addHTML("<B>".wfMsg("historywarning"));
-                       $wgOut->addHTML( $skin->historyLink() ."</B><P>");
+                       $wgOut->addHTML("<b>".wfMsg("historywarning"));
+                       $wgOut->addHTML( $skin->historyLink() ."</b>");
                }
 
                $sql="SELECT cur_text FROM cur WHERE cur_namespace=$ns and cur_title='$etitle'";
@@ -802,10 +890,11 @@ class Article {
                        
                        # this should not happen, since it is not possible to store an empty, new
                        # page. Let's insert a standard text in case it does, though
-                       if($length==0 && !$wpReason) { $wpReason=wfmsg("exblank");}
-                       
+                       if($length == 0 && $reason === "") { 
+                               $reason = wfMsg("exblank");
+                       }
                        
-                       if($length < 500 && !$wpReason) {
+                       if($length < 500 && $reason === "") {
                                                                        
                                # comment field=255, let's grep the first 150 to have some user
                                # space left
@@ -816,22 +905,22 @@ class Article {
                                $text=preg_replace("/\>/","&gt;",$text);
                                $text=preg_replace("/[\n\r]/","",$text);
                                if(!$blanked) {
-                                       $wpReason=wfMsg("excontent"). " '".$text;
+                                       $reason=wfMsg("excontent"). " '".$text;
                                } else {
-                                       $wpReason=wfMsg("exbeforeblank") . " '".$text;
+                                       $reason=wfMsg("exbeforeblank") . " '".$text;
                                }
-                               if($length>150) { $wpReason .= "..."; } # we've only pasted part of the text
-                               $wpReason.="'"; 
+                               if($length>150) { $reason .= "..."; } # we've only pasted part of the text
+                               $reason.="'"; 
                        }
                }
 
-               return $this->confirmDelete();
+               return $this->confirmDelete( "", $reason );
        }
        
-       function confirmDelete( $par = "" )
+       # Output deletion confirmation dialog
+       function confirmDelete( $par, $reason )
        {
                global $wgOut;
-               global $wpReason;
 
                wfDebug( "Article::confirmDelete\n" );
                
@@ -842,34 +931,52 @@ class Article {
 
                $formaction = $this->mTitle->escapeLocalURL( "action=delete" . $par );
                
-               $confirm = wfMsg( "confirm" );
-               $check = wfMsg( "confirmcheck" );
-               $delcom = wfMsg( "deletecomment" );
+               $confirm = htmlspecialchars( wfMsg( "confirm" ) );
+               $check = htmlspecialchars( wfMsg( "confirmcheck" ) );
+               $delcom = htmlspecialchars( wfMsg( "deletecomment" ) );
 
                $wgOut->addHTML( "
-<form id=\"deleteconfirm\" method=\"post\" action=\"{$formaction}\">
-<table border=0><tr><td align=right>
-{$delcom}:</td><td align=left>
-<input type=text size=60 name=\"wpReason\" value=\"" . htmlspecialchars( $wpReason ) . "\">
-</td></tr><tr><td>&nbsp;</td></tr>
-<tr><td align=right>
-<input type=checkbox name=\"wpConfirm\" value='1' id=\"wpConfirm\">
-</td><td><label for=\"wpConfirm\">{$check}</label></td>
-</tr><tr><td>&nbsp;</td><td>
-<input type=submit name=\"wpConfirmB\" value=\"{$confirm}\">
-</td></tr></table></form>\n" );
+<form id='deleteconfirm' method='post' action=\"{$formaction}\">
+       <table border='0'>
+               <tr>
+                       <td align='right'>
+                               <label for='wpReason'>{$delcom}:</label>
+                       </td>
+                       <td align='left'>
+                               <input type='text' size='60' name='wpReason' id='wpReason' value=\"" . htmlspecialchars( $reason ) . "\" />
+                       </td>
+               </tr>
+               <tr>
+                       <td>&nbsp;</td>
+               </tr>
+               <tr>
+                       <td align='right'>
+                               <input type='checkbox' name='wpConfirm' value='1' id='wpConfirm' />
+                       </td>
+                       <td>
+                               <label for='wpConfirm'>{$check}</label>
+                       </td>
+               </tr>
+               <tr>
+                       <td>&nbsp;</td>
+                       <td>
+                               <input type='submit' name='wpConfirmB' value=\"{$confirm}\" />
+                       </td>
+               </tr>
+       </table>
+</form>\n" );
 
                $wgOut->returnToMain( false );
        }
 
-       function doDelete()
+       # Perform a deletion and output success or failure messages
+       function doDelete( $reason )
        {
                global $wgOut, $wgUser, $wgLang;
-               global $wpReason;
                $fname = "Article::doDelete";
                wfDebug( "$fname\n" );
 
-               if ( $this->doDeleteArticle() ) {       
+               if ( $this->doDeleteArticle( $reason ) ) {      
                        $deleted = $this->mTitle->getPrefixedText();
 
                        $wgOut->setPagetitle( wfMsg( "actioncomplete" ) );
@@ -882,17 +989,19 @@ class Article {
 
                        $text = wfMsg( "deletedtext", $deleted, $loglink );
 
-                       $wgOut->addHTML( "<p>" . $text );
+                       $wgOut->addHTML( "<p>" . $text . "</p>\n" );
                        $wgOut->returnToMain( false );
                } else {
                        $wgOut->fatalError( wfMsg( "cannotdelete" ) );
                }
        }
 
-       # Delete the article, returns success
-       function doDeleteArticle()
+       # Back-end article deletion
+       # Deletes the article with database consistency, writes logs, purges caches
+       # Returns success
+       function doDeleteArticle( $reason )
        {
-               global $wgUser, $wgLang, $wgRequest;
+               global $wgUser, $wgLang;
                global  $wgUseSquid, $wgDeferredUpdateList, $wgInternalServer;
 
                $fname = "Article::doDeleteArticle";
@@ -991,8 +1100,7 @@ class Article {
                
                $log = new LogPage( wfMsg( "dellogpage" ), wfMsg( "dellogpagetext" ) );
                $art = $this->mTitle->getPrefixedText();
-               $wpReason = $wgRequest->getText( "wpReason" );
-               $log->addEntry( wfMsg( "deletedarticle", $art ), $wpReason );
+               $log->addEntry( wfMsg( "deletedarticle", $art ), $reason );
 
                # Clear the cached article id so the interface doesn't act like we exist
                $this->mTitle->resetArticleID( 0 );
@@ -1074,7 +1182,7 @@ class Article {
                $newcomment = wfMsg( "revertpage", $s->old_user_text, $from );
                $wgOut->setPagetitle( wfMsg( "actioncomplete" ) );
                $wgOut->setRobotpolicy( "noindex,nofollow" );
-               $wgOut->addHTML( "<h2>" . $newcomment . "</h2>\n<hr>\n" );
+               $wgOut->addHTML( "<h2>" . $newcomment . "</h2>\n<hr />\n" );
                $this->updateArticle( Article::getRevisionText( $s ), $newcomment, 1, $this->mTitle->userIsWatching(), $bot );
                Article::onArticleEdit( $this->mTitle );
                $wgOut->returnToMain( false );
@@ -1189,8 +1297,9 @@ class Article {
        }
 
        function isFileCacheable() {
-               global $wgUser, $wgUseFileCache, $wgShowIPinHeader;
-               global $action, $oldid, $diff, $redirect, $printable;
+               global $wgUser, $wgUseFileCache, $wgShowIPinHeader, $wgRequest;
+               extract( $wgRequest->getValues( 'action', 'oldid', 'diff', 'redirect', 'printable' ) );
+               
                return $wgUseFileCache
                        and (!$wgShowIPinHeader)
                        and ($this->getID() != 0)