Skip to content

Commit e91aae1

Browse files
committed
fix: Fix Encryption wrapper not seen by group folder cache
Jail wrappers reuse the cache of the wrapped storage even if another storage is explicitly given. Due to that, when the cache is got from an storage and that storage has a Jail all the wrappers above it are not known to the cache, and only those wrapped by the Jail are taken into account. In general that works fine, as in most cases the cache does not need to know the details of a storage. However, it needs to know if an Encryption wrapper is present in the storage when moving files into it, as the file cache explicitly clears the "encrypted" flag when moving a file from an encrypted storage to a non encrypted storage. As the Encryption wrapper of groupfolders was not known to the cache all files moved from an encrypted storage to an encrypted groupfolder ended wrongly marked as not encrypted. To solve that now the Jail used by groupfolders does not reuse the inner cache when encryption is enabled, and instead passes the given storage. This is applied only when encryption is enabled, as reusing the inner cache was done as a performance optimization. Signed-off-by: Daniel CalviΓ±o SΓ‘nchez <[email protected]>
1 parent 06b83d6 commit e91aae1

File tree

2 files changed

+52
-4
lines changed

2 files changed

+52
-4
lines changed
+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
/**
5+
* @copyright Copyright (c) 2024 Daniel CalviΓ±o SΓ‘nchez <[email protected]>
6+
*
7+
* @license GNU AGPL version 3 or any later version
8+
*
9+
* This program is free software: you can redistribute it and/or modify
10+
* it under the terms of the GNU Affero General Public License as
11+
* published by the Free Software Foundation, either version 3 of the
12+
* License, or (at your option) any later version.
13+
*
14+
* This program is distributed in the hope that it will be useful,
15+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17+
* GNU Affero General Public License for more details.
18+
*
19+
* You should have received a copy of the GNU Affero General Public License
20+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
21+
*
22+
*/
23+
24+
namespace OCA\GroupFolders\Mount;
25+
26+
use OC\Files\Cache\Wrapper\CacheJail;
27+
use OC\Files\Storage\Wrapper\Jail;
28+
29+
/**
30+
* Jail with overridden behaviors specific to group folders when encryption is
31+
* enabled.
32+
*/
33+
class GroupFolderEncryptionJail extends Jail {
34+
public function getCache($path = '', $storage = null) {
35+
if (!$storage) {
36+
$storage = $this->getWrapperStorage();
37+
}
38+
// By default the Jail reuses the inner cache, but when encryption is
39+
// enabled the storage needs to be passed to the cache so it takes into
40+
// account the outer Encryption wrapper.
41+
$sourceCache = $this->getWrapperStorage()->getCache($this->getUnjailedPath($path), $storage);
42+
return new CacheJail($sourceCache, $this->rootPath);
43+
}
44+
}

β€Žlib/Mount/MountProvider.php

+8-4
Original file line numberDiff line numberDiff line change
@@ -230,11 +230,11 @@ public function getMount(
230230
$cacheEntry['permissions'] &= $aclRootPermissions;
231231
}
232232

233-
$baseStorage = new Jail([
234-
'storage' => $storage,
235-
'root' => $rootPath
236-
]);
237233
if ($this->enableEncryption) {
234+
$baseStorage = new GroupFolderEncryptionJail([
235+
'storage' => $storage,
236+
'root' => $rootPath
237+
]);
238238
$quotaStorage = new GroupFolderStorage([
239239
'storage' => $baseStorage,
240240
'quota' => $quota,
@@ -244,6 +244,10 @@ public function getMount(
244244
'mountOwner' => $user,
245245
]);
246246
} else {
247+
$baseStorage = new Jail([
248+
'storage' => $storage,
249+
'root' => $rootPath
250+
]);
247251
$quotaStorage = new GroupFolderNoEncryptionStorage([
248252
'storage' => $baseStorage,
249253
'quota' => $quota,

0 commit comments

Comments
Β (0)