static function insertBlock($address, $reason, $expiry, $options = array()) { global $wgUser; $errors = array(); ## Purge expired blocks. GlobalBlocking::purgeExpired(); ## Validate input $ip = IP::sanitizeIP($address); $anonOnly = in_array('anon-only', $options); $modify = in_array('modify', $options); if (!IP::isIPAddress($ip)) { // Invalid IP address. $errors[] = array('globalblocking-block-ipinvalid', $ip); } if (false === $expiry) { $errors[] = array('globalblocking-block-expiryinvalid', $expiry); } $existingBlock = GlobalBlocking::getGlobalBlockId($ip); if (!$modify && $existingBlock) { $errors[] = array('globalblocking-block-alreadyblocked', $ip); } // Check for too-big ranges. list($range_start, $range_end) = IP::parseRange($ip); if (substr($range_start, 0, 4) != substr($range_end, 0, 4)) { // Range crosses a /16 boundary. $errors[] = array('globalblocking-block-bigrange', $ip); } // Normalise the range if ($range_start != $range_end) { $ip = Block::normaliseRange($ip); } if (count($errors) > 0) { return $errors; } // We're a-ok. $dbw = GlobalBlocking::getGlobalBlockingMaster(); // Delete the old block, if applicable if ($modify) { $dbw->delete('globalblocks', array('gb_id' => $existingBlock), __METHOD__); } $row = array(); $row['gb_address'] = $ip; $row['gb_by'] = $wgUser->getName(); $row['gb_by_wiki'] = wfWikiId(); $row['gb_reason'] = $reason; $row['gb_timestamp'] = $dbw->timestamp(wfTimestampNow()); $row['gb_anon_only'] = $anonOnly; $row['gb_expiry'] = Block::encodeExpiry($expiry, $dbw); list($row['gb_range_start'], $row['gb_range_end']) = array($range_start, $range_end); $dbw->insert('globalblocks', $row, __METHOD__); return array(); }