]> scripts.mit.edu Git - autoinstallsdev/mediawiki.git/blob - includes/SpecialIpblocklist.php
MediaWiki 1.11.0
[autoinstallsdev/mediawiki.git] / includes / SpecialIpblocklist.php
1 <?php
2 /**
3  *
4  * @addtogroup SpecialPage
5  */
6
7 /**
8  * @todo document
9  */
10 function wfSpecialIpblocklist() {
11         global $wgUser, $wgOut, $wgRequest;
12         
13         $ip = $wgRequest->getVal( 'wpUnblockAddress', $wgRequest->getVal( 'ip' ) );
14         $id = $wgRequest->getVal( 'id' );
15         $reason = $wgRequest->getText( 'wpUnblockReason' );
16         $action = $wgRequest->getText( 'action' );
17         $successip = $wgRequest->getVal( 'successip' );
18
19         $ipu = new IPUnblockForm( $ip, $id, $reason );
20
21         if( $action == 'unblock' ) {
22                 # Check permissions
23                 if( !$wgUser->isAllowed( 'block' ) ) {
24                         $wgOut->permissionRequired( 'block' );
25                         return;
26                 }
27                 # Check for database lock
28                 if( wfReadOnly() ) {
29                         $wgOut->readOnlyPage();
30                         return;
31                 }
32                 # Show unblock form
33                 $ipu->showForm( '' );
34         } elseif( $action == 'submit' && $wgRequest->wasPosted()
35                 && $wgUser->matchEditToken( $wgRequest->getVal( 'wpEditToken' ) ) ) {
36                 # Check permissions
37                 if( !$wgUser->isAllowed( 'block' ) ) {
38                         $wgOut->permissionRequired( 'block' );
39                         return;
40                 }
41                 # Check for database lock
42                 if( wfReadOnly() ) {
43                         $wgOut->readOnlyPage();
44                         return;
45                 }
46                 # Remove blocks and redirect user to success page
47                 $ipu->doSubmit();
48         } elseif( $action == 'success' ) {
49                 # Inform the user of a successful unblock
50                 # (No need to check permissions or locks here,
51                 # if something was done, then it's too late!)
52                 if ( substr( $successip, 0, 1) == '#' ) {
53                         // A block ID was unblocked
54                         $ipu->showList( $wgOut->parse( wfMsg( 'unblocked-id', $successip ) ) );
55                 } else {
56                         // A username/IP was unblocked
57                         $ipu->showList( $wgOut->parse( wfMsg( 'unblocked', $successip ) ) );
58                 }
59         } else {
60                 # Just show the block list
61                 $ipu->showList( '' );
62         }
63
64 }
65
66 /**
67  * implements Special:ipblocklist GUI
68  * @addtogroup SpecialPage
69  */
70 class IPUnblockForm {
71         var $ip, $reason, $id;
72
73         function IPUnblockForm( $ip, $id, $reason ) {
74                 $this->ip = strtr( $ip, '_', ' ' );
75                 $this->id = $id;
76                 $this->reason = $reason;
77         }
78
79         function showForm( $err ) {
80                 global $wgOut, $wgUser, $wgSysopUserBans, $wgContLang;
81
82                 $wgOut->setPagetitle( wfMsg( 'unblockip' ) );
83                 $wgOut->addWikiText( wfMsg( 'unblockiptext' ) );
84
85                 $ipa = wfMsgHtml( $wgSysopUserBans ? 'ipadressorusername' : 'ipaddress' );
86                 $ipr = wfMsgHtml( 'ipbreason' );
87                 $ipus = wfMsgHtml( 'ipusubmit' );
88                 $titleObj = SpecialPage::getTitleFor( "Ipblocklist" );
89                 $action = $titleObj->getLocalURL( "action=submit" );
90                 $alignRight = $wgContLang->isRtl() ? 'left' : 'right';
91
92                 if ( "" != $err ) {
93                         $wgOut->setSubtitle( wfMsg( "formerror" ) );
94                         $wgOut->addWikitext( "<span class='error'>{$err}</span>\n" );
95                 }
96                 $token = htmlspecialchars( $wgUser->editToken() );
97
98                 $addressPart = false;
99                 if ( $this->id ) {
100                         $block = Block::newFromID( $this->id );
101                         if ( $block ) {
102                                 $encName = htmlspecialchars( $block->getRedactedName() );
103                                 $encId = $this->id;
104                                 $addressPart = $encName . Xml::hidden( 'id', $encId );
105                         }
106                 }
107                 if ( !$addressPart ) {
108                         $addressPart = Xml::input( 'wpUnblockAddress', 20, $this->ip, array( 'type' => 'text', 'tabindex' => '1' ) );
109                 }
110
111                 $wgOut->addHTML(
112                         Xml::openElement( 'form', array( 'method' => 'post', 'action' => $action, 'id' => 'unblockip' ) ) .
113                         Xml::openElement( 'table', array( 'border' => '0' ) ).
114                         "<tr>
115                                 <td align='$alignRight'>
116                                         {$ipa}
117                                 </td>
118                                 <td>
119                                         {$addressPart}
120                                 </td>
121                         </tr>
122                         <tr>
123                                 <td align='$alignRight'>
124                                         {$ipr}
125                                 </td>
126                                 <td>" .
127                                         Xml::input( 'wpUnblockReason', 40, $this->reason, array( 'type' => 'text', 'tabindex' => '2' ) ) .
128                                 "</td>
129                         </tr>
130                         <tr>
131                                 <td>&nbsp;</td>
132                                 <td>" .
133                                         Xml::submitButton( $ipus, array( 'name' => 'wpBlock', 'tabindex' => '3' ) ) .
134                                 "</td>
135                         </tr>" .
136                         Xml::closeElement( 'table' ) .
137                         Xml::hidden( 'wpEditToken', $token ) .
138                         Xml::closeElement( 'form' ) . "\n"
139                 );
140
141         }
142
143         function doSubmit() {
144                 global $wgOut;
145
146                 if ( $this->id ) {
147                         $block = Block::newFromID( $this->id );
148                         if ( $block ) {
149                                 $this->ip = $block->getRedactedName();
150                         }
151                 } else {
152                         $block = new Block();
153                         $this->ip = trim( $this->ip );
154                         if ( substr( $this->ip, 0, 1 ) == "#" ) {
155                                 $id = substr( $this->ip, 1 );
156                                 $block = Block::newFromID( $id );
157                         } else {
158                                 $block = Block::newFromDB( $this->ip );
159                                 if ( !$block ) { 
160                                         $block = null;
161                                 }
162                         }
163                 }
164                 $success = false;
165                 if ( $block ) {
166                         # Delete block
167                         if ( $block->delete() ) {
168                                 # Make log entry
169                                 $log = new LogPage( 'block' );
170                                 $log->addEntry( 'unblock', Title::makeTitle( NS_USER, $this->ip ), $this->reason );
171                                 $success = true;
172                         }
173                 }
174
175                 if ( $success ) {
176                         # Report to the user
177                         $titleObj = SpecialPage::getTitleFor( "Ipblocklist" );
178                         $success = $titleObj->getFullURL( "action=success&successip=" . urlencode( $this->ip ) );
179                         $wgOut->redirect( $success );
180                 } else {
181                         if ( !$this->ip && $this->id ) {
182                                 $this->ip = '#' . $this->id;
183                         }
184                         $this->showForm( wfMsg( 'ipb_cant_unblock', htmlspecialchars( $this->id ) ) );
185                 }
186         }
187
188         function showList( $msg ) {
189                 global $wgOut, $wgUser;
190
191                 $wgOut->setPagetitle( wfMsg( "ipblocklist" ) );
192                 if ( "" != $msg ) {
193                         $wgOut->setSubtitle( $msg );
194                 }
195
196                 // Purge expired entries on one in every 10 queries
197                 if ( !mt_rand( 0, 10 ) ) {
198                         Block::purgeExpired();
199                 }
200
201                 $conds = array();
202                 $matches = array();
203                 // Is user allowed to see all the blocks?
204                 if ( !$wgUser->isAllowed( 'oversight' ) )
205                         $conds['ipb_deleted'] = 0;
206                 if ( $this->ip == '' ) {
207                         // No extra conditions
208                 } elseif ( substr( $this->ip, 0, 1 ) == '#' ) {
209                         $conds['ipb_id'] = substr( $this->ip, 1 );
210                 } elseif ( IP::toUnsigned( $this->ip ) !== false ) {
211                         $conds['ipb_address'] = $this->ip;
212                         $conds['ipb_auto'] = 0;
213                 } elseif( preg_match( '/^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\\/(\\d{1,2})$/', $this->ip, $matches ) ) {
214                         $conds['ipb_address'] = Block::normaliseRange( $this->ip );
215                         $conds['ipb_auto'] = 0;
216                 } else {
217                         $user = User::newFromName( $this->ip );
218                         if ( $user && ( $id = $user->getID() ) != 0 ) {
219                                 $conds['ipb_user'] = $id;
220                         } else {
221                                 // Uh...?
222                                 $conds['ipb_address'] = $this->ip;
223                                 $conds['ipb_auto'] = 0;
224                         }
225                 }
226
227                 $pager = new IPBlocklistPager( $this, $conds );
228                 if ( $pager->getNumRows() ) {
229                         $wgOut->addHTML(
230                                 $this->searchForm() .
231                                 $pager->getNavigationBar() .
232                                 Xml::tags( 'ul', null, $pager->getBody() ) .
233                                 $pager->getNavigationBar()
234                         );
235                 } elseif ( $this->ip != '') {
236                         $wgOut->addHTML( $this->searchForm() );
237                         $wgOut->addWikiText( wfMsg( 'ipblocklist-no-results' ) );
238                 } else {
239                         $wgOut->addWikiText( wfMsg( 'ipblocklist-empty' ) );
240                 }
241         }
242
243         function searchForm() {
244                 global $wgTitle, $wgScript, $wgRequest;
245                 return
246                         Xml::tags( 'form', array( 'action' => $wgScript ),
247                                 Xml::hidden( 'title', $wgTitle->getPrefixedDbKey() ) .
248                                 Xml::openElement( 'fieldset' ) .
249                                 Xml::element( 'legend', null, wfMsg( 'ipblocklist-legend' ) ) .
250                                 Xml::inputLabel( wfMsg( 'ipblocklist-username' ), 'ip', 'ip', /* size */ false, $this->ip ) .
251                                 '&nbsp;' .
252                                 Xml::submitButton( wfMsg( 'ipblocklist-submit' ) ) .
253                                 Xml::closeElement( 'fieldset' )
254                         );
255         }
256
257         /**
258          * Callback function to output a block
259          */
260         function formatRow( $block ) {
261                 global $wgUser, $wgLang;
262
263                 wfProfileIn( __METHOD__ );
264
265                 static $sk=null, $msg=null;
266
267                 if( is_null( $sk ) )
268                         $sk = $wgUser->getSkin();
269                 if( is_null( $msg ) ) {
270                         $msg = array();
271                         $keys = array( 'infiniteblock', 'expiringblock', 'contribslink', 'unblocklink', 
272                                 'anononlyblock', 'createaccountblock', 'noautoblockblock', 'emailblock' );
273                         foreach( $keys as $key ) {
274                                 $msg[$key] = wfMsgHtml( $key );
275                         }
276                         $msg['blocklistline'] = wfMsg( 'blocklistline' );
277                         $msg['contribslink'] = wfMsg( 'contribslink' );
278                 }
279
280                 # Prepare links to the blocker's user and talk pages
281                 $blocker_id = $block->getBy();
282                 $blocker_name = $block->getByName();
283                 $blocker = $sk->userLink( $blocker_id, $blocker_name );
284                 $blocker .= $sk->userToolLinks( $blocker_id, $blocker_name );
285
286                 # Prepare links to the block target's user and contribs. pages (as applicable, don't do it for autoblocks)
287                 if( $block->mAuto ) {
288                         $target = $block->getRedactedName(); # Hide the IP addresses of auto-blocks; privacy
289                 } else {
290                         $target = $sk->userLink( $block->mUser, $block->mAddress )
291                                 . $sk->userToolLinks( $block->mUser, $block->mAddress, false, Linker::TOOL_LINKS_NOBLOCK );
292                 }
293                 
294                 $formattedTime = $wgLang->timeanddate( $block->mTimestamp, true );
295
296                 $properties = array();
297                 if ( $block->mExpiry === "" || $block->mExpiry === Block::infinity() ) {
298                         $properties[] = $msg['infiniteblock'];
299                 } else {
300                         $properties[] = wfMsgReplaceArgs( $msg['expiringblock'],
301                                 array( $wgLang->timeanddate( $block->mExpiry, true ) ) );
302                 }
303                 if ( $block->mAnonOnly ) {
304                         $properties[] = $msg['anononlyblock'];
305                 }
306                 if ( $block->mCreateAccount ) {
307                         $properties[] = $msg['createaccountblock'];
308                 }
309                 if (!$block->mEnableAutoblock && $block->mUser ) {
310                         $properties[] = $msg['noautoblockblock'];
311                 }
312
313                 if ( $block->mBlockEmail && $block->mUser ) {
314                         $properties[] = $msg['emailblock'];
315                 }
316
317                 $properties = implode( ', ', $properties );
318
319                 $line = wfMsgReplaceArgs( $msg['blocklistline'], array( $formattedTime, $blocker, $target, $properties ) );
320
321                 $unblocklink = '';
322                 if ( $wgUser->isAllowed('block') ) {
323                         $titleObj = SpecialPage::getTitleFor( "Ipblocklist" );
324                         $unblocklink = ' (' . $sk->makeKnownLinkObj($titleObj, $msg['unblocklink'], 'action=unblock&id=' . urlencode( $block->mId ) ) . ')';
325                 }
326                 
327                 $comment = $sk->commentBlock( $block->mReason );
328                 
329                 $s = "{$line} $comment";        
330                 if ( $block->mHideName )
331                         $s = '<span class="history-deleted">' . $s . '</span>';
332                                 
333                 wfProfileOut( __METHOD__ );
334                 return "<li>$s $unblocklink</li>\n";
335         }
336 }
337
338 /**
339  * @todo document
340  * @addtogroup Pager
341  */
342 class IPBlocklistPager extends ReverseChronologicalPager {
343         public $mForm, $mConds;
344
345         function __construct( $form, $conds = array() ) {
346                 $this->mForm = $form;
347                 $this->mConds = $conds;
348                 parent::__construct();
349         }
350
351         function getStartBody() {
352                 wfProfileIn( __METHOD__ );
353                 # Do a link batch query
354                 $this->mResult->seek( 0 );
355                 $lb = new LinkBatch;
356
357                 /*
358                 while ( $row = $this->mResult->fetchObject() ) {
359                         $lb->addObj( Title::makeTitleSafe( NS_USER, $row->user_name ) );
360                         $lb->addObj( Title::makeTitleSafe( NS_USER_TALK, $row->user_name ) );
361                         $lb->addObj( Title::makeTitleSafe( NS_USER, $row->ipb_address ) );
362                         $lb->addObj( Title::makeTitleSafe( NS_USER_TALK, $row->ipb_address ) );
363                 }*/
364                 # Faster way
365                 # Usernames and titles are in fact related by a simple substitution of space -> underscore
366                 # The last few lines of Title::secureAndSplit() tell the story.
367                 while ( $row = $this->mResult->fetchObject() ) {
368                         $name = str_replace( ' ', '_', $row->user_name );
369                         $lb->add( NS_USER, $name );
370                         $lb->add( NS_USER_TALK, $name );
371                         $name = str_replace( ' ', '_', $row->ipb_address );
372                         $lb->add( NS_USER, $name );
373                         $lb->add( NS_USER_TALK, $name );
374                 }
375                 $lb->execute();
376                 wfProfileOut( __METHOD__ );
377                 return '';
378         }
379         
380         function formatRow( $row ) {
381                 $block = new Block;
382                 $block->initFromRow( $row );
383                 return $this->mForm->formatRow( $block );
384         }
385
386         function getQueryInfo() {
387                 $conds = $this->mConds;
388                 $conds[] = 'ipb_expiry>' . $this->mDb->addQuotes( $this->mDb->timestamp() );
389                 $conds[] = 'ipb_by=user_id';
390                 return array(
391                         'tables' => array( 'ipblocks', 'user' ),
392                         'fields' => $this->mDb->tableName( 'ipblocks' ) . '.*,user_name',
393                         'conds' => $conds,
394                 );
395         }
396
397         function getIndexField() {
398                 return 'ipb_timestamp';
399         }
400 }
401
402