diff --git a/app/Filament/Resources/User/UserResource/Pages/UserProfile.php b/app/Filament/Resources/User/UserResource/Pages/UserProfile.php
index c447e847..dfec0818 100644
--- a/app/Filament/Resources/User/UserResource/Pages/UserProfile.php
+++ b/app/Filament/Resources/User/UserResource/Pages/UserProfile.php
@@ -14,10 +14,11 @@ use Filament\Resources\Pages\Concerns\InteractsWithRecord;
use Filament\Resources\Pages\Page;
use Filament\Pages\Actions;
use Filament\Forms;
+use Filament\Resources\Pages\ViewRecord;
use Illuminate\Support\Facades\Auth;
use Nexus\Database\NexusDB;
-class UserProfile extends Page
+class UserProfile extends ViewRecord
{
use InteractsWithRecord;
use HasRelationManagers;
@@ -47,16 +48,6 @@ class UserProfile extends Page
$this->record = $this->resolveRecord($id);
}
- public function mount($record)
- {
- static::authorizeResourceAccess();
-
- $this->record = $this->resolveRecord($record);
-
- abort_unless(static::getResource()::canView($this->getRecord()), 403);
-
- }
-
protected function getActions(): array
{
$actions = [];
@@ -74,7 +65,9 @@ class UserProfile extends Page
$actions[] = $this->buildResetPasswordAction();
$actions[] = $this->buildEnableDisableAction();
$actions[] = $this->buildEnableDisableDownloadPrivilegesAction();
-
+ if (user_can('user-delete')) {
+ $actions[] = $this->buildDeleteAction();
+ }
$actions = apply_filter('user_profile_actions', $actions);
}
return $actions;
@@ -299,6 +292,13 @@ class UserProfile extends Page
});
}
+ private function buildDeleteAction(): Actions\Action
+ {
+ return Actions\DeleteAction::make()->using(function () {
+ $this->getRep()->destroy($this->record->id);
+ });
+ }
+
public function getViewData(): array
{
return [
diff --git a/app/Repositories/UserRepository.php b/app/Repositories/UserRepository.php
index 8e8a40d9..fccf5f78 100644
--- a/app/Repositories/UserRepository.php
+++ b/app/Repositories/UserRepository.php
@@ -497,4 +497,21 @@ class UserRepository extends BaseRepository
return true;
}
+ public function destroy($id)
+ {
+ user_can('user-delete', true);
+ $tables = [
+ 'users' => 'id',
+ 'hit_and_runs' => 'uid',
+ 'claims' => 'uid',
+ 'exam_users' => 'uid',
+ 'exam_progress' => 'uid',
+ ];
+ foreach ($tables as $table => $key) {
+ \Nexus\Database\NexusDB::table($table)->where($key, $id)->delete();
+ }
+ do_log("[DESTROY_USER]: $id", 'error');
+ return true;
+ }
+
}
diff --git a/nexus/Install/settings.default.php b/nexus/Install/settings.default.php
index 66c584f3..eeb0c938 100644
--- a/nexus/Install/settings.default.php
+++ b/nexus/Install/settings.default.php
@@ -177,6 +177,8 @@ return array (
'torrent_hr' => User::CLASS_ADMINISTRATOR,
'torrent-approval' => User::CLASS_ADMINISTRATOR,
'torrent-delete' => User::CLASS_ADMINISTRATOR,
+ 'user-delete' => User::CLASS_ADMINISTRATOR,
+ 'user-change-class' => User::CLASS_ADMINISTRATOR,
),
'tweak' =>
array (
diff --git a/public/delacctadmin.php b/public/delacctadmin.php
index 8a382fe2..6cd49ed4 100644
--- a/public/delacctadmin.php
+++ b/public/delacctadmin.php
@@ -1,8 +1,7 @@
where('id', $id)->delete();
- if ($affectedRows != 1) {
- throw new \RuntimeException("Unable to delete the account.");
- }
- $tables = [
- 'hit_and_runs' => 'uid',
- 'claims' => 'uid',
- 'exam_users' => 'uid',
- 'exam_progress' => 'uid',
- ];
- foreach ($tables as $table => $key) {
- \Nexus\Database\NexusDB::table($table)->where($key, $id)->delete();
- }
- });
-} catch (\Exception $exception) {
- stderr("Error", $exception->getMessage());
-}
+$userRep = new \App\Repositories\UserRepository();
+$userRep->destroy($id);
stderr("Success", "The account ".htmlspecialchars($name)." was deleted.",false);
}
stdhead("Delete account");
diff --git a/public/modtask.php b/public/modtask.php
index 836598c0..bb3e814c 100644
--- a/public/modtask.php
+++ b/public/modtask.php
@@ -194,7 +194,7 @@ if ($action == "edituser")
if ($curclass >= get_user_class())
puke();
- if ($curclass != $class)
+ if (user_can('user-change-class') && $curclass != $class)
{
$what = ($class > $curclass ? $lang_modtask_target[get_user_lang($userid)]['msg_promoted'] : $lang_modtask_target[get_user_lang($userid)]['msg_demoted']);
$subject = sqlesc($lang_modtask_target[get_user_lang($userid)]['msg_class_change']);
diff --git a/public/settings.php b/public/settings.php
index 3e3c3c16..d97ba88f 100644
--- a/public/settings.php
+++ b/public/settings.php
@@ -221,7 +221,8 @@ elseif ($action == 'savesettings_authority') // save user authority
'commanage','forummanage','viewuserlist','torrentmanage','torrentsticky', 'torrentonpromotion', 'torrent_hr', 'askreseed', 'viewnfo',
'torrentstructure','sendinvite','viewhistory','topten','log','confilog','userprofile', 'torrenthistory','prfmanage', 'cruprfmanage',
'uploadsub','delownsub','submanage','updateextinfo', 'viewanonymous','beanonymous','addoffer','offermanage', 'upload','uploadspecial',
- 'view_special_torrent','movetorrent','chrmanage','viewinvite', 'buyinvite','seebanned','againstoffer','userbar', 'torrent-approval', 'torrent-delete'
+ 'view_special_torrent','movetorrent','chrmanage','viewinvite', 'buyinvite','seebanned','againstoffer','userbar', 'torrent-approval',
+ 'torrent-delete', 'user-delete', 'user-change-class',
);
GetVar($validConfig);
$AUTHORITY = [];
@@ -439,6 +440,9 @@ elseif ($action == 'authoritysettings') //Authority settings
tr($lang_settings['row_comment_management'], $lang_settings['text_minimum_class'].classlist('commanage',$maxclass,$AUTHORITY['commanage'],0,true).$lang_settings['text_default'].get_user_class_name(UC_MODERATOR,false,true,true).$lang_settings['text_comment_management_note'],1);
tr($lang_settings['row_forum_management'], $lang_settings['text_minimum_class'].classlist('forummanage',$maxclass,$AUTHORITY['forummanage'],0,true).$lang_settings['text_default'].get_user_class_name(UC_ADMINISTRATOR,false,true,true).$lang_settings['text_forum_management_note'],1);
tr($lang_settings['row_view_userlist'], $lang_settings['text_minimum_class'].classlist('viewuserlist',$maxclass,$AUTHORITY['viewuserlist'],0,true).$lang_settings['text_default'].get_user_class_name(UC_POWER_USER,false,true,true).$lang_settings['text_view_userlist_note'],1);
+ tr(nexus_trans('permission.user-delete.text'), $lang_settings['text_minimum_class'].classlist('user-delete',$maxclass,$AUTHORITY['user-delete'],0,true).$lang_settings['text_default'].get_user_class_name(UC_ADMINISTRATOR,false,true,true).nexus_trans('permission.user-delete.desc'),1);
+ tr(nexus_trans('permission.user-change-class.text'), $lang_settings['text_minimum_class'].classlist('user-change-class',$maxclass,$AUTHORITY['user-change-class'],0,true).$lang_settings['text_default'].get_user_class_name(UC_ADMINISTRATOR,false,true,true).nexus_trans('permission.user-change-class.desc'),1);
+
tr($lang_settings['row_torrent_management'], $lang_settings['text_minimum_class'].classlist('torrentmanage',$maxclass,$AUTHORITY['torrentmanage'],0,true).$lang_settings['text_default'].get_user_class_name(UC_MODERATOR,false,true,true).$lang_settings['text_torrent_management_note'], 1);
tr($lang_settings['row_torrent_delete'], $lang_settings['text_minimum_class'].classlist('torrent-delete',$maxclass,$AUTHORITY['torrent-delete'],0,true).$lang_settings['text_default'].get_user_class_name(UC_ADMINISTRATOR,false,true,true).$lang_settings['text_torrent_delete_note'], 1);
diff --git a/public/userdetails.php b/public/userdetails.php
index d327be1a..59da6d2b 100644
--- a/public/userdetails.php
+++ b/public/userdetails.php
@@ -464,9 +464,11 @@ if (user_can('prfmanage') && $user["class"] < get_user_class())
tr($lang_userdetails['row_donated'], "USD: CNY: " . $lang_userdetails['text_transaction_memo'] . "", 1);
tr($lang_userdetails['row_donoruntil'], " ".$lang_userdetails['text_donoruntil_note'], 1);
}
- $maxclass = get_user_class() - 1;
- $classselect=classlist('class', $maxclass, $user["class"]);
- tr($lang_userdetails['row_class'], $classselect, 1);
+ if (user_can('user-change-class')) {
+ $maxclass = get_user_class() - 1;
+ $classselect=classlist('class', $maxclass, $user["class"]);
+ tr($lang_userdetails['row_class'], $classselect, 1);
+ }
tr($lang_userdetails['row_vip_by_bonus'], "".$lang_userdetails['radio_yes']." ".$lang_userdetails['radio_no']."
".$lang_userdetails['text_vip_by_bonus_note'], 1);
tr($lang_userdetails['row_vip_until'], " ".$lang_userdetails['text_vip_until_note'], 1);
$supportlang = htmlspecialchars($user["supportlang"]);
@@ -610,7 +612,7 @@ JS;
print("\n");
print("\n");
end_frame();
- if (user_can('cruprfmanage'))
+ if (user_can('user-delete'))
{
begin_frame($lang_userdetails['text_delete_user'], true);
print("