[ Index ]

PHP Cross Reference of MediaWiki-1.24.0

title

Body

[close]

/includes/specials/ -> SpecialBlockList.php (source)

   1  <?php
   2  /**
   3   * Implements Special:BlockList
   4   *
   5   * This program is free software; you can redistribute it and/or modify
   6   * it under the terms of the GNU General Public License as published by
   7   * the Free Software Foundation; either version 2 of the License, or
   8   * (at your option) any later version.
   9   *
  10   * This program is distributed in the hope that it will be useful,
  11   * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13   * GNU General Public License for more details.
  14   *
  15   * You should have received a copy of the GNU General Public License along
  16   * with this program; if not, write to the Free Software Foundation, Inc.,
  17   * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  18   * http://www.gnu.org/copyleft/gpl.html
  19   *
  20   * @file
  21   * @ingroup SpecialPage
  22   */
  23  
  24  /**
  25   * A special page that lists existing blocks
  26   *
  27   * @ingroup SpecialPage
  28   */
  29  class SpecialBlockList extends SpecialPage {
  30      protected $target;
  31  
  32      protected $options;
  33  
  34  	function __construct() {
  35          parent::__construct( 'BlockList' );
  36      }
  37  
  38      /**
  39       * Main execution point
  40       *
  41       * @param string $par Title fragment
  42       */
  43  	public function execute( $par ) {
  44          $this->setHeaders();
  45          $this->outputHeader();
  46          $out = $this->getOutput();
  47          $lang = $this->getLanguage();
  48          $out->setPageTitle( $this->msg( 'ipblocklist' ) );
  49          $out->addModuleStyles( 'mediawiki.special' );
  50  
  51          $request = $this->getRequest();
  52          $par = $request->getVal( 'ip', $par );
  53          $this->target = trim( $request->getVal( 'wpTarget', $par ) );
  54  
  55          $this->options = $request->getArray( 'wpOptions', array() );
  56  
  57          $action = $request->getText( 'action' );
  58  
  59          if ( $action == 'unblock' || $action == 'submit' && $request->wasPosted() ) {
  60              # B/C @since 1.18: Unblock interface is now at Special:Unblock
  61              $title = SpecialPage::getTitleFor( 'Unblock', $this->target );
  62              $out->redirect( $title->getFullURL() );
  63  
  64              return;
  65          }
  66  
  67          # Just show the block list
  68          $fields = array(
  69              'Target' => array(
  70                  'type' => 'text',
  71                  'label-message' => 'ipaddressorusername',
  72                  'tabindex' => '1',
  73                  'size' => '45',
  74                  'default' => $this->target,
  75              ),
  76              'Options' => array(
  77                  'type' => 'multiselect',
  78                  'options' => array(
  79                      $this->msg( 'blocklist-userblocks' )->text() => 'userblocks',
  80                      $this->msg( 'blocklist-tempblocks' )->text() => 'tempblocks',
  81                      $this->msg( 'blocklist-addressblocks' )->text() => 'addressblocks',
  82                      $this->msg( 'blocklist-rangeblocks' )->text() => 'rangeblocks',
  83                  ),
  84                  'flatlist' => true,
  85              ),
  86              'Limit' => array(
  87                  'type' => 'limitselect',
  88                  'label-message' => 'table_pager_limit_label',
  89                  'options' => array(
  90                      $lang->formatNum( 20 ) => 20,
  91                      $lang->formatNum( 50 ) => 50,
  92                      $lang->formatNum( 100 ) => 100,
  93                      $lang->formatNum( 250 ) => 250,
  94                      $lang->formatNum( 500 ) => 500,
  95                  ),
  96                  'name' => 'limit',
  97                  'default' => 50,
  98              ),
  99          );
 100          $context = new DerivativeContext( $this->getContext() );
 101          $context->setTitle( $this->getPageTitle() ); // Remove subpage
 102          $form = new HTMLForm( $fields, $context );
 103          $form->setMethod( 'get' );
 104          $form->setWrapperLegendMsg( 'ipblocklist-legend' );
 105          $form->setSubmitTextMsg( 'ipblocklist-submit' );
 106          $form->prepareForm();
 107  
 108          $form->displayForm( '' );
 109          $this->showList();
 110      }
 111  
 112  	function showList() {
 113          # Purge expired entries on one in every 10 queries
 114          if ( !mt_rand( 0, 10 ) ) {
 115              Block::purgeExpired();
 116          }
 117  
 118          $conds = array();
 119          # Is the user allowed to see hidden blocks?
 120          if ( !$this->getUser()->isAllowed( 'hideuser' ) ) {
 121              $conds['ipb_deleted'] = 0;
 122          }
 123  
 124          if ( $this->target !== '' ) {
 125              list( $target, $type ) = Block::parseTarget( $this->target );
 126  
 127              switch ( $type ) {
 128                  case Block::TYPE_ID:
 129                  case Block::TYPE_AUTO:
 130                      $conds['ipb_id'] = $target;
 131                      break;
 132  
 133                  case Block::TYPE_IP:
 134                  case Block::TYPE_RANGE:
 135                      list( $start, $end ) = IP::parseRange( $target );
 136                      $dbr = wfGetDB( DB_SLAVE );
 137                      $conds[] = $dbr->makeList(
 138                          array(
 139                              'ipb_address' => $target,
 140                              Block::getRangeCond( $start, $end )
 141                          ),
 142                          LIST_OR
 143                      );
 144                      $conds['ipb_auto'] = 0;
 145                      break;
 146  
 147                  case Block::TYPE_USER:
 148                      $conds['ipb_address'] = $target->getName();
 149                      $conds['ipb_auto'] = 0;
 150                      break;
 151              }
 152          }
 153  
 154          # Apply filters
 155          if ( in_array( 'userblocks', $this->options ) ) {
 156              $conds['ipb_user'] = 0;
 157          }
 158          if ( in_array( 'tempblocks', $this->options ) ) {
 159              $conds['ipb_expiry'] = 'infinity';
 160          }
 161          if ( in_array( 'addressblocks', $this->options ) ) {
 162              $conds[] = "ipb_user != 0 OR ipb_range_end > ipb_range_start";
 163          }
 164          if ( in_array( 'rangeblocks', $this->options ) ) {
 165              $conds[] = "ipb_range_end = ipb_range_start";
 166          }
 167  
 168          # Check for other blocks, i.e. global/tor blocks
 169          $otherBlockLink = array();
 170          wfRunHooks( 'OtherBlockLogLink', array( &$otherBlockLink, $this->target ) );
 171  
 172          $out = $this->getOutput();
 173  
 174          # Show additional header for the local block only when other blocks exists.
 175          # Not necessary in a standard installation without such extensions enabled
 176          if ( count( $otherBlockLink ) ) {
 177              $out->addHTML(
 178                  Html::element( 'h2', array(), $this->msg( 'ipblocklist-localblock' )->text() ) . "\n"
 179              );
 180          }
 181  
 182          $pager = new BlockListPager( $this, $conds );
 183          if ( $pager->getNumRows() ) {
 184              $out->addParserOutputContent( $pager->getFullOutput() );
 185          } elseif ( $this->target ) {
 186              $out->addWikiMsg( 'ipblocklist-no-results' );
 187          } else {
 188              $out->addWikiMsg( 'ipblocklist-empty' );
 189          }
 190  
 191          if ( count( $otherBlockLink ) ) {
 192              $out->addHTML(
 193                  Html::rawElement(
 194                      'h2',
 195                      array(),
 196                      $this->msg( 'ipblocklist-otherblocks', count( $otherBlockLink ) )->parse()
 197                  ) . "\n"
 198              );
 199              $list = '';
 200              foreach ( $otherBlockLink as $link ) {
 201                  $list .= Html::rawElement( 'li', array(), $link ) . "\n";
 202              }
 203              $out->addHTML( Html::rawElement(
 204                  'ul',
 205                  array( 'class' => 'mw-ipblocklist-otherblocks' ),
 206                  $list
 207              ) . "\n" );
 208          }
 209      }
 210  
 211  	protected function getGroupName() {
 212          return 'users';
 213      }
 214  }
 215  
 216  class BlockListPager extends TablePager {
 217      protected $conds;
 218      protected $page;
 219  
 220      /**
 221       * @param SpecialPage $page
 222       * @param array $conds
 223       */
 224  	function __construct( $page, $conds ) {
 225          $this->page = $page;
 226          $this->conds = $conds;
 227          $this->mDefaultDirection = IndexPager::DIR_DESCENDING;
 228          parent::__construct( $page->getContext() );
 229      }
 230  
 231  	function getFieldNames() {
 232          static $headers = null;
 233  
 234          if ( $headers === null ) {
 235              $headers = array(
 236                  'ipb_timestamp' => 'blocklist-timestamp',
 237                  'ipb_target' => 'blocklist-target',
 238                  'ipb_expiry' => 'blocklist-expiry',
 239                  'ipb_by' => 'blocklist-by',
 240                  'ipb_params' => 'blocklist-params',
 241                  'ipb_reason' => 'blocklist-reason',
 242              );
 243              foreach ( $headers as $key => $val ) {
 244                  $headers[$key] = $this->msg( $val )->text();
 245              }
 246          }
 247  
 248          return $headers;
 249      }
 250  
 251  	function formatValue( $name, $value ) {
 252          static $msg = null;
 253          if ( $msg === null ) {
 254              $msg = array(
 255                  'anononlyblock',
 256                  'createaccountblock',
 257                  'noautoblockblock',
 258                  'emailblock',
 259                  'blocklist-nousertalk',
 260                  'unblocklink',
 261                  'change-blocklink',
 262                  'infiniteblock',
 263              );
 264              $msg = array_combine( $msg, array_map( array( $this, 'msg' ), $msg ) );
 265          }
 266  
 267          /** @var $row object */
 268          $row = $this->mCurrentRow;
 269  
 270          $formatted = '';
 271  
 272          switch ( $name ) {
 273              case 'ipb_timestamp':
 274                  $formatted = $this->getLanguage()->userTimeAndDate( $value, $this->getUser() );
 275                  break;
 276  
 277              case 'ipb_target':
 278                  if ( $row->ipb_auto ) {
 279                      $formatted = $this->msg( 'autoblockid', $row->ipb_id )->parse();
 280                  } else {
 281                      list( $target, $type ) = Block::parseTarget( $row->ipb_address );
 282                      switch ( $type ) {
 283                          case Block::TYPE_USER:
 284                          case Block::TYPE_IP:
 285                              $formatted = Linker::userLink( $target->getId(), $target );
 286                              $formatted .= Linker::userToolLinks(
 287                                  $target->getId(),
 288                                  $target,
 289                                  false,
 290                                  Linker::TOOL_LINKS_NOBLOCK
 291                              );
 292                              break;
 293                          case Block::TYPE_RANGE:
 294                              $formatted = htmlspecialchars( $target );
 295                      }
 296                  }
 297                  break;
 298  
 299              case 'ipb_expiry':
 300                  $formatted = $this->getLanguage()->formatExpiry( $value, /* User preference timezone */true );
 301                  if ( $this->getUser()->isAllowed( 'block' ) ) {
 302                      if ( $row->ipb_auto ) {
 303                          $links[] = Linker::linkKnown(
 304                              SpecialPage::getTitleFor( 'Unblock' ),
 305                              $msg['unblocklink'],
 306                              array(),
 307                              array( 'wpTarget' => "#{$row->ipb_id}" )
 308                          );
 309                      } else {
 310                          $links[] = Linker::linkKnown(
 311                              SpecialPage::getTitleFor( 'Unblock', $row->ipb_address ),
 312                              $msg['unblocklink']
 313                          );
 314                          $links[] = Linker::linkKnown(
 315                              SpecialPage::getTitleFor( 'Block', $row->ipb_address ),
 316                              $msg['change-blocklink']
 317                          );
 318                      }
 319                      $formatted .= ' ' . Html::rawElement(
 320                          'span',
 321                          array( 'class' => 'mw-blocklist-actions' ),
 322                          $this->msg( 'parentheses' )->rawParams(
 323                              $this->getLanguage()->pipeList( $links ) )->escaped()
 324                      );
 325                  }
 326                  break;
 327  
 328              case 'ipb_by':
 329                  if ( isset( $row->by_user_name ) ) {
 330                      $formatted = Linker::userLink( $value, $row->by_user_name );
 331                      $formatted .= Linker::userToolLinks( $value, $row->by_user_name );
 332                  } else {
 333                      $formatted = htmlspecialchars( $row->ipb_by_text ); // foreign user?
 334                  }
 335                  break;
 336  
 337              case 'ipb_reason':
 338                  $formatted = Linker::formatComment( $value );
 339                  break;
 340  
 341              case 'ipb_params':
 342                  $properties = array();
 343                  if ( $row->ipb_anon_only ) {
 344                      $properties[] = $msg['anononlyblock'];
 345                  }
 346                  if ( $row->ipb_create_account ) {
 347                      $properties[] = $msg['createaccountblock'];
 348                  }
 349                  if ( $row->ipb_user && !$row->ipb_enable_autoblock ) {
 350                      $properties[] = $msg['noautoblockblock'];
 351                  }
 352  
 353                  if ( $row->ipb_block_email ) {
 354                      $properties[] = $msg['emailblock'];
 355                  }
 356  
 357                  if ( !$row->ipb_allow_usertalk ) {
 358                      $properties[] = $msg['blocklist-nousertalk'];
 359                  }
 360  
 361                  $formatted = $this->getLanguage()->commaList( $properties );
 362                  break;
 363  
 364              default:
 365                  $formatted = "Unable to format $name";
 366                  break;
 367          }
 368  
 369          return $formatted;
 370      }
 371  
 372  	function getQueryInfo() {
 373          $info = array(
 374              'tables' => array( 'ipblocks', 'user' ),
 375              'fields' => array(
 376                  'ipb_id',
 377                  'ipb_address',
 378                  'ipb_user',
 379                  'ipb_by',
 380                  'ipb_by_text',
 381                  'by_user_name' => 'user_name',
 382                  'ipb_reason',
 383                  'ipb_timestamp',
 384                  'ipb_auto',
 385                  'ipb_anon_only',
 386                  'ipb_create_account',
 387                  'ipb_enable_autoblock',
 388                  'ipb_expiry',
 389                  'ipb_range_start',
 390                  'ipb_range_end',
 391                  'ipb_deleted',
 392                  'ipb_block_email',
 393                  'ipb_allow_usertalk',
 394              ),
 395              'conds' => $this->conds,
 396              'join_conds' => array( 'user' => array( 'LEFT JOIN', 'user_id = ipb_by' ) )
 397          );
 398  
 399          # Is the user allowed to see hidden blocks?
 400          if ( !$this->getUser()->isAllowed( 'hideuser' ) ) {
 401              $info['conds']['ipb_deleted'] = 0;
 402          }
 403  
 404          return $info;
 405      }
 406  
 407  	public function getTableClass() {
 408          return parent::getTableClass() . ' mw-blocklist';
 409      }
 410  
 411  	function getIndexField() {
 412          return 'ipb_timestamp';
 413      }
 414  
 415  	function getDefaultSort() {
 416          return 'ipb_timestamp';
 417      }
 418  
 419  	function isFieldSortable( $name ) {
 420          return false;
 421      }
 422  
 423      /**
 424       * Do a LinkBatch query to minimise database load when generating all these links
 425       * @param ResultWrapper $result
 426       */
 427  	function preprocessResults( $result ) {
 428          wfProfileIn( __METHOD__ );
 429          # Do a link batch query
 430          $lb = new LinkBatch;
 431          $lb->setCaller( __METHOD__ );
 432  
 433          $userids = array();
 434  
 435          foreach ( $result as $row ) {
 436              $userids[] = $row->ipb_by;
 437  
 438              # Usernames and titles are in fact related by a simple substitution of space -> underscore
 439              # The last few lines of Title::secureAndSplit() tell the story.
 440              $name = str_replace( ' ', '_', $row->ipb_address );
 441              $lb->add( NS_USER, $name );
 442              $lb->add( NS_USER_TALK, $name );
 443          }
 444  
 445          $ua = UserArray::newFromIDs( $userids );
 446          foreach ( $ua as $user ) {
 447              $name = str_replace( ' ', '_', $user->getName() );
 448              $lb->add( NS_USER, $name );
 449              $lb->add( NS_USER_TALK, $name );
 450          }
 451  
 452          $lb->execute();
 453          wfProfileOut( __METHOD__ );
 454      }
 455  }


Generated: Fri Nov 28 14:03:12 2014 Cross-referenced by PHPXref 0.7.1