Tweaks to Special:Interwiki:
authorAlexandre Emsenhuber <ialex@users.mediawiki.org>
Sat, 27 Dec 2008 13:35:55 +0000 (13:35 +0000)
committerAlexandre Emsenhuber <ialex@users.mediawiki.org>
Sat, 27 Dec 2008 13:35:55 +0000 (13:35 +0000)
* Splitted SpecialInterwiki::execute() in multiple functions
* using OutputPage::addWikiMsg() and OutputPage::wrapWikiMsg() when possible
* using $res->fetchObject() and $res->free() rather than $dbr->fetchObject() and $dbr->freeResult()
* Removed 'interwiki' restrict passed to parent::__construct() so that it appears in Special:SpecialPages for everybody
* Added missing 'interwiki' entry to User::$mCoreRights

includes/User.php
includes/specials/SpecialInterwiki.php

index 3ae85b1..e3e59d0 100644 (file)
@@ -146,6 +146,7 @@ class User {
                'editusercssjs',
                'import',
                'importupload',
+               'interwiki',
                'ipblock-exempt',
                'markbotedits',
                'minoredit',
index 6a3cb2c..17b8c28 100644 (file)
@@ -7,14 +7,16 @@
 class SpecialInterwiki extends SpecialPage {
        
        function __construct() {
-               parent::__construct( 'Interwiki', 'interwiki' );
+               parent::__construct( 'Interwiki' );
        }
        
        function execute( $par ) {
                global $wgRequest, $wgOut, $wgUser;
 
                $this->setHeaders();
-               $admin = $this->userCanExecute( $wgUser );
+               $this->outputHeader();
+
+               $admin = $wgUser->isAllowed( 'interwiki' );
                if ( $admin ) {
                        $wgOut->setPagetitle( wfMsg( 'interwiki' ) );
                } else {
@@ -22,40 +24,60 @@ class SpecialInterwiki extends SpecialPage {
                }
                $action = $wgRequest->getVal( 'action', $par );
 
-               // checking
-               $selfTitle = $this->getTitle();
-
-               // Protect administrative actions against malicious requests
-               $safePost = $wgRequest->wasPosted() &&
-                       $wgUser->matchEditToken( $wgRequest->getVal( 'wpEditToken' ) );
-
                switch( $action ){
                case "delete":
+               case "edit" :
+               case "add" :
                        if( !$admin ){
-                               $wgOut->permissionRequired('interwiki');
+                               $wgOut->permissionRequired( 'interwiki' );
+                               return;
+                       }
+                       $this->showForm( $action );
+                       break;
+               case "submit":
+                       if( !$admin ){
+                               $wgOut->permissionRequired( 'interwiki' );
+                               return;
+                       }
+                       if( !$wgRequest->wasPosted() || !$wgUser->matchEditToken( $wgRequest->getVal( 'wpEditToken' ) ) ) {
+                               $wgOut->addWikiMsg( 'sessionfailure' );
                                return;
                        }
+                       $this->doSubmit();
+                       break;
+               default:
+                       $this->showList( $admin );
+                       break;
+               }
+       }
+
+       function showForm( $action ) {
+               global $wgRequest, $wgUser, $wgOut;
+               
+               $actionUrl = $this->getTitle()->getLocalURL( 'action=submit' );
+               $token = $wgUser->editToken();
+               $defaultreason = wfMsgForContent( 'interwiki_defaultreason' );
+               
+               switch( $action ){
+               case "delete":
 
                        $prefix = $wgRequest->getVal( 'prefix' );
-                       $actionUrl = $selfTitle->getLocalURL( "action=submit" );
                        $button = wfMsg( 'delete' );
-                       $topmessage = wfMsg( 'interwiki_delquestion', $encPrefix );
-                       $deletingmessage = wfMsgHtml( 'interwiki_deleting', $encPrefix );
+                       $topmessage = wfMsg( 'interwiki_delquestion', $prefix );
+                       $deletingmessage = wfMsgExt( 'interwiki_deleting', array( 'parseinline' ), $prefix );
                        $reasonmessage = wfMsg( 'deletecomment' );
-                       $defaultreason = wfMsgForContent( 'interwiki_defaultreason' );
-                       $token = $wgUser->editToken();
 
                        $wgOut->addHTML(
                                Xml::openElement( 'fieldset' ) .
                                Xml::element( 'legend', null, $topmessage ) .
-                               Xml::openElement( 'form', array('id'=> 'mw-interwiki-deleteform', 'method'=> 'post', 'action'=>$actionUrl) ) .
+                               Xml::openElement( 'form', array('id'=> 'mw-interwiki-deleteform', 'method'=> 'post', 'action' => $actionUrl ) ) .
                                Xml::openElement( 'table' ) .
                                "<tr><td>$deletingmessage</td></tr>".
                                '<tr><td class="mw-label">' . Xml::label( $reasonmessage, 'mw-interwiki-deletereason') . '</td>' .
                                '<td class="mw-input">' .
-                               Xml::input( 'wpInterwikiReason', 60, $defaultreason, array('tabindex'=>'1', 'id'=>'mw-interwiki-deletereason', 'maxlength'=>'200') ) . 
+                               Xml::input( 'wpInterwikiReason', 60, $defaultreason, array( 'tabindex' => '1', 'id' => 'mw-interwiki-deletereason', 'maxlength' => '200' ) ) . 
                                '</td></tr>' . 
-                               '<tr><td class="mw-submit">' . Xml::submitButton( $button, array('id'=>'mw-interwiki-submit') ) .
+                               '<tr><td class="mw-submit">' . Xml::submitButton( $button, array( 'id' => 'mw-interwiki-submit' ) ) .
                                Xml::hidden( 'wpInterwikiPrefix', $prefix ) .
                                Xml::hidden( 'wpInterwikiAction', $action ) .
                                Xml::hidden( 'wpEditToken', $token ) .
@@ -67,10 +89,6 @@ class SpecialInterwiki extends SpecialPage {
                        break;
                case "edit" :
                case "add" :
-                       if( !$admin ){
-                               $wgOut->permissionRequired( 'interwiki' );
-                               return;
-                       }
                        if( $action == "edit" ){
                                $prefix = $wgRequest->getVal( 'prefix' );
                                $dbr = wfGetDB( DB_SLAVE );
@@ -84,27 +102,25 @@ class SpecialInterwiki extends SpecialPage {
                                $trans = $row->iw_trans;
                                $local = $row->iw_local;
                                $old = Xml::hidden( 'wpInterwikiPrefix', $row->iw_prefix );
-                               $topmessage = wfMsgExt( 'interwiki_edittext', array('parseinline') );
-                               $intromessage = wfMsgExt( 'interwiki_editintro', array('parseinline') );
+                               $topmessage = wfMsgExt( 'interwiki_edittext', array( 'parseinline' ) );
+                               $intromessage = wfMsgExt( 'interwiki_editintro', array( 'parseinline' ) );
                                $button = wfMsg( 'edit' );
                        } else {
-                               $prefix = Xml::input( 'wpInterwikiPrefix', 20, false, array( 'tabindex'=>'1', 'id'=>'mw-interwiki-prefix', 'maxlength'=>'20') );
+                               $prefix = Xml::input( 'wpInterwikiPrefix', 20, false, array( 'tabindex'=>'1', 'id'=>'mw-interwiki-prefix', 'maxlength'=>'20' ) );
                                $local = false;
                                $trans = false;
                                $old = '';
                                $defaulturl = wfMsg( 'interwiki_defaulturl' );
-                               $topmessage = wfMsgExt( 'interwiki_addtext', array('parseinline') );
-                               $intromessage = wfMsgExt( 'interwiki_addintro', array('parseinline') );
+                               $topmessage = wfMsgExt( 'interwiki_addtext', array( 'parseinline' ) );
+                               $intromessage = wfMsgExt( 'interwiki_addintro', array( 'parseinline' ) );
                                $button = wfMsg( 'interwiki_addbutton' );
                        }
 
-                       $actionUrl = $selfTitle->getLocalURL( 'action=submit' );
                        $prefixmessage = wfMsgHtml( 'interwiki_prefix' );
                        $localmessage = wfMsg( 'interwiki_local' );
                        $transmessage = wfMsg( 'interwiki_trans' );
                        $reasonmessage = wfMsg( 'interwiki_reasonfield' );
                        $urlmessage = wfMsg( 'interwiki_url' );
-                       $token = $wgUser->editToken();
                        $defaultreason = wfMsgForContent( 'interwiki_defaultreason' );
 
                        $wgOut->addHTML(
@@ -126,123 +142,121 @@ class SpecialInterwiki extends SpecialPage {
                                $old .
                                Xml::hidden( 'wpEditToken', $token ) .
                                '</td></tr>' .
-                               '<tr><td class="mw-submit">' . Xml::submitButton( $button, array('id'=>'mw-interwiki-submit') ) . '</td></tr>' .
+                               '<tr><td class="mw-submit">' . Xml::submitButton( $button, array( 'id'=>'mw-interwiki-submit' ) ) . '</td></tr>' .
                                Xml::closeElement( 'table' ) .
                                Xml::closeElement( 'form' ) .
                                Xml::closeElement( 'fieldset' )
                        );
                        break;
-               case "submit":
-                       if( !$admin ){
-                               $wgOut->permissionRequired('interwiki');
-                               return;
-                       }
-                       if( !$safePost ){
-                               $wgOut->addWikiText( wfMsg('sessionfailure') );
-                               return;
-                       }
+               }
+       }
 
-                       $prefix = $wgRequest->getVal( 'wpInterwikiPrefix' );
-                       $reason = $wgRequest->getText( 'wpInterwikiReason' );
-                       $do = $wgRequest->getVal( 'wpInterwikiAction' );
-                       $dbw = wfGetDB( DB_MASTER );
-                       switch( $do ){
-                       case "delete":
-                               $dbw->delete( 'interwiki', array( 'iw_prefix' => $prefix ), __METHOD__ );
-
-                               if ($dbw->affectedRows() == 0) {
-                                       $wgOut->addWikiText( '<span class="error">' . wfMsg( 'interwiki_delfailed', $prefix ) . '</span>' );
-                               } else {
-                                       $wgOut->addWikiText( wfMsg( 'interwiki_deleted', $prefix ));
-                                       $wgOut->returnToMain( false, $selfTitle );
-                                       $log = new LogPage( 'interwiki' );
-                                       $log->addEntry( 'iw_delete', $selfTitle, $reason, array( $prefix ) );
-                               }
-                               break;
-                       case "edit":
-                       case "add":
-                               $theurl = $wgRequest->getVal( 'wpInterwikiURL' );
-                               $local = $wgRequest->getCheck( 'wpInterwikiLocal' ) ? 1 : 0;
-                               $trans = $wgRequest->getCheck( 'wpInterwikiTrans' ) ? 1 : 0;
-                               $data = array( 'iw_prefix' => $prefix, 'iw_url'    => $theurl,
-                                       'iw_local'  => $local, 'iw_trans'  => $trans );
-
-                               if( $do == 'add' ){
-                                       $dbw->insert( 'interwiki', $data, __METHOD__, 'IGNORE' );
-                               } else {
-                                       $dbw->update( 'interwiki', $data, array( 'iw_prefix' => $prefix ), __METHOD__, 'IGNORE' );
-                               }
+       function doSubmit() {
+               global $wgRequest, $wgOut;
+               $prefix = $wgRequest->getVal( 'wpInterwikiPrefix' );
+               $reason = $wgRequest->getText( 'wpInterwikiReason' );
+               $do = $wgRequest->getVal( 'wpInterwikiAction' );
+               $selfTitle = $this->getTitle();
+               $dbw = wfGetDB( DB_MASTER );
+               switch( $do ){
+               case "delete":
+                       $dbw->delete( 'interwiki', array( 'iw_prefix' => $prefix ), __METHOD__ );
 
-                               if( $dbw->affectedRows() == 0 ) {
-                                       $wgOut->addWikiText( '<span class="error">' . wfMsg( "interwiki_{$do}failed", $prefix ) . '</span>' );
-                               } else {
-                                       $wgOut->addWikiText( wfMsg( "interwiki_{$do}ed", $prefix ));
-                                       $wgOut->returnToMain( false, $selfTitle );
-                                       $log = new LogPage( 'interwiki' );
-                                       $log->addEntry( 'iw_'.$do, $selfTitle, $reason, array( $prefix, $theurl, $trans, $local ) );
-                               }
-                               break;
+                       if ( $dbw->affectedRows() == 0 ) {
+                               $wgOut->addWikiText( '<span class="error">' . wfMsg( 'interwiki_delfailed', $prefix ) . '</span>' );
+                       } else {
+                               $wgOut->addWikiText( wfMsg( 'interwiki_deleted', $prefix ));
+                               $wgOut->returnToMain( false, $selfTitle );
+                               $log = new LogPage( 'interwiki' );
+                               $log->addEntry( 'iw_delete', $selfTitle, $reason, array( $prefix ) );
                        }
                        break;
-               default:
-                       $prefixmessage = wfMsgHtml( 'interwiki_prefix' );
-                       $urlmessage = wfMsgHtml( 'interwiki_url' );
-                       $localmessage = wfMsgHtml( 'interwiki_local' );
-                       $transmessage = wfMsgHtml( 'interwiki_trans' );
-
-                       $wgOut->addWikiText( wfMsg( 'interwiki_intro' ) );
+               case "edit":
+               case "add":
+                       $theurl = $wgRequest->getVal( 'wpInterwikiURL' );
+                       $local = $wgRequest->getCheck( 'wpInterwikiLocal' ) ? 1 : 0;
+                       $trans = $wgRequest->getCheck( 'wpInterwikiTrans' ) ? 1 : 0;
+                       $data = array( 'iw_prefix' => $prefix, 'iw_url' => $theurl,
+                               'iw_local'  => $local, 'iw_trans'  => $trans );
 
-                       if ($admin) {
-                               $skin = $wgUser->getSkin();
-                               $addtext = wfMsgHtml( 'interwiki_addtext' );
-                               $addlink = $skin->makeLinkObj( $selfTitle, $addtext, 'action=add' );
-                               $wgOut->addHTML( '<ul>' . '<li>' . $addlink . '</li>' . '</ul>' );
+                       if( $do == 'add' ){
+                               $dbw->insert( 'interwiki', $data, __METHOD__, 'IGNORE' );
+                       } else {
+                               $dbw->update( 'interwiki', $data, array( 'iw_prefix' => $prefix ), __METHOD__, 'IGNORE' );
                        }
 
-                       $out = "
-                       <br />
-                       <table width='100%' border='2' id='interwikitable'>
-                       <tr id='interwikitable-header'><th>$prefixmessage</th> <th>$urlmessage</th> <th>$localmessage</th> <th>$transmessage</th>";
-                       if( $admin ) {
-                               $deletemessage = wfMsgHtml( 'delete' );
-                               $editmessage = wfMsgHtml( 'edit' );
-                               $out .= "<th>$editmessage</th>";
+                       if( $dbw->affectedRows() == 0 ) {
+                               $wgOut->wrapWikiMsg( '<span class="error">$1</span>', array( "interwiki_{$do}failed", $prefix ) );
+                       } else {
+                               $wgOut->addWikiMsg( "interwiki_{$do}ed", $prefix );
+                               $wgOut->returnToMain( false, $selfTitle );
+                               $log = new LogPage( 'interwiki' );
+                               $log->addEntry( 'iw_'.$do, $selfTitle, $reason, array( $prefix, $theurl, $trans, $local ) );
                        }
+                       break;
+               }       
+       }
 
-                       $out .= "</tr>\n";
+       function showList( $admin ) {
+               global $wgUser, $wgOut; 
+               $prefixmessage = wfMsgHtml( 'interwiki_prefix' );
+               $urlmessage = wfMsgHtml( 'interwiki_url' );
+               $localmessage = wfMsgHtml( 'interwiki_local' );
+               $transmessage = wfMsgHtml( 'interwiki_trans' );
 
-                       $dbr = wfGetDB( DB_SLAVE );
-                       $res = $dbr->select( 'interwiki', '*' );
-                       $numrows = $dbr->numRows( $res );
-                       if ($numrows == 0) {
-                               $errormessage = wfMsgHtml('interwiki_error');
-                               $out .= "<br /><div class=\"error\">$errormessage</div><br />";
-                       }
-                       while( $s = $dbr->fetchObject( $res ) ) {
-                               $prefix = htmlspecialchars( $s->iw_prefix );
-                               $url = htmlspecialchars( $s->iw_url );
-                               $trans = htmlspecialchars( $s->iw_trans );
-                               $local = htmlspecialchars( $s->iw_local );
-                               $out .= "<tr class='mw-interwikitable-row'>
-                                       <td class='mw-interwikitable-prefix'>$prefix</td>
-                                       <td class='mw-interwikitable-url'>$url</td>
-                                       <td class='mw-interwikitable-local'>$local</td>
-                                       <td class='mw-interwikitable-trans'>$trans</td>";
-                               if( $admin ) {
-                                       $out .= '<td class="mw-interwikitable-modify">';
-                                       $out .= $skin->makeLinkObj( $selfTitle, $editmessage,
-                                               'action=edit&prefix=' . urlencode( $s->iw_prefix ) );
-                                       $out .= ', ';
-                                       $out .= $skin->makeLinkObj( $selfTitle, $deletemessage,
-                                               'action=delete&prefix=' . urlencode( $s->iw_prefix ) );
-                                       $out .= '</td>';
-                               }
+               $wgOut->addWikiMsg( 'interwiki_intro' );
+               $selfTitle = $this->getTitle();
 
-                               $out .= "\n</tr>\n";
+               if ( $admin ) {
+                       $skin = $wgUser->getSkin();
+                       $addtext = wfMsgHtml( 'interwiki_addtext' );
+                       $addlink = $skin->link( $selfTitle, $addtext, array(), array( 'action' => 'add' ) );
+                       $wgOut->addHTML( '<ul>' . '<li>' . $addlink . '</li>' . '</ul>' );
+               }
+
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select( 'interwiki', '*' );
+               $numrows = $res->numRows();
+               if ( $numrows == 0 ) {
+                       $wgOut->wrapWikiMsg( '<div class="errorbox">$1</div>', 'interwiki_error' );
+                       return;
+               }
+               
+               $out = "
+               <br />
+               <table width='100%' border='2' id='interwikitable'>
+               <tr id='interwikitable-header'><th>$prefixmessage</th> <th>$urlmessage</th> <th>$localmessage</th> <th>$transmessage</th>";
+               if( $admin ) {
+                       $deletemessage = wfMsgHtml( 'delete' );
+                       $editmessage = wfMsgHtml( 'edit' );
+                       $out .= "<th>$editmessage</th>";
+               }
+               $out .= "</tr>\n";
+               
+               while( $s = $res->fetchObject() ) {
+                       $prefix = htmlspecialchars( $s->iw_prefix );
+                       $url = htmlspecialchars( $s->iw_url );
+                       $trans = htmlspecialchars( $s->iw_trans );
+                       $local = htmlspecialchars( $s->iw_local );
+                       $out .= "<tr class='mw-interwikitable-row'>
+                               <td class='mw-interwikitable-prefix'>$prefix</td>
+                               <td class='mw-interwikitable-url'>$url</td>
+                               <td class='mw-interwikitable-local'>$local</td>
+                               <td class='mw-interwikitable-trans'>$trans</td>";
+                       if( $admin ) {
+                               $out .= '<td class="mw-interwikitable-modify">';
+                               $out .= $skin->link( $selfTitle, $editmessage, array(),
+                                       array( 'action' => 'edit', 'prefix' => $s->iw_prefix ) );
+                               $out .= ', ';
+                               $out .= $skin->link( $selfTitle, $deletemessage, array(),
+                                       array( 'action' => 'delete', 'prefix' => $s->iw_prefix ) );
+                               $out .= '</td>';
                        }
-                       $dbr->freeResult( $res );
-                       $out .= "</table><br />";
-                       $wgOut->addHTML($out);
+
+                       $out .= "\n</tr>\n";
                }
+               $res->free();
+               $out .= "</table><br />";
+               $wgOut->addHTML( $out );
        }
 }