Page Menu
Home
WickedGov Phorge
Search
Configure Global Search
Log In
Files
F4110156
GlobalBlock.php
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
GlobalBlock.php
View Options
<?php
namespace
MediaWiki\Extension\GlobalBlocking
;
use
MediaWiki\Block\AbstractBlock
;
use
MediaWiki\MediaWikiServices
;
use
MediaWiki\User\CentralId\CentralIdLookup
;
use
MediaWiki\User\UserIdentity
;
use
MediaWiki\User\UserIdentityValue
;
use
MediaWiki\WikiMap\WikiMap
;
use
stdClass
;
class
GlobalBlock
extends
AbstractBlock
{
private
int
$id
;
private
bool
$xff
;
private
bool
$isAutoBlock
;
private
bool
$isAutoblocking
;
private
?
UserIdentity
$blocker
;
/**
* Constructs a GlobalBlock instance from a database returned row returned by GlobalBlockLookup.
*
* @param stdClass $row The database row
* @param bool $xff Whether this was triggered by the XFF header containing a globally blocked IP address
* @return GlobalBlock
* @internal You should get a GlobalBlock instance through the {@link GlobalBlockLookup} service in most cases
*/
public
static
function
newFromRow
(
stdClass
$row
,
bool
$xff
):
GlobalBlock
{
return
new
GlobalBlock
(
[
'id'
=>
$row
->
gb_id
,
'isAutoblock'
=>
boolval
(
$row
->
gb_autoblock_parent_id
),
'enableAutoblock'
=>
$row
->
gb_enable_autoblock
,
'byCentralId'
=>
$row
->
gb_by_central_id
,
'byWiki'
=>
$row
->
gb_by_wiki
,
'address'
=>
$row
->
gb_address
,
'reason'
=>
$row
->
gb_reason
,
'timestamp'
=>
$row
->
gb_timestamp
,
'anonOnly'
=>
$row
->
gb_anon_only
,
'expiry'
=>
$row
->
gb_expiry
,
'createAccount'
=>
$row
->
gb_create_account
,
'xff'
=>
$xff
,
]
);
}
/**
* @param array $options Parameters of the block, with options supported by {@link AbstractBlock::__construct} and:
* - id: (int) The ID of the global block from the 'globalblocks' table
* - isAutoblock: (bool) Is this an automatic block?
* - enableAutoblock: (bool) Enable automatic blocking
* - expiry: (string) Database timestamp of expiration of the block or 'infinity'
* - anonOnly: (bool) Only disallow anonymous actions
* - createAccount: (bool) Disallow creation of new accounts
* - byCentralId: (int) Central ID of the blocker
* - byWiki: (string) Wiki ID of the wiki where the blocker performed the block
* - xff: (bool) Did this block match the current user because one of their XFF IPs were blocked?
*
* @internal You should get a GlobalBlock instance through the {@link GlobalBlockLookup} service.
*/
public
function
__construct
(
array
$options
)
{
// We need to set isAutoBlock before calling the parent, because the parent calls ::getType which then
// accesses this property.
$this
->
isAutoBlock
=
(
bool
)
$options
[
'isAutoblock'
];
parent
::
__construct
(
$options
);
$db
=
MediaWikiServices
::
getInstance
()->
getConnectionProvider
()->
getReplicaDatabase
(
$this
->
getWikiId
()
);
$this
->
setExpiry
(
$db
->
decodeExpiry
(
$options
[
'expiry'
]
)
);
$this
->
id
=
(
int
)
$options
[
'id'
];
$this
->
xff
=
(
bool
)
$options
[
'xff'
];
$this
->
isAutoblocking
=
(
bool
)
$options
[
'enableAutoblock'
];
$this
->
isCreateAccountBlocked
(
(
bool
)
$options
[
'createAccount'
]
);
$this
->
setGlobalBlocker
(
$options
);
}
/**
* @inheritDoc
*/
public
function
getBy
(
$wikiId
=
self
::
LOCAL
):
int
{
$this
->
assertWiki
(
$wikiId
);
return
(
$this
->
blocker
)
?
$this
->
blocker
->
getId
(
$wikiId
)
:
0
;
}
/**
* @inheritDoc
*/
public
function
getByName
():
string
{
return
(
$this
->
blocker
)
?
$this
->
blocker
->
getName
()
:
''
;
}
/**
* @inheritDoc
*/
public
function
getBlocker
():
?
UserIdentity
{
return
$this
->
blocker
;
}
/**
* @inheritDoc
*/
public
function
getIdentifier
(
$wikiId
=
self
::
LOCAL
)
{
return
$this
->
getId
(
$wikiId
);
}
/**
* @inheritDoc
* @return int
*/
public
function
getId
(
$wikiId
=
self
::
LOCAL
):
int
{
return
$this
->
id
;
}
public
function
getXff
()
{
return
$this
->
xff
;
}
/**
* Does the block cause autoblocks to be created?
*
* @return bool
*/
public
function
isAutoblocking
():
bool
{
return
$this
->
getType
()
==
self
::
TYPE_USER
?
$this
->
isAutoblocking
:
false
;
}
/** @inheritDoc */
public
function
getType
():
?
int
{
return
$this
->
isAutoBlock
?
self
::
TYPE_AUTO
:
parent
::
getType
();
}
/**
* @param array $options Options for the $block provided in ::__construct
*/
private
function
setGlobalBlocker
(
array
$options
)
{
$services
=
MediaWikiServices
::
getInstance
();
$lookup
=
$services
->
getCentralIdLookup
();
$user
=
$lookup
->
localUserFromCentralId
(
$options
[
'byCentralId'
],
CentralIdLookup
::
AUDIENCE_RAW
);
// If the block was inserted from this wiki, then we know the blocker exists
if
(
$user
&&
$options
[
'byWiki'
]
===
WikiMap
::
getCurrentWikiId
()
)
{
$this
->
blocker
=
$user
;
return
;
}
// If the blocker is the same user on the foreign wiki and the current wiki
// then we can use the username
if
(
$user
&&
$user
->
getId
()
&&
$lookup
->
isAttached
(
$user
)
&&
$lookup
->
isAttached
(
$user
,
$options
[
'byWiki'
]
)
)
{
$this
->
blocker
=
$user
;
return
;
}
// They don't exist locally, so we need to use an interwiki username
$username
=
$lookup
->
nameFromCentralId
(
$options
[
'byCentralId'
],
CentralIdLookup
::
AUDIENCE_RAW
);
if
(
$username
!==
null
)
{
$this
->
blocker
=
$services
->
getUserFactory
()->
newFromUserIdentity
(
UserIdentityValue
::
newExternal
(
$options
[
'byWiki'
],
$username
)
);
return
;
}
// If all else fails, then set the blocker as null. This shouldn't happen unless the central ID for the
// performer of the block is broken.
$this
->
blocker
=
null
;
}
}
File Metadata
Details
Attached
Mime Type
text/x-php
Expires
Tue, Aug 18, 21:35 (2 d, 20 h ago)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
fa/1f/8bcd25e6750b9a5766c31389df72
Default Alt Text
GlobalBlock.php (5 KB)
Attached To
Mode
rMWPROD MediaWiki Production
Attached
Detach File
Event Timeline
Log In to Comment