diff --git a/lib/private/Files/ObjectStore/ObjectStoreStorage.php b/lib/private/Files/ObjectStore/ObjectStoreStorage.php index ea60de137d25e..7c1e54ec45dc1 100644 --- a/lib/private/Files/ObjectStore/ObjectStoreStorage.php +++ b/lib/private/Files/ObjectStore/ObjectStoreStorage.php @@ -87,17 +87,13 @@ public function __construct($params) { 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 @@ public function stat($path) { 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,13 @@ public function fopen($path, $mode) { case 'wb': case 'w+': case 'wb+': + $dirName = dirname($path); + $parentExists = $this->is_dir($dirName); + if (!$parentExists) { + throw new \Exception("parent $dirName not found in object store"); + return false; + } + $tmpFile = \OC::$server->getTempManager()->getTemporaryFile($ext); $handle = fopen($tmpFile, $mode); return CallbackWrapper::wrap($handle, null, null, function () use ($path, $tmpFile) { @@ -469,6 +479,9 @@ public function needsPartFile() { public function file_put_contents($path, $data) { $handle = $this->fopen($path, 'w+'); + if (!$handle) { + return false; + } $result = fwrite($handle, $data); fclose($handle); return $result;