From 6561a9e3704b6a9cd2bd15ef0a6d8351f7685ba7 Mon Sep 17 00:00:00 2001 From: X! Date: Sat, 27 Dec 2008 05:00:33 +0000 Subject: [PATCH] Add Interwiki extension to core. --- includes/AutoLoader.php | 1 + includes/DefaultSettings.php | 9 + includes/SpecialPage.php | 1 + includes/specials/SpecialInterwiki.php | 263 +++++++++++++++++++++++++ languages/messages/MessagesEn.php | 40 ++++ maintenance/language/messages.inc | 4 + 6 files changed, 318 insertions(+) create mode 100644 includes/specials/SpecialInterwiki.php diff --git a/includes/AutoLoader.php b/includes/AutoLoader.php index ce1912ea65..0860002a7b 100644 --- a/includes/AutoLoader.php +++ b/includes/AutoLoader.php @@ -480,6 +480,7 @@ $wgAutoloadLocalClasses = array( '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', diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php index efe1b2f0df..17cf8542a4 100644 --- a/includes/DefaultSettings.php +++ b/includes/DefaultSettings.php @@ -1210,6 +1210,7 @@ $wgGroupPermissions['sysop']['editinterface'] = true; $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 @@ $wgLogTypes = array( '', 'upload', 'move', 'import', + 'interwiki', 'patrol', 'merge', 'suppress', @@ -2845,6 +2847,7 @@ $wgLogNames = array( 'upload' => 'uploadlogpage', 'move' => 'movelogpage', 'import' => 'importlogpage', + 'interwiki' => 'interwikilogpage', 'patrol' => 'patrol-log-page', 'merge' => 'mergelog', 'suppress' => 'suppressionlog', @@ -2865,6 +2868,7 @@ $wgLogHeaders = array( 'upload' => 'uploadlogpagetext', 'move' => 'movelogpagetext', 'import' => 'importlogpagetext', + 'interwiki' => 'interwikilogpagetext', 'patrol' => 'patrol-log-header', 'merge' => 'mergelogpagetext', 'suppress' => 'suppressionlogtext', @@ -2896,6 +2900,10 @@ $wgLogActions = array( '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 @@ $wgSpecialPageGroups = array( 'Specialpages' => 'other', 'Blockme' => 'other', 'Booksources' => 'other', + 'Interwiki' => 'other', ); /** diff --git a/includes/SpecialPage.php b/includes/SpecialPage.php index 812ad53888..ef0dd8af2d 100644 --- a/includes/SpecialPage.php +++ b/includes/SpecialPage.php @@ -147,6 +147,7 @@ class SpecialPage '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', diff --git a/includes/specials/SpecialInterwiki.php b/includes/specials/SpecialInterwiki.php new file mode 100644 index 0000000000..36ebbca67a --- /dev/null +++ b/includes/specials/SpecialInterwiki.php @@ -0,0 +1,263 @@ +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( + "
+ $topmessage +
+ + + + +
$deletingmessage
$reasonmessage  
+ + + + +
+
+
\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( '
$1
', 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 = ""; + $topmessage = wfMsgHtml( 'interwiki_edittext' ); + $intromessage = wfMsgHtml( 'interwiki_editintro' ); + $button = wfMsgHtml( 'edit' ); + } else { + $prefix = ""; + $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( + "
+ $topmessage + $intromessage +
+ + + + + + + + + + + + + + + +
$prefixmessage$prefix
$localmessage
$transmessage
$urlmessage
$reasonmessage
+ + + $old + +
+
\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( '' . wfMsg( 'interwiki_delfailed', $prefix ) . '' ); + } 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( '' . wfMsg( "interwiki_{$do}failed", $prefix ) . '' ); + } 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( '' ); + } + + $out = " +
+ + "; + if( $admin ) { + $deletemessage = wfMsgHtml( 'delete' ); + $editmessage = wfMsgHtml( 'edit' ); + $out .= ""; + } + + $out .= "\n"; + + $dbr = wfGetDB( DB_SLAVE ); + $res = $dbr->select( 'interwiki', '*' ); + $numrows = $dbr->numRows( $res ); + if ($numrows == 0) { + $errormessage = wfMsgHtml('interwiki_error'); + $out .= "
$errormessage

"; + } + 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 .= " + + + + "; + if( $admin ) { + $out .= ''; + } + + $out .= "\n\n"; + } + $dbr->freeResult( $res ); + $out .= "
$prefixmessage $urlmessage $localmessage $transmessage$editmessage
$prefix$url$local$trans'; + $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 .= '

"; + $wgOut->addHTML($out); + } + } +} diff --git a/languages/messages/MessagesEn.php b/languages/messages/MessagesEn.php index 08900d66a8..8449b707a9 100644 --- a/languages/messages/MessagesEn.php +++ b/languages/messages/MessagesEn.php @@ -430,6 +430,7 @@ $specialPageAliases = array( 'Blankpage' => array( 'BlankPage' ), 'LinkSearch' => array( 'LinkSearch' ), 'DeletedContributions' => array( 'DeletedContributions' ), + 'Interwiki' => array( 'Interwiki' ), ); /** @@ -2187,6 +2188,45 @@ Also see [[Special:WantedCategories|wanted categories]].', # 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:', diff --git a/maintenance/language/messages.inc b/maintenance/language/messages.inc index f0f7586d65..f57729b9b4 100644 --- a/maintenance/language/messages.inc +++ b/maintenance/language/messages.inc @@ -1465,6 +1465,9 @@ $wgMessageStructure = array( 'deletedcontribs' => array( 'deletedcontributions', ), + 'interwiki' => array( + 'interwiki', + ), 'linksearch' => array( 'linksearch', 'linksearch-pat', @@ -2948,6 +2951,7 @@ XHTML id names.", 'allpages' => 'Special:AllPages', 'categories' => 'Special:Categories', 'deletedcontribs' => 'Special:DeletedContributions', + 'deletedcontribs' => 'Special:Interwiki', 'linksearch' => 'Special:LinkSearch', 'listusers' => 'Special:ListUsers', 'newuserlog' => 'Special:Log/newusers', -- 2.20.1