diff --git a/src/bundle/DependencyInjection/IbexaMessengerExtension.php b/src/bundle/DependencyInjection/IbexaMessengerExtension.php index edc738d..1a5d296 100644 --- a/src/bundle/DependencyInjection/IbexaMessengerExtension.php +++ b/src/bundle/DependencyInjection/IbexaMessengerExtension.php @@ -10,6 +10,7 @@ use Ibexa\Bundle\Messenger\Middleware\DeduplicateMiddleware; use Ibexa\Bundle\Messenger\Middleware\SudoMiddleware; +use Ibexa\Bundle\Messenger\Middleware\UserPermissionMiddleware; use Ibexa\Bundle\Messenger\Serializer\Normalizer\LockKeyNormalizer; use Ibexa\Contracts\Messenger\Transport\MessageProviderInterface; use LogicException; @@ -121,6 +122,7 @@ private function registerMessengerConfiguration( $middleware = [ ['id' => SudoMiddleware::class], + ['id' => UserPermissionMiddleware::class], ]; if ($mergedConfig['deduplication_lock_storage']['enabled'] === true) { diff --git a/src/bundle/Middleware/SudoMiddleware.php b/src/bundle/Middleware/SudoMiddleware.php index f9a45e3..d8afc38 100644 --- a/src/bundle/Middleware/SudoMiddleware.php +++ b/src/bundle/Middleware/SudoMiddleware.php @@ -28,6 +28,14 @@ public function handle(Envelope $envelope, StackInterface $stack): Envelope { $stamp = $envelope->last(SudoStamp::class); if ($stamp === null) { + // todo add this deprecation in 5.0.x release + trigger_deprecation( + 'ibexa/messenger', + '5.0.x', + 'Since 6.0.0, %s will not be attached automatically to all messages. You will need to add the stamp explicitly when dispatching the message.', + SudoStamp::class, + ); + $envelope = $envelope->with(new SudoStamp()); $envelope = $this->repository->sudo( diff --git a/src/bundle/Middleware/UserPermissionMiddleware.php b/src/bundle/Middleware/UserPermissionMiddleware.php new file mode 100644 index 0000000..a9bab93 --- /dev/null +++ b/src/bundle/Middleware/UserPermissionMiddleware.php @@ -0,0 +1,43 @@ +last(UserPermissionStamp::class); + if ($stamp === null) { + return $stack->next()->handle($envelope, $stack); + } + + $previousUserReference = $this->permissionResolver->getCurrentUserReference(); + $this->permissionResolver->setCurrentUserReference( + new UserReference($stamp->userId) + ); + + try { + return $stack->next()->handle($envelope, $stack); + } finally { + $this->permissionResolver->setCurrentUserReference($previousUserReference); + } + } +} diff --git a/src/bundle/Resources/config/services/buses.yaml b/src/bundle/Resources/config/services/buses.yaml index e001225..ab98996 100644 --- a/src/bundle/Resources/config/services/buses.yaml +++ b/src/bundle/Resources/config/services/buses.yaml @@ -25,6 +25,8 @@ services: Ibexa\Bundle\Messenger\Middleware\SudoMiddleware: ~ + Ibexa\Bundle\Messenger\Middleware\UserPermissionMiddleware: ~ + Ibexa\Bundle\Messenger\Middleware\DeduplicateMiddleware: arguments: - '@ibexa.messenger.lock_factory' diff --git a/src/bundle/Stamp/UserPermissionStamp.php b/src/bundle/Stamp/UserPermissionStamp.php new file mode 100644 index 0000000..e0c9036 --- /dev/null +++ b/src/bundle/Stamp/UserPermissionStamp.php @@ -0,0 +1,19 @@ +