From 8016f2b6decfb33b2418f6abd3a5b4106c117a70 Mon Sep 17 00:00:00 2001 From: xiaomlove Date: Sun, 23 Oct 2022 18:26:03 +0800 Subject: [PATCH] physical delete acount write to ban log --- app/Repositories/UserRepository.php | 26 +++++++++++++++++++++----- include/cleanup.php | 21 +++++++++++++-------- include/constants.php | 2 +- resources/lang/en/cleanup.php | 1 + resources/lang/en/user.php | 2 ++ resources/lang/zh_CN/cleanup.php | 1 + resources/lang/zh_CN/user.php | 2 ++ resources/lang/zh_TW/cleanup.php | 1 + resources/lang/zh_TW/user.php | 2 ++ 9 files changed, 44 insertions(+), 14 deletions(-) diff --git a/app/Repositories/UserRepository.php b/app/Repositories/UserRepository.php index b2b37efa..f09af9c9 100644 --- a/app/Repositories/UserRepository.php +++ b/app/Repositories/UserRepository.php @@ -162,12 +162,15 @@ class UserRepository extends BaseRepository return User::listClass(); } - public function disableUser(User $operator, $uid, $reason) + public function disableUser(User $operator, $uid, $reason = '') { $targetUser = User::query()->findOrFail($uid, ['id', 'enabled', 'username', 'class']); if ($targetUser->enabled == User::ENABLED_NO) { throw new NexusException('Already disabled !'); } + if (empty($reason)) { + $reason = nexus_trans("user.disable_by_admin"); + } $this->checkPermission($operator, $targetUser); $banLog = [ 'uid' => $uid, @@ -519,9 +522,13 @@ class UserRepository extends BaseRepository return true; } - public function destroy($id) + public function destroy($id, $reasonKey = 'user.destroy_by_admin') { - user_can('user-delete', true); + if (!isRunningInConsole()) { + user_can('user-delete', true); + } + $uidArr = Arr::wrap($id); + $users = User::query()->with('language')->whereIn('id', $uidArr)->get(['id', 'username', 'lang']); $tables = [ 'users' => 'id', 'hit_and_runs' => 'uid', @@ -530,9 +537,18 @@ class UserRepository extends BaseRepository 'exam_progress' => 'uid', ]; foreach ($tables as $table => $key) { - \Nexus\Database\NexusDB::table($table)->where($key, $id)->delete(); + \Nexus\Database\NexusDB::table($table)->whereIn($key, $uidArr)->delete(); } - do_log("[DESTROY_USER]: $id", 'error'); + do_log("[DESTROY_USER]: " . json_encode($uidArr), 'error'); + $userBanLogs = []; + foreach ($users as $user) { + $userBanLogs[] = [ + 'uid' => $user->id, + 'username' => $user->username, + 'reason' => nexus_trans($reasonKey, [], $user->locale) + ]; + } + UserBanLog::query()->insert($userBanLogs); return true; } diff --git a/include/cleanup.php b/include/cleanup.php index 3e301bfa..aa461cdb 100644 --- a/include/cleanup.php +++ b/include/cleanup.php @@ -664,10 +664,14 @@ function docleanup($forceAll = 0, $printProgress = false) { if ($destroyDisabledDays > 0) { $secs = $destroyDisabledDays*24*60*60; $dt = date("Y-m-d H:i:s",(TIMENOW - $secs)); - \App\Models\User::query() + $users = \App\Models\User::query() ->where('enabled', 'no') ->where("last_access","<", $dt) - ->delete(); + ->get(['id']); + if ($users->isNotEmpty()) { + $userRep = new \App\Repositories\UserRepository(); + $userRep->destroy($users->pluck('id')->toArray(), 'cleanup.destroy_disabled_account'); + } } $log = "destroy disabled accounts"; do_log($log); @@ -1037,12 +1041,13 @@ function docleanup($forceAll = 0, $printProgress = false) { } //remove duplicate user ban logs - $log = "clear user ban log duplicate"; - \App\Models\UserBanLog::clearUserBanLogDuplicate(); - do_log($log); - if ($printProgress) { - printProgress($log); - } + //No need to do that, disable + destroy will have two records, sometimes disable will enable again +// $log = "clear user ban log duplicate"; +// \App\Models\UserBanLog::clearUserBanLogDuplicate(); +// do_log($log); +// if ($printProgress) { +// printProgress($log); +// } $log = 'Full cleanup is done'; do_log($log); diff --git a/include/constants.php b/include/constants.php index f92778d0..89e7ebeb 100644 --- a/include/constants.php +++ b/include/constants.php @@ -1,6 +1,6 @@ 'Disable inactive user accounts, no transfer. Alt: register time.', 'disable_user_not_parked' => 'Disable inactive user accounts, not parked.', 'disable_user_parked' => 'Disable inactive user accounts, parked.', + 'destroy_disabled_account' => 'Timed physical deletion of disabled accounts', ]; diff --git a/resources/lang/en/user.php b/resources/lang/en/user.php index 33e2e17d..8524f42e 100644 --- a/resources/lang/en/user.php +++ b/resources/lang/en/user.php @@ -27,4 +27,6 @@ return [ \App\Models\User::CLASS_STAFF_LEADER => 'Staff Leader', ], 'change_username_lte_min_interval' => 'Last change time: :last_change_time, unmet minimum interval: :interval days', + 'destroy_by_admin' => 'Physical delete by administrator', + 'disable_by_admin' => 'Disable by administrator', ]; diff --git a/resources/lang/zh_CN/cleanup.php b/resources/lang/zh_CN/cleanup.php index 9d8ad4da..e74ced00 100644 --- a/resources/lang/zh_CN/cleanup.php +++ b/resources/lang/zh_CN/cleanup.php @@ -7,4 +7,5 @@ return [ 'disable_user_no_transfer_alt_register_time' => '封禁非活跃的无流量账号,由注册时间时间断定.', 'disable_user_not_parked' => '定时封禁未挂起的非活跃账号.', 'disable_user_parked' => '定时封禁已挂起的非活跃账号.', + 'destroy_disabled_account' => '定时物理删除已封禁账号', ]; diff --git a/resources/lang/zh_CN/user.php b/resources/lang/zh_CN/user.php index 68c51678..ad427709 100644 --- a/resources/lang/zh_CN/user.php +++ b/resources/lang/zh_CN/user.php @@ -27,4 +27,6 @@ return [ \App\Models\User::CLASS_STAFF_LEADER => '主管', ], 'change_username_lte_min_interval' => '上次修改时间::last_change_time,未满足最小间隔::interval 天', + 'destroy_by_admin' => '被管理员物理删除', + 'disable_by_admin' => '被管理員封禁', ]; diff --git a/resources/lang/zh_TW/cleanup.php b/resources/lang/zh_TW/cleanup.php index 76358e15..86de0547 100644 --- a/resources/lang/zh_TW/cleanup.php +++ b/resources/lang/zh_TW/cleanup.php @@ -7,4 +7,5 @@ return [ 'disable_user_no_transfer_alt_register_time' => '封禁非活躍的無流量賬號,由註冊時間時間斷定.', 'disable_user_not_parked' => '定時封禁未掛起的非活躍賬號.', 'disable_user_parked' => '定時封禁已掛起的非活躍賬號.', + 'destroy_disabled_account' => '定時物理刪除已封禁賬號', ]; diff --git a/resources/lang/zh_TW/user.php b/resources/lang/zh_TW/user.php index 9fa65910..9f5c1a80 100644 --- a/resources/lang/zh_TW/user.php +++ b/resources/lang/zh_TW/user.php @@ -27,4 +27,6 @@ return [ \App\Models\User::CLASS_STAFF_LEADER => '主管', ], 'change_username_lte_min_interval' => '上次修改時間::last_change_time,未滿足最小間隔::interval 天', + 'destroy_by_admin' => '被管理員物理刪除', + 'disable_by_admin' => '被管理员封禁', ];