Page Menu
Home
WickedGov Phorge
Search
Configure Global Search
Log In
Files
F4135245
Degroup.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
Degroup.php
View Options
<?php
namespace
MediaWiki\Extension\AbuseFilter\Consequences\Consequence
;
use
ManualLogEntry
;
use
MediaWiki\Extension\AbuseFilter\Consequences\Parameters
;
use
MediaWiki\Extension\AbuseFilter\FilterUser
;
use
MediaWiki\Extension\AbuseFilter\GlobalNameUtils
;
use
MediaWiki\Extension\AbuseFilter\Variables\LazyLoadedVariable
;
use
MediaWiki\Extension\AbuseFilter\Variables\UnsetVariableException
;
use
MediaWiki\Extension\AbuseFilter\Variables\VariableHolder
;
use
MediaWiki\Title\TitleValue
;
use
MediaWiki\User\UserGroupManager
;
use
MediaWiki\User\UserIdentity
;
use
MediaWiki\User\UserIdentityUtils
;
use
MessageLocalizer
;
/**
* Consequence that removes all user groups from a user.
*/
class
Degroup
extends
Consequence
implements
HookAborterConsequence
,
ReversibleConsequence
{
/**
* @var VariableHolder
* @todo This dependency is subpar
*/
private
$vars
;
/** @var UserGroupManager */
private
$userGroupManager
;
/** @var UserIdentityUtils */
private
$userIdentityUtils
;
/** @var FilterUser */
private
$filterUser
;
/** @var MessageLocalizer */
private
$messageLocalizer
;
/**
* @param Parameters $params
* @param VariableHolder $vars
* @param UserGroupManager $userGroupManager
* @param UserIdentityUtils $userIdentityUtils
* @param FilterUser $filterUser
* @param MessageLocalizer $messageLocalizer
*/
public
function
__construct
(
Parameters
$params
,
VariableHolder
$vars
,
UserGroupManager
$userGroupManager
,
UserIdentityUtils
$userIdentityUtils
,
FilterUser
$filterUser
,
MessageLocalizer
$messageLocalizer
)
{
parent
::
__construct
(
$params
);
$this
->
vars
=
$vars
;
$this
->
userGroupManager
=
$userGroupManager
;
$this
->
userIdentityUtils
=
$userIdentityUtils
;
$this
->
filterUser
=
$filterUser
;
$this
->
messageLocalizer
=
$messageLocalizer
;
}
/**
* @inheritDoc
*/
public
function
execute
():
bool
{
$user
=
$this
->
parameters
->
getUser
();
if
(
!
$this
->
userIdentityUtils
->
isNamed
(
$user
)
)
{
return
false
;
}
// Pull the groups from the VariableHolder, so that they will always be computed.
// This allow us to pull the groups from the VariableHolder to undo the degroup
// via Special:AbuseFilter/revert.
try
{
// No point in triggering a lazy-load, instead we compute it here if necessary
$groupsVar
=
$this
->
vars
->
getVarThrow
(
'user_groups'
);
}
catch
(
UnsetVariableException
$_
)
{
$groupsVar
=
null
;
}
if
(
$groupsVar
===
null
||
$groupsVar
instanceof
LazyLoadedVariable
)
{
// The variable is unset or not computed. Compute it and update the holder so we can use it for reverts
$groups
=
$this
->
userGroupManager
->
getUserEffectiveGroups
(
$user
);
$this
->
vars
->
setVar
(
'user_groups'
,
$groups
);
}
else
{
$groups
=
$groupsVar
->
toNative
();
}
$implicitGroups
=
$this
->
userGroupManager
->
listAllImplicitGroups
();
$removeGroups
=
array_diff
(
$groups
,
$implicitGroups
);
if
(
!
count
(
$removeGroups
)
)
{
return
false
;
}
foreach
(
$removeGroups
as
$group
)
{
$this
->
userGroupManager
->
removeUserFromGroup
(
$user
,
$group
);
}
// TODO Core should provide a logging method
$logEntry
=
new
ManualLogEntry
(
'rights'
,
'rights'
);
$logEntry
->
setPerformer
(
$this
->
filterUser
->
getUserIdentity
()
);
$logEntry
->
setTarget
(
new
TitleValue
(
NS_USER
,
$user
->
getName
()
)
);
$logEntry
->
setComment
(
$this
->
messageLocalizer
->
msg
(
'abusefilter-degroupreason'
,
$this
->
parameters
->
getFilter
()->
getName
(),
$this
->
parameters
->
getFilter
()->
getID
()
)->
inContentLanguage
()->
text
()
);
$logEntry
->
setParameters
(
[
'4::oldgroups'
=>
$removeGroups
,
'5::newgroups'
=>
[]
]
);
$logEntry
->
publish
(
$logEntry
->
insert
()
);
return
true
;
}
/**
* @inheritDoc
*/
public
function
revert
(
UserIdentity
$performer
,
string
$reason
):
bool
{
$user
=
$this
->
parameters
->
getUser
();
$currentGroups
=
$this
->
userGroupManager
->
getUserGroups
(
$user
);
// Pull the user's original groups from the vars. This is guaranteed to be set, because we
// enforce it when performing a degroup.
$removedGroups
=
$this
->
vars
->
getComputedVariable
(
'user_groups'
)->
toNative
();
$removedGroups
=
array_diff
(
$removedGroups
,
$this
->
userGroupManager
->
listAllImplicitGroups
(),
$currentGroups
);
$addedGroups
=
[];
foreach
(
$removedGroups
as
$group
)
{
// TODO An addUserToGroups method with bulk updates would be nice
if
(
$this
->
userGroupManager
->
addUserToGroup
(
$user
,
$group
)
)
{
$addedGroups
[]
=
$group
;
}
}
// Don't log if no groups were added.
if
(
!
$addedGroups
)
{
return
false
;
}
// TODO Core should provide a logging method
$logEntry
=
new
ManualLogEntry
(
'rights'
,
'rights'
);
$logEntry
->
setTarget
(
new
TitleValue
(
NS_USER
,
$user
->
getName
()
)
);
$logEntry
->
setPerformer
(
$performer
);
$logEntry
->
setComment
(
$reason
);
$logEntry
->
setParameters
(
[
'4::oldgroups'
=>
$currentGroups
,
'5::newgroups'
=>
array_merge
(
$currentGroups
,
$addedGroups
)
]
);
$logEntry
->
publish
(
$logEntry
->
insert
()
);
return
true
;
}
/**
* @inheritDoc
*/
public
function
getMessage
():
array
{
$filter
=
$this
->
parameters
->
getFilter
();
return
[
'abusefilter-degrouped'
,
$filter
->
getName
(),
GlobalNameUtils
::
buildGlobalName
(
$filter
->
getID
(),
$this
->
parameters
->
getIsGlobalFilter
()
)
];
}
}
File Metadata
Details
Attached
Mime Type
text/x-php
Expires
Wed, Aug 19, 13:02 (3 w, 3 d ago)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
65/9b/9abe6aa74c95c93bd182c212d23c
Default Alt Text
Degroup.php (5 KB)
Attached To
Mode
rMWPROD MediaWiki Production
Attached
Detach File
Event Timeline
Log In to Comment