diff --git a/extend.php b/extend.php index eba4ede..e8fa9d1 100644 --- a/extend.php +++ b/extend.php @@ -39,14 +39,17 @@ ->type(UserSuspendedBlueprint::class, BasicUserSerializer::class, ['alert', 'email']) ->type(UserUnsuspendedBlueprint::class, BasicUserSerializer::class, ['alert', 'email']), - function (Dispatcher $events) { - $events->subscribe(Listener\AddUserSuspendAttributes::class); - $events->subscribe(Listener\RevokeAccessFromSuspendedUsers::class); + (new Extend\Event()) + ->listen(Saving::class, Listener\SaveSuspensionToDatabase::class) + ->listen(Saving::class, Listener\PreventAttributesMutations::class) + ->listen(Suspended::class, Listener\SendNotificationWhenUserIsSuspended::class) + ->listen(Unsuspended::class, Listener\SendNotificationWhenUserIsUnsuspended::class), - $events->listen(Saving::class, Listener\SaveSuspensionToDatabase::class); + (new Extend\User) + ->permissionGroups(Listener\RevokeAccessFromSuspendedUsers::class), - $events->listen(Suspended::class, Listener\SendNotificationWhenUserIsSuspended::class); - $events->listen(Unsuspended::class, Listener\SendNotificationWhenUserIsUnsuspended::class); + function (Dispatcher $events) { + $events->subscribe(Listener\AddUserSuspendAttributes::class); $events->subscribe(Access\UserPolicy::class); diff --git a/src/Listener/PreventAttributesMutations.php b/src/Listener/PreventAttributesMutations.php new file mode 100644 index 0000000..249f59a --- /dev/null +++ b/src/Listener/PreventAttributesMutations.php @@ -0,0 +1,27 @@ +user->suspended_until) { + return; + } + + if ($event->user->id === $event->actor->id) { + throw new PermissionDeniedException; + } + } +} diff --git a/src/Listener/RevokeAccessFromSuspendedUsers.php b/src/Listener/RevokeAccessFromSuspendedUsers.php index a8a2b30..53fc3b0 100755 --- a/src/Listener/RevokeAccessFromSuspendedUsers.php +++ b/src/Listener/RevokeAccessFromSuspendedUsers.php @@ -10,29 +10,17 @@ namespace Flarum\Suspend\Listener; use Carbon\Carbon; -use Flarum\Event\PrepareUserGroups; use Flarum\Group\Group; -use Illuminate\Contracts\Events\Dispatcher; +use Flarum\User\User; class RevokeAccessFromSuspendedUsers { - /** - * @param Dispatcher $events - */ - public function subscribe(Dispatcher $events) + public function __invoke(User $user, array $groupIds) { - $events->listen(PrepareUserGroups::class, [$this, 'prepareUserGroups']); - } - - /** - * @param PrepareUserGroups $event - */ - public function prepareUserGroups(PrepareUserGroups $event) - { - $suspendedUntil = $event->user->suspended_until; + $suspendedUntil = $user->suspended_until; if ($suspendedUntil && $suspendedUntil->gt(Carbon::now())) { - $event->groupIds = [Group::GUEST_ID]; + return [Group::GUEST_ID]; } } }