/** * Copies a file or directory. * * This method must work recursively and delete the destination * if it exists * * @param string $source * @param string $destination * @throws \Sabre\DAV\Exception\ServiceUnavailable * @return void */ public function copy($source, $destination) { if (!$this->fileView) { throw new \Sabre\DAV\Exception\ServiceUnavailable('filesystem not setup'); } try { if ($this->fileView->is_file($source)) { $this->fileView->copy($source, $destination); } else { $this->fileView->mkdir($destination); $dh = $this->fileView->opendir($source); if (is_resource($dh)) { while (($subNode = readdir($dh)) !== false) { if ($subNode == '.' || $subNode == '..') { continue; } $this->copy($source . '/' . $subNode, $destination . '/' . $subNode); } } } } catch (\OCP\Files\StorageNotAvailableException $e) { throw new \Sabre\DAV\Exception\ServiceUnavailable($e->getMessage()); } list($destinationDir, ) = \Sabre\DAV\URLUtil::splitPath($destination); $this->markDirty($destinationDir); }
/** * Find all files and their encryption status within a directory * @param string $directory The path of the parent directory to search * @param bool $found the founded files if called again * @return array keys: plain, encrypted, broken * @note $directory needs to be a path relative to OC data dir. e.g. * /admin/files NOT /backup OR /home/www/oc/data/admin/files */ public function findEncFiles($directory, &$found = false) { // Disable proxy - we don't want files to be decrypted before // we handle them \OC_FileProxy::$enabled = false; if ($found === false) { $found = array('plain' => array(), 'encrypted' => array(), 'broken' => array()); } if ($this->view->is_dir($directory) && ($handle = $this->view->opendir($directory))) { if (is_resource($handle)) { while (false !== ($file = readdir($handle))) { if ($file !== "." && $file !== "..") { // skip stray part files if (Helper::isPartialFilePath($file)) { continue; } $filePath = $directory . '/' . $this->view->getRelativePath('/' . $file); $relPath = Helper::stripUserFilesPath($filePath); // If the path is a directory, search // its contents if ($this->view->is_dir($filePath)) { $this->findEncFiles($filePath, $found); // If the path is a file, determine // its encryption status } elseif ($this->view->is_file($filePath)) { // Disable proxies again, some- // where they got re-enabled :/ \OC_FileProxy::$enabled = false; $isEncryptedPath = $this->isEncryptedPath($filePath); // If the file is encrypted // NOTE: If the userId is // empty or not set, file will // detected as plain // NOTE: This is inefficient; // scanning every file like this // will eat server resources :( if ($isEncryptedPath) { $fileKey = Keymanager::getFileKey($this->view, $this, $relPath); $shareKey = Keymanager::getShareKey($this->view, $this->userId, $this, $relPath); // if file is encrypted but now file key is available, throw exception if ($fileKey === false || $shareKey === false) { \OCP\Util::writeLog('encryption library', 'No keys available to decrypt the file: ' . $filePath, \OCP\Util::ERROR); $found['broken'][] = array('name' => $file, 'path' => $filePath); } else { $found['encrypted'][] = array('name' => $file, 'path' => $filePath); } // If the file is not encrypted } else { $found['plain'][] = array('name' => $file, 'path' => $relPath); } } } } } } \OC_FileProxy::$enabled = true; return $found; }
/** * Check if genesis is valid * @param \OC\Files\View $view * @param string $path relative to the view * @throws \Exception */ protected function validate($view, $path) { if (!$view->file_exists($path)) { throw new \Exception('Document not found ' . $path); } if (!$view->is_file($path)) { throw new \Exception('Object ' . $path . ' is not a file.'); } //TODO check if it is a valid odt }
public static function is_file($path) { return self::$defaultInstance->is_file($path); }