aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFerdinand Thiessen <opensource@fthiessen.de>2024-10-07 17:31:39 +0200
committerFerdinand Thiessen <opensource@fthiessen.de>2024-10-07 17:31:39 +0200
commitbf63db1e8bddb8d23c3e480f4e955c5a4ffa6cad (patch)
tree4c4e99f34f70dbfc594ef3fbfba96df6d73decd4
parent4bcbe8a894218f99a3b4426d36577928cdeea8cd (diff)
downloadnextcloud-server-refactor/zip-event.tar.gz
nextcloud-server-refactor/zip-event.zip
refactor(files_sharing): Handle access to shares using the direct download endpointrefactor/zip-event
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
-rw-r--r--apps/files_sharing/lib/Listener/BeforeDirectFileDownloadListener.php16
1 files changed, 16 insertions, 0 deletions
diff --git a/apps/files_sharing/lib/Listener/BeforeDirectFileDownloadListener.php b/apps/files_sharing/lib/Listener/BeforeDirectFileDownloadListener.php
index 717edd4869e..4b79c5b59c1 100644
--- a/apps/files_sharing/lib/Listener/BeforeDirectFileDownloadListener.php
+++ b/apps/files_sharing/lib/Listener/BeforeDirectFileDownloadListener.php
@@ -9,11 +9,13 @@ declare(strict_types=1);
namespace OCA\Files_Sharing\Listener;
+use OCA\Files_Sharing\Services\ShareAccessService;
use OCA\Files_Sharing\ViewOnly;
use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventListener;
use OCP\Files\Events\BeforeDirectFileDownloadEvent;
use OCP\Files\IRootFolder;
+use OCP\Files\Storage\ISharedStorage;
use OCP\IUserSession;
/**
@@ -24,6 +26,7 @@ class BeforeDirectFileDownloadListener implements IEventListener {
public function __construct(
private IUserSession $userSession,
private IRootFolder $rootFolder,
+ private ShareAccessService $accessService,
) {
}
@@ -42,6 +45,19 @@ class BeforeDirectFileDownloadListener implements IEventListener {
if (!$viewOnlyHandler->check($pathsToCheck)) {
$event->setSuccessful(false);
$event->setErrorMessage('Access to this resource or one of its sub-items has been denied.');
+ return;
+ }
+ }
+
+ $node = $event->getNode();
+ if ($node !== null) {
+ $storage = $node->getStorage();
+ if ($storage->instanceOfStorage(ISharedStorage::class)) {
+ /** @var ISharedStorage $storage */
+ $share = $storage->getShare();
+ $this->accessService->shareDownloaded($share);
+ // All we now need to do is log the download
+ $this->accessService->sharedFileDownloaded($share, $node);
}
}
}