Skip to content

Commit 0afc89d

Browse files
committed
[3.0] Cleanup the delete member action
This also includes the fixes from SimpleMachines#7842 for 3.0
1 parent 5da8ca8 commit 0afc89d

File tree

1 file changed

+87
-248
lines changed

1 file changed

+87
-248
lines changed

Sources/User.php

Lines changed: 87 additions & 248 deletions
Original file line numberDiff line numberDiff line change
@@ -3106,10 +3106,11 @@ public static function delete(int|array $users, bool $check_not_admin = false, b
31063106
// Get their names for logging purposes.
31073107
$admins = [];
31083108
$user_log_details = [];
3109+
$emails = [];
31093110

31103111
$request = Db::$db->query(
31113112
'SELECT
3112-
id_member, member_name, is_activated,
3113+
id_member, member_name, is_activated, email_address,
31133114
CASE WHEN id_group = {int:admin_group} OR FIND_IN_SET({int:admin_group}, additional_groups) != 0 THEN 1 ELSE 0 END AS is_admin
31143115
FROM {db_prefix}members
31153116
WHERE id_member IN ({array_int:user_list})
@@ -3127,6 +3128,7 @@ public static function delete(int|array $users, bool $check_not_admin = false, b
31273128
}
31283129

31293130
$user_log_details[$row['id_member']] = $row;
3131+
$emails[] = $row['email_address'];
31303132
}
31313133
Db::$db->free_result($request);
31323134

@@ -3182,263 +3184,91 @@ public static function delete(int|array $users, bool $check_not_admin = false, b
31823184
}
31833185
}
31843186

