/** @var bool */
protected $isAutoblocking;
+ /** @var string|null */
+ protected $systemBlockType;
+
# TYPE constants
const TYPE_USER = 1;
const TYPE_IP = 2;
* blockEmail bool Disallow sending emails
* allowUsertalk bool Allow the target to edit its own talk page
* byText string Username of the blocker (for foreign users)
+ * systemBlock string Indicate that this block is automatically
+ * created by MediaWiki rather than being stored
+ * in the database. Value is a string to return
+ * from self::getSystemBlockType().
*
* @since 1.26 accepts $options array instead of individual parameters; order
* of parameters above reflects the original order
'blockEmail' => false,
'allowUsertalk' => false,
'byText' => '',
+ 'systemBlock' => null,
];
if ( func_num_args() > 1 || !is_array( $options ) ) {
$this->prevents( 'createaccount', (bool)$options['createAccount'] );
$this->mFromMaster = false;
+ $this->systemBlockType = $options['systemBlock'];
}
/**
*/
public function insert( $dbw = null ) {
global $wgBlockDisablesLogin;
+
+ if ( $this->getSystemBlockType() !== null ) {
+ throw new MWException( 'Cannot insert a system block into the database' );
+ }
+
wfDebug( "Block::insert; timestamp {$this->mTimestamp}\n" );
if ( $dbw === null ) {
return false;
}
+ # Don't autoblock for system blocks
+ if ( $this->getSystemBlockType() !== null ) {
+ throw new MWException( 'Cannot autoblock from a system block' );
+ }
+
# Check for presence on the autoblock whitelist.
if ( self::isWhitelistedFromAutoblocks( $autoblockIP ) ) {
return false;
}
+ // Avoid PHP 7.1 warning of passing $this by reference
+ $block = $this;
# Allow hooks to cancel the autoblock.
- if ( !Hooks::run( 'AbortAutoblock', [ $autoblockIP, &$this ] ) ) {
+ if ( !Hooks::run( 'AbortAutoblock', [ $autoblockIP, &$block ] ) ) {
wfDebug( "Autoblock aborted by hook.\n" );
return false;
}
return $this->mId;
}
+ /**
+ * Get the system block type, if any
+ * @return string|null
+ */
+ public function getSystemBlockType() {
+ return $this->systemBlockType;
+ }
+
/**
* Get/set a flag determining whether the master is used for reads
*
/**
* Set the 'BlockID' cookie to this block's ID and expiry time. The cookie's expiry will be
- * the same as the block's, unless it's greater than $wgCookieExpiration in which case
- * $wgCookieExpiration will be used instead (defaults to 30 days).
+ * the same as the block's, to a maximum of 24 hours.
*
* An empty value can also be set, in order to retain the cookie but remove the block ID
* (e.g. as used in User::getBlockedStatus).
*/
public function setCookie( WebResponse $response, $setEmpty = false ) {
// Calculate the default expiry time.
- $config = RequestContext::getMain()->getConfig();
- $defaultExpiry = wfTimestamp() + $config->get( 'CookieExpiration' );
+ $maxExpiryTime = wfTimestamp( TS_MW, wfTimestamp() + ( 24 * 60 * 60 ) );
// Use the Block's expiry time only if it's less than the default.
- $expiry = wfTimestamp( TS_UNIX, $this->getExpiry() );
- if ( $expiry > $defaultExpiry ) {
- // The *default* default expiry is 30 days.
- $expiry = $defaultExpiry;
+ $expiryTime = $this->getExpiry();
+ if ( $expiryTime === 'infinity' || $expiryTime > $maxExpiryTime ) {
+ $expiryTime = $maxExpiryTime;
}
+ // Set the cookie. Reformat the MediaWiki datetime as a Unix timestamp for the cookie.
$cookieValue = $setEmpty ? '' : $this->getId();
- $response->setCookie( 'BlockID', $cookieValue, $expiry );
+ $expiryValue = DateTime::createFromFormat( "YmdHis", $expiryTime );
+ $response->setCookie( 'BlockID', $cookieValue, $expiryValue->format( "U" ) );
}
/**
* This could be a username, an IP range, or a single IP. */
$intended = $this->getTarget();
+ $systemBlockType = $this->getSystemBlockType();
+
$lang = $context->getLanguage();
return [
- $this->mAuto ? 'autoblockedtext' : 'blockedtext',
+ $systemBlockType !== null
+ ? 'systemblockedtext'
+ : ( $this->mAuto ? 'autoblockedtext' : 'blockedtext' ),
$link,
$reason,
$context->getRequest()->getIP(),
$this->getByName(),
- $this->getId(),
+ $systemBlockType !== null ? $systemBlockType : $this->getId(),
$lang->formatExpiry( $this->mExpiry ),
(string)$intended,
$lang->userTimeAndDate( $this->mTimestamp, $context->getUser() ),