MediaWiki r45062 - Code Review

Jump to: navigation, search
Repository:MediaWiki
Revision:r45061‎ | r45062 (on ViewVC)‎ | r45063 >
Date:05:00, 27 December 2008
Author:soxred93
Status:reverted (Comments)
Tags:
Comment:
Add Interwiki extension to core.
Modified paths:

Diff [purge]

Index: trunk/phase3/maintenance/language/messages.inc
===================================================================
--- trunk/phase3/maintenance/language/messages.inc	(revision 45061)
+++ trunk/phase3/maintenance/language/messages.inc	(revision 45062)
@@ -1465,6 +1465,9 @@
 	'deletedcontribs' => array(
 		'deletedcontributions',
 	),
+	'interwiki' => array(
+		'interwiki',
+	),
 	'linksearch' => array(
 		'linksearch',
 		'linksearch-pat',
@@ -2948,6 +2951,7 @@
 	'allpages'            => 'Special:AllPages',
 	'categories'          => 'Special:Categories',
 	'deletedcontribs'     => 'Special:DeletedContributions',
+	'deletedcontribs'     => 'Special:Interwiki',
 	'linksearch'          => 'Special:LinkSearch',
 	'listusers'           => 'Special:ListUsers',
 	'newuserlog'          => 'Special:Log/newusers',
Index: trunk/phase3/includes/AutoLoader.php
===================================================================
--- trunk/phase3/includes/AutoLoader.php	(revision 45061)
+++ trunk/phase3/includes/AutoLoader.php	(revision 45062)
@@ -480,6 +480,7 @@
 	'SpecialAllpages' => 'includes/specials/SpecialAllpages.php',
 	'SpecialBookSources' => 'includes/specials/SpecialBooksources.php',
 	'SpecialImport' => 'includes/specials/SpecialImport.php',
+	'SpecialInterwiki' => 'includes/specials/SpecialInterwiki.php',
 	'SpecialListGroupRights' => 'includes/specials/SpecialListgrouprights.php',
 	'SpecialMostlinkedtemplates' => 'includes/specials/SpecialMostlinkedtemplates.php',
 	'SpecialPrefixindex' => 'includes/specials/SpecialPrefixindex.php',
Index: trunk/phase3/includes/DefaultSettings.php
===================================================================
--- trunk/phase3/includes/DefaultSettings.php	(revision 45061)
+++ trunk/phase3/includes/DefaultSettings.php	(revision 45062)
@@ -1210,6 +1210,7 @@
 $wgGroupPermissions['sysop']['editusercssjs']    = true;
 $wgGroupPermissions['sysop']['import']           = true;
 $wgGroupPermissions['sysop']['importupload']     = true;
+$wgGroupPermissions['sysop']['interwiki']        = true;
 $wgGroupPermissions['sysop']['move']             = true;
 $wgGroupPermissions['sysop']['move-subpages']    = true;
 $wgGroupPermissions['sysop']['move-rootuserpages'] = true;
@@ -2791,6 +2792,7 @@
 	'upload',
 	'move',
 	'import',
+	'interwiki',
 	'patrol',
 	'merge',
 	'suppress',
@@ -2845,6 +2847,7 @@
 	'upload'  => 'uploadlogpage',
 	'move'    => 'movelogpage',
 	'import'  => 'importlogpage',
+	'interwiki' => 'interwikilogpage',
 	'patrol'  => 'patrol-log-page',
 	'merge'   => 'mergelog',
 	'suppress' => 'suppressionlog',
@@ -2865,6 +2868,7 @@
 	'upload'  => 'uploadlogpagetext',
 	'move'    => 'movelogpagetext',
 	'import'  => 'importlogpagetext',
+	'interwiki' => 'interwikilogpagetext',
 	'patrol'  => 'patrol-log-header',
 	'merge'   => 'mergelogpagetext',
 	'suppress' => 'suppressionlogtext',
@@ -2896,6 +2900,10 @@
 	'move/move_redir'   => '1movedto2_redir',
 	'import/upload'     => 'import-logentry-upload',
 	'import/interwiki'  => 'import-logentry-interwiki',
+	'interwiki/interwiki' => 'interwiki_logentry',
+	'interwiki/iw_add' => 'interwiki_log_added',
+	'interwiki/iw_delete' => 'interwiki_log_deleted',
+	'interwiki/iw_edit' => 'interwiki_log_edited',
 	'merge/merge'       => 'pagemerge-logentry',
 	'suppress/revision' => 'revdelete-logentry',
 	'suppress/file'     => 'revdelete-logentry',
@@ -3014,6 +3022,7 @@
 	'Specialpages'              => 'other',
 	'Blockme'                   => 'other',
 	'Booksources'               => 'other',
+	'Interwiki'                 => 'other',
 );
 
 /**
Index: trunk/phase3/includes/specials/SpecialInterwiki.php
===================================================================
--- trunk/phase3/includes/specials/SpecialInterwiki.php	(revision 0)
+++ trunk/phase3/includes/specials/SpecialInterwiki.php	(revision 45062)
@@ -0,0 +1,263 @@
+<?php
+
+/**
+ * Constructor
+ */
+function wfSpecialInterwiki( $par ) {
+	global $wgRequest;
+
+	$form = new SpecialInterwiki( $wgRequest, $par );
+	$form->execute();
+}
+
+/**
+ * implements Special:Interwiki
+ * @ingroup SpecialPage
+ */
+class SpecialInterwiki extends SpecialPage {
+	
+	function __construct() {
+		parent::__construct( 'Interwiki' );
+	}
+
+	
+	function execute( $par = null ) {
+		global $wgRequest, $wgOut, $wgUser;
+
+		$admin = $wgUser->isAllowed( 'interwiki' );
+
+		$this->setHeaders();
+		if( $admin ){
+			$wgOut->setPagetitle( wfMsg( 'interwiki' ) );
+		} else {
+			$wgOut->setPagetitle( wfMsg( 'interwiki-title-norights' ) );
+		}
+		$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":
+			if( !$admin ){
+				$wgOut->permissionRequired('interwiki');
+				return;
+			}
+
+			$prefix = $wgRequest->getVal( 'prefix' );
+			$encPrefix = htmlspecialchars( $prefix );
+			$actionUrl = $selfTitle->escapeLocalURL( "action=submit" );
+			$button = wfMsgHtml( 'delete' );
+			$topmessage = wfMsgHtml( 'interwiki_delquestion', $encPrefix );
+			$deletingmessage = wfMsgHtml( 'interwiki_deleting', $encPrefix );
+			$reasonmessage = wfMsgHtml( 'deletecomment' );
+			$defaultreason = wfMsgForContent( 'interwiki_defaultreason' );
+			$token = htmlspecialchars( $wgUser->editToken() );
+
+			$wgOut->addHTML(
+				"<fieldset>
+				<legend>$topmessage</legend>
+				<form id=\"delete\" method=\"post\" action=\"{$actionUrl}\">
+				<table><tr>
+				<td>$deletingmessage</td>
+				</tr><tr>
+				<td>$reasonmessage &nbsp; <input tabindex='1' type='text' name=\"reason\" maxlength='200' size='60' value='$defaultreason' /></td>
+				</tr><tr><td>
+				<input type='submit' name='delete' id=\"interwikideletebutton\" value='{$button}' />
+				<input type='hidden' name='prefix' value='{$encPrefix}' />
+				<input type='hidden' name='do' value='delete' />
+				<input type='hidden' name='wpEditToken' value='{$token}' />
+				</td></tr></table>
+				</form>
+				</fieldset>\n"
+			);
+			break;
+		case "edit" :
+		case "add" :
+			if( !$admin ){
+				$wgOut->permissionRequired( 'interwiki' );
+				return;
+			}
+			if( $action == "edit" ){
+				$prefix = $wgRequest->getVal( 'prefix' );
+				$dbr = wfGetDB( DB_SLAVE );
+				$row = $dbr->selectRow( 'interwiki', '*', array( 'iw_prefix' => $prefix ) );
+				if( !$row ){
+					$wgOut->wrapWikiMsg( '<div class="errorbox">$1</div>', array( 'interwiki_editerror', $prefix ) );
+					return;
+				}
+				$prefix = htmlspecialchars( $row->iw_prefix );
+				$defaulturl = htmlspecialchars( $row->iw_url );
+				$trans = $row->iw_trans ? " checked='checked'" : '' ;
+				$local = $row->iw_local ? " checked='checked'" : '';
+				$old = "<input type='hidden' name='prefix' value='" . htmlspecialchars( $row->iw_prefix ) . "' />";
+				$topmessage = wfMsgHtml( 'interwiki_edittext' );
+				$intromessage = wfMsgHtml( 'interwiki_editintro' );
+				$button = wfMsgHtml( 'edit' );
+			} else {
+				$prefix = "<input tabindex='1' type='text' name='prefix' maxlength='20' size='20' />";
+				$local = '';
+				$trans = '';
+				$old = '';
+				$defaulturl = wfMsgHtml( 'interwiki_defaulturl' );
+				$topmessage = wfMsgHtml( 'interwiki_addtext' );
+				$intromessage = wfMsgHtml( 'interwiki_addintro' );
+				$button = wfMsgHtml( 'interwiki_addbutton' );
+			}
+
+			$actionUrl = $selfTitle->escapeLocalURL( 'action=submit' );
+			$prefixmessage = wfMsgHtml( 'interwiki_prefix' );
+			$localmessage = wfMsgHtml( 'interwiki_local' );
+			$transmessage = wfMsgHtml( 'interwiki_trans' );
+			$reasonmessage = wfMsgHtml( 'interwiki_reasonfield' );
+			$urlmessage = wfMsgHtml( 'interwiki_url' );
+			$token = htmlspecialchars( $wgUser->editToken() );
+			$defaultreason = htmlspecialchars( wfMsgForContent( 'interwiki_defaultreason' ) );
+
+			$wgOut->addHTML(
+				"<fieldset>
+				<legend>$topmessage</legend>
+				$intromessage
+				<form id='{$action}' method='post' action='{$actionUrl}'>
+				<table id='interwikitable-{$action}'><tr>
+				<td>$prefixmessage</td>
+				<td>$prefix</td>
+				</tr><tr>
+				<td>$localmessage</td>
+				<td><input type='checkbox' id='local' name='local' {$local}/></td>
+				</tr><tr>
+				<td>$transmessage</td>
+				<td><input type='checkbox' id='trans' name='trans' {$trans}/></td>
+				</tr><tr>
+				<td>$urlmessage</td>
+				<td><input tabindex='1' type='text' name='theurl' maxlength='200' size='60' value='$defaulturl' /></td>
+				</tr><tr>
+				<td>$reasonmessage</td>
+				<td><input tabindex='1' type='text' name='reason' maxlength='200' size='60' value='$defaultreason' /></td>
+				</tr></table>
+				<input type='submit' name='{$action}'  id='interwiki{$action}button' value='{$button}' />
+				<input type='hidden' name='do' value='{$action}' />
+				$old
+				<input type='hidden' name='wpEditToken' value='{$token}' />
+				</form>
+				</fieldset>\n"
+			);
+			break;
+		case "submit":
+			if( !$admin ){
+				$wgOut->permissionRequired('interwiki');
+				return;
+			}
+			if( !$safePost ){
+				$wgOut->addWikiText( wfMsg('sessionfailure') );
+				return;
+			}
+
+			$prefix = $wgRequest->getVal('prefix');
+			$reason = $wgRequest->getText('reason');
+			$do = $wgRequest->getVal('do');
+			$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('theurl');
+				$local = $wgRequest->getCheck('local') ? 1 : 0;
+				$trans = $wgRequest->getCheck('trans') ? 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' );
+				}
+
+				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;
+			}
+			break;
+		default:
+			$prefixmessage = wfMsgHtml( 'interwiki_prefix' );
+			$urlmessage = wfMsgHtml( 'interwiki_url' );
+			$localmessage = wfMsgHtml( 'interwiki_local' );
+			$transmessage = wfMsgHtml( 'interwiki_trans' );
+
+			$wgOut->addWikiText( wfMsg( 'interwiki_intro', '[http://www.mediawiki.org/wiki/Interwiki_table MediaWiki.org]' ) );
+
+			if ($admin) {
+				$skin = $wgUser->getSkin();
+				$addtext = wfMsgHtml( 'interwiki_addtext' );
+				$addlink = $skin->makeLinkObj( $selfTitle, $addtext, 'action=add' );
+				$wgOut->addHTML( '<ul>' . '<li>' . $addlink . '</li>' . '</ul>' );
+			}
+
+			$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";
+
+			$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 id='interwikitable-row'>
+					<td id='interwikitable-prefix'>$prefix</td>
+					<td id='interwikitable-url'>$url</td>
+					<td id='interwikitable-local'>$local</td>
+					<td id='interwikitable-trans'>$trans</td>";
+				if( $admin ) {
+					$out .= '<td id="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>';
+				}
+
+				$out .= "\n</tr>\n";
+			}
+			$dbr->freeResult( $res );
+			$out .= "</table><br />";
+			$wgOut->addHTML($out);
+		}
+	}
+}

Property changes on: trunk/phase3/includes/specials/SpecialInterwiki.php
___________________________________________________________________
Name: svn:eol-style
   + native

Index: trunk/phase3/includes/SpecialPage.php
===================================================================
--- trunk/phase3/includes/SpecialPage.php	(revision 45061)
+++ trunk/phase3/includes/SpecialPage.php	(revision 45062)
@@ -147,6 +147,7 @@
 		'Blockip'                   => array( 'SpecialPage', 'Blockip', 'block' ),
 		'Undelete'                  => array( 'SpecialPage', 'Undelete', 'deletedhistory' ),
 		'Import'                    => 'SpecialImport',
+		'Interwiki'                 => array( 'SpecialPage', 'Interwiki' ),
 		'Lockdb'                    => array( 'SpecialPage', 'Lockdb', 'siteadmin' ),
 		'Unlockdb'                  => array( 'SpecialPage', 'Unlockdb', 'siteadmin' ),
 		'Userrights'                => 'UserrightsPage',
Index: trunk/phase3/languages/messages/MessagesEn.php
===================================================================
--- trunk/phase3/languages/messages/MessagesEn.php	(revision 45061)
+++ trunk/phase3/languages/messages/MessagesEn.php	(revision 45062)
@@ -430,6 +430,7 @@
 	'Blankpage'                 => array( 'BlankPage' ),
 	'LinkSearch'                => array( 'LinkSearch' ),
 	'DeletedContributions'      => array( 'DeletedContributions' ),
+	'Interwiki'                 => array( 'Interwiki' ),
 );
 
 /**
@@ -2187,6 +2188,45 @@
 # Special:DeletedContributions
 'deletedcontributions' => 'Deleted user contributions',
 
+# Special:Interwiki
+'interwiki'                => 'View and edit interwiki data',
+'interwiki-title-norights' => 'View interwiki data',
+'interwiki-desc'           => 'Adds a [[Special:Interwiki|special page]] to view and edit the interwiki table',
+'interwiki_reasonfield'    => 'Reason',
+'interwiki_intro'          => 'See $1 for more information about the interwiki table.
+There is a [[Special:Log/interwiki|log of changes]] to the interwiki table.',
+'interwiki_prefix'         => 'Prefix',
+'interwiki_url'            => 'URL',
+'interwiki_local'          => 'Local', 
+'interwiki_trans'          => 'Trans',
+'interwiki_error'          => 'Error: The interwiki table is empty, or something else went wrong.',
+'interwiki_delquestion'    => 'Deleting "$1"',
+'interwiki_deleting'       => 'You are deleting prefix "$1".',
+'interwiki_deleted'        => 'Prefix "$1" was successfully removed from the interwiki table.',
+'interwiki_delfailed'      => 'Prefix "$1" could not be removed from the interwiki table.',
+'interwiki_addtext'        => 'Add an interwiki prefix',
+'interwiki_addintro'       => 'You are adding a new interwiki prefix.
+Remember that it cannot contain spaces ( ), colons (:), ampersands (&), or equal signs (=).',
+'interwiki_addbutton'      => 'Add',
+'interwiki_added'          => 'Prefix "$1" was successfully added to the interwiki table.',
+'interwiki_addfailed'      => 'Prefix "$1" could not be added to the interwiki table.
+Possibly it already exists in the interwiki table.',
+'interwiki_defaulturl'     => 'http://www.example.com/$1',
+'interwiki_edittext'       => 'Editing an interwiki prefix',
+'interwiki_editintro'      => 'You are editing an interwiki prefix.
+Remember that this can break existing links.',
+'interwiki_edited'         => 'Prefix "$1" was successfully modified in the interwiki table.',
+'interwiki_editerror'      => 'Prefix "$1" can not be modified in the interwiki table.
+Possibly it does not exist.',
+'interwikilogpage'         => 'Interwiki table log',
+'interwiki_log_added'      => 'added prefix "$2" ($3) (trans: $4) (local: $5) to the interwiki table',
+'interwiki_log_edited'     => 'modified prefix "$2" : ($3) (trans: $4) (local: $5) in the interwiki table',
+'interwiki_log_deleted'    => 'removed prefix "$2" from the interwiki table',
+'interwikilogpagetext'     => 'This is a log of changes to the [[Special:Interwiki|interwiki table]].',
+'interwiki_defaultreason'  => 'no reason given',
+'interwiki_logentry'       => '', # do not translate this message
+'right-interwiki'          => 'Edit interwiki data',
+
 # Special:LinkSearch
 'linksearch'       => 'Search web links',
 'linksearch-pat'   => 'Search pattern:',

Follow-up revisions

Rev.Commit summaryAuthorDate
r45064Cleanup to r45062 (add Interwiki extension to core)...demon05:17, 27 December 2008
r45070Follow up on r45062....siebrand07:57, 27 December 2008
r45071Follow up on r45062....siebrand07:58, 27 December 2008
r45223This extension is obsolete per MediaWiki 1.14alpha r45062, when extension Int...siebrand15:08, 31 December 2008
r45238* Revert r45062 and related (Merge Interwiki extension to core) per brion....siebrand18:44, 31 December 2008

Comments

#Comment by MZMcBride (Talk | contribs)   08:11, 27 December 2008

Assuming this is kept in, a couple of notes:

  1. There may be issues with WMF wikis due to caching (this is coming from ^demon)
  2. The 'interwiki' right would likely only be given to admins at Meta and nowhere else
  3. bugzilla:12763#c5 suggests there may be security implications here
#Comment by Siebrand (Talk | contribs)   10:57, 27 December 2008
  • FIXME: PHP Notice: Undefined variable: encPrefix in /var/www/w/includes/specials/SpecialInterwiki.php on line 42
  • FIXME: messages 'interwiki_local' and 'interwiki_trans' are poor. There should be more explanation for their exact meaning.
  • FIXME: <Nikerabbit> that table is horrible. Could be at least class=wikitable
  • FIXME: <Nikerabbit> the i18n of that special page is unacceptable. The string is used for table header and a label when adding
#Comment by Siebrand (Talk | contribs)   11:31, 27 December 2008
  • FIXME: $wgSpecialPageGroups should be set
#Comment by VasilievVV (Talk | contribs)   19:36, 27 December 2008

This page cannot be run on Wikimedia now: this special page only updates interwikis on the wiki where it's used, while we need it to update all wikis.

"interwiki" shouldn't be assigned on WMF sites until that's fixed.

#Comment by Soxred93 (Talk | contribs)   01:31, 28 December 2008

Can't we just assign "interwiki" to a new usergroup, and give it out to no one? Then give it out on Meta? That way, it'd be updated automatically on all wikis.

#Comment by VasilievVV (Talk | contribs)   09:59, 28 December 2008

> That way, it'd be updated automatically on all wikis.

It wouldn't

#Comment by Brion VIBBER (Talk | contribs)   17:48, 31 December 2008

The UI is terrible right now, and it's totally incompatible with Wikimedia.

I've disabled it in r45232... please continue working on it, it'd be a nice thing to have for third-party installations if the UI is cleaned up.

#Comment by Brion VIBBER (Talk | contribs)   17:54, 31 December 2008

At this point I recommend moving the updates back to the extension and working on it there so it won't interfere with core updates.

#Comment by Siebrand (Talk | contribs)   18:55, 31 December 2008

Reverted and later changed merged back into extension in r45238 and r45239.

Status & tagging log

  • 19:04, 31 December 2008 VasilievVV (Talk | contribs) changed the status of r45062 [removed: fixme added: reverted]
  • 17:48, 31 December 2008 Brion VIBBER (Talk | contribs) changed the status of r45062 [removed: new added: fixme]
Personal tools
Namespaces
Variants
Views
Actions
Site
Support
Download
Development
Communication
Toolbox