From c08e803db305edb06bf6a0857a37689bcc19e613 Mon Sep 17 00:00:00 2001 From: Roeland Jago Douma Date: Tue, 5 Nov 2019 19:19:16 +0100 Subject: [PATCH] Catch forbidden http status code If you try to do something on a DAV mount (external or federated share) that is not allowed. We should not mark the storage as not available but just fail somewhat gracefully. Now by catching this and just properly returning the operation will just fail (and notify the user) which is already a lot better then marking the storage as unavailable and doing boom. Signed-off-by: Roeland Jago Douma --- lib/private/Files/Storage/DAV.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/private/Files/Storage/DAV.php b/lib/private/Files/Storage/DAV.php index c4ebb0a44d..2367c1aab3 100644 --- a/lib/private/Files/Storage/DAV.php +++ b/lib/private/Files/Storage/DAV.php @@ -35,6 +35,7 @@ namespace OC\Files\Storage; use Exception; use GuzzleHttp\Exception\RequestException; +use OCP\Files\ForbiddenException; use OCP\ILogger; use Psr\Http\Message\ResponseInterface; use Icewind\Streams\CallbackWrapper; @@ -829,6 +830,7 @@ class DAV extends Common { * when the authentication expired or is invalid * @throws StorageNotAvailableException if the storage is not available, * which might be temporary + * @throws ForbiddenException if the action is not allowed */ protected function convertException(Exception $e, $path = '') { \OC::$server->getLogger()->logException($e, ['app' => 'files_external', 'level' => ILogger::DEBUG]); @@ -842,6 +844,9 @@ class DAV extends Common { } else if ($e->getHttpStatus() === Http::STATUS_METHOD_NOT_ALLOWED) { // ignore exception for MethodNotAllowed, false will be returned return; + } else if ($e->getHttpStatus() === Http::STATUS_FORBIDDEN){ + // The operation is forbidden. Fail somewhat gracefully + throw new ForbiddenException(get_class($e) . ':' . $e->getMessage()); } throw new StorageNotAvailableException(get_class($e) . ': ' . $e->getMessage()); } else if ($e instanceof ClientException) {