Skip to content

Commit d90be1a

Browse files
committed
fixup! feat: improve ZipFolderPlugin behaviour for different cases
Signed-off-by: Salvatore Martire <4652631+salmart-dev@users.noreply.github.com>
1 parent 1aeb4b0 commit d90be1a

2 files changed

Lines changed: 35 additions & 16 deletions

File tree

apps/files_sharing/lib/Listener/BeforeDirectFileDownloadListener.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ public function handle(Event $event): void {
3737
// Check only for user/group shares. Don't restrict e.g. share links
3838
if (!$user) {
3939
return;
40-
4140
}
41+
4242
$userFolder = $this->rootFolder->getUserFolder($user->getUID());
4343
$node = $userFolder->get($event->getPath());
4444
if (!$this->viewOnly->isDownloadable($node)) {

apps/files_sharing/lib/Listener/BeforeZipCreatedListener.php

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,18 @@
99

1010
namespace OCA\Files_Sharing\Listener;
1111

12+
use OC\User\NoUserException;
13+
use OCA\DAV\Connector\Sabre\Directory;
1214
use OCA\Files_Sharing\ViewOnly;
1315
use OCP\EventDispatcher\Event;
1416
use OCP\EventDispatcher\IEventListener;
1517
use OCP\Files\Events\BeforeZipCreatedEvent;
18+
use OCP\Files\Folder;
1619
use OCP\Files\IRootFolder;
1720
use OCP\Files\Node;
21+
use OCP\Files\NotFoundException;
22+
use OCP\Files\NotPermittedException;
23+
use OCP\IUser;
1824
use OCP\IUserSession;
1925

2026
/**
@@ -46,24 +52,15 @@ public function handle(Event $event): void {
4652
}
4753
}
4854

49-
// Check only for user/group shares. Don't restrict e.g. share links
5055
$user = $this->userSession->getUser();
51-
if (!$user) {
52-
$folder = $event->getFolder();
53-
// there is no session, allow downloads only if the owner of the share has permissions!
54-
$user = $folder?->getOwner();
55-
if (!$user) {
56-
// block download as there is no way to determine whether the files should be publicly downloadable or not
57-
$event->setSuccessful(false);
58-
return;
59-
}
56+
$folder = $this->getFolderOrFallback($user, $event);
57+
if ($folder === null) {
58+
// folder is not a directory
59+
return;
6060
}
6161

62-
$userFolder = $this->rootFolder->getUserFolder($user->getUID());
63-
$viewOnlyHandler = new ViewOnly($userFolder);
64-
65-
$node = $userFolder->get($dir);
66-
$isRootDownloadable = $viewOnlyHandler->isDownloadable($node);
62+
$viewOnlyHandler = new ViewOnly($folder);
63+
$isRootDownloadable = $viewOnlyHandler->isDownloadable($folder);
6764

6865
if (!$isRootDownloadable) {
6966
$message = $event->allowPartialArchive ? 'Access to this resource and its children has been denied.' : 'Access to this resource or one of its sub-items has been denied.';
@@ -86,4 +83,26 @@ public function handle(Event $event): void {
8683
$event->setSuccessful(false);
8784
}
8885
}
86+
87+
/**
88+
* Gets the folder containing the files to be downloaded from the POV of the
89+
* logged-in user, or if no logged-in user is present (e.g. link shares),
90+
* from the POV of the owner of the folder.
91+
*
92+
* @return ?Folder A Folder or null if the Node is a File.
93+
* @throws NotFoundException
94+
* @throws NotPermittedException
95+
* @throws NoUserException
96+
*/
97+
private function getFolderOrFallback(?IUser $user, BeforeZipCreatedEvent $event): ?Folder {
98+
// if no user (in public links for example), use the owner's POV to determine if files should be downloadable
99+
$folder = $user ? $this->rootFolder->getUserFolder($user->getUID()) : $event->getFolder();
100+
if ($folder !== null) {
101+
return $folder instanceof Folder ? $folder : null;
102+
}
103+
104+
$folder = $this->rootFolder->get($event->getDirectory());
105+
106+
return $folder instanceof Folder ? $folder : null;
107+
}
89108
}

0 commit comments

Comments
 (0)