Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 32 additions & 1 deletion apps/dav/lib/Connector/Sabre/QuotaPlugin.php
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@
use Sabre\DAV\Exception\InsufficientStorage;
use Sabre\DAV\Exception\ServiceUnavailable;
use Sabre\DAV\INode;
use Sabre\HTTP\RequestInterface;
use Sabre\HTTP\ResponseInterface;

/**
* This plugin check user quota and deny creating files when they exceeds the quota.
Expand Down Expand Up @@ -78,6 +80,7 @@

$server->on('beforeWriteContent', [$this, 'beforeWriteContent'], 10);
$server->on('beforeCreateFile', [$this, 'beforeCreateFile'], 10);
$server->on('method:MKCOL', [$this, 'onCreateCollection'], 30);
$server->on('beforeMove', [$this, 'beforeMove'], 10);
$server->on('beforeCopy', [$this, 'beforeCopy'], 10);
}
Expand Down Expand Up @@ -111,6 +114,31 @@
return $this->checkQuota($parent->getPath() . '/' . basename($uri));
}

/**
* Check quota before creating directory
*
* @param RequestInterface $request
* @param ResponseInterface $response
* @return bool
* @throws InsufficientStorage
* @throws \Sabre\DAV\Exception\Forbidden
*/
public function onCreateCollection(RequestInterface $request, ResponseInterface $response): bool {
try {
$destinationPath = $this->server->calculateUri($request->getUrl());
$quotaPath = $this->getPathForDestination($destinationPath);
} catch (\Exception $e) {
return true;
}
if ($quotaPath) {
// MKCOL does not have a Content-Length header, so we can use
// a fixed value for the quota check.
return $this->checkQuota($quotaPath, 4096, true);
}

return true;
}

/**
* Check quota before writing content
*
Expand Down Expand Up @@ -197,7 +225,7 @@
* @throws InsufficientStorage
* @return bool
*/
public function checkQuota(string $path, $length = null) {
public function checkQuota(string $path, $length = null, $isDir = false) {

Check notice

Code scanning / Psalm

MissingParamType Note

Parameter $isDir has no provided type
if ($length === null) {
$length = $this->getLength();
}
Expand Down Expand Up @@ -229,6 +257,9 @@
if (isset($chunkHandler)) {
$chunkHandler->cleanup();
}
if ($isDir) {
throw new InsufficientStorage("Insufficient space in $path. $freeSpace available. Cannot create directory");
}
throw new InsufficientStorage("Insufficient space in $path, $length required, $freeSpace available");
}
}
Expand Down
Loading