From 7f066931e44e7221e3e4e3685e59fff63a91e596 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 16 Mar 2021 15:34:41 +0100 Subject: [PATCH] add (hidden) option to always show smb root as writable some smb servers are very insistent in reporting that the root of the share is readonly, even if it isn't. This works around the problem by adding a hidden option to overwrite the permissions of the root of the share. This can be enabled using ```bash occ files_external:config root_force_writable true ``` where you can find your mount id using ```bash occ files_external:list ``` Signed-off-by: Robin Appelman --- apps/files_external/lib/Lib/Storage/SMB.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/apps/files_external/lib/Lib/Storage/SMB.php b/apps/files_external/lib/Lib/Storage/SMB.php index bc065b2455..45a01db76b 100644 --- a/apps/files_external/lib/Lib/Storage/SMB.php +++ b/apps/files_external/lib/Lib/Storage/SMB.php @@ -97,6 +97,9 @@ class SMB extends Common implements INotifyStorage { /** @var bool */ protected $checkAcl; + /** @var bool */ + protected $rootWritable; + public function __construct($params) { if (!isset($params['host'])) { throw new \Exception('Invalid configuration, no host provided'); @@ -134,6 +137,7 @@ class SMB extends Common implements INotifyStorage { $this->showHidden = isset($params['show_hidden']) && $params['show_hidden']; $this->checkAcl = isset($params['check_acl']) && $params['check_acl']; + $this->rootWritable = isset($params['root_force_writable']) && $params['root_force_writable']; $this->statCache = new CappedMemoryCache(); parent::__construct($params); @@ -573,7 +577,11 @@ class SMB extends Common implements INotifyStorage { private function getMetaDataFromFileInfo(IFileInfo $fileInfo) { $permissions = Constants::PERMISSION_READ + Constants::PERMISSION_SHARE; - if (!$fileInfo->isReadOnly()) { + if ( + !$fileInfo->isReadOnly() || ( + $this->rootWritable && $fileInfo->getPath() == $this->buildPath('') + ) + ) { $permissions += Constants::PERMISSION_DELETE; $permissions += Constants::PERMISSION_UPDATE; if ($fileInfo->isDirectory()) {