MediaWiki  1.23.1
Block.php
Go to the documentation of this file.
1 <?php
22 class Block {
24 
25  protected
28 
33 
35  protected $target;
36 
38  protected $forcedTargetID;
39 
41  protected $type;
42 
44  protected $blocker;
45 
47  protected $isHardblock = true;
48 
50  protected $isAutoblocking = true;
51 
52  # TYPE constants
53  const TYPE_USER = 1;
54  const TYPE_IP = 2;
55  const TYPE_RANGE = 3;
56  const TYPE_AUTO = 4;
57  const TYPE_ID = 5;
58 
64  function __construct( $address = '', $user = 0, $by = 0, $reason = '',
65  $timestamp = 0, $auto = 0, $expiry = '', $anonOnly = 0, $createAccount = 0, $enableAutoblock = 0,
66  $hideName = 0, $blockEmail = 0, $allowUsertalk = 0, $byText = ''
67  ) {
68  if ( $timestamp === 0 ) {
70  }
71 
72  if ( count( func_get_args() ) > 0 ) {
73  # Soon... :D
74  # wfDeprecated( __METHOD__ . " with arguments" );
75  }
76 
77  $this->setTarget( $address );
78  if ( $this->target instanceof User && $user ) {
79  $this->forcedTargetID = $user; // needed for foreign users
80  }
81  if ( $by ) { // local user
82  $this->setBlocker( User::newFromID( $by ) );
83  } else { // foreign user
84  $this->setBlocker( $byText );
85  }
86  $this->mReason = $reason;
87  $this->mTimestamp = wfTimestamp( TS_MW, $timestamp );
88  $this->mAuto = $auto;
89  $this->isHardblock( !$anonOnly );
90  $this->prevents( 'createaccount', $createAccount );
91  if ( $expiry == 'infinity' || $expiry == wfGetDB( DB_SLAVE )->getInfinity() ) {
92  $this->mExpiry = 'infinity';
93  } else {
94  $this->mExpiry = wfTimestamp( TS_MW, $expiry );
95  }
96  $this->isAutoblocking( $enableAutoblock );
97  $this->mHideName = $hideName;
98  $this->prevents( 'sendemail', $blockEmail );
99  $this->prevents( 'editownusertalk', !$allowUsertalk );
100 
101  $this->mFromMaster = false;
102  }
103 
110  public static function newFromID( $id ) {
111  $dbr = wfGetDB( DB_SLAVE );
112  $res = $dbr->selectRow(
113  'ipblocks',
114  self::selectFields(),
115  array( 'ipb_id' => $id ),
116  __METHOD__
117  );
118  if ( $res ) {
119  return self::newFromRow( $res );
120  } else {
121  return null;
122  }
123  }
124 
130  public static function selectFields() {
131  return array(
132  'ipb_id',
133  'ipb_address',
134  'ipb_by',
135  'ipb_by_text',
136  'ipb_reason',
137  'ipb_timestamp',
138  'ipb_auto',
139  'ipb_anon_only',
140  'ipb_create_account',
141  'ipb_enable_autoblock',
142  'ipb_expiry',
143  'ipb_deleted',
144  'ipb_block_email',
145  'ipb_allow_usertalk',
146  'ipb_parent_block_id',
147  );
148  }
149 
158  public function equals( Block $block ) {
159  return (
160  (string)$this->target == (string)$block->target
161  && $this->type == $block->type
162  && $this->mAuto == $block->mAuto
163  && $this->isHardblock() == $block->isHardblock()
164  && $this->prevents( 'createaccount' ) == $block->prevents( 'createaccount' )
165  && $this->mExpiry == $block->mExpiry
166  && $this->isAutoblocking() == $block->isAutoblocking()
167  && $this->mHideName == $block->mHideName
168  && $this->prevents( 'sendemail' ) == $block->prevents( 'sendemail' )
169  && $this->prevents( 'editownusertalk' ) == $block->prevents( 'editownusertalk' )
170  && $this->mReason == $block->mReason
171  );
172  }
173 
184  protected function newLoad( $vagueTarget = null ) {
185  $db = wfGetDB( $this->mFromMaster ? DB_MASTER : DB_SLAVE );
186 
187  if ( $this->type !== null ) {
188  $conds = array(
189  'ipb_address' => array( (string)$this->target ),
190  );
191  } else {
192  $conds = array( 'ipb_address' => array() );
193  }
194 
195  # Be aware that the != '' check is explicit, since empty values will be
196  # passed by some callers (bug 29116)
197  if ( $vagueTarget != '' ) {
198  list( $target, $type ) = self::parseTarget( $vagueTarget );
199  switch ( $type ) {
200  case self::TYPE_USER:
201  # Slightly weird, but who are we to argue?
202  $conds['ipb_address'][] = (string)$target;
203  break;
204 
205  case self::TYPE_IP:
206  $conds['ipb_address'][] = (string)$target;
207  $conds[] = self::getRangeCond( IP::toHex( $target ) );
208  $conds = $db->makeList( $conds, LIST_OR );
209  break;
210 
211  case self::TYPE_RANGE:
212  list( $start, $end ) = IP::parseRange( $target );
213  $conds['ipb_address'][] = (string)$target;
214  $conds[] = self::getRangeCond( $start, $end );
215  $conds = $db->makeList( $conds, LIST_OR );
216  break;
217 
218  default:
219  throw new MWException( "Tried to load block with invalid type" );
220  }
221  }
222 
223  $res = $db->select( 'ipblocks', self::selectFields(), $conds, __METHOD__ );
224 
225  # This result could contain a block on the user, a block on the IP, and a russian-doll
226  # set of rangeblocks. We want to choose the most specific one, so keep a leader board.
227  $bestRow = null;
228 
229  # Lower will be better
230  $bestBlockScore = 100;
231 
232  # This is begging for $this = $bestBlock, but that's not allowed in PHP :(
233  $bestBlockPreventsEdit = null;
234 
235  foreach ( $res as $row ) {
236  $block = self::newFromRow( $row );
237 
238  # Don't use expired blocks
239  if ( $block->deleteIfExpired() ) {
240  continue;
241  }
242 
243  # Don't use anon only blocks on users
244  if ( $this->type == self::TYPE_USER && !$block->isHardblock() ) {
245  continue;
246  }
247 
248  if ( $block->getType() == self::TYPE_RANGE ) {
249  # This is the number of bits that are allowed to vary in the block, give
250  # or take some floating point errors
251  $end = wfBaseconvert( $block->getRangeEnd(), 16, 10 );
252  $start = wfBaseconvert( $block->getRangeStart(), 16, 10 );
253  $size = log( $end - $start + 1, 2 );
254 
255  # This has the nice property that a /32 block is ranked equally with a
256  # single-IP block, which is exactly what it is...
257  $score = self::TYPE_RANGE - 1 + ( $size / 128 );
258 
259  } else {
260  $score = $block->getType();
261  }
262 
263  if ( $score < $bestBlockScore ) {
264  $bestBlockScore = $score;
265  $bestRow = $row;
266  $bestBlockPreventsEdit = $block->prevents( 'edit' );
267  }
268  }
269 
270  if ( $bestRow !== null ) {
271  $this->initFromRow( $bestRow );
272  $this->prevents( 'edit', $bestBlockPreventsEdit );
273  return true;
274  } else {
275  return false;
276  }
277  }
278 
285  public static function getRangeCond( $start, $end = null ) {
286  if ( $end === null ) {
287  $end = $start;
288  }
289  # Per bug 14634, we want to include relevant active rangeblocks; for
290  # rangeblocks, we want to include larger ranges which enclose the given
291  # range. We know that all blocks must be smaller than $wgBlockCIDRLimit,
292  # so we can improve performance by filtering on a LIKE clause
293  $chunk = self::getIpFragment( $start );
294  $dbr = wfGetDB( DB_SLAVE );
295  $like = $dbr->buildLike( $chunk, $dbr->anyString() );
296 
297  # Fairly hard to make a malicious SQL statement out of hex characters,
298  # but stranger things have happened...
299  $safeStart = $dbr->addQuotes( $start );
300  $safeEnd = $dbr->addQuotes( $end );
301 
302  return $dbr->makeList(
303  array(
304  "ipb_range_start $like",
305  "ipb_range_start <= $safeStart",
306  "ipb_range_end >= $safeEnd",
307  ),
308  LIST_AND
309  );
310  }
311 
318  protected static function getIpFragment( $hex ) {
319  global $wgBlockCIDRLimit;
320  if ( substr( $hex, 0, 3 ) == 'v6-' ) {
321  return 'v6-' . substr( substr( $hex, 3 ), 0, floor( $wgBlockCIDRLimit['IPv6'] / 4 ) );
322  } else {
323  return substr( $hex, 0, floor( $wgBlockCIDRLimit['IPv4'] / 4 ) );
324  }
325  }
326 
332  protected function initFromRow( $row ) {
333  $this->setTarget( $row->ipb_address );
334  if ( $row->ipb_by ) { // local user
335  $this->setBlocker( User::newFromID( $row->ipb_by ) );
336  } else { // foreign user
337  $this->setBlocker( $row->ipb_by_text );
338  }
339 
340  $this->mReason = $row->ipb_reason;
341  $this->mTimestamp = wfTimestamp( TS_MW, $row->ipb_timestamp );
342  $this->mAuto = $row->ipb_auto;
343  $this->mHideName = $row->ipb_deleted;
344  $this->mId = $row->ipb_id;
345  $this->mParentBlockId = $row->ipb_parent_block_id;
346 
347  // I wish I didn't have to do this
348  $db = wfGetDB( DB_SLAVE );
349  if ( $row->ipb_expiry == $db->getInfinity() ) {
350  $this->mExpiry = 'infinity';
351  } else {
352  $this->mExpiry = wfTimestamp( TS_MW, $row->ipb_expiry );
353  }
354 
355  $this->isHardblock( !$row->ipb_anon_only );
356  $this->isAutoblocking( $row->ipb_enable_autoblock );
357 
358  $this->prevents( 'createaccount', $row->ipb_create_account );
359  $this->prevents( 'sendemail', $row->ipb_block_email );
360  $this->prevents( 'editownusertalk', !$row->ipb_allow_usertalk );
361  }
362 
368  public static function newFromRow( $row ) {
369  $block = new Block;
370  $block->initFromRow( $row );
371  return $block;
372  }
373 
380  public function delete() {
381  if ( wfReadOnly() ) {
382  return false;
383  }
384 
385  if ( !$this->getId() ) {
386  throw new MWException( "Block::delete() requires that the mId member be filled\n" );
387  }
388 
389  $dbw = wfGetDB( DB_MASTER );
390  $dbw->delete( 'ipblocks', array( 'ipb_parent_block_id' => $this->getId() ), __METHOD__ );
391  $dbw->delete( 'ipblocks', array( 'ipb_id' => $this->getId() ), __METHOD__ );
392 
393  return $dbw->affectedRows() > 0;
394  }
395 
404  public function insert( $dbw = null ) {
405  wfDebug( "Block::insert; timestamp {$this->mTimestamp}\n" );
406 
407  if ( $dbw === null ) {
408  $dbw = wfGetDB( DB_MASTER );
409  }
410 
411  # Don't collide with expired blocks
413 
414  $row = $this->getDatabaseArray();
415  $row['ipb_id'] = $dbw->nextSequenceValue( "ipblocks_ipb_id_seq" );
416 
417  $dbw->insert(
418  'ipblocks',
419  $row,
420  __METHOD__,
421  array( 'IGNORE' )
422  );
423  $affected = $dbw->affectedRows();
424  $this->mId = $dbw->insertId();
425 
426  if ( $affected ) {
427  $auto_ipd_ids = $this->doRetroactiveAutoblock();
428  return array( 'id' => $this->mId, 'autoIds' => $auto_ipd_ids );
429  }
430 
431  return false;
432  }
433 
441  public function update() {
442  wfDebug( "Block::update; timestamp {$this->mTimestamp}\n" );
443  $dbw = wfGetDB( DB_MASTER );
444 
445  $dbw->startAtomic( __METHOD__ );
446 
447  $dbw->update(
448  'ipblocks',
449  $this->getDatabaseArray( $dbw ),
450  array( 'ipb_id' => $this->getId() ),
451  __METHOD__
452  );
453 
454  $affected = $dbw->affectedRows();
455 
456  if ( $this->isAutoblocking() ) {
457  // update corresponding autoblock(s) (bug 48813)
458  $dbw->update(
459  'ipblocks',
460  $this->getAutoblockUpdateArray(),
461  array( 'ipb_parent_block_id' => $this->getId() ),
462  __METHOD__
463  );
464  } else {
465  // autoblock no longer required, delete corresponding autoblock(s)
466  $dbw->delete(
467  'ipblocks',
468  array( 'ipb_parent_block_id' => $this->getId() ),
469  __METHOD__
470  );
471  }
472 
473  $dbw->endAtomic( __METHOD__ );
474 
475  if ( $affected ) {
476  $auto_ipd_ids = $this->doRetroactiveAutoblock();
477  return array( 'id' => $this->mId, 'autoIds' => $auto_ipd_ids );
478  }
479 
480  return false;
481  }
482 
488  protected function getDatabaseArray( $db = null ) {
489  if ( !$db ) {
490  $db = wfGetDB( DB_SLAVE );
491  }
492  $expiry = $db->encodeExpiry( $this->mExpiry );
493 
494  if ( $this->forcedTargetID ) {
495  $uid = $this->forcedTargetID;
496  } else {
497  $uid = $this->target instanceof User ? $this->target->getID() : 0;
498  }
499 
500  $a = array(
501  'ipb_address' => (string)$this->target,
502  'ipb_user' => $uid,
503  'ipb_by' => $this->getBy(),
504  'ipb_by_text' => $this->getByName(),
505  'ipb_reason' => $this->mReason,
506  'ipb_timestamp' => $db->timestamp( $this->mTimestamp ),
507  'ipb_auto' => $this->mAuto,
508  'ipb_anon_only' => !$this->isHardblock(),
509  'ipb_create_account' => $this->prevents( 'createaccount' ),
510  'ipb_enable_autoblock' => $this->isAutoblocking(),
511  'ipb_expiry' => $expiry,
512  'ipb_range_start' => $this->getRangeStart(),
513  'ipb_range_end' => $this->getRangeEnd(),
514  'ipb_deleted' => intval( $this->mHideName ), // typecast required for SQLite
515  'ipb_block_email' => $this->prevents( 'sendemail' ),
516  'ipb_allow_usertalk' => !$this->prevents( 'editownusertalk' ),
517  'ipb_parent_block_id' => $this->mParentBlockId
518  );
519 
520  return $a;
521  }
522 
526  protected function getAutoblockUpdateArray() {
527  return array(
528  'ipb_by' => $this->getBy(),
529  'ipb_by_text' => $this->getByName(),
530  'ipb_reason' => $this->mReason,
531  'ipb_create_account' => $this->prevents( 'createaccount' ),
532  'ipb_deleted' => (int)$this->mHideName, // typecast required for SQLite
533  'ipb_allow_usertalk' => !$this->prevents( 'editownusertalk' ),
534  );
535  }
536 
543  protected function doRetroactiveAutoblock() {
544  $blockIds = array();
545  # If autoblock is enabled, autoblock the LAST IP(s) used
546  if ( $this->isAutoblocking() && $this->getType() == self::TYPE_USER ) {
547  wfDebug( "Doing retroactive autoblocks for " . $this->getTarget() . "\n" );
548 
549  $continue = wfRunHooks(
550  'PerformRetroactiveAutoblock', array( $this, &$blockIds ) );
551 
552  if ( $continue ) {
553  self::defaultRetroactiveAutoblock( $this, $blockIds );
554  }
555  }
556  return $blockIds;
557  }
558 
567  protected static function defaultRetroactiveAutoblock( Block $block, array &$blockIds ) {
568  global $wgPutIPinRC;
569 
570  // No IPs are in recentchanges table, so nothing to select
571  if ( !$wgPutIPinRC ) {
572  return;
573  }
574 
575  $dbr = wfGetDB( DB_SLAVE );
576 
577  $options = array( 'ORDER BY' => 'rc_timestamp DESC' );
578  $conds = array( 'rc_user_text' => (string)$block->getTarget() );
579 
580  // Just the last IP used.
581  $options['LIMIT'] = 1;
582 
583  $res = $dbr->select( 'recentchanges', array( 'rc_ip' ), $conds,
584  __METHOD__, $options );
585 
586  if ( !$res->numRows() ) {
587  # No results, don't autoblock anything
588  wfDebug( "No IP found to retroactively autoblock\n" );
589  } else {
590  foreach ( $res as $row ) {
591  if ( $row->rc_ip ) {
592  $id = $block->doAutoblock( $row->rc_ip );
593  if ( $id ) {
594  $blockIds[] = $id;
595  }
596  }
597  }
598  }
599  }
600 
608  public static function isWhitelistedFromAutoblocks( $ip ) {
609  global $wgMemc;
610 
611  // Try to get the autoblock_whitelist from the cache, as it's faster
612  // than getting the msg raw and explode()'ing it.
613  $key = wfMemcKey( 'ipb', 'autoblock', 'whitelist' );
614  $lines = $wgMemc->get( $key );
615  if ( !$lines ) {
616  $lines = explode( "\n", wfMessage( 'autoblock_whitelist' )->inContentLanguage()->plain() );
617  $wgMemc->set( $key, $lines, 3600 * 24 );
618  }
619 
620  wfDebug( "Checking the autoblock whitelist..\n" );
621 
622  foreach ( $lines as $line ) {
623  # List items only
624  if ( substr( $line, 0, 1 ) !== '*' ) {
625  continue;
626  }
627 
628  $wlEntry = substr( $line, 1 );
629  $wlEntry = trim( $wlEntry );
630 
631  wfDebug( "Checking $ip against $wlEntry..." );
632 
633  # Is the IP in this range?
634  if ( IP::isInRange( $ip, $wlEntry ) ) {
635  wfDebug( " IP $ip matches $wlEntry, not autoblocking\n" );
636  return true;
637  } else {
638  wfDebug( " No match\n" );
639  }
640  }
641 
642  return false;
643  }
644 
651  public function doAutoblock( $autoblockIP ) {
652  # If autoblocks are disabled, go away.
653  if ( !$this->isAutoblocking() ) {
654  return false;
655  }
656 
657  # Check for presence on the autoblock whitelist.
658  if ( self::isWhitelistedFromAutoblocks( $autoblockIP ) ) {
659  return false;
660  }
661 
662  # Allow hooks to cancel the autoblock.
663  if ( !wfRunHooks( 'AbortAutoblock', array( $autoblockIP, &$this ) ) ) {
664  wfDebug( "Autoblock aborted by hook.\n" );
665  return false;
666  }
667 
668  # It's okay to autoblock. Go ahead and insert/update the block...
669 
670  # Do not add a *new* block if the IP is already blocked.
671  $ipblock = Block::newFromTarget( $autoblockIP );
672  if ( $ipblock ) {
673  # Check if the block is an autoblock and would exceed the user block
674  # if renewed. If so, do nothing, otherwise prolong the block time...
675  if ( $ipblock->mAuto && // @todo Why not compare $ipblock->mExpiry?
676  $this->mExpiry > Block::getAutoblockExpiry( $ipblock->mTimestamp )
677  ) {
678  # Reset block timestamp to now and its expiry to
679  # $wgAutoblockExpiry in the future
680  $ipblock->updateTimestamp();
681  }
682  return false;
683  }
684 
685  # Make a new block object with the desired properties.
686  $autoblock = new Block;
687  wfDebug( "Autoblocking {$this->getTarget()}@" . $autoblockIP . "\n" );
688  $autoblock->setTarget( $autoblockIP );
689  $autoblock->setBlocker( $this->getBlocker() );
690  $autoblock->mReason = wfMessage( 'autoblocker', $this->getTarget(), $this->mReason )
691  ->inContentLanguage()->plain();
693  $autoblock->mTimestamp = $timestamp;
694  $autoblock->mAuto = 1;
695  $autoblock->prevents( 'createaccount', $this->prevents( 'createaccount' ) );
696  # Continue suppressing the name if needed
697  $autoblock->mHideName = $this->mHideName;
698  $autoblock->prevents( 'editownusertalk', $this->prevents( 'editownusertalk' ) );
699  $autoblock->mParentBlockId = $this->mId;
700 
701  if ( $this->mExpiry == 'infinity' ) {
702  # Original block was indefinite, start an autoblock now
703  $autoblock->mExpiry = Block::getAutoblockExpiry( $timestamp );
704  } else {
705  # If the user is already blocked with an expiry date, we don't
706  # want to pile on top of that.
707  $autoblock->mExpiry = min( $this->mExpiry, Block::getAutoblockExpiry( $timestamp ) );
708  }
709 
710  # Insert the block...
711  $status = $autoblock->insert();
712  return $status
713  ? $status['id']
714  : false;
715  }
716 
721  public function deleteIfExpired() {
722  wfProfileIn( __METHOD__ );
723 
724  if ( $this->isExpired() ) {
725  wfDebug( "Block::deleteIfExpired() -- deleting\n" );
726  $this->delete();
727  $retVal = true;
728  } else {
729  wfDebug( "Block::deleteIfExpired() -- not expired\n" );
730  $retVal = false;
731  }
732 
733  wfProfileOut( __METHOD__ );
734  return $retVal;
735  }
736 
741  public function isExpired() {
743  wfDebug( "Block::isExpired() checking current " . $timestamp . " vs $this->mExpiry\n" );
744 
745  if ( !$this->mExpiry ) {
746  return false;
747  } else {
748  return $timestamp > $this->mExpiry;
749  }
750  }
751 
756  public function isValid() {
757  return $this->getTarget() != null;
758  }
759 
763  public function updateTimestamp() {
764  if ( $this->mAuto ) {
765  $this->mTimestamp = wfTimestamp();
766  $this->mExpiry = Block::getAutoblockExpiry( $this->mTimestamp );
767 
768  $dbw = wfGetDB( DB_MASTER );
769  $dbw->update( 'ipblocks',
770  array( /* SET */
771  'ipb_timestamp' => $dbw->timestamp( $this->mTimestamp ),
772  'ipb_expiry' => $dbw->timestamp( $this->mExpiry ),
773  ),
774  array( /* WHERE */
775  'ipb_address' => (string)$this->getTarget()
776  ),
777  __METHOD__
778  );
779  }
780  }
781 
787  public function getRangeStart() {
788  switch ( $this->type ) {
789  case self::TYPE_USER:
790  return '';
791  case self::TYPE_IP:
792  return IP::toHex( $this->target );
793  case self::TYPE_RANGE:
794  list( $start, /*...*/ ) = IP::parseRange( $this->target );
795  return $start;
796  default:
797  throw new MWException( "Block with invalid type" );
798  }
799  }
800 
806  public function getRangeEnd() {
807  switch ( $this->type ) {
808  case self::TYPE_USER:
809  return '';
810  case self::TYPE_IP:
811  return IP::toHex( $this->target );
812  case self::TYPE_RANGE:
813  list( /*...*/, $end ) = IP::parseRange( $this->target );
814  return $end;
815  default:
816  throw new MWException( "Block with invalid type" );
817  }
818  }
819 
825  public function getBy() {
826  $blocker = $this->getBlocker();
827  return ( $blocker instanceof User )
828  ? $blocker->getId()
829  : 0;
830  }
831 
837  public function getByName() {
838  $blocker = $this->getBlocker();
839  return ( $blocker instanceof User )
840  ? $blocker->getName()
841  : (string)$blocker; // username
842  }
843 
848  public function getId() {
849  return $this->mId;
850  }
851 
858  public function fromMaster( $x = null ) {
859  return wfSetVar( $this->mFromMaster, $x );
860  }
861 
867  public function isHardblock( $x = null ) {
868  wfSetVar( $this->isHardblock, $x );
869 
870  # You can't *not* hardblock a user
871  return $this->getType() == self::TYPE_USER
872  ? true
874  }
875 
876  public function isAutoblocking( $x = null ) {
877  wfSetVar( $this->isAutoblocking, $x );
878 
879  # You can't put an autoblock on an IP or range as we don't have any history to
880  # look over to get more IPs from
881  return $this->getType() == self::TYPE_USER
882  ? $this->isAutoblocking
883  : false;
884  }
885 
892  public function prevents( $action, $x = null ) {
893  switch ( $action ) {
894  case 'edit':
895  # For now... <evil laugh>
896  return true;
897 
898  case 'createaccount':
899  return wfSetVar( $this->mCreateAccount, $x );
900 
901  case 'sendemail':
902  return wfSetVar( $this->mBlockEmail, $x );
903 
904  case 'editownusertalk':
905  return wfSetVar( $this->mDisableUsertalk, $x );
906 
907  default:
908  return null;
909  }
910  }
911 
916  public function getRedactedName() {
917  if ( $this->mAuto ) {
918  return Html::rawElement(
919  'span',
920  array( 'class' => 'mw-autoblockid' ),
921  wfMessage( 'autoblockid', $this->mId )
922  );
923  } else {
924  return htmlspecialchars( $this->getTarget() );
925  }
926  }
927 
934  public static function getAutoblockExpiry( $timestamp ) {
935  global $wgAutoblockExpiry;
936 
937  return wfTimestamp( TS_MW, wfTimestamp( TS_UNIX, $timestamp ) + $wgAutoblockExpiry );
938  }
939 
943  public static function purgeExpired() {
944  if ( wfReadOnly() ) {
945  return;
946  }
947 
948  $method = __METHOD__;
949  $dbw = wfGetDB( DB_MASTER );
950  $dbw->onTransactionIdle( function() use ( $dbw, $method ) {
951  $dbw->delete( 'ipblocks',
952  array( 'ipb_expiry < ' . $dbw->addQuotes( $dbw->timestamp() ) ), $method );
953  } );
954  }
955 
976  public static function newFromTarget( $specificTarget, $vagueTarget = null, $fromMaster = false ) {
977 
978  list( $target, $type ) = self::parseTarget( $specificTarget );
979  if ( $type == Block::TYPE_ID || $type == Block::TYPE_AUTO ) {
980  return Block::newFromID( $target );
981 
982  } elseif ( $target === null && $vagueTarget == '' ) {
983  # We're not going to find anything useful here
984  # Be aware that the == '' check is explicit, since empty values will be
985  # passed by some callers (bug 29116)
986  return null;
987 
988  } elseif ( in_array(
989  $type,
991  ) {
992  $block = new Block();
993  $block->fromMaster( $fromMaster );
994 
995  if ( $type !== null ) {
996  $block->setTarget( $target );
997  }
998 
999  if ( $block->newLoad( $vagueTarget ) ) {
1000  return $block;
1001  }
1002  }
1003  return null;
1004  }
1005 
1016  public static function getBlocksForIPList( array $ipChain, $isAnon, $fromMaster = false ) {
1017  if ( !count( $ipChain ) ) {
1018  return array();
1019  }
1020 
1021  wfProfileIn( __METHOD__ );
1022  $conds = array();
1023  foreach ( array_unique( $ipChain ) as $ipaddr ) {
1024  # Discard invalid IP addresses. Since XFF can be spoofed and we do not
1025  # necessarily trust the header given to us, make sure that we are only
1026  # checking for blocks on well-formatted IP addresses (IPv4 and IPv6).
1027  # Do not treat private IP spaces as special as it may be desirable for wikis
1028  # to block those IP ranges in order to stop misbehaving proxies that spoof XFF.
1029  if ( !IP::isValid( $ipaddr ) ) {
1030  continue;
1031  }
1032  # Don't check trusted IPs (includes local squids which will be in every request)
1033  if ( wfIsTrustedProxy( $ipaddr ) ) {
1034  continue;
1035  }
1036  # Check both the original IP (to check against single blocks), as well as build
1037  # the clause to check for rangeblocks for the given IP.
1038  $conds['ipb_address'][] = $ipaddr;
1039  $conds[] = self::getRangeCond( IP::toHex( $ipaddr ) );
1040  }
1041 
1042  if ( !count( $conds ) ) {
1043  wfProfileOut( __METHOD__ );
1044  return array();
1045  }
1046 
1047  if ( $fromMaster ) {
1048  $db = wfGetDB( DB_MASTER );
1049  } else {
1050  $db = wfGetDB( DB_SLAVE );
1051  }
1052  $conds = $db->makeList( $conds, LIST_OR );
1053  if ( !$isAnon ) {
1054  $conds = array( $conds, 'ipb_anon_only' => 0 );
1055  }
1056  $selectFields = array_merge(
1057  array( 'ipb_range_start', 'ipb_range_end' ),
1059  );
1060  $rows = $db->select( 'ipblocks',
1061  $selectFields,
1062  $conds,
1063  __METHOD__
1064  );
1065 
1066  $blocks = array();
1067  foreach ( $rows as $row ) {
1068  $block = self::newFromRow( $row );
1069  if ( !$block->deleteIfExpired() ) {
1070  $blocks[] = $block;
1071  }
1072  }
1073 
1074  wfProfileOut( __METHOD__ );
1075  return $blocks;
1076  }
1077 
1095  public static function chooseBlock( array $blocks, array $ipChain ) {
1096  if ( !count( $blocks ) ) {
1097  return null;
1098  } elseif ( count( $blocks ) == 1 ) {
1099  return $blocks[0];
1100  }
1101 
1102  wfProfileIn( __METHOD__ );
1103 
1104  // Sort hard blocks before soft ones and secondarily sort blocks
1105  // that disable account creation before those that don't.
1106  usort( $blocks, function( Block $a, Block $b ) {
1107  $aWeight = (int)$a->isHardblock() . (int)$a->prevents( 'createaccount' );
1108  $bWeight = (int)$b->isHardblock() . (int)$b->prevents( 'createaccount' );
1109  return strcmp( $bWeight, $aWeight ); // highest weight first
1110  } );
1111 
1112  $blocksListExact = array(
1113  'hard' => false,
1114  'disable_create' => false,
1115  'other' => false,
1116  'auto' => false
1117  );
1118  $blocksListRange = array(
1119  'hard' => false,
1120  'disable_create' => false,
1121  'other' => false,
1122  'auto' => false
1123  );
1124  $ipChain = array_reverse( $ipChain );
1125 
1126  foreach ( $blocks as $block ) {
1127  // Stop searching if we have already have a "better" block. This
1128  // is why the order of the blocks matters
1129  if ( !$block->isHardblock() && $blocksListExact['hard'] ) {
1130  break;
1131  } elseif ( !$block->prevents( 'createaccount' ) && $blocksListExact['disable_create'] ) {
1132  break;
1133  }
1134 
1135  foreach ( $ipChain as $checkip ) {
1136  $checkipHex = IP::toHex( $checkip );
1137  if ( (string)$block->getTarget() === $checkip ) {
1138  if ( $block->isHardblock() ) {
1139  $blocksListExact['hard'] = $blocksListExact['hard'] ?: $block;
1140  } elseif ( $block->prevents( 'createaccount' ) ) {
1141  $blocksListExact['disable_create'] = $blocksListExact['disable_create'] ?: $block;
1142  } elseif ( $block->mAuto ) {
1143  $blocksListExact['auto'] = $blocksListExact['auto'] ?: $block;
1144  } else {
1145  $blocksListExact['other'] = $blocksListExact['other'] ?: $block;
1146  }
1147  // We found closest exact match in the ip list, so go to the next Block
1148  break;
1149  } elseif ( array_filter( $blocksListExact ) == array()
1150  && $block->getRangeStart() <= $checkipHex
1151  && $block->getRangeEnd() >= $checkipHex
1152  ) {
1153  if ( $block->isHardblock() ) {
1154  $blocksListRange['hard'] = $blocksListRange['hard'] ?: $block;
1155  } elseif ( $block->prevents( 'createaccount' ) ) {
1156  $blocksListRange['disable_create'] = $blocksListRange['disable_create'] ?: $block;
1157  } elseif ( $block->mAuto ) {
1158  $blocksListRange['auto'] = $blocksListRange['auto'] ?: $block;
1159  } else {
1160  $blocksListRange['other'] = $blocksListRange['other'] ?: $block;
1161  }
1162  break;
1163  }
1164  }
1165  }
1166 
1167  if ( array_filter( $blocksListExact ) == array() ) {
1168  $blocksList = &$blocksListRange;
1169  } else {
1170  $blocksList = &$blocksListExact;
1171  }
1172 
1173  $chosenBlock = null;
1174  if ( $blocksList['hard'] ) {
1175  $chosenBlock = $blocksList['hard'];
1176  } elseif ( $blocksList['disable_create'] ) {
1177  $chosenBlock = $blocksList['disable_create'];
1178  } elseif ( $blocksList['other'] ) {
1179  $chosenBlock = $blocksList['other'];
1180  } elseif ( $blocksList['auto'] ) {
1181  $chosenBlock = $blocksList['auto'];
1182  } else {
1183  wfProfileOut( __METHOD__ );
1184  throw new MWException( "Proxy block found, but couldn't be classified." );
1185  }
1186 
1187  wfProfileOut( __METHOD__ );
1188  return $chosenBlock;
1189  }
1190 
1200  public static function parseTarget( $target ) {
1201  # We may have been through this before
1202  if ( $target instanceof User ) {
1203  if ( IP::isValid( $target->getName() ) ) {
1204  return array( $target, self::TYPE_IP );
1205  } else {
1206  return array( $target, self::TYPE_USER );
1207  }
1208  } elseif ( $target === null ) {
1209  return array( null, null );
1210  }
1211 
1212  $target = trim( $target );
1213 
1214  if ( IP::isValid( $target ) ) {
1215  # We can still create a User if it's an IP address, but we need to turn
1216  # off validation checking (which would exclude IP addresses)
1217  return array(
1220  );
1221 
1222  } elseif ( IP::isValidBlock( $target ) ) {
1223  # Can't create a User from an IP range
1225  }
1226 
1227  # Consider the possibility that this is not a username at all
1228  # but actually an old subpage (bug #29797)
1229  if ( strpos( $target, '/' ) !== false ) {
1230  # An old subpage, drill down to the user behind it
1231  $parts = explode( '/', $target );
1232  $target = $parts[0];
1233  }
1234 
1235  $userObj = User::newFromName( $target );
1236  if ( $userObj instanceof User ) {
1237  # Note that since numbers are valid usernames, a $target of "12345" will be
1238  # considered a User. If you want to pass a block ID, prepend a hash "#12345",
1239  # since hash characters are not valid in usernames or titles generally.
1240  return array( $userObj, Block::TYPE_USER );
1241 
1242  } elseif ( preg_match( '/^#\d+$/', $target ) ) {
1243  # Autoblock reference in the form "#12345"
1244  return array( substr( $target, 1 ), Block::TYPE_AUTO );
1245 
1246  } else {
1247  # WTF?
1248  return array( null, null );
1249  }
1250  }
1251 
1256  public function getType() {
1257  return $this->mAuto
1258  ? self::TYPE_AUTO
1259  : $this->type;
1260  }
1261 
1269  public function getTargetAndType() {
1270  return array( $this->getTarget(), $this->getType() );
1271  }
1272 
1279  public function getTarget() {
1280  return $this->target;
1281  }
1288  public function getExpiry() {
1289  return $this->mExpiry;
1290  }
1291 
1296  public function setTarget( $target ) {
1297  list( $this->target, $this->type ) = self::parseTarget( $target );
1298  }
1299 
1304  public function getBlocker() {
1305  return $this->blocker;
1306  }
1307 
1312  public function setBlocker( $user ) {
1313  $this->blocker = $user;
1314  }
1315 
1323  public function getPermissionsError( IContextSource $context ) {
1324  $blocker = $this->getBlocker();
1325  if ( $blocker instanceof User ) { // local user
1326  $blockerUserpage = $blocker->getUserPage();
1327  $link = "[[{$blockerUserpage->getPrefixedText()}|{$blockerUserpage->getText()}]]";
1328  } else { // foreign user
1329  $link = $blocker;
1330  }
1331 
1332  $reason = $this->mReason;
1333  if ( $reason == '' ) {
1334  $reason = $context->msg( 'blockednoreason' )->text();
1335  }
1336 
1337  /* $ip returns who *is* being blocked, $intended contains who was meant to be blocked.
1338  * This could be a username, an IP range, or a single IP. */
1339  $intended = $this->getTarget();
1340 
1341  $lang = $context->getLanguage();
1342  return array(
1343  $this->mAuto ? 'autoblockedtext' : 'blockedtext',
1344  $link,
1345  $reason,
1346  $context->getRequest()->getIP(),
1347  $this->getByName(),
1348  $this->getId(),
1349  $lang->formatExpiry( $this->mExpiry ),
1350  (string)$intended,
1351  $lang->timeanddate( wfTimestamp( TS_MW, $this->mTimestamp ), true ),
1352  );
1353  }
1354 }
Block\prevents
prevents( $action, $x=null)
Get/set whether the Block prevents a given action.
Definition: Block.php:886
IP\toHex
static toHex( $ip)
Return a zero-padded upper case hexadecimal representation of an IP address.
Definition: IP.php:447
Block\isHardblock
isHardblock( $x=null)
Get/set whether the Block is a hardblock (affects logged-in users on a given IP/range.
Definition: Block.php:861
DB_MASTER
const DB_MASTER
Definition: Defines.php:56
Block\equals
equals(Block $block)
Check if two blocks are effectively equal.
Definition: Block.php:152
Block\$type
Integer $type
Block::TYPE_ constant.
Definition: Block.php:38
Block\getType
getType()
Get the type of target for this particular block.
Definition: Block.php:1250
php
skin txt MediaWiki includes four core it has been set as the default in MediaWiki since the replacing Monobook it had been been the default skin since before being replaced by Vector largely rewritten in while keeping its appearance Several legacy skins were removed in the as the burden of supporting them became too heavy to bear Those in etc for skin dependent CSS etc for skin dependent JavaScript These can also be customised on a per user by etc This feature has led to a wide variety of user styles becoming that gallery is a good place to ending in php
Definition: skin.txt:62
User\getId
getId()
Get the user's ID.
Definition: User.php:1852
Block\$mReason
$mReason
Definition: Block.php:23
Block\getIpFragment
static getIpFragment( $hex)
Get the component of an IP address which is certain to be the same between an IP address and a rangeb...
Definition: Block.php:312
Block\isExpired
isExpired()
Has the block expired?
Definition: Block.php:735
Block\$mDisableUsertalk
$mDisableUsertalk
Definition: Block.php:26
Block\newFromID
static newFromID( $id)
Load a blocked user from their block id.
Definition: Block.php:104
wfSetVar
wfSetVar(&$dest, $source, $force=false)
Sets dest to source and returns the original value of dest If source is NULL, it just returns the val...
Definition: GlobalFunctions.php:2139
Block\TYPE_IP
const TYPE_IP
Definition: Block.php:48
$wgMemc
globals will be eliminated from MediaWiki replaced by an application object which would be passed to constructors Whether that would be an convenient solution remains to be but certainly PHP makes such object oriented programming models easier than they were in previous versions For the time being MediaWiki programmers will have to work in an environment with some global context At the time of globals were initialised on startup by MediaWiki of these were configuration which are documented in DefaultSettings php There is no comprehensive documentation for the remaining however some of the most important ones are listed below They are typically initialised either in index php or in Setup php For a description of the see design txt $wgTitle Title object created from the request URL $wgOut OutputPage object for HTTP response $wgUser User object for the user associated with the current request $wgLang Language object selected by user preferences $wgContLang Language object associated with the wiki being viewed $wgParser Parser object Parser extensions register their hooks here $wgRequest WebRequest to get request data $wgMemc
Definition: globals.txt:25
Block\TYPE_RANGE
const TYPE_RANGE
Definition: Block.php:49
Block\getBy
getBy()
Get the user id of the blocking sysop.
Definition: Block.php:819
Block\chooseBlock
static chooseBlock(array $blocks, array $ipChain)
From a list of multiple blocks, find the most exact and strongest Block.
Definition: Block.php:1089
wfGetDB
& wfGetDB( $db, $groups=array(), $wiki=false)
Get a Database object.
Definition: GlobalFunctions.php:3650
$timestamp
if( $limit) $timestamp
Definition: importImages.php:104
wfTimestamp
wfTimestamp( $outputtype=TS_UNIX, $ts=0)
Get a timestamp string in one of various formats.
Definition: GlobalFunctions.php:2483
Block\update
update()
Update a block in the DB with new parameters.
Definition: Block.php:435
wfProfileIn
wfProfileIn( $functionname)
Begin profiling of a function.
Definition: Profiler.php:33
Block\getId
getId()
Get the block ID.
Definition: Block.php:842
Block\newFromTarget
static newFromTarget( $specificTarget, $vagueTarget=null, $fromMaster=false)
Given a target and the target's type, get an existing Block object if possible.
Definition: Block.php:970
wfReadOnly
wfReadOnly()
Check whether the wiki is in read-only mode.
Definition: GlobalFunctions.php:1313
IContextSource\msg
msg()
Get a Message object with context set.
User\newFromName
static newFromName( $name, $validate='valid')
Static factory method for creation from username.
Definition: User.php:388
Block\isValid
isValid()
Is the block address valid (i.e.
Definition: Block.php:750
Block\initFromRow
initFromRow( $row)
Given a database row from the ipblocks table, initialize member variables.
Definition: Block.php:326
User\getUserPage
getUserPage()
Get this user's personal page title.
Definition: User.php:3654
Block\getRangeEnd
getRangeEnd()
Get the IP address at the end of the range in Hex form.
Definition: Block.php:800
Block\$isHardblock
Bool $isHardblock
Definition: Block.php:42
$link
set to $title object and return false for a match for latest after cache objects are set use the ContentHandler facility to handle CSS and JavaScript for highlighting & $link
Definition: hooks.txt:2149
Block\getExpiry
getExpiry()
Definition: Block.php:1282
Block\deleteIfExpired
deleteIfExpired()
Check if a block has expired.
Definition: Block.php:715
Block\insert
insert( $dbw=null)
Insert a block into the block table.
Definition: Block.php:398
true
null means default in associative array with keys and values unescaped Should be merged with default with a value of false meaning to suppress the attribute in associative array with keys and values unescaped noclasses just before the function returns a value If you return true
Definition: hooks.txt:1530
LIST_AND
const LIST_AND
Definition: Defines.php:203
Block\getRedactedName
getRedactedName()
Get the block name, but with autoblocked IPs hidden as per standard privacy policy.
Definition: Block.php:910
Block\newLoad
newLoad( $vagueTarget=null)
Load a block from the database which affects the already-set $this->target: 1) A block directly on th...
Definition: Block.php:178
Block\$mExpiry
$mExpiry
Definition: Block.php:23
$dbr
$dbr
Definition: testCompression.php:48
Block\$mFromMaster
$mFromMaster
Definition: Block.php:26
LIST_OR
const LIST_OR
Definition: Defines.php:206
MWException
MediaWiki exception.
Definition: MWException.php:26
wfMemcKey
wfMemcKey()
Get a cache key.
Definition: GlobalFunctions.php:3571
Block\parseTarget
static parseTarget( $target)
From an existing Block, get the target and the type of target.
Definition: Block.php:1194
Block\getRangeCond
static getRangeCond( $start, $end=null)
Get a set of SQL conditions which will select rangeblocks encompassing a given range.
Definition: Block.php:279
Block\doAutoblock
doAutoblock( $autoblockIP)
Autoblocks the given IP, referring to this Block.
Definition: Block.php:645
Block\TYPE_ID
const TYPE_ID
Definition: Block.php:51
Block\__construct
__construct( $address='', $user=0, $by=0, $reason='', $timestamp=0, $auto=0, $expiry='', $anonOnly=0, $createAccount=0, $enableAutoblock=0, $hideName=0, $blockEmail=0, $allowUsertalk=0, $byText='')
Constructor.
Definition: Block.php:58
wfProfileOut
wfProfileOut( $functionname='missing')
Stop profiling of a function.
Definition: Profiler.php:46
wfMessage
null means default in associative array with keys and values unescaped Should be merged with default with a value of false meaning to suppress the attribute in associative array with keys and values unescaped noclasses just before the function returns a value If you return an< a > element with HTML attributes $attribs and contents $html will be returned If you return $ret will be returned and may include noclasses after processing after in associative array form externallinks including delete and has completed for all link tables default is conds Array Extra conditions for the No matching items in log is displayed if loglist is empty msgKey Array If you want a nice box with a set this to the key of the message First element is the message additional optional elements are parameters for the key that are processed with wfMessage() -> params() ->parseAsBlock() - offset Set to overwrite offset parameter in $wgRequest set to '' to unset offset - wrap String Wrap the message in html(usually something like "&lt
wfRunHooks
wfRunHooks( $event, array $args=array(), $deprecatedVersion=null)
Call hook functions defined in $wgHooks.
Definition: GlobalFunctions.php:4001
Block\isWhitelistedFromAutoblocks
static isWhitelistedFromAutoblocks( $ip)
Checks whether a given IP is on the autoblock whitelist.
Definition: Block.php:602
$lines
$lines
Definition: router.php:65
Block\getAutoblockUpdateArray
getAutoblockUpdateArray()
Definition: Block.php:520
array
the array() calling protocol came about after MediaWiki 1.4rc1.
List of Api Query prop modules.
global
when a variable name is used in a it is silently declared as a new masking the global
Definition: design.txt:93
IP\isInRange
static isInRange( $addr, $range)
Determine if a given IPv4/IPv6 address is in a given CIDR network.
Definition: IP.php:707
wfTimestampNow
wfTimestampNow()
Convenience function; returns MediaWiki timestamp for the present time.
Definition: GlobalFunctions.php:2514
Block\isAutoblocking
isAutoblocking( $x=null)
Definition: Block.php:870
$allowUsertalk
return false to override stock group addition can be modified try getUserPermissionsErrors userCan checks are continued by internal code can override on output return false to not delete it return false to override the default password checks this Boolean value will be checked to determine if the password was valid return false to implement your own hashing method this String will be used as the hash which may be added to this hook is run right before returning the options to the caller which means it s potentially called dozens or hundreds of times You may want to cache the results of non trivial operations in your hook function for this reason change this to override email change this to override email authentication timestamp whether or not the user is blocked from that page & $allowUsertalk
Definition: hooks.txt:2697
list
deferred txt A few of the database updates required by various functions here can be deferred until after the result page is displayed to the user For updating the view updating the linked to tables after a etc PHP does not yet have any way to tell the server to actually return and disconnect while still running these but it might have such a feature in the future We handle these by creating a deferred update object and putting those objects on a global list
Definition: deferred.txt:11
Block\getBlocksForIPList
static getBlocksForIPList(array $ipChain, $isAnon, $fromMaster=false)
Get all blocks that match any IP from an array of IP addresses.
Definition: Block.php:1010
$options
null means default in associative array with keys and values unescaped Should be merged with default with a value of false meaning to suppress the attribute in associative array with keys and values unescaped & $options
Definition: hooks.txt:1530
Block\getTargetAndType
getTargetAndType()
Get the target and target type for this particular Block.
Definition: Block.php:1263
$line
$line
Definition: cdb.php:57
TS_MW
const TS_MW
MediaWiki concatenated string timestamp (YYYYMMDDHHMMSS)
Definition: GlobalFunctions.php:2431
wfDebug
wfDebug( $text, $dest='all')
Sends a line to the debug log if enabled or, optionally, to a comment in output.
Definition: GlobalFunctions.php:933
Block\doRetroactiveAutoblock
doRetroactiveAutoblock()
Retroactively autoblocks the last IP used by the user (if it is a user) blocked by this Block.
Definition: Block.php:537
Block\$mCreateAccount
$mCreateAccount
Definition: Block.php:26
$size
$size
Definition: RandomTest.php:75
Block\$isAutoblocking
Bool $isAutoblocking
Definition: Block.php:44
Block\updateTimestamp
updateTimestamp()
Update the timestamp on autoblocks.
Definition: Block.php:757
IP\parseRange
static parseRange( $range)
Given a string range in a number of formats, return the start and end of the range in hexadecimal.
Definition: IP.php:564
Block\getBlocker
getBlocker()
Get the user who implemented this block.
Definition: Block.php:1298
Block\setBlocker
setBlocker( $user)
Set the user who implemented (or will implement) this block.
Definition: Block.php:1306
Block\$blocker
User $blocker
Definition: Block.php:40
Block\fromMaster
fromMaster( $x=null)
Get/set a flag determining whether the master is used for reads.
Definition: Block.php:852
Block\getTarget
getTarget()
Get the target for this particular Block.
Definition: Block.php:1273
Block\purgeExpired
static purgeExpired()
Purge expired blocks from the ipblocks table.
Definition: Block.php:937
Block\TYPE_AUTO
const TYPE_AUTO
Definition: Block.php:50
IP\isValid
static isValid( $ip)
Validate an IP address.
Definition: IP.php:108
$user
please add to it if you re going to add events to the MediaWiki code where normally authentication against an external auth plugin would be creating a account $user
Definition: hooks.txt:237
wfIsTrustedProxy
wfIsTrustedProxy( $ip)
Checks if an IP is a trusted proxy provider.
Definition: GlobalFunctions.php:4156
IContextSource
Interface for objects which can provide a context on request.
Definition: IContextSource.php:29
Block\TYPE_USER
const TYPE_USER
Definition: Block.php:47
Block\$mHideName
$mHideName
Definition: Block.php:23
Block\$target
User String $target
Definition: Block.php:34
IP\sanitizeIP
static sanitizeIP( $ip)
Convert an IP into a verbose, uppercase, normalized form.
Definition: IP.php:134
DB_SLAVE
const DB_SLAVE
Definition: Defines.php:55
type
This document describes the state of Postgres support in and is fairly well maintained The main code is very well while extensions are very hit and miss it is probably the most supported database after MySQL Much of the work in making MediaWiki database agnostic came about through the work of creating Postgres as and are nearing end of but without copying over all the usage comments General notes on the but these can almost always be programmed around *Although Postgres has a true BOOLEAN type
Definition: postgres.txt:22
Block\selectFields
static selectFields()
Return the list of ipblocks fields that should be selected to create a new block.
Definition: Block.php:124
TS_UNIX
const TS_UNIX
Unix time - the number of seconds since 1970-01-01 00:00:00 UTC.
Definition: GlobalFunctions.php:2426
Block\$mBlockEmail
$mBlockEmail
Definition: Block.php:26
as
This document is intended to provide useful advice for parties seeking to redistribute MediaWiki to end users It s targeted particularly at maintainers for Linux since it s been observed that distribution packages of MediaWiki often break We ve consistently had to recommend that users seeking support use official tarballs instead of their distribution s and this often solves whatever problem the user is having It would be nice if this could such as
Definition: distributors.txt:9
Block
Definition: Block.php:22
Block\getRangeStart
getRangeStart()
Get the IP address at the start of the range in Hex form.
Definition: Block.php:781
Block\getPermissionsError
getPermissionsError(IContextSource $context)
Get the key and parameters for the corresponding error message.
Definition: Block.php:1317
IContextSource\getRequest
getRequest()
Get the WebRequest object.
Block\getDatabaseArray
getDatabaseArray( $db=null)
Get an array suitable for passing to $dbw->insert() or $dbw->update()
Definition: Block.php:482
Block\getByName
getByName()
Get the username of the blocking sysop.
Definition: Block.php:831
Block\$mParentBlockId
$mParentBlockId
Definition: Block.php:26
Block\$mAuto
$mAuto
Definition: Block.php:23
Html\rawElement
static rawElement( $element, $attribs=array(), $contents='')
Returns an HTML element in a string.
Definition: Html.php:124
Block\newFromRow
static newFromRow( $row)
Create a new Block object from a database row.
Definition: Block.php:362
User
The User object encapsulates all of the user-specific settings (user_id, name, rights,...
Definition: User.php:59
IP\isValidBlock
static isValidBlock( $ipblock)
Validate an IP Block (valid address WITH a valid prefix).
Definition: IP.php:121
$res
$res
Definition: database.txt:21
Block\$mTimestamp
$mTimestamp
Definition: Block.php:23
User\getName
getName()
Get the user name, or the IP of an anonymous user.
Definition: User.php:1876
Block\defaultRetroactiveAutoblock
static defaultRetroactiveAutoblock(Block $block, array &$blockIds)
Retroactively autoblocks the last IP used by the user (if it is a user) blocked by this Block.
Definition: Block.php:561
IP\sanitizeRange
static sanitizeRange( $range)
Gets rid of unneeded numbers in quad-dotted/octet IP strings For example, 127.111....
Definition: IP.php:763
Block\$forcedTargetID
Integer $forcedTargetID
Hack for foreign blocking (CentralAuth) *.
Definition: Block.php:36
Block\setTarget
setTarget( $target)
Set the target for this block, and update $this->type accordingly.
Definition: Block.php:1290
Block\$mId
$mId
Definition: Block.php:26
IContextSource\getLanguage
getLanguage()
Get the Language object.
Block\getAutoblockExpiry
static getAutoblockExpiry( $timestamp)
Get a timestamp of the expiry for autoblocks.
Definition: Block.php:928