3185-
// Make these peoples' posts guest posts.
3186-
Db::$db->query(
3187-
'UPDATE {db_prefix}messages
3188-
SET id_member = {int:guest_id}
3189-
WHERE id_member IN ({array_int:users})',
3190-
[
3191-
'guest_id' => 0,
3192-
'users' => $users,
3193-
],
3194-
);
3195-
3196-
Db::$db->query(
3197-
'UPDATE {db_prefix}polls
3198-
SET id_member = {int:guest_id}
3199-
WHERE id_member IN ({array_int:users})',
3200-
[
3201-
'guest_id' => 0,
3202-
'users' => $users,
3203-
],
3204-
);
3205-
3206-
// Make these peoples' posts guest first posts and last posts.
3207-
Db::$db->query(
3208-
'UPDATE {db_prefix}topics
3209-
SET id_member_started = {int:guest_id}
3210-
WHERE id_member_started IN ({array_int:users})',
3211-
[
3212-
'guest_id' => 0,
3213-
'users' => $users,
3214-
],
3215-
);
3216-
3217-
Db::$db->query(
3218-
'UPDATE {db_prefix}topics
3219-
SET id_member_updated = {int:guest_id}
3220-
WHERE id_member_updated IN ({array_int:users})',
3221-
[
3222-
'guest_id' => 0,
3223-
'users' => $users,
3224-
],
3225-
);
3226-
3227-
Db::$db->query(
3228-
'UPDATE {db_prefix}log_actions
3229-
SET id_member = {int:guest_id}
3230-
WHERE id_member IN ({array_int:users})',
3231-
[
3232-
'guest_id' => 0,
3233-
'users' => $users,
3234-
],
3235-
);
3236-
3237-
Db::$db->query(
3238-
'UPDATE {db_prefix}log_banned
3239-
SET id_member = {int:guest_id}
3240-
WHERE id_member IN ({array_int:users})',
3241-
[
3242-
'guest_id' => 0,
3243-
'users' => $users,
3244-
],
3245-
);
3246-
3247-
Db::$db->query(
3248-
'UPDATE {db_prefix}log_errors
3249-
SET id_member = {int:guest_id}
3250-
WHERE id_member IN ({array_int:users})',
3251-
[
3252-
'guest_id' => 0,
3253-
'users' => $users,
3254-
],
3255-
);
3256-
3257-
// Delete the member.
3258-
Db::$db->query(
3259-
'DELETE FROM {db_prefix}members
3260-
WHERE id_member IN ({array_int:users})',
3261-
[
3262-
'users' => $users,
3263-
],
3264-
);
3265-
3266-
// Delete any drafts...
3267-
Db::$db->query(
3268-
'DELETE FROM {db_prefix}user_drafts
3269-
WHERE id_member IN ({array_int:users})',
3270-
[
3271-
'users' => $users,
3272-
],
3273-
);
3274-
3275-
// Delete anything they liked.
3276-
Db::$db->query(
3277-
'DELETE FROM {db_prefix}user_likes
3278-
WHERE id_member IN ({array_int:users})',
3279-
[
3280-
'users' => $users,
3281-
],
3282-
);
3283-
3284-
// Delete their mentions
3285-
Db::$db->query(
3286-
'DELETE FROM {db_prefix}mentions
3287-
WHERE id_member IN ({array_int:members})',
3288-
[
3289-
'members' => $users,
3290-
],
3291-
);
3292-
3293-
// Delete the logs...
3294-
Db::$db->query(
3295-
'DELETE FROM {db_prefix}log_actions
3296-
WHERE id_log = {int:log_type}
3297-
AND id_member IN ({array_int:users})',
3298-
[
3299-
'log_type' => 2,
3300-
'users' => $users,
3301-
],
3302-
);
3303-
3304-
Db::$db->query(
3305-
'DELETE FROM {db_prefix}log_boards
3306-
WHERE id_member IN ({array_int:users})',
3307-
[
3308-
'users' => $users,
3309-
],
3310-
);
3311-
3312-
Db::$db->query(
3313-
'DELETE FROM {db_prefix}log_comments
3314-
WHERE id_recipient IN ({array_int:users})
3315-
AND comment_type = {string:warntpl}',
3316-
[
3317-
'users' => $users,
3318-
'warntpl' => 'warntpl',
3319-
],
3320-
);
3321-
3322-
Db::$db->query(
3323-
'DELETE FROM {db_prefix}log_group_requests
3324-
WHERE id_member IN ({array_int:users})',
3325-
[
3326-
'users' => $users,
3327-
],
3328-
);
3329-
3330-
Db::$db->query(
3331-
'DELETE FROM {db_prefix}log_mark_read
3332-
WHERE id_member IN ({array_int:users})',
3333-
[
3334-
'users' => $users,
3335-
],
3336-
);
3337-
3338-
Db::$db->query(
3339-
'DELETE FROM {db_prefix}log_notify
3340-
WHERE id_member IN ({array_int:users})',
3341-
[
3342-
'users' => $users,
3343-
],
3344-
);
3345-
3346-
Db::$db->query(
3347-
'DELETE FROM {db_prefix}log_online
3348-
WHERE id_member IN ({array_int:users})',
3349-
[
3350-
'users' => $users,
3351-
],
3352-
);
3353-
3354-
Db::$db->query(
3355-
'DELETE FROM {db_prefix}log_subscribed
3356-
WHERE id_member IN ({array_int:users})',
3357-
[
3358-
'users' => $users,
3359-
],
3360-
);
3187+
$set_tables = [
3188+
// Make these peoples' posts guest posts.
3189+
['messages', 'id_member'],
3190+
['polls', 'id_member'],
3191+
// Make these peoples' posts guest first posts and last posts.
3192+
['topics', 'id_member_started'],
3193+
['topics', 'id_member_updated'],
3194+
['log_actions', 'id_member'],
3195+
['log_banned', 'id_member'],
3196+
['log_errors', 'id_member'],
3197+
['log_reported', 'id_member'],
3198+
['log_reported_comments', 'id_member'],
3199+
// Make their votes appear as guest votes - at least it keeps the totals right.
3200+
// @todo Consider adding back in cookie protection.
3201+
['log_polls', 'id_member'],
3202+
];
33613203

3362-
Db::$db->query(
3363-
'DELETE FROM {db_prefix}log_topics
3364-
WHERE id_member IN ({array_int:users})',
3365-
[
3366-
'users' => $users,
3367-
],
3368-
);
3204+
$delete_tables = [
3205+
// Delete the member.
3206+
['members', 'id_member'],
3207+
['member_logins', 'id_member'],
3208+
['user_alerts', 'id_member'],
3209+
['user_alerts', 'id_member_started'],
3210+
['user_alerts_prefs', 'id_member'],
3211+
// Delete any drafts...
3212+
['user_drafts', 'id_member'],
3213+
// Delete anything they liked.
3214+
['user_likes', 'id_member'],
3215+
// Delete their mentions
3216+
['mentions', 'id_member'],
3217+
// Delete the logs...
3218+
['log_actions', 'id_member', ' AND id_log = {int:log_type}', ['log_type' => 2]],
3219+
['log_boards', 'id_member'],
3220+
['log_comments', 'id_recipient', ' AND comment_type = {string:warntpl}', ['warntpl' => 'warntpl']],
3221+
['log_group_requests', 'id_member'],
3222+
['log_mark_read', 'id_member'],
3223+
['log_notify', 'id_member'],
3224+
['log_online', 'id_member'],
3225+
['log_subscribed', 'id_member'],
3226+
['log_topics', 'id_member'],
3227+
['personal_messages', 'id_member_from'],
3228+
['pm_rules', 'id_member'],
3229+
// They no longer exist, so we don't know who it was sent to.
3230+
['pm_recipients', 'id_member'],
3231+
// It's over, no more moderation for you.
3232+
['moderators', 'id_member'],
3233+
['group_moderators', 'id_member'],
3234+
// If you don't exist we can't ban you.
3235+
['ban_items', 'id_member'],
3236+
// Remove individual theme settings.
3237+
['themes', 'id_member'],
3238+
];
33693239

3370-
// Make their votes appear as guest votes - at least it keeps the totals right.
3371-
// @todo Consider adding back in cookie protection.
3372-
Db::$db->query(
3373-
'UPDATE {db_prefix}log_polls
3374-
SET id_member = {int:guest_id}
3375-
WHERE id_member IN ({array_int:users})',
3376-
[
3377-
'guest_id' => 0,
3378-
'users' => $users,
3379-
],
3380-
);
3240+
foreach($set_tables as $d) {
3241+
Db::$db->query(
3242+
'UPDATE {db_prefix}{raw:table}
3243+
SET {raw:col} = {int:guest_id}
3244+
WHERE {raw:col} IN ({array_int:users})',
3245+
[
3246+
'table' => $d[0],
3247+
'col' => $d[1],
3248+
'guest_id' => 0,
3249+
'users' => $users,
3250+
],
3251+
);
3252+
}
33813253

33823254
// Delete personal messages.
33833255
PM::delete(null, null, $users);
33843256

3385-
Db::$db->query(
3386-
'UPDATE {db_prefix}personal_messages
3387-
SET id_member_from = {int:guest_id}
3388-
WHERE id_member_from IN ({array_int:users})',
3389-
[
3390-
'guest_id' => 0,
3391-
'users' => $users,
3392-
],
3393-
);
3394-
3395-
// They no longer exist, so we don't know who it was sent to.
3396-
Db::$db->query(
3397-
'DELETE FROM {db_prefix}pm_recipients
3398-
WHERE id_member IN ({array_int:users})',
3399-
[
3400-
'users' => $users,
3401-
],
3402-
);
3257+
foreach($delete_tables as $d) {
3258+
Db::$db->query(
3259+
'DELETE FROM {db_prefix}{raw:table}
3260+
WHERE {raw:col} IN ({array_int:users})' . ($d[2] ?? ''),
3261+
array_merge($d[3] ?? [], [
3262+
'table' => $d[0],
3263+
'col' => $d[1],
3264+
'users' => $users,
3265+
]),
3266+
);
3267+
}
34033268

34043269
// Delete avatar.
34053270
Attachment::remove(['id_member' => $users]);
34063271

3407-
// It's over, no more moderation for you.
3408-
Db::$db->query(
3409-
'DELETE FROM {db_prefix}moderators
3410-
WHERE id_member IN ({array_int:users})',
3411-
[
3412-
'users' => $users,
3413-
],
3414-
);
3415-
3416-
Db::$db->query(
3417-
'DELETE FROM {db_prefix}group_moderators
3418-
WHERE id_member IN ({array_int:users})',
3419-
[
3420-
'users' => $users,
3421-
],
3422-
);
3423-
3424-
// If you don't exist we can't ban you.
3425-
Db::$db->query(
3426-
'DELETE FROM {db_prefix}ban_items
3427-
WHERE id_member IN ({array_int:users})',
3428-
[
3429-
'users' => $users,
3430-
],
3431-
);
3432-
3433-
// Remove individual theme settings.
3434-
Db::$db->query(
3435-
'DELETE FROM {db_prefix}themes
3436-
WHERE id_member IN ({array_int:users})',
3437-
[
3438-
'users' => $users,
3439-
],
3440-
);
3441-
34423272
// These users are nobody's buddy nomore.
34433273
$request = Db::$db->query(
34443274
'SELECT id_member, pm_ignore_list, buddy_list
@@ -3466,6 +3296,15 @@ public static function delete(int|array $users, bool $check_not_admin = false, b
34663296
}
34673297
Db::$db->free_result($request);
34683298

3299+
// Remove any emails we may have queued to send.
3300+
Db::$db->query(
3301+
'DELETE FROM {db_prefix}mail_queue
3302+
WHERE recipient IN ({array_string:emails})',
3303+
[
3304+
'emails' => $emails,
3305+
],
3306+
);
3307+
34693308
// Make sure no member's birthday is still sticking in the calendar...
34703309
Config::updateModSettings([
34713310
'calendar_updated' => time(),

0 commit comments

Comments
 (0)