diff --git a/app/Console/Commands/Test.php b/app/Console/Commands/Test.php index 94863f2e..9a8b9d8b 100644 --- a/app/Console/Commands/Test.php +++ b/app/Console/Commands/Test.php @@ -86,9 +86,7 @@ class Test extends Command */ public function handle() { - $a = Carbon::parse('2022-08-06 23:08:03'); - $b = $a->clone()->addHours(1); - dd($a, $b); + } diff --git a/app/Filament/Resources/System/UsernameChangeLogResource.php b/app/Filament/Resources/System/UsernameChangeLogResource.php new file mode 100644 index 00000000..f9a5e6a6 --- /dev/null +++ b/app/Filament/Resources/System/UsernameChangeLogResource.php @@ -0,0 +1,77 @@ +schema([ + // + ]); + } + + public static function table(Table $table): Table + { + return $table + ->columns([ + Tables\Columns\TextColumn::make('id')->sortable(), + Tables\Columns\TextColumn::make('changeTypeText')->label(__('username-change-log.labels.change_type')), + Tables\Columns\TextColumn::make('uid')->searchable(), + Tables\Columns\TextColumn::make('user.username')->searchable()->label(__('label.username')), + Tables\Columns\TextColumn::make('username_old')->searchable()->label(__('username-change-log.labels.username_old')), + Tables\Columns\TextColumn::make('username_new')->searchable()->label(__('username-change-log.labels.username_new')), + Tables\Columns\TextColumn::make('operator')->searchable()->label(__('label.operator')), + Tables\Columns\TextColumn::make('created_at')->label(__('label.created_at'))->formatStateUsing(fn ($state) => format_datetime($state)), + + ]) + ->defaultSort('id', 'desc') + ->filters([ + Tables\Filters\SelectFilter::make('change_type')->options(UsernameChangeLog::listChangeType())->label(__('username-change-log.labels.change_type')), + ]) + ->actions([ +// Tables\Actions\EditAction::make(), +// Tables\Actions\DeleteAction::make(), + ]) + ->bulkActions([ +// Tables\Actions\DeleteBulkAction::make(), + ]); + } + + public static function getPages(): array + { + return [ + 'index' => Pages\ManageUsernameChangeLogs::route('/'), + ]; + } +} diff --git a/app/Filament/Resources/System/UsernameChangeLogResource/Pages/ManageUsernameChangeLogs.php b/app/Filament/Resources/System/UsernameChangeLogResource/Pages/ManageUsernameChangeLogs.php new file mode 100644 index 00000000..c34d4cee --- /dev/null +++ b/app/Filament/Resources/System/UsernameChangeLogResource/Pages/ManageUsernameChangeLogs.php @@ -0,0 +1,21 @@ + ['text' => 'User'], + self::CHANGE_TYPE_ADMIN => ['text' => 'Administrator'], + ]; + + public function getChangeTypeTextAttribute() + { + return nexus_trans('username-change-log.change_type.' . $this->change_type); + } + public function user() { return $this->belongsTo(User::class, 'uid'); } + public static function listChangeType() + { + $result = []; + foreach (self::$changeTypes as $type => $info) { + $result[$type] = nexus_trans('username-change-log.change_type.' . $type); + } + return $result; + } + } diff --git a/app/Repositories/UserRepository.php b/app/Repositories/UserRepository.php index 3fa3e203..d3c49f4b 100644 --- a/app/Repositories/UserRepository.php +++ b/app/Repositories/UserRepository.php @@ -11,6 +11,7 @@ use App\Models\Setting; use App\Models\User; use App\Models\UserBanLog; use App\Models\UserMeta; +use App\Models\UsernameChangeLog; use Carbon\Carbon; use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Arr; @@ -359,6 +360,9 @@ class UserRepository extends BaseRepository private function checkPermission($operator, User $user, $minAuthClass = 'authority.prfmanage') { $operator = $this->getUser($operator); + if ($operator->id == $user->id) { + return; + } $classRequire = Setting::get($minAuthClass); if ($operator->class < $classRequire || $operator->class <= $user->class) { throw new InsufficientPermissionException(); @@ -396,7 +400,7 @@ class UserRepository extends BaseRepository $user = User::query()->findOrFail($uid, User::$commonFields); if ($metaKey == UserMeta::META_KEY_CHANGE_USERNAME) { NexusDB::transaction(function () use ($user, $meta, $params) { - $this->changeUsername($user, $params['username']); + $this->changeUsername($user, UsernameChangeLog::CHANGE_TYPE_USER, $user, $params['username']); $meta->delete(); clear_user_cache($user->id, $user->passkey); }); @@ -406,22 +410,32 @@ class UserRepository extends BaseRepository throw new \InvalidArgumentException("Invalid meta_key: $metaKey"); } - private function changeUsername(User $user, $newUsername): bool + private function changeUsername($operator, $changeType, $targetUser, $newUsername): bool { - if ($user->username == $newUsername) { + $operator = $this->getUser($operator); + $targetUser = $this->getUser($targetUser); + $this->checkPermission($operator, $targetUser); + if ($targetUser->username == $newUsername) { throw new \RuntimeException("New username can not be the same with current username !"); } - if (!validusername($newUsername)) { - throw new \InvalidArgumentException("Invalid username, length must between 4 and 20 characters"); + $strWidth = mb_strwidth($newUsername); + if ($strWidth < 4 || $strWidth > 20) { + throw new \InvalidArgumentException("Invalid username, maybe too long or too short"); } - if (User::query()->where('username', $newUsername)->where('id', '!=', $user->id)->exists()) { + if (User::query()->where('username', $newUsername)->where('id', '!=', $targetUser->id)->exists()) { throw new \RuntimeException("Username: $newUsername already exists !"); } - NexusDB::transaction(function () use ($user, $newUsername) { - $oldUsername = $user->username; - $user->usernameChangeLogs()->create(['username_old' => $oldUsername, 'username_new' => $newUsername]); - $user->username = $newUsername; - $user->save(); + $changeLog = [ + 'uid' => $targetUser->id, + 'operator' => $operator->username, + 'change_type' => $changeType, + 'username_old' => $targetUser->username, + 'username_new' => $newUsername + ]; + NexusDB::transaction(function () use ($operator, $changeType,$targetUser, $changeLog) { + $targetUser->usernameChangeLogs()->create($changeLog); + $targetUser->username = $changeLog['username_new']; + $targetUser->save(); }); return true; } diff --git a/database/migrations/2022_08_09_235716_create_username_change_logs_table.php b/database/migrations/2022_08_09_235716_create_username_change_logs_table.php index 23836a98..95f27631 100644 --- a/database/migrations/2022_08_09_235716_create_username_change_logs_table.php +++ b/database/migrations/2022_08_09_235716_create_username_change_logs_table.php @@ -16,6 +16,8 @@ return new class extends Migration Schema::create('username_change_logs', function (Blueprint $table) { $table->id(); $table->integer('uid'); + $table->string('operator'); + $table->integer('change_type')->nullable(false)->default(0); $table->string('username_old'); $table->string('username_new'); $table->timestamps(); diff --git a/public/modtask.php b/public/modtask.php index 205b3bd7..2b4e7aa1 100644 --- a/public/modtask.php +++ b/public/modtask.php @@ -117,6 +117,14 @@ if ($action == "edituser") $subject = sqlesc($lang_modtask_target[get_user_lang($userid)]['msg_username_change']); $msg = sqlesc($lang_modtask_target[get_user_lang($userid)]['msg_your_username_changed_from'].$arr['username'].$lang_modtask_target[get_user_lang($userid)]['msg_to_new'] . $username .$lang_modtask_target[get_user_lang($userid)]['msg_by'].$CURUSER['username']); sql_query("INSERT INTO messages (sender, receiver, subject, msg, added) VALUES(0, $userid, $subject, $msg, $added)") or sqlerr(__FILE__, __LINE__); + $changeLog = [ + 'uid' => $arr['id'], + 'operator' => $CURUSER['username'], + 'change_type' => \App\Models\UsernameChangeLog::CHANGE_TYPE_ADMIN, + 'username_old' => $arr['username'], + 'username_new' => $username, + ]; + \App\Models\UsernameChangeLog::query()->create($changeLog); } if ($ori_downloaded != $downloaded){ $updateset[] = "downloaded = " . sqlesc($downloaded); diff --git a/resources/lang/en/admin.php b/resources/lang/en/admin.php index 5b2fd58a..ac1cdf63 100644 --- a/resources/lang/en/admin.php +++ b/resources/lang/en/admin.php @@ -22,6 +22,7 @@ return [ 'download_speed' => 'Download speed', 'isp' => 'ISP', 'menu' => 'Custom menu', + 'username_change_log' => 'Username change log', ], 'resources' => [ 'agent_allow' => [ diff --git a/resources/lang/en/label.php b/resources/lang/en/label.php index 840cdf18..e6635555 100644 --- a/resources/lang/en/label.php +++ b/resources/lang/en/label.php @@ -27,6 +27,7 @@ return [ 'description' => 'Description', 'price' => 'Price', 'deadline' => 'Deadline', + 'operator' => 'Operator', 'setting' => [ 'nav_text' => 'Setting', 'backup' => [ diff --git a/resources/lang/en/username-change-log.php b/resources/lang/en/username-change-log.php new file mode 100644 index 00000000..4ef32b61 --- /dev/null +++ b/resources/lang/en/username-change-log.php @@ -0,0 +1,13 @@ + [ + \App\Models\UsernameChangeLog::CHANGE_TYPE_USER => 'User', + \App\Models\UsernameChangeLog::CHANGE_TYPE_ADMIN => 'Administrator', + ], + 'labels' => [ + 'username_old' => 'Old username', + 'username_new' => 'New username', + 'change_type' => 'Change type', + ], +]; diff --git a/resources/lang/zh_CN/admin.php b/resources/lang/zh_CN/admin.php index a308eb57..4674af29 100644 --- a/resources/lang/zh_CN/admin.php +++ b/resources/lang/zh_CN/admin.php @@ -22,6 +22,7 @@ return [ 'download_speed' => '下行带宽', 'isp' => 'ISP', 'menu' => '自定义菜单', + 'username_change_log' => '改名记录', ], 'resources' => [ 'agent_allow' => [ diff --git a/resources/lang/zh_CN/label.php b/resources/lang/zh_CN/label.php index b5a01415..66e18ac3 100644 --- a/resources/lang/zh_CN/label.php +++ b/resources/lang/zh_CN/label.php @@ -27,6 +27,7 @@ return [ 'description' => '描述', 'price' => '价格', 'deadline' => '截止时间', + 'operator' => '操作者', 'setting' => [ 'nav_text' => '设置', 'backup' => [ @@ -213,7 +214,7 @@ return [ ], 'user_meta' => [ 'meta_keys' => [ - \App\Models\UserMeta::META_KEY_CHANGE_USERNAME => '更名卡', + \App\Models\UserMeta::META_KEY_CHANGE_USERNAME => '改名卡', \App\Models\UserMeta::META_KEY_PERSONALIZED_USERNAME => '彩虹 ID', ], ], diff --git a/resources/lang/zh_CN/username-change-log.php b/resources/lang/zh_CN/username-change-log.php new file mode 100644 index 00000000..884e8ac7 --- /dev/null +++ b/resources/lang/zh_CN/username-change-log.php @@ -0,0 +1,13 @@ + [ + \App\Models\UsernameChangeLog::CHANGE_TYPE_USER => '用户', + \App\Models\UsernameChangeLog::CHANGE_TYPE_ADMIN => '管理员', + ], + 'labels' => [ + 'username_old' => '旧用户名', + 'username_new' => '新用户名', + 'change_type' => '修改类型', + ], +]; diff --git a/resources/lang/zh_TW/admin.php b/resources/lang/zh_TW/admin.php index a17e9694..e0a7bf3d 100644 --- a/resources/lang/zh_TW/admin.php +++ b/resources/lang/zh_TW/admin.php @@ -22,6 +22,7 @@ return [ 'download_speed' => '下行帶寬', 'isp' => 'ISP', 'menu' => '自定義菜單', + 'username_change_log' => '改名記錄', ], 'resources' => [ 'agent_allow' => [ diff --git a/resources/lang/zh_TW/label.php b/resources/lang/zh_TW/label.php index 52aa9895..db2e3776 100644 --- a/resources/lang/zh_TW/label.php +++ b/resources/lang/zh_TW/label.php @@ -27,6 +27,7 @@ return [ 'description' => '描述', 'price' => '價格', 'deadline' => '截止時間', + 'operator' => '操作者', 'setting' => [ 'nav_text' => '設置', 'backup' => [ @@ -210,7 +211,7 @@ return [ ], 'user_meta' => [ 'meta_keys' => [ - \App\Models\UserMeta::META_KEY_CHANGE_USERNAME => '更名卡', + \App\Models\UserMeta::META_KEY_CHANGE_USERNAME => '改名卡', \App\Models\UserMeta::META_KEY_PERSONALIZED_USERNAME => '彩虹 ID', ], ], diff --git a/resources/lang/zh_TW/username-change-log.php b/resources/lang/zh_TW/username-change-log.php new file mode 100644 index 00000000..8a3536cf --- /dev/null +++ b/resources/lang/zh_TW/username-change-log.php @@ -0,0 +1,13 @@ + [ + \App\Models\UsernameChangeLog::CHANGE_TYPE_USER => '用戶', + \App\Models\UsernameChangeLog::CHANGE_TYPE_ADMIN => '管理員', + ], + 'labels' => [ + 'username_old' => '舊用戶名', + 'username_new' => '新用戶名', + 'change_type' => '修改類型', + ], +];