*/ class BeforeZipCreatedListener implements IEventListener { public function __construct( private IUserSession $userSession, private IRootFolder $rootFolder, ) { } public function handle(Event $event): void { if (!($event instanceof BeforeZipCreatedEvent)) { return; } /** @psalm-suppress DeprecatedMethod should be migrated to getFolder but for now it would just duplicate code */ $dir = $event->getDirectory(); $files = $event->getFiles(); if (empty($files)) { $pathsToCheck = [$dir]; } else { $pathsToCheck = []; foreach ($files as $file) { $pathsToCheck[] = $dir . '/' . $file; } } // Check only for user/group shares. Don't restrict e.g. share links $user = $this->userSession->getUser(); if ($user) { $viewOnlyHandler = new ViewOnly( $this->rootFolder->getUserFolder($user->getUID()) ); if (!$viewOnlyHandler->check($pathsToCheck)) { $event->setErrorMessage('Access to this resource or one of its sub-items has been denied.'); $event->setSuccessful(false); } else { $event->setSuccessful(true); } } else { $event->setSuccessful(true); } } }