aboutsummaryrefslogtreecommitdiffstats
path: root/lib/private/Files
diff options
context:
space:
mode:
Diffstat (limited to 'lib/private/Files')
-rw-r--r--lib/private/Files/Cache/Cache.php15
-rw-r--r--lib/private/Files/Cache/HomeCache.php2
-rw-r--r--lib/private/Files/Cache/Scanner.php2
-rw-r--r--lib/private/Files/Cache/Wrapper/CacheJail.php2
-rw-r--r--lib/private/Files/Cache/Wrapper/CacheWrapper.php2
-rw-r--r--lib/private/Files/Node/LazyFolder.php7
-rw-r--r--lib/private/Files/Node/LazyUserFolder.php17
-rw-r--r--lib/private/Files/ObjectStore/ObjectStoreStorage.php24
-rw-r--r--lib/private/Files/Storage/DAV.php5
-rw-r--r--lib/private/Files/Storage/Local.php7
-rw-r--r--lib/private/Files/Type/Loader.php26
11 files changed, 65 insertions, 44 deletions
diff --git a/lib/private/Files/Cache/Cache.php b/lib/private/Files/Cache/Cache.php
index f085f8ade5e..5af15700764 100644
--- a/lib/private/Files/Cache/Cache.php
+++ b/lib/private/Files/Cache/Cache.php
@@ -60,6 +60,7 @@ use OCP\Files\Search\ISearchOperator;
use OCP\Files\Search\ISearchQuery;
use OCP\Files\Storage\IStorage;
use OCP\IDBConnection;
+use OCP\Util;
use Psr\Log\LoggerInterface;
/**
@@ -191,8 +192,8 @@ class Cache implements ICache {
$data['path'] = (string)$data['path'];
$data['fileid'] = (int)$data['fileid'];
$data['parent'] = (int)$data['parent'];
- $data['size'] = 0 + $data['size'];
- $data['unencrypted_size'] = 0 + ($data['unencrypted_size'] ?? 0);
+ $data['size'] = Util::numericToNumber($data['size']);
+ $data['unencrypted_size'] = Util::numericToNumber($data['unencrypted_size'] ?? 0);
$data['mtime'] = (int)$data['mtime'];
$data['storage_mtime'] = (int)$data['storage_mtime'];
$data['encryptedVersion'] = (int)$data['encrypted'];
@@ -900,7 +901,7 @@ class Cache implements ICache {
*
* @param string $path
* @param array|null|ICacheEntry $entry (optional) meta data of the folder
- * @return int
+ * @return int|float
*/
public function calculateFolderSize($path, $entry = null) {
return $this->calculateFolderSizeInner($path, $entry);
@@ -913,7 +914,7 @@ class Cache implements ICache {
* @param string $path
* @param array|null|ICacheEntry $entry (optional) meta data of the folder
* @param bool $ignoreUnknown don't mark the folder size as unknown if any of it's children are unknown
- * @return int
+ * @return int|float
*/
protected function calculateFolderSizeInner(string $path, $entry = null, bool $ignoreUnknown = false) {
$totalSize = 0;
@@ -937,13 +938,13 @@ class Cache implements ICache {
if ($rows) {
$sizes = array_map(function (array $row) {
- return (int)$row['size'];
+ return Util::numericToNumber($row['size']);
}, $rows);
$unencryptedOnlySizes = array_map(function (array $row) {
- return (int)$row['unencrypted_size'];
+ return Util::numericToNumber($row['unencrypted_size']);
}, $rows);
$unencryptedSizes = array_map(function (array $row) {
- return (int)(($row['unencrypted_size'] > 0) ? $row['unencrypted_size'] : $row['size']);
+ return Util::numericToNumber(($row['unencrypted_size'] > 0) ? $row['unencrypted_size'] : $row['size']);
}, $rows);
$sum = array_sum($sizes);
diff --git a/lib/private/Files/Cache/HomeCache.php b/lib/private/Files/Cache/HomeCache.php
index 9dbbb46c57b..83e5cb89b8a 100644
--- a/lib/private/Files/Cache/HomeCache.php
+++ b/lib/private/Files/Cache/HomeCache.php
@@ -36,7 +36,7 @@ class HomeCache extends Cache {
*
* @param string $path
* @param array|null|ICacheEntry $entry (optional) meta data of the folder
- * @return int
+ * @return int|float
*/
public function calculateFolderSize($path, $entry = null) {
if ($path !== '/' and $path !== '' and $path !== 'files' and $path !== 'files_trashbin' and $path !== 'files_versions') {
diff --git a/lib/private/Files/Cache/Scanner.php b/lib/private/Files/Cache/Scanner.php
index a34f1db3195..edf9b5697e7 100644
--- a/lib/private/Files/Cache/Scanner.php
+++ b/lib/private/Files/Cache/Scanner.php
@@ -386,7 +386,7 @@ class Scanner extends BasicEmitter implements IScanner {
* @param int $folderId id for the folder to be scanned
* @param bool $lock set to false to disable getting an additional read lock during scanning
* @param array $data the data of the folder before (re)scanning the children
- * @return int the size of the scanned folder or -1 if the size is unknown at this stage
+ * @return int|float the size of the scanned folder or -1 if the size is unknown at this stage
*/
protected function scanChildren($path, $recursive = self::SCAN_RECURSIVE, $reuse = -1, $folderId = null, $lock = true, array $data = []) {
if ($reuse === -1) {
diff --git a/lib/private/Files/Cache/Wrapper/CacheJail.php b/lib/private/Files/Cache/Wrapper/CacheJail.php
index 2885a8bf5e0..d8cf3eb61d7 100644
--- a/lib/private/Files/Cache/Wrapper/CacheJail.php
+++ b/lib/private/Files/Cache/Wrapper/CacheJail.php
@@ -240,7 +240,7 @@ class CacheJail extends CacheWrapper {
*
* @param string $path
* @param array|null|ICacheEntry $entry (optional) meta data of the folder
- * @return int
+ * @return int|float
*/
public function calculateFolderSize($path, $entry = null) {
if ($this->getCache() instanceof Cache) {
diff --git a/lib/private/Files/Cache/Wrapper/CacheWrapper.php b/lib/private/Files/Cache/Wrapper/CacheWrapper.php
index c1043fbc6fb..6479ea793b0 100644
--- a/lib/private/Files/Cache/Wrapper/CacheWrapper.php
+++ b/lib/private/Files/Cache/Wrapper/CacheWrapper.php
@@ -250,7 +250,7 @@ class CacheWrapper extends Cache {
*
* @param string $path
* @param array|null|ICacheEntry $entry (optional) meta data of the folder
- * @return int
+ * @return int|float
*/
public function calculateFolderSize($path, $entry = null) {
if ($this->getCache() instanceof Cache) {
diff --git a/lib/private/Files/Node/LazyFolder.php b/lib/private/Files/Node/LazyFolder.php
index cc1f64889a1..c843baabade 100644
--- a/lib/private/Files/Node/LazyFolder.php
+++ b/lib/private/Files/Node/LazyFolder.php
@@ -27,6 +27,7 @@ declare(strict_types=1);
namespace OC\Files\Node;
use OC\Files\Utils\PathHelper;
+use OCP\Files\Folder;
use OCP\Constants;
/**
@@ -37,8 +38,8 @@ use OCP\Constants;
*
* @package OC\Files\Node
*/
-class LazyFolder implements \OCP\Files\Folder {
- /** @var \Closure */
+class LazyFolder implements Folder {
+ /** @var \Closure(): Folder */
private $folderClosure;
/** @var LazyFolder | null */
@@ -49,7 +50,7 @@ class LazyFolder implements \OCP\Files\Folder {
/**
* LazyFolder constructor.
*
- * @param \Closure $folderClosure
+ * @param \Closure(): Folder $folderClosure
*/
public function __construct(\Closure $folderClosure, array $data = []) {
$this->folderClosure = $folderClosure;
diff --git a/lib/private/Files/Node/LazyUserFolder.php b/lib/private/Files/Node/LazyUserFolder.php
index 81009532dbf..8fbdec4b49d 100644
--- a/lib/private/Files/Node/LazyUserFolder.php
+++ b/lib/private/Files/Node/LazyUserFolder.php
@@ -28,7 +28,10 @@ use OCP\Constants;
use OCP\Files\IRootFolder;
use OCP\Files\Mount\IMountManager;
use OCP\Files\NotFoundException;
+use OCP\Files\Folder;
+use OCP\Files\File;
use OCP\IUser;
+use Psr\Log\LoggerInterface;
class LazyUserFolder extends LazyFolder {
private IRootFolder $root;
@@ -41,14 +44,22 @@ class LazyUserFolder extends LazyFolder {
$this->user = $user;
$this->mountManager = $mountManager;
$this->path = '/' . $user->getUID() . '/files';
- parent::__construct(function () use ($user) {
+ parent::__construct(function () use ($user): Folder {
try {
- return $this->root->get('/' . $user->getUID() . '/files');
+ $node = $this->root->get($this->path);
+ if ($node instanceof File) {
+ $e = new \RuntimeException();
+ \OCP\Server::get(LoggerInterface::class)->error('User root storage is not a folder: ' . $this->path, [
+ 'exception' => $e,
+ ]);
+ throw $e;
+ }
+ return $node;
} catch (NotFoundException $e) {
if (!$this->root->nodeExists('/' . $user->getUID())) {
$this->root->newFolder('/' . $user->getUID());
}
- return $this->root->newFolder('/' . $user->getUID() . '/files');
+ return $this->root->newFolder($this->path);
}
}, [
'path' => $this->path,
diff --git a/lib/private/Files/ObjectStore/ObjectStoreStorage.php b/lib/private/Files/ObjectStore/ObjectStoreStorage.php
index ea60de137d2..978b5b0451c 100644
--- a/lib/private/Files/ObjectStore/ObjectStoreStorage.php
+++ b/lib/private/Files/ObjectStore/ObjectStoreStorage.php
@@ -87,17 +87,13 @@ class ObjectStoreStorage extends \OC\Files\Storage\Common implements IChunkedFil
if (isset($params['validateWrites'])) {
$this->validateWrites = (bool)$params['validateWrites'];
}
- //initialize cache with root directory in cache
- if (!$this->is_dir('/')) {
- $this->mkdir('/');
- }
$this->logger = \OC::$server->getLogger();
}
- public function mkdir($path) {
+ public function mkdir($path, bool $force = false) {
$path = $this->normalizePath($path);
- if ($this->file_exists($path)) {
+ if (!$force && $this->file_exists($path)) {
$this->logger->warning("Tried to create an object store folder that already exists: $path");
return false;
}
@@ -246,6 +242,13 @@ class ObjectStoreStorage extends \OC\Files\Storage\Common implements IChunkedFil
if ($cacheEntry instanceof CacheEntry) {
return $cacheEntry->getData();
} else {
+ if ($path === '') {
+ $this->mkdir('', true);
+ $cacheEntry = $this->getCache()->get($path);
+ if ($cacheEntry instanceof CacheEntry) {
+ return $cacheEntry->getData();
+ }
+ }
return false;
}
}
@@ -357,6 +360,12 @@ class ObjectStoreStorage extends \OC\Files\Storage\Common implements IChunkedFil
case 'wb':
case 'w+':
case 'wb+':
+ $dirName = dirname($path);
+ $parentExists = $this->is_dir($dirName);
+ if (!$parentExists) {
+ return false;
+ }
+
$tmpFile = \OC::$server->getTempManager()->getTemporaryFile($ext);
$handle = fopen($tmpFile, $mode);
return CallbackWrapper::wrap($handle, null, null, function () use ($path, $tmpFile) {
@@ -469,6 +478,9 @@ class ObjectStoreStorage extends \OC\Files\Storage\Common implements IChunkedFil
public function file_put_contents($path, $data) {
$handle = $this->fopen($path, 'w+');
+ if (!$handle) {
+ return false;
+ }
$result = fwrite($handle, $data);
fclose($handle);
return $result;
diff --git a/lib/private/Files/Storage/DAV.php b/lib/private/Files/Storage/DAV.php
index 6a05f54a0b4..733aa10cde6 100644
--- a/lib/private/Files/Storage/DAV.php
+++ b/lib/private/Files/Storage/DAV.php
@@ -51,6 +51,7 @@ use OCP\Files\StorageInvalidException;
use OCP\Files\StorageNotAvailableException;
use OCP\Http\Client\IClientService;
use OCP\ICertificateManager;
+use OCP\Util;
use Psr\Http\Message\ResponseInterface;
use Sabre\DAV\Client;
use Sabre\DAV\Xml\Property\ResourceType;
@@ -451,7 +452,7 @@ class DAV extends Common {
return FileInfo::SPACE_UNKNOWN;
}
if (isset($response['{DAV:}quota-available-bytes'])) {
- return (int)$response['{DAV:}quota-available-bytes'];
+ return Util::numericToNumber($response['{DAV:}quota-available-bytes']);
} else {
return FileInfo::SPACE_UNKNOWN;
}
@@ -605,7 +606,7 @@ class DAV extends Common {
}
return [
'mtime' => isset($response['{DAV:}getlastmodified']) ? strtotime($response['{DAV:}getlastmodified']) : null,
- 'size' => (int)($response['{DAV:}getcontentlength'] ?? 0),
+ 'size' => Util::numericToNumber($response['{DAV:}getcontentlength'] ?? 0),
];
} catch (\Exception $e) {
$this->convertException($e, $path);
diff --git a/lib/private/Files/Storage/Local.php b/lib/private/Files/Storage/Local.php
index ee86fe356f7..c0ce0e7021a 100644
--- a/lib/private/Files/Storage/Local.php
+++ b/lib/private/Files/Storage/Local.php
@@ -52,6 +52,7 @@ use OCP\Files\GenericFileException;
use OCP\Files\IMimeTypeDetector;
use OCP\Files\Storage\IStorage;
use OCP\IConfig;
+use OCP\Util;
use Psr\Log\LoggerInterface;
/**
@@ -135,10 +136,10 @@ class Local extends \OC\Files\Storage\Common {
if (in_array($file->getBasename(), ['.', '..'])) {
$it->next();
continue;
- } elseif ($file->isDir()) {
- rmdir($file->getPathname());
} elseif ($file->isFile() || $file->isLink()) {
unlink($file->getPathname());
+ } elseif ($file->isDir()) {
+ rmdir($file->getPathname());
}
$it->next();
}
@@ -422,7 +423,7 @@ class Local extends \OC\Files\Storage\Common {
if ($space === false || is_null($space)) {
return \OCP\Files\FileInfo::SPACE_UNKNOWN;
}
- return (int)$space;
+ return Util::numericToNumber($space);
}
public function search($query) {
diff --git a/lib/private/Files/Type/Loader.php b/lib/private/Files/Type/Loader.php
index 32013bc3786..20c298f21b3 100644
--- a/lib/private/Files/Type/Loader.php
+++ b/lib/private/Files/Type/Loader.php
@@ -116,7 +116,7 @@ class Loader implements IMimeTypeLoader {
* @return int inserted ID
*/
protected function store($mimetype) {
- $row = $this->atomic(function () use ($mimetype) {
+ $mimetypeId = $this->atomic(function () use ($mimetype) {
try {
$insert = $this->dbConnection->getQueryBuilder();
$insert->insert('mimetypes')
@@ -124,34 +124,28 @@ class Loader implements IMimeTypeLoader {
'mimetype' => $insert->createNamedParameter($mimetype)
])
->executeStatement();
- return [
- 'mimetype' => $mimetype,
- 'id' => $insert->getLastInsertId(),
- ];
+ return $insert->getLastInsertId();
} catch (DbalException $e) {
if ($e->getReason() !== DBException::REASON_UNIQUE_CONSTRAINT_VIOLATION) {
throw $e;
}
$qb = $this->dbConnection->getQueryBuilder();
- $row = $qb->select('id')
+ $qb->select('id')
->from('mimetypes')
- ->where($qb->expr()->eq('mimetype', $qb->createNamedParameter($mimetype)))
- ->executeQuery()
- ->fetchOne();
- if ($row) {
- return [
- 'mimetype' => $mimetype,
- 'id' => $row['id'],
- ];
+ ->where($qb->expr()->eq('mimetype', $qb->createNamedParameter($mimetype)));
+ $result = $qb->executeQuery();
+ $id = $result->fetchOne();
+ $result->closeCursor();
+ if ($id !== false) {
+ return (int) $id;
}
throw new \Exception("Database threw an unique constraint on inserting a new mimetype, but couldn't return the ID for this very mimetype");
}
}, $this->dbConnection);
- if (!$row) {
+ if (!$mimetypeId) {
throw new \Exception("Failed to get mimetype id for $mimetype after trying to store it");
}
- $mimetypeId = (int) $row['id'];
$this->mimetypes[$mimetypeId] = $mimetype;
$this->mimetypeIds[$mimetype] = $mimetypeId;