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
34 changes: 33 additions & 1 deletion apps/dav/lib/Connector/Sabre/QuotaPlugin.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,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 @@ -55,6 +57,7 @@ public function initialize(\Sabre\DAV\Server $server) {

$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 @@ -88,6 +91,31 @@ public function beforeCreateFile($uri, $data, INode $parent, $modified) {
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 @@ -174,7 +202,7 @@ private function getPathForDestination(string $destinationPath): string {
* @throws InsufficientStorage
* @return bool
*/
public function checkQuota(string $path, $length = null) {
public function checkQuota(string $path, $length = null, $isDir = false) {
if ($length === null) {
$length = $this->getLength();
}
Expand All @@ -191,6 +219,10 @@ public function checkQuota(string $path, $length = null) {

$freeSpace = $this->getFreeSpace($path);
if ($freeSpace >= 0 && $length > $freeSpace) {
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