45 $relayLog = $this->readRelayLog();
48 $restrictedGroups = $services->getRestrictedUserGroupConfigReader()->getConfig();
50 $demotableGroups = array_filter(
52 static fn ( $restriction ) => $restriction->allowsAutomaticDemotion()
55 if ( !$demotableGroups ) {
56 $this->
output(
"No groups are configured for automatic demotion, exiting.\n" );
61 $groupMembers = $dbr->newSelectQueryBuilder()
62 ->select( [
'user_id',
'user_name',
'ug_group' ] )
64 ->join(
'user_groups',
null,
'ug_user = user_id' )
65 ->where( [
'ug_group' => array_keys( $demotableGroups ) ] )
66 ->caller( __METHOD__ )
73 $userRequirementsChecker = $services->getUserRequirementsConditionChecker();
74 $userFactory = $services->getUserFactory();
75 foreach ( $groupMembers as $member ) {
76 $userIdentity = UserIdentityValue::newRegistered( $member->user_id, $member->user_name );
77 $groupConditions = $demotableGroups[$member->ug_group]->getMemberConditions();
80 $userRequirementsChecker->recursivelyCheckCondition( $groupConditions, $userIdentity )
81 || $userFactory->newFromUserIdentity( $userIdentity )->isSystemUser()
86 $userIdentities[$userIdentity->getId()] = $userIdentity;
87 $groupsToRemove[$userIdentity->getId()][] = $member->ug_group;
90 if ( !$userIdentities ) {
91 $this->
output(
"No ineligible users found, exiting.\n" );
95 $numUsers = count( $userIdentities );
97 $this->
output(
"DRY RUN: $numUsers users would be affected normally\n" );
99 $this->
output(
"Removing groups from $numUsers users...\n" );
102 $performingUser = User::newSystemUser( User::MAINTENANCE_SCRIPT_USER, [
'steal' =>
true ] );
105 $groupAssignmentService = $services->getUserGroupAssignmentService();
106 $removedText = $dryRun ?
'Would remove' :
'Removed';
107 foreach ( $userIdentities as $userIdentity ) {
108 $userName = $userIdentity->getName();
109 $removeUserGroups = $groupsToRemove[$userIdentity->getId()];
111 $logReason =
wfMessage(
'restrictedgroups-autodemotion-log-reason' )
112 ->params( $userName )
113 ->numParams( count( $removeUserGroups ) )
115 $additionalWikis = [];
116 foreach ( $removeUserGroups as $group ) {
117 if ( isset( $relayLog[$group] ) ) {
118 $additionalWikis = array_merge( $additionalWikis, $relayLog[$group] );
121 $groupAssignmentService->saveChangesToUserGroups(
122 $performingAuthority, $userIdentity, [], $removeUserGroups, [], $logReason, [], $additionalWikis );
124 $groupsList = implode(
', ', $removeUserGroups );
125 $this->
output(
"$removedText groups from $userName: $groupsList\n" );
127 $this->
output(
"Finished processing. $removedText groups from $numUsers users\n" );