From e9ae943bbaeda07724dd52cb238caad015504a6f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Julius=20H=C3=A4rtl?= <jus@bitgrid.net>
Date: Fri, 29 Jan 2021 11:26:19 +0100
Subject: [PATCH] Properly handle SMB ACL blocking scanning a directory
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

This makes sure that a possible ForbiddenException is properly passed
through the storage as a ForbiddenException and can be catched when
trying to fetch the quota info of a parent folder

Signed-off-by: Julius Härtl <jus@bitgrid.net>
---
 apps/dav/lib/Connector/Sabre/Directory.php  | 3 +++
 apps/files_external/lib/Lib/Storage/SMB.php | 9 +++++++--
 2 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/apps/dav/lib/Connector/Sabre/Directory.php b/apps/dav/lib/Connector/Sabre/Directory.php
index 990e57eea58..98705c57792 100644
--- a/apps/dav/lib/Connector/Sabre/Directory.php
+++ b/apps/dav/lib/Connector/Sabre/Directory.php
@@ -41,6 +41,7 @@ use OCA\DAV\Connector\Sabre\Exception\InvalidPath;
 use OCP\Files\FileInfo;
 use OCP\Files\ForbiddenException;
 use OCP\Files\InvalidPathException;
+use OCP\Files\NotPermittedException;
 use OCP\Files\StorageNotAvailableException;
 use OCP\Lock\ILockingProvider;
 use OCP\Lock\LockedException;
@@ -343,6 +344,8 @@ class Directory extends \OCA\DAV\Connector\Sabre\Node implements \Sabre\DAV\ICol
 			return [0, 0];
 		} catch (\OCP\Files\StorageNotAvailableException $e) {
 			return [0, 0];
+		} catch (NotPermittedException $e) {
+			return [0, 0];
 		}
 	}
 
diff --git a/apps/files_external/lib/Lib/Storage/SMB.php b/apps/files_external/lib/Lib/Storage/SMB.php
index 0f67877d148..952f6c08931 100644
--- a/apps/files_external/lib/Lib/Storage/SMB.php
+++ b/apps/files_external/lib/Lib/Storage/SMB.php
@@ -61,6 +61,7 @@ use OCP\Constants;
 use OCP\Files\EntityTooLargeException;
 use OCP\Files\Notify\IChange;
 use OCP\Files\Notify\IRenameChange;
+use OCP\Files\NotPermittedException;
 use OCP\Files\Storage\INotifyStorage;
 use OCP\Files\StorageAuthException;
 use OCP\Files\StorageNotAvailableException;
@@ -235,7 +236,11 @@ class SMB extends Common implements INotifyStorage {
 	protected function getFolderContents($path): iterable {
 		try {
 			$path = ltrim($this->buildPath($path), '/');
-			$files = $this->share->dir($path);
+			try {
+				$files = $this->share->dir($path);
+			} catch (ForbiddenException $e) {
+				throw new NotPermittedException();
+			}
 			foreach ($files as $file) {
 				$this->statCache[$path . '/' . $file->getName()] = $file;
 			}
@@ -595,7 +600,7 @@ class SMB extends Common implements INotifyStorage {
 			$files = $this->getFolderContents($path);
 		} catch (NotFoundException $e) {
 			return false;
-		} catch (ForbiddenException $e) {
+		} catch (NotPermittedException $e) {
 			return false;
 		}
 		$names = array_map(function ($info) {
-- 
GitLab