fix: create mountpoint folder even if the user has a quota of 0

Signed-off-by: Robin Appelman <robin@icewind.nl>
pull/52769/head
Robin Appelman 2025-05-06 15:48:29 +07:00
parent 61182a1d2c
commit 54338f6d72
2 changed files with 19 additions and 0 deletions

@ -21,6 +21,7 @@ class Quota extends Wrapper {
protected string $sizeRoot;
private SystemConfig $config;
private bool $quotaIncludeExternalStorage;
private bool $enabled = true;
/**
* @param array $parameters
@ -46,6 +47,9 @@ class Quota extends Wrapper {
}
private function hasQuota(): bool {
if (!$this->enabled) {
return false;
}
return $this->getQuota() !== FileInfo::SPACE_UNLIMITED;
}
@ -197,4 +201,8 @@ class Quota extends Wrapper {
return parent::touch($path, $mtime);
}
public function enableQuota(bool $enabled): void {
$this->enabled = $enabled;
}
}

@ -10,6 +10,7 @@ namespace OC\Files;
use Icewind\Streams\CallbackWrapper;
use OC\Files\Mount\MoveableMount;
use OC\Files\Storage\Storage;
use OC\Files\Storage\Wrapper\Quota;
use OC\Share\Share;
use OC\User\LazyUser;
use OC\User\Manager as UserManager;
@ -1579,12 +1580,22 @@ class View {
// Create parent folders if the mountpoint is inside a subfolder that doesn't exist yet
if (!isset($files[$entryName])) {
try {
[$storage, ] = $this->resolvePath($path . '/' . $entryName);
// make sure we can create the mountpoint folder, even if the user has a quota of 0
if ($storage->instanceOfStorage(Quota::class)) {
$storage->enableQuota(false);
}
if ($this->mkdir($path . '/' . $entryName) !== false) {
$info = $this->getFileInfo($path . '/' . $entryName);
if ($info !== false) {
$files[$entryName] = $info;
}
}
if ($storage->instanceOfStorage(Quota::class)) {
$storage->enableQuota(true);
}
} catch (\Exception $e) {
// Creating the parent folder might not be possible, for example due to a lack of permissions.
$this->logger->debug('Failed to create non-existent parent', ['exception' => $e, 'path' => $path . '/' . $entryName]);