3470bbb9f92c2f1b24cc0dbc6ca87ec0d794b8d2
[lhc/web/wiklou.git] / includes / specials / SpecialInterwiki.php
1 <?php
2
3 /**
4 * implements Special:Interwiki
5 * @ingroup SpecialPage
6 */
7 class SpecialInterwiki extends SpecialPage {
8
9 function __construct() {
10 parent::__construct( 'Interwiki' );
11 }
12
13 function execute( $par ) {
14 global $wgRequest, $wgOut, $wgUser, $wgEnableSpecialInterwiki;
15
16 $this->setHeaders();
17 $this->outputHeader();
18
19 $admin = $wgUser->isAllowed( 'interwiki' );
20 if ( $admin ) {
21 $wgOut->setPagetitle( wfMsg( 'interwiki' ) );
22 } else {
23 $wgOut->setPagetitle( wfMsg( 'interwiki-title-norights' ) );
24 }
25 $action = $wgRequest->getVal( 'action', $par );
26
27 switch( $action ){
28 case "delete":
29 case "edit" :
30 case "add" :
31 if( !$wgEnableSpecialInterwiki ) {
32 $wgOut->addWikiMsg( 'interwiki-not-enabled' );
33 return;
34 }
35 if( !$admin ){
36 $wgOut->permissionRequired( 'interwiki' );
37 return;
38 }
39 $this->showForm( $action );
40 break;
41 case "submit":
42 if( !$wgEnableSpecialInterwiki ) {
43 $wgOut->addWikiMsg( 'interwiki-not-enabled' );
44 return;
45 }
46 if( !$admin ){
47 $wgOut->permissionRequired( 'interwiki' );
48 return;
49 }
50 if( !$wgRequest->wasPosted() || !$wgUser->matchEditToken( $wgRequest->getVal( 'wpEditToken' ) ) ) {
51 $wgOut->addWikiMsg( 'sessionfailure' );
52 return;
53 }
54 $this->doSubmit();
55 break;
56 default:
57 $this->showList( $admin );
58 break;
59 }
60 }
61
62 function showForm( $action ) {
63 global $wgRequest, $wgUser, $wgOut;
64
65 $actionUrl = $this->getTitle()->getLocalURL( 'action=submit' );
66 $token = $wgUser->editToken();
67 $defaultreason = $wgRequest->getVal( 'wpInterwikiReason' ) ? $wgRequest->getVal( 'wpInterwikiReason' ) : wfMsgForContent( 'interwiki_defaultreason' );
68
69 switch( $action ){
70 case "delete":
71
72 $prefix = $wgRequest->getVal( 'prefix' );
73 $button = wfMsg( 'delete' );
74 $topmessage = wfMsg( 'interwiki_delquestion', $prefix );
75 $deletingmessage = wfMsgExt( 'interwiki_deleting', array( 'parseinline' ), $prefix );
76 $reasonmessage = wfMsg( 'deletecomment' );
77
78 $wgOut->addHTML(
79 Xml::openElement( 'fieldset' ) .
80 Xml::element( 'legend', null, $topmessage ) .
81 Xml::openElement( 'form', array('id'=> 'mw-interwiki-deleteform', 'method'=> 'post', 'action' => $actionUrl ) ) .
82 Xml::openElement( 'table' ) .
83 "<tr><td>$deletingmessage</td></tr>".
84 '<tr><td class="mw-label">' . Xml::label( $reasonmessage, 'mw-interwiki-deletereason') . '</td>' .
85 '<td class="mw-input">' .
86 Xml::input( 'wpInterwikiReason', 60, $defaultreason, array( 'tabindex' => '1', 'id' => 'mw-interwiki-deletereason', 'maxlength' => '200' ) ) .
87 '</td></tr>' .
88 '<tr><td class="mw-submit">' . Xml::submitButton( $button, array( 'id' => 'mw-interwiki-submit' ) ) .
89 Xml::hidden( 'wpInterwikiPrefix', $prefix ) .
90 Xml::hidden( 'wpInterwikiAction', $action ) .
91 Xml::hidden( 'wpEditToken', $token ) .
92 '</td></tr>' .
93 Xml::closeElement( 'table' ) .
94 Xml::closeElement( 'form' ) .
95 Xml::closeElement( 'fieldset' )
96 );
97 break;
98 case "edit" :
99 case "add" :
100 if( $action == "edit" ){
101 $prefix = $wgRequest->getVal( 'prefix' );
102 $dbr = wfGetDB( DB_SLAVE );
103 $row = $dbr->selectRow( 'interwiki', '*', array( 'iw_prefix' => $prefix ) );
104 if( !$row ){
105 $this->error( wfMsg( 'interwiki_editerror', $prefix ) );
106 return;
107 }
108 $prefix = '<tt>' . htmlspecialchars( $row->iw_prefix ) . '</tt>';
109 $defaulturl = $row->iw_url;
110 $trans = $row->iw_trans;
111 $local = $row->iw_local;
112 $old = Xml::hidden( 'wpInterwikiPrefix', $row->iw_prefix );
113 $topmessage = wfMsgExt( 'interwiki_edittext', array( 'parseinline' ) );
114 $intromessage = wfMsgExt( 'interwiki_editintro', array( 'parseinline' ) );
115 $button = wfMsg( 'edit' );
116 } else {
117 $prefix = $wgRequest->getVal( 'wpInterwikiPrefix' ) ? $wgRequest->getVal( 'wpInterwikiPrefix' ) : $wgRequest->getVal( 'prefix' );
118 $prefix = Xml::input( 'wpInterwikiPrefix', 20, $prefix, array( 'tabindex'=>'1', 'id'=>'mw-interwiki-prefix', 'maxlength'=>'20' ) );
119 $local = $wgRequest->getCheck( 'wpInterwikiLocal' );
120 $trans = $wgRequest->getCheck( 'wpInterwikiTrans' );
121 $old = '';
122 $defaulturl = $wgRequest->getVal( 'wpInterwikiURL' ) ? $wgRequest->getVal( 'wpInterwikiURL' ) : wfMsg( 'interwiki_defaulturl' );
123 $topmessage = wfMsgExt( 'interwiki_addtext', array( 'parseinline' ) );
124 $intromessage = wfMsgExt( 'interwiki_addintro', array( 'parseinline' ) );
125 $button = wfMsg( 'interwiki_addbutton' );
126 }
127
128 $prefixmessage = wfMsgHtml( 'interwiki_prefix' );
129 $localmessage = wfMsg( 'interwiki_local' );
130 $transmessage = wfMsg( 'interwiki_trans' );
131 $reasonmessage = wfMsg( 'interwiki_reasonfield' );
132 $urlmessage = wfMsg( 'interwiki_url' );
133
134 $wgOut->addHTML(
135 Xml::openElement( 'fieldset' ) .
136 Xml::element( 'legend', null, $topmessage ) .
137 $intromessage .
138 Xml::openElement( 'form', array('id'=> 'mw-interwiki-editform', 'method'=> 'post', 'action'=>$actionUrl) ) .
139 Xml::openElement( 'table', array('id'=>"mw-interwiki-$action") ) .
140 "<tr><td class='mw-label'>$prefixmessage</td><td><tt>$prefix</tt></td></tr>" .
141 "<tr><td class='mw-label'>" . Xml::label( $localmessage, 'mw-interwiki-local' ) . '</td>' .
142 "<td class='mw-input'>" . Xml::check( 'wpInterwikiLocal', $local, array('id'=>'mw-interwiki-local') ) . '</td></tr>' .
143 '<tr><td class="mw-label">' . Xml::label( $transmessage, 'mw-interwiki-trans' ) . '</td>' .
144 '<td class="mw-input">' . Xml::check( 'wpInterwikiTrans', $trans, array('id'=>'mw-interwiki-trans') ) . '</td></tr>' .
145 '<tr><td class="mw-label">' . Xml::label( $urlmessage, 'mw-interwiki-url' ) . '</td>' .
146 '<td class="mw-input">' . Xml::input( 'wpInterwikiURL', 60, $defaulturl, array('tabindex'=>'1', 'maxlength'=>'200', 'id'=>'mw-interwiki-url') ) . '</td></tr>' .
147 '<tr><td class="mw-label">' . Xml::label( $reasonmessage, 'mw-interwiki-editreason' ) . '</td>' .
148 '<td class="mw-input">' . Xml::input( 'wpInterwikiReason', 60, $defaultreason, array( 'tabindex'=>'1', 'id'=>'mw-interwiki-editreason', 'maxlength'=>'200') ) .
149 Xml::hidden( 'wpInterwikiAction', $action ) .
150 $old .
151 Xml::hidden( 'wpEditToken', $token ) .
152 '</td></tr>' .
153 '<tr><td class="mw-submit">' . Xml::submitButton( $button, array( 'id'=>'mw-interwiki-submit' ) ) . '</td></tr>' .
154 Xml::closeElement( 'table' ) .
155 Xml::closeElement( 'form' ) .
156 Xml::closeElement( 'fieldset' )
157 );
158 break;
159 }
160 }
161
162 function doSubmit() {
163 global $wgRequest, $wgOut;
164 $prefix = $wgRequest->getVal( 'wpInterwikiPrefix' );
165 $do = $wgRequest->getVal( 'wpInterwikiAction' );
166 if( preg_match( '/[\s:&=]/', $prefix ) ) {
167 $this->error( wfMsg( 'interwiki-badprefix', $prefix ) );
168 $this->showForm( $do );
169 return;
170 }
171 $reason = $wgRequest->getText( 'wpInterwikiReason' );
172 $selfTitle = $this->getTitle();
173 $dbw = wfGetDB( DB_MASTER );
174 switch( $do ){
175 case "delete":
176 $dbw->delete( 'interwiki', array( 'iw_prefix' => $prefix ), __METHOD__ );
177
178 if ( $dbw->affectedRows() == 0 ) {
179 $this->error( wfMsg( 'interwiki_delfailed', $prefix ) );
180 $this->showForm( $do );
181 } else {
182 $wgOut->addWikiText( wfMsg( 'interwiki_deleted', $prefix ));
183 $wgOut->returnToMain( false, $selfTitle );
184 $log = new LogPage( 'interwiki' );
185 $log->addEntry( 'iw_delete', $selfTitle, $reason, array( $prefix ) );
186 }
187 break;
188 case "edit":
189 case "add":
190 $theurl = $wgRequest->getVal( 'wpInterwikiURL' );
191 $local = $wgRequest->getCheck( 'wpInterwikiLocal' ) ? 1 : 0;
192 $trans = $wgRequest->getCheck( 'wpInterwikiTrans' ) ? 1 : 0;
193 $data = array( 'iw_prefix' => $prefix, 'iw_url' => $theurl,
194 'iw_local' => $local, 'iw_trans' => $trans );
195
196 if( $do == 'add' ){
197 $dbw->insert( 'interwiki', $data, __METHOD__, 'IGNORE' );
198 } else {
199 $dbw->update( 'interwiki', $data, array( 'iw_prefix' => $prefix ), __METHOD__, 'IGNORE' );
200 }
201
202 if( $dbw->affectedRows() == 0 ) {
203 $this->error( wfMsg( "interwiki_{$do}failed", $prefix ) );
204 $this->showForm( $do );
205 } else {
206 $wgOut->addWikiMsg( "interwiki_{$do}ed", $prefix );
207 $wgOut->returnToMain( false, $selfTitle );
208 $log = new LogPage( 'interwiki' );
209 $log->addEntry( 'iw_'.$do, $selfTitle, $reason, array( $prefix, $theurl, $trans, $local ) );
210 }
211 break;
212 }
213 }
214
215 function showList( $admin ) {
216 global $wgUser, $wgOut, $wgEnableSpecialInterwiki;
217 $prefixmessage = wfMsgHtml( 'interwiki_prefix' );
218 $urlmessage = wfMsgHtml( 'interwiki_url' );
219 $localmessage = wfMsgHtml( 'interwiki_local' );
220 $transmessage = wfMsgHtml( 'interwiki_trans' );
221
222 $wgOut->addWikiMsg( 'interwiki_intro' );
223 $selfTitle = $this->getTitle();
224
225 if ( $admin && $wgEnableSpecialInterwiki ) {
226 $skin = $wgUser->getSkin();
227 $addtext = wfMsgHtml( 'interwiki_addtext' );
228 $addlink = $skin->link( $selfTitle, $addtext, array(), array( 'action' => 'add' ) );
229 $wgOut->addHTML( '<ul>' . '<li>' . $addlink . '</li>' . '</ul>' );
230 }
231
232 $dbr = wfGetDB( DB_SLAVE );
233 $res = $dbr->select( 'interwiki', '*' );
234 $numrows = $res->numRows();
235 if ( $numrows == 0 ) {
236 $this->error( wfMsgWikiHtml( 'interwiki_error' ) );
237 return;
238 }
239
240 $out = "
241 <br />
242 <table width='100%' style='border:1px solid #aaa;' class='wikitable'>
243 <tr id='interwikitable-header'><th>$prefixmessage</th> <th>$urlmessage</th> <th>$localmessage</th> <th>$transmessage</th>";
244 if( $admin && $wgEnableSpecialInterwiki ) {
245 $deletemessage = wfMsgHtml( 'delete' );
246 $editmessage = wfMsgHtml( 'edit' );
247 $out .= "<th>$editmessage</th>";
248 }
249 $out .= "</tr>\n";
250
251 while( $s = $res->fetchObject() ) {
252 $prefix = htmlspecialchars( $s->iw_prefix );
253 $url = htmlspecialchars( $s->iw_url );
254 $trans = htmlspecialchars( $s->iw_trans );
255 $local = htmlspecialchars( $s->iw_local );
256 $out .= "<tr class='mw-interwikitable-row'>
257 <td class='mw-interwikitable-prefix'>$prefix</td>
258 <td class='mw-interwikitable-url'>$url</td>
259 <td class='mw-interwikitable-local'>$local</td>
260 <td class='mw-interwikitable-trans'>$trans</td>";
261 if( $admin && $wgEnableSpecialInterwiki ) {
262 $out .= '<td class="mw-interwikitable-modify">';
263 $out .= $skin->link( $selfTitle, $editmessage, array(),
264 array( 'action' => 'edit', 'prefix' => $s->iw_prefix ) );
265 $out .= ', ';
266 $out .= $skin->link( $selfTitle, $deletemessage, array(),
267 array( 'action' => 'delete', 'prefix' => $s->iw_prefix ) );
268 $out .= '</td>';
269 }
270
271 $out .= "\n</tr>\n";
272 }
273 $res->free();
274 $out .= "</table><br />";
275 $wgOut->addHTML( $out );
276 }
277
278 function error( $msg ) {
279 global $wgOut;
280 $wgOut->addHTML( Xml::tags( 'p', array( 'class' => 'error' ), $msg ) );
281 }
282 }