diff options
author | Thomas Müller <thomas.mueller@tmit.eu> | 2013-09-25 13:36:30 +0200 |
---|---|---|
committer | Thomas Müller <thomas.mueller@tmit.eu> | 2013-09-30 16:36:59 +0200 |
commit | 9c9dc276b7a1d2592c4fb0a887888632dc1f1e29 (patch) | |
tree | bbe3aed3e09c31c68806bdb8acffef70ba08f51c /lib/files/storage | |
parent | a711399e62d5a9f14d4b748efe4354ee37e61f13 (diff) | |
download | nextcloud-server-9c9dc276b7a1d2592c4fb0a887888632dc1f1e29.tar.gz nextcloud-server-9c9dc276b7a1d2592c4fb0a887888632dc1f1e29.zip |
move the private namespace OC into lib/private - OCP will stay in lib/public
Conflicts:
lib/private/vcategories.php
Diffstat (limited to 'lib/files/storage')
-rw-r--r-- | lib/files/storage/common.php | 374 | ||||
-rw-r--r-- | lib/files/storage/commontest.php | 80 | ||||
-rw-r--r-- | lib/files/storage/loader.php | 38 | ||||
-rw-r--r-- | lib/files/storage/local.php | 310 | ||||
-rw-r--r-- | lib/files/storage/mappedlocal.php | 365 | ||||
-rw-r--r-- | lib/files/storage/storage.php | 343 | ||||
-rw-r--r-- | lib/files/storage/temporary.php | 27 | ||||
-rw-r--r-- | lib/files/storage/wrapper/quota.php | 104 | ||||
-rw-r--r-- | lib/files/storage/wrapper/wrapper.php | 427 |
9 files changed, 0 insertions, 2068 deletions
diff --git a/lib/files/storage/common.php b/lib/files/storage/common.php deleted file mode 100644 index a5b79f0e967..00000000000 --- a/lib/files/storage/common.php +++ /dev/null @@ -1,374 +0,0 @@ -<?php -/** - * Copyright (c) 2012 Robin Appelman <icewind@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -namespace OC\Files\Storage; - -/** - * Storage backend class for providing common filesystem operation methods - * which are not storage-backend specific. - * - * \OC\Files\Storage\Common is never used directly; it is extended by all other - * storage backends, where its methods may be overridden, and additional - * (backend-specific) methods are defined. - * - * Some \OC\Files\Storage\Common methods call functions which are first defined - * in classes which extend it, e.g. $this->stat() . - */ - -abstract class Common implements \OC\Files\Storage\Storage { - private $cache; - private $scanner; - private $permissioncache; - private $watcher; - private $storageCache; - - public function __construct($parameters) { - } - - public function is_dir($path) { - return $this->filetype($path) == 'dir'; - } - - public function is_file($path) { - return $this->filetype($path) == 'file'; - } - - public function filesize($path) { - if ($this->is_dir($path)) { - return 0; //by definition - } else { - $stat = $this->stat($path); - if (isset($stat['size'])) { - return $stat['size']; - } else { - return 0; - } - } - } - - public function isCreatable($path) { - if ($this->is_dir($path) && $this->isUpdatable($path)) { - return true; - } - return false; - } - - public function isDeletable($path) { - return $this->isUpdatable($path); - } - - public function isSharable($path) { - return $this->isReadable($path); - } - - public function getPermissions($path) { - $permissions = 0; - if ($this->isCreatable($path)) { - $permissions |= \OCP\PERMISSION_CREATE; - } - if ($this->isReadable($path)) { - $permissions |= \OCP\PERMISSION_READ; - } - if ($this->isUpdatable($path)) { - $permissions |= \OCP\PERMISSION_UPDATE; - } - if ($this->isDeletable($path)) { - $permissions |= \OCP\PERMISSION_DELETE; - } - if ($this->isSharable($path)) { - $permissions |= \OCP\PERMISSION_SHARE; - } - return $permissions; - } - - public function filemtime($path) { - $stat = $this->stat($path); - if (isset($stat['mtime'])) { - return $stat['mtime']; - } else { - return 0; - } - } - - public function file_get_contents($path) { - $handle = $this->fopen($path, "r"); - if (!$handle) { - return false; - } - $size = $this->filesize($path); - if ($size == 0) { - return ''; - } - return fread($handle, $size); - } - - public function file_put_contents($path, $data) { - $handle = $this->fopen($path, "w"); - return fwrite($handle, $data); - } - - public function rename($path1, $path2) { - if ($this->copy($path1, $path2)) { - return $this->unlink($path1); - } else { - return false; - } - } - - public function copy($path1, $path2) { - $source = $this->fopen($path1, 'r'); - $target = $this->fopen($path2, 'w'); - list($count, $result) = \OC_Helper::streamCopy($source, $target); - return $result; - } - - /** - * @brief Deletes all files and folders recursively within a directory - * @param string $directory The directory whose contents will be deleted - * @param bool $empty Flag indicating whether directory will be emptied - * @returns bool - * - * @note By default the directory specified by $directory will be - * deleted together with its contents. To avoid this set $empty to true - */ - public function deleteAll($directory, $empty = false) { - $directory = trim($directory, '/'); - if (!$this->is_dir($directory) || !$this->isReadable($directory)) { - return false; - } else { - $directoryHandle = $this->opendir($directory); - if(is_resource($directoryHandle)) { - while (($contents = readdir($directoryHandle)) !== false) { - if (!\OC\Files\Filesystem::isIgnoredDir($contents)) { - $path = $directory . '/' . $contents; - if ($this->is_dir($path)) { - $this->deleteAll($path); - } else { - $this->unlink($path); - } - } - } - } - if ($empty === false) { - if (!$this->rmdir($directory)) { - return false; - } - } - return true; - } - - } - - public function getMimeType($path) { - if (!$this->file_exists($path)) { - return false; - } - if ($this->is_dir($path)) { - return 'httpd/unix-directory'; - } - $source = $this->fopen($path, 'r'); - if (!$source) { - return false; - } - $head = fread($source, 8192); //8kb should suffice to determine a mimetype - if ($pos = strrpos($path, '.')) { - $extension = substr($path, $pos); - } else { - $extension = ''; - } - $tmpFile = \OC_Helper::tmpFile($extension); - file_put_contents($tmpFile, $head); - $mime = \OC_Helper::getMimeType($tmpFile); - unlink($tmpFile); - return $mime; - } - - public function hash($type, $path, $raw = false) { - $tmpFile = $this->getLocalFile($path); - $hash = hash($type, $tmpFile, $raw); - unlink($tmpFile); - return $hash; - } - - public function search($query) { - return $this->searchInDir($query); - } - - public function getLocalFile($path) { - return $this->toTmpFile($path); - } - - private function toTmpFile($path) { //no longer in the storage api, still useful here - $source = $this->fopen($path, 'r'); - if (!$source) { - return false; - } - if ($pos = strrpos($path, '.')) { - $extension = substr($path, $pos); - } else { - $extension = ''; - } - $tmpFile = \OC_Helper::tmpFile($extension); - $target = fopen($tmpFile, 'w'); - \OC_Helper::streamCopy($source, $target); - return $tmpFile; - } - - public function getLocalFolder($path) { - $baseDir = \OC_Helper::tmpFolder(); - $this->addLocalFolder($path, $baseDir); - return $baseDir; - } - - private function addLocalFolder($path, $target) { - $dh = $this->opendir($path); - if(is_resource($dh)) { - while (($file = readdir($dh)) !== false) { - if ($file !== '.' and $file !== '..') { - if ($this->is_dir($path . '/' . $file)) { - mkdir($target . '/' . $file); - $this->addLocalFolder($path . '/' . $file, $target . '/' . $file); - } else { - $tmp = $this->toTmpFile($path . '/' . $file); - rename($tmp, $target . '/' . $file); - } - } - } - } - } - - protected function searchInDir($query, $dir = '') { - $files = array(); - $dh = $this->opendir($dir); - if (is_resource($dh)) { - while (($item = readdir($dh)) !== false) { - if ($item == '.' || $item == '..') continue; - if (strstr(strtolower($item), strtolower($query)) !== false) { - $files[] = $dir . '/' . $item; - } - if ($this->is_dir($dir . '/' . $item)) { - $files = array_merge($files, $this->searchInDir($query, $dir . '/' . $item)); - } - } - } - return $files; - } - - /** - * check if a file or folder has been updated since $time - * - * @param string $path - * @param int $time - * @return bool - */ - public function hasUpdated($path, $time) { - return $this->filemtime($path) > $time; - } - - public function getCache($path = '') { - if (!isset($this->cache)) { - $this->cache = new \OC\Files\Cache\Cache($this); - } - return $this->cache; - } - - public function getScanner($path = '') { - if (!isset($this->scanner)) { - $this->scanner = new \OC\Files\Cache\Scanner($this); - } - return $this->scanner; - } - - public function getPermissionsCache($path = '') { - if (!isset($this->permissioncache)) { - $this->permissioncache = new \OC\Files\Cache\Permissions($this); - } - return $this->permissioncache; - } - - public function getWatcher($path = '') { - if (!isset($this->watcher)) { - $this->watcher = new \OC\Files\Cache\Watcher($this); - } - return $this->watcher; - } - - public function getStorageCache(){ - if (!isset($this->storageCache)) { - $this->storageCache = new \OC\Files\Cache\Storage($this); - } - return $this->storageCache; - } - - /** - * get the owner of a path - * - * @param string $path The path to get the owner - * @return string uid or false - */ - public function getOwner($path) { - return \OC_User::getUser(); - } - - /** - * get the ETag for a file or folder - * - * @param string $path - * @return string - */ - public function getETag($path) { - $ETagFunction = \OC_Connector_Sabre_Node::$ETagFunction; - if ($ETagFunction) { - $hash = call_user_func($ETagFunction, $path); - return $hash; - } else { - return uniqid(); - } - } - - /** - * clean a path, i.e. remove all redundant '.' and '..' - * making sure that it can't point to higher than '/' - * - * @param $path The path to clean - * @return string cleaned path - */ - public function cleanPath($path) { - if (strlen($path) == 0 or $path[0] != '/') { - $path = '/' . $path; - } - - $output = array(); - foreach (explode('/', $path) as $chunk) { - if ($chunk == '..') { - array_pop($output); - } else if ($chunk == '.') { - } else { - $output[] = $chunk; - } - } - return implode('/', $output); - } - - public function test() { - if ($this->stat('')) { - return true; - } - return false; - } - - /** - * get the free space in the storage - * - * @param $path - * @return int - */ - public function free_space($path) { - return \OC\Files\SPACE_UNKNOWN; - } -} diff --git a/lib/files/storage/commontest.php b/lib/files/storage/commontest.php deleted file mode 100644 index c3f1eb31955..00000000000 --- a/lib/files/storage/commontest.php +++ /dev/null @@ -1,80 +0,0 @@ -<?php - -/** -* ownCloud -* -* @author Robin Appelman -* @copyright 2012 Robin Appelman icewind@owncloud.com -* -* This library is free software; you can redistribute it and/or -* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE -* License as published by the Free Software Foundation; either -* version 3 of the License, or any later version. -* -* This library is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU AFFERO GENERAL PUBLIC LICENSE for more details. -* -* You should have received a copy of the GNU Affero General Public -* License along with this library. If not, see <http://www.gnu.org/licenses/>. -* -*/ - -/** - * test implementation for \OC\Files\Storage\Common with \OC\Files\Storage\Local - */ - -namespace OC\Files\Storage; - -class CommonTest extends \OC\Files\Storage\Common{ - /** - * underlying local storage used for missing functions - * @var \OC\Files\Storage\Local - */ - private $storage; - - public function __construct($params) { - $this->storage=new \OC\Files\Storage\Local($params); - } - - public function getId(){ - return 'test::'.$this->storage->getId(); - } - public function mkdir($path) { - return $this->storage->mkdir($path); - } - public function rmdir($path) { - return $this->storage->rmdir($path); - } - public function opendir($path) { - return $this->storage->opendir($path); - } - public function stat($path) { - return $this->storage->stat($path); - } - public function filetype($path) { - return $this->storage->filetype($path); - } - public function isReadable($path) { - return $this->storage->isReadable($path); - } - public function isUpdatable($path) { - return $this->storage->isUpdatable($path); - } - public function file_exists($path) { - return $this->storage->file_exists($path); - } - public function unlink($path) { - return $this->storage->unlink($path); - } - public function fopen($path, $mode) { - return $this->storage->fopen($path, $mode); - } - public function free_space($path) { - return $this->storage->free_space($path); - } - public function touch($path, $mtime=null) { - return $this->storage->touch($path, $mtime); - } -} diff --git a/lib/files/storage/loader.php b/lib/files/storage/loader.php deleted file mode 100644 index 2572ef443bc..00000000000 --- a/lib/files/storage/loader.php +++ /dev/null @@ -1,38 +0,0 @@ -<?php -/** - * Copyright (c) 2012 Robin Appelman <icewind@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -namespace OC\Files\Storage; - -class Loader { - /** - * @var callable[] $storageWrappers - */ - private $storageWrappers = array(); - - /** - * allow modifier storage behaviour by adding wrappers around storages - * - * $callback should be a function of type (string $mountPoint, Storage $storage) => Storage - * - * @param callable $callback - */ - public function addStorageWrapper($callback) { - $this->storageWrappers[] = $callback; - } - - public function load($mountPoint, $class, $arguments) { - return $this->wrap($mountPoint, new $class($arguments)); - } - - public function wrap($mountPoint, $storage) { - foreach ($this->storageWrappers as $wrapper) { - $storage = $wrapper($mountPoint, $storage); - } - return $storage; - } -} diff --git a/lib/files/storage/local.php b/lib/files/storage/local.php deleted file mode 100644 index 5209fabc30a..00000000000 --- a/lib/files/storage/local.php +++ /dev/null @@ -1,310 +0,0 @@ -<?php -/** - * Copyright (c) 2012 Robin Appelman <icewind@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -namespace OC\Files\Storage; - -if (\OC_Util::runningOnWindows()) { - class Local extends MappedLocal { - - } -} else { - - /** - * for local filestore, we only have to map the paths - */ - class Local extends \OC\Files\Storage\Common { - protected $datadir; - - public function __construct($arguments) { - $this->datadir = $arguments['datadir']; - if (substr($this->datadir, -1) !== '/') { - $this->datadir .= '/'; - } - } - - public function __destruct() { - } - - public function getId() { - return 'local::' . $this->datadir; - } - - public function mkdir($path) { - return @mkdir($this->datadir . $path); - } - - public function rmdir($path) { - try { - $it = new \RecursiveIteratorIterator( - new \RecursiveDirectoryIterator($this->datadir . $path), - \RecursiveIteratorIterator::CHILD_FIRST - ); - foreach ($it as $file) { - /** - * @var \SplFileInfo $file - */ - if (in_array($file->getBasename(), array('.', '..'))) { - continue; - } elseif ($file->isDir()) { - rmdir($file->getPathname()); - } elseif ($file->isFile() || $file->isLink()) { - unlink($file->getPathname()); - } - } - return rmdir($this->datadir . $path); - } catch (\UnexpectedValueException $e) { - return false; - } - } - - public function opendir($path) { - return opendir($this->datadir . $path); - } - - public function is_dir($path) { - if (substr($path, -1) == '/') { - $path = substr($path, 0, -1); - } - return is_dir($this->datadir . $path); - } - - public function is_file($path) { - return is_file($this->datadir . $path); - } - - public function stat($path) { - $fullPath = $this->datadir . $path; - $statResult = stat($fullPath); - - if ($statResult['size'] < 0) { - $size = self::getFileSizeFromOS($fullPath); - $statResult['size'] = $size; - $statResult[7] = $size; - } - return $statResult; - } - - public function filetype($path) { - $filetype = filetype($this->datadir . $path); - if ($filetype == 'link') { - $filetype = filetype(realpath($this->datadir . $path)); - } - return $filetype; - } - - public function filesize($path) { - if ($this->is_dir($path)) { - return 0; - } else { - $fullPath = $this->datadir . $path; - $fileSize = filesize($fullPath); - if ($fileSize < 0) { - return self::getFileSizeFromOS($fullPath); - } - - return $fileSize; - } - } - - public function isReadable($path) { - return is_readable($this->datadir . $path); - } - - public function isUpdatable($path) { - return is_writable($this->datadir . $path); - } - - public function file_exists($path) { - return file_exists($this->datadir . $path); - } - - public function filemtime($path) { - return filemtime($this->datadir . $path); - } - - public function touch($path, $mtime = null) { - // sets the modification time of the file to the given value. - // If mtime is nil the current time is set. - // note that the access time of the file always changes to the current time. - if ($this->file_exists($path) and !$this->isUpdatable($path)) { - return false; - } - if (!is_null($mtime)) { - $result = touch($this->datadir . $path, $mtime); - } else { - $result = touch($this->datadir . $path); - } - if ($result) { - clearstatcache(true, $this->datadir . $path); - } - - return $result; - } - - public function file_get_contents($path) { - return file_get_contents($this->datadir . $path); - } - - public function file_put_contents($path, $data) { //trigger_error("$path = ".var_export($path, 1)); - return file_put_contents($this->datadir . $path, $data); - } - - public function unlink($path) { - return $this->delTree($path); - } - - public function rename($path1, $path2) { - if (!$this->isUpdatable($path1)) { - \OC_Log::write('core', 'unable to rename, file is not writable : ' . $path1, \OC_Log::ERROR); - return false; - } - if (!$this->file_exists($path1)) { - \OC_Log::write('core', 'unable to rename, file does not exists : ' . $path1, \OC_Log::ERROR); - return false; - } - - if ($return = rename($this->datadir . $path1, $this->datadir . $path2)) { - } - return $return; - } - - public function copy($path1, $path2) { - if ($this->is_dir($path2)) { - if (!$this->file_exists($path2)) { - $this->mkdir($path2); - } - $source = substr($path1, strrpos($path1, '/') + 1); - $path2 .= $source; - } - return copy($this->datadir . $path1, $this->datadir . $path2); - } - - public function fopen($path, $mode) { - if ($return = fopen($this->datadir . $path, $mode)) { - switch ($mode) { - case 'r': - break; - case 'r+': - case 'w+': - case 'x+': - case 'a+': - break; - case 'w': - case 'x': - case 'a': - break; - } - } - return $return; - } - - public function getMimeType($path) { - if ($this->isReadable($path)) { - return \OC_Helper::getMimeType($this->datadir . $path); - } else { - return false; - } - } - - private function delTree($dir) { - $dirRelative = $dir; - $dir = $this->datadir . $dir; - if (!file_exists($dir)) return true; - if (!is_dir($dir) || is_link($dir)) return unlink($dir); - foreach (scandir($dir) as $item) { - if ($item == '.' || $item == '..') continue; - if (is_file($dir . '/' . $item)) { - if (unlink($dir . '/' . $item)) { - } - } elseif (is_dir($dir . '/' . $item)) { - if (!$this->delTree($dirRelative . "/" . $item)) { - return false; - }; - } - } - if ($return = rmdir($dir)) { - } - return $return; - } - - private static function getFileSizeFromOS($fullPath) { - $name = strtolower(php_uname('s')); - // Windows OS: we use COM to access the filesystem - if (strpos($name, 'win') !== false) { - if (class_exists('COM')) { - $fsobj = new \COM("Scripting.FileSystemObject"); - $f = $fsobj->GetFile($fullPath); - return $f->Size; - } - } else if (strpos($name, 'bsd') !== false) { - if (\OC_Helper::is_function_enabled('exec')) { - return (float)exec('stat -f %z ' . escapeshellarg($fullPath)); - } - } else if (strpos($name, 'linux') !== false) { - if (\OC_Helper::is_function_enabled('exec')) { - return (float)exec('stat -c %s ' . escapeshellarg($fullPath)); - } - } else { - \OC_Log::write('core', - 'Unable to determine file size of "' . $fullPath . '". Unknown OS: ' . $name, - \OC_Log::ERROR); - } - - return 0; - } - - public function hash($path, $type, $raw = false) { - return hash_file($type, $this->datadir . $path, $raw); - } - - public function free_space($path) { - $space = @disk_free_space($this->datadir . $path); - if ($space === false) { - return \OC\Files\SPACE_UNKNOWN; - } - return $space; - } - - public function search($query) { - return $this->searchInDir($query); - } - - public function getLocalFile($path) { - return $this->datadir . $path; - } - - public function getLocalFolder($path) { - return $this->datadir . $path; - } - - protected function searchInDir($query, $dir = '') { - $files = array(); - foreach (scandir($this->datadir . $dir) as $item) { - if ($item == '.' || $item == '..') continue; - if (strstr(strtolower($item), strtolower($query)) !== false) { - $files[] = $dir . '/' . $item; - } - if (is_dir($this->datadir . $dir . '/' . $item)) { - $files = array_merge($files, $this->searchInDir($query, $dir . '/' . $item)); - } - } - return $files; - } - - /** - * check if a file or folder has been updated since $time - * - * @param string $path - * @param int $time - * @return bool - */ - public function hasUpdated($path, $time) { - return $this->filemtime($path) > $time; - } - } -} diff --git a/lib/files/storage/mappedlocal.php b/lib/files/storage/mappedlocal.php deleted file mode 100644 index ba5ac4191c5..00000000000 --- a/lib/files/storage/mappedlocal.php +++ /dev/null @@ -1,365 +0,0 @@ -<?php -/** - * Copyright (c) 2012 Robin Appelman <icewind@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -namespace OC\Files\Storage; - -/** - * for local filestore, we only have to map the paths - */ -class MappedLocal extends \OC\Files\Storage\Common{ - protected $datadir; - private $mapper; - - public function __construct($arguments) { - $this->datadir=$arguments['datadir']; - if(substr($this->datadir, -1)!=='/') { - $this->datadir.='/'; - } - - $this->mapper= new \OC\Files\Mapper($this->datadir); - } - public function __destruct() { - if (defined('PHPUNIT_RUN')) { - $this->mapper->removePath($this->datadir, true, true); - } - } - public function getId(){ - return 'local::'.$this->datadir; - } - public function mkdir($path) { - return @mkdir($this->buildPath($path)); - } - public function rmdir($path) { - try { - $it = new \RecursiveIteratorIterator( - new \RecursiveDirectoryIterator($this->buildPath($path)), - \RecursiveIteratorIterator::CHILD_FIRST - ); - foreach ($it as $file) { - /** - * @var \SplFileInfo $file - */ - if (in_array($file->getBasename(), array('.', '..'))) { - continue; - } elseif ($file->isDir()) { - rmdir($file->getPathname()); - } elseif ($file->isFile() || $file->isLink()) { - unlink($file->getPathname()); - } - } - if ($result = @rmdir($this->buildPath($path))) { - $this->cleanMapper($path); - } - return $result; - } catch (\UnexpectedValueException $e) { - return false; - } - } - public function opendir($path) { - $files = array('.', '..'); - $physicalPath= $this->buildPath($path); - - $logicalPath = $this->mapper->physicalToLogic($physicalPath); - $dh = opendir($physicalPath); - if(is_resource($dh)) { - while (($file = readdir($dh)) !== false) { - if ($file === '.' or $file === '..') { - continue; - } - - $logicalFilePath = $this->mapper->physicalToLogic($physicalPath.'/'.$file); - - $file= $this->mapper->stripRootFolder($logicalFilePath, $logicalPath); - $file = $this->stripLeading($file); - $files[]= $file; - } - } - - \OC\Files\Stream\Dir::register('local-win32'.$path, $files); - return opendir('fakedir://local-win32'.$path); - } - public function is_dir($path) { - if(substr($path, -1)=='/') { - $path=substr($path, 0, -1); - } - return is_dir($this->buildPath($path)); - } - public function is_file($path) { - return is_file($this->buildPath($path)); - } - public function stat($path) { - $fullPath = $this->buildPath($path); - $statResult = stat($fullPath); - - if ($statResult['size'] < 0) { - $size = self::getFileSizeFromOS($fullPath); - $statResult['size'] = $size; - $statResult[7] = $size; - } - return $statResult; - } - public function filetype($path) { - $filetype=filetype($this->buildPath($path)); - if($filetype=='link') { - $filetype=filetype(realpath($this->buildPath($path))); - } - return $filetype; - } - public function filesize($path) { - if($this->is_dir($path)) { - return 0; - }else{ - $fullPath = $this->buildPath($path); - $fileSize = filesize($fullPath); - if ($fileSize < 0) { - return self::getFileSizeFromOS($fullPath); - } - - return $fileSize; - } - } - public function isReadable($path) { - return is_readable($this->buildPath($path)); - } - public function isUpdatable($path) { - return is_writable($this->buildPath($path)); - } - public function file_exists($path) { - return file_exists($this->buildPath($path)); - } - public function filemtime($path) { - return filemtime($this->buildPath($path)); - } - public function touch($path, $mtime=null) { - // sets the modification time of the file to the given value. - // If mtime is nil the current time is set. - // note that the access time of the file always changes to the current time. - if(!is_null($mtime)) { - $result=touch( $this->buildPath($path), $mtime ); - }else{ - $result=touch( $this->buildPath($path)); - } - if( $result ) { - clearstatcache( true, $this->buildPath($path) ); - } - - return $result; - } - public function file_get_contents($path) { - return file_get_contents($this->buildPath($path)); - } - public function file_put_contents($path, $data) { - return file_put_contents($this->buildPath($path), $data); - } - public function unlink($path) { - return $this->delTree($path); - } - public function rename($path1, $path2) { - if (!$this->isUpdatable($path1)) { - \OC_Log::write('core', 'unable to rename, file is not writable : '.$path1, \OC_Log::ERROR); - return false; - } - if(! $this->file_exists($path1)) { - \OC_Log::write('core', 'unable to rename, file does not exists : '.$path1, \OC_Log::ERROR); - return false; - } - - $physicPath1 = $this->buildPath($path1); - $physicPath2 = $this->buildPath($path2); - if($return=rename($physicPath1, $physicPath2)) { - // mapper needs to create copies or all children - $this->copyMapping($path1, $path2); - $this->cleanMapper($physicPath1, false, true); - } - return $return; - } - public function copy($path1, $path2) { - if($this->is_dir($path2)) { - if(!$this->file_exists($path2)) { - $this->mkdir($path2); - } - $source=substr($path1, strrpos($path1, '/')+1); - $path2.=$source; - } - if($return=copy($this->buildPath($path1), $this->buildPath($path2))) { - // mapper needs to create copies or all children - $this->copyMapping($path1, $path2); - } - return $return; - } - public function fopen($path, $mode) { - if($return=fopen($this->buildPath($path), $mode)) { - switch($mode) { - case 'r': - break; - case 'r+': - case 'w+': - case 'x+': - case 'a+': - break; - case 'w': - case 'x': - case 'a': - break; - } - } - return $return; - } - - public function getMimeType($path) { - if($this->isReadable($path)) { - return \OC_Helper::getMimeType($this->buildPath($path)); - }else{ - return false; - } - } - - private function delTree($dir, $isLogicPath=true) { - $dirRelative=$dir; - if ($isLogicPath) { - $dir=$this->buildPath($dir); - } - if (!file_exists($dir)) { - return true; - } - if (!is_dir($dir) || is_link($dir)) { - if($return=unlink($dir)) { - $this->cleanMapper($dir, false); - return $return; - } - } - foreach (scandir($dir) as $item) { - if ($item == '.' || $item == '..') { - continue; - } - if(is_file($dir.'/'.$item)) { - if(unlink($dir.'/'.$item)) { - $this->cleanMapper($dir.'/'.$item, false); - } - }elseif(is_dir($dir.'/'.$item)) { - if (!$this->delTree($dir. "/" . $item, false)) { - return false; - }; - } - } - if($return=rmdir($dir)) { - $this->cleanMapper($dir, false); - } - return $return; - } - - private static function getFileSizeFromOS($fullPath) { - $name = strtolower(php_uname('s')); - // Windows OS: we use COM to access the filesystem - if (strpos($name, 'win') !== false) { - if (class_exists('COM')) { - $fsobj = new \COM("Scripting.FileSystemObject"); - $f = $fsobj->GetFile($fullPath); - return $f->Size; - } - } else if (strpos($name, 'bsd') !== false) { - if (\OC_Helper::is_function_enabled('exec')) { - return (float)exec('stat -f %z ' . escapeshellarg($fullPath)); - } - } else if (strpos($name, 'linux') !== false) { - if (\OC_Helper::is_function_enabled('exec')) { - return (float)exec('stat -c %s ' . escapeshellarg($fullPath)); - } - } else { - \OC_Log::write('core', - 'Unable to determine file size of "'.$fullPath.'". Unknown OS: '.$name, - \OC_Log::ERROR); - } - - return 0; - } - - public function hash($path, $type, $raw=false) { - return hash_file($type, $this->buildPath($path), $raw); - } - - public function free_space($path) { - return @disk_free_space($this->buildPath($path)); - } - - public function search($query) { - return $this->searchInDir($query); - } - public function getLocalFile($path) { - return $this->buildPath($path); - } - public function getLocalFolder($path) { - return $this->buildPath($path); - } - - protected function searchInDir($query, $dir='') { - $files=array(); - $physicalDir = $this->buildPath($dir); - foreach (scandir($physicalDir) as $item) { - if ($item == '.' || $item == '..') - continue; - $physicalItem = $this->mapper->physicalToLogic($physicalDir.'/'.$item); - $item = substr($physicalItem, strlen($physicalDir)+1); - - if(strstr(strtolower($item), strtolower($query)) !== false) { - $files[]=$dir.'/'.$item; - } - if(is_dir($physicalItem)) { - $files=array_merge($files, $this->searchInDir($query, $dir.'/'.$item)); - } - } - return $files; - } - - /** - * check if a file or folder has been updated since $time - * @param string $path - * @param int $time - * @return bool - */ - public function hasUpdated($path, $time) { - return $this->filemtime($path)>$time; - } - - private function buildPath($path, $create=true) { - $path = $this->stripLeading($path); - $fullPath = $this->datadir.$path; - return $this->mapper->logicToPhysical($fullPath, $create); - } - - private function cleanMapper($path, $isLogicPath=true, $recursive=true) { - $fullPath = $path; - if ($isLogicPath) { - $fullPath = $this->datadir.$path; - } - $this->mapper->removePath($fullPath, $isLogicPath, $recursive); - } - - private function copyMapping($path1, $path2) { - $path1 = $this->stripLeading($path1); - $path2 = $this->stripLeading($path2); - - $fullPath1 = $this->datadir.$path1; - $fullPath2 = $this->datadir.$path2; - - $this->mapper->copy($fullPath1, $fullPath2); - } - - private function stripLeading($path) { - if(strpos($path, '/') === 0) { - $path = substr($path, 1); - } - if(strpos($path, '\\') === 0) { - $path = substr($path, 1); - } - if ($path === false) { - return ''; - } - - return $path; - } -} diff --git a/lib/files/storage/storage.php b/lib/files/storage/storage.php deleted file mode 100644 index b673bb9a32d..00000000000 --- a/lib/files/storage/storage.php +++ /dev/null @@ -1,343 +0,0 @@ -<?php -/** - * Copyright (c) 2012 Robin Appelman <icewind@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -namespace OC\Files\Storage; - -/** - * Provide a common interface to all different storage options - * - * All paths passed to the storage are relative to the storage and should NOT have a leading slash. - */ -interface Storage extends \OCP\Files\Storage { - /** - * $parameters is a free form array with the configuration options needed to construct the storage - * - * @param array $parameters - */ - public function __construct($parameters); - - /** - * Get the identifier for the storage, - * the returned id should be the same for every storage object that is created with the same parameters - * and two storage objects with the same id should refer to two storages that display the same files. - * - * @return string - */ - public function getId(); - - /** - * see http://php.net/manual/en/function.mkdir.php - * - * @param string $path - * @return bool - */ - public function mkdir($path); - - /** - * see http://php.net/manual/en/function.rmdir.php - * - * @param string $path - * @return bool - */ - public function rmdir($path); - - /** - * see http://php.net/manual/en/function.opendir.php - * - * @param string $path - * @return resource - */ - public function opendir($path); - - /** - * see http://php.net/manual/en/function.is_dir.php - * - * @param string $path - * @return bool - */ - public function is_dir($path); - - /** - * see http://php.net/manual/en/function.is_file.php - * - * @param string $path - * @return bool - */ - public function is_file($path); - - /** - * see http://php.net/manual/en/function.stat.php - * only the following keys are required in the result: size and mtime - * - * @param string $path - * @return array - */ - public function stat($path); - - /** - * see http://php.net/manual/en/function.filetype.php - * - * @param string $path - * @return bool - */ - public function filetype($path); - - /** - * see http://php.net/manual/en/function.filesize.php - * The result for filesize when called on a folder is required to be 0 - * - * @param string $path - * @return int - */ - public function filesize($path); - - /** - * check if a file can be created in $path - * - * @param string $path - * @return bool - */ - public function isCreatable($path); - - /** - * check if a file can be read - * - * @param string $path - * @return bool - */ - public function isReadable($path); - - /** - * check if a file can be written to - * - * @param string $path - * @return bool - */ - public function isUpdatable($path); - - /** - * check if a file can be deleted - * - * @param string $path - * @return bool - */ - public function isDeletable($path); - - /** - * check if a file can be shared - * - * @param string $path - * @return bool - */ - public function isSharable($path); - - /** - * get the full permissions of a path. - * Should return a combination of the PERMISSION_ constants defined in lib/public/constants.php - * - * @param string $path - * @return int - */ - public function getPermissions($path); - - /** - * see http://php.net/manual/en/function.file_exists.php - * - * @param string $path - * @return bool - */ - public function file_exists($path); - - /** - * see http://php.net/manual/en/function.filemtime.php - * - * @param string $path - * @return int - */ - public function filemtime($path); - - /** - * see http://php.net/manual/en/function.file_get_contents.php - * - * @param string $path - * @return string - */ - public function file_get_contents($path); - - /** - * see http://php.net/manual/en/function.file_put_contents.php - * - * @param string $path - * @param string $data - * @return bool - */ - public function file_put_contents($path, $data); - - /** - * see http://php.net/manual/en/function.unlink.php - * - * @param string $path - * @return bool - */ - public function unlink($path); - - /** - * see http://php.net/manual/en/function.rename.php - * - * @param string $path1 - * @param string $path2 - * @return bool - */ - public function rename($path1, $path2); - - /** - * see http://php.net/manual/en/function.copy.php - * - * @param string $path1 - * @param string $path2 - * @return bool - */ - public function copy($path1, $path2); - - /** - * see http://php.net/manual/en/function.fopen.php - * - * @param string $path - * @param string $mode - * @return resource - */ - public function fopen($path, $mode); - - /** - * get the mimetype for a file or folder - * The mimetype for a folder is required to be "httpd/unix-directory" - * - * @param string $path - * @return string - */ - public function getMimeType($path); - - /** - * see http://php.net/manual/en/function.hash.php - * - * @param string $type - * @param string $path - * @param bool $raw - * @return string - */ - public function hash($type, $path, $raw = false); - - /** - * see http://php.net/manual/en/function.free_space.php - * - * @param string $path - * @return int - */ - public function free_space($path); - - /** - * search for occurrences of $query in file names - * - * @param string $query - * @return array - */ - public function search($query); - - /** - * see http://php.net/manual/en/function.touch.php - * If the backend does not support the operation, false should be returned - * - * @param string $path - * @param int $mtime - * @return bool - */ - public function touch($path, $mtime = null); - - /** - * get the path to a local version of the file. - * The local version of the file can be temporary and doesn't have to be persistent across requests - * - * @param string $path - * @return string - */ - public function getLocalFile($path); - - /** - * get the path to a local version of the folder. - * The local version of the folder can be temporary and doesn't have to be persistent across requests - * - * @param string $path - * @return string - */ - public function getLocalFolder($path); - /** - * check if a file or folder has been updated since $time - * - * @param string $path - * @param int $time - * @return bool - * - * hasUpdated for folders should return at least true if a file inside the folder is add, removed or renamed. - * returning true for other changes in the folder is optional - */ - public function hasUpdated($path, $time); - - /** - * get a cache instance for the storage - * - * @param string $path - * @return \OC\Files\Cache\Cache - */ - public function getCache($path = ''); - - /** - * get a scanner instance for the storage - * - * @param string $path - * @return \OC\Files\Cache\Scanner - */ - public function getScanner($path = ''); - - - /** - * get the user id of the owner of a file or folder - * - * @param string $path - * @return string - */ - public function getOwner($path); - - /** - * get a permissions cache instance for the cache - * - * @param string $path - * @return \OC\Files\Cache\Permissions - */ - public function getPermissionsCache($path = ''); - - /** - * get a watcher instance for the cache - * - * @param string $path - * @return \OC\Files\Cache\Watcher - */ - public function getWatcher($path = ''); - - /** - * @return \OC\Files\Cache\Storage - */ - public function getStorageCache(); - - /** - * get the ETag for a file or folder - * - * @param string $path - * @return string - */ - public function getETag($path); -} diff --git a/lib/files/storage/temporary.php b/lib/files/storage/temporary.php deleted file mode 100644 index d84dbda2e39..00000000000 --- a/lib/files/storage/temporary.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php -/** - * Copyright (c) 2012 Robin Appelman <icewind@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -namespace OC\Files\Storage; - -/** - * local storage backend in temporary folder for testing purpose - */ -class Temporary extends Local{ - public function __construct($arguments) { - parent::__construct(array('datadir' => \OC_Helper::tmpFolder())); - } - - public function cleanUp() { - \OC_Helper::rmdirr($this->datadir); - } - - public function __destruct() { - parent::__destruct(); - $this->cleanUp(); - } -} diff --git a/lib/files/storage/wrapper/quota.php b/lib/files/storage/wrapper/quota.php deleted file mode 100644 index e2da8cf2e05..00000000000 --- a/lib/files/storage/wrapper/quota.php +++ /dev/null @@ -1,104 +0,0 @@ -<?php -/** - * Copyright (c) 2013 Robin Appelman <icewind@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -namespace OC\Files\Storage\Wrapper; - -class Quota extends Wrapper { - - /** - * @var int $quota - */ - protected $quota; - - /** - * @param array $parameters - */ - public function __construct($parameters) { - $this->storage = $parameters['storage']; - $this->quota = $parameters['quota']; - } - - protected function getSize($path) { - $cache = $this->getCache(); - $data = $cache->get($path); - if (is_array($data) and isset($data['size'])) { - return $data['size']; - } else { - return \OC\Files\SPACE_NOT_COMPUTED; - } - } - - /** - * Get free space as limited by the quota - * - * @param string $path - * @return int - */ - public function free_space($path) { - if ($this->quota < 0) { - return $this->storage->free_space($path); - } else { - $used = $this->getSize(''); - if ($used < 0) { - return \OC\Files\SPACE_NOT_COMPUTED; - } else { - $free = $this->storage->free_space($path); - return min($free, (max($this->quota - $used, 0))); - } - } - } - - /** - * see http://php.net/manual/en/function.file_put_contents.php - * - * @param string $path - * @param string $data - * @return bool - */ - public function file_put_contents($path, $data) { - $free = $this->free_space(''); - if ($free < 0 or strlen($data) < $free) { - return $this->storage->file_put_contents($path, $data); - } else { - return false; - } - } - - /** - * see http://php.net/manual/en/function.copy.php - * - * @param string $source - * @param string $target - * @return bool - */ - public function copy($source, $target) { - $free = $this->free_space(''); - if ($free < 0 or $this->getSize($source) < $free) { - return $this->storage->copy($source, $target); - } else { - return false; - } - } - - /** - * see http://php.net/manual/en/function.fopen.php - * - * @param string $path - * @param string $mode - * @return resource - */ - public function fopen($path, $mode) { - $source = $this->storage->fopen($path, $mode); - $free = $this->free_space(''); - if ($free >= 0) { - return \OC\Files\Stream\Quota::wrap($source, $free); - } else { - return $source; - } - } -} diff --git a/lib/files/storage/wrapper/wrapper.php b/lib/files/storage/wrapper/wrapper.php deleted file mode 100644 index 0336c27efa1..00000000000 --- a/lib/files/storage/wrapper/wrapper.php +++ /dev/null @@ -1,427 +0,0 @@ -<?php -/** - * Copyright (c) 2013 Robin Appelman <icewind@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -namespace OC\Files\Storage\Wrapper; - -class Wrapper implements \OC\Files\Storage\Storage { - /** - * @var \OC\Files\Storage\Storage $storage - */ - protected $storage; - - /** - * @param array $parameters - */ - public function __construct($parameters) { - $this->storage = $parameters['storage']; - } - - /** - * @return \OC\Files\Storage\Storage - */ - public function getWrapperStorage() { - return $this->storage; - } - - /** - * Get the identifier for the storage, - * the returned id should be the same for every storage object that is created with the same parameters - * and two storage objects with the same id should refer to two storages that display the same files. - * - * @return string - */ - public function getId() { - return $this->storage->getId(); - } - - /** - * see http://php.net/manual/en/function.mkdir.php - * - * @param string $path - * @return bool - */ - public function mkdir($path) { - return $this->storage->mkdir($path); - } - - /** - * see http://php.net/manual/en/function.rmdir.php - * - * @param string $path - * @return bool - */ - public function rmdir($path) { - return $this->storage->rmdir($path); - } - - /** - * see http://php.net/manual/en/function.opendir.php - * - * @param string $path - * @return resource - */ - public function opendir($path) { - return $this->storage->opendir($path); - } - - /** - * see http://php.net/manual/en/function.is_dir.php - * - * @param string $path - * @return bool - */ - public function is_dir($path) { - return $this->storage->is_dir($path); - } - - /** - * see http://php.net/manual/en/function.is_file.php - * - * @param string $path - * @return bool - */ - public function is_file($path) { - return $this->storage->is_file($path); - } - - /** - * see http://php.net/manual/en/function.stat.php - * only the following keys are required in the result: size and mtime - * - * @param string $path - * @return array - */ - public function stat($path) { - return $this->storage->stat($path); - } - - /** - * see http://php.net/manual/en/function.filetype.php - * - * @param string $path - * @return bool - */ - public function filetype($path) { - return $this->storage->filetype($path); - } - - /** - * see http://php.net/manual/en/function.filesize.php - * The result for filesize when called on a folder is required to be 0 - * - * @param string $path - * @return int - */ - public function filesize($path) { - return $this->storage->filesize($path); - } - - /** - * check if a file can be created in $path - * - * @param string $path - * @return bool - */ - public function isCreatable($path) { - return $this->storage->isCreatable($path); - } - - /** - * check if a file can be read - * - * @param string $path - * @return bool - */ - public function isReadable($path) { - return $this->storage->isReadable($path); - } - - /** - * check if a file can be written to - * - * @param string $path - * @return bool - */ - public function isUpdatable($path) { - return $this->storage->isUpdatable($path); - } - - /** - * check if a file can be deleted - * - * @param string $path - * @return bool - */ - public function isDeletable($path) { - return $this->storage->isDeletable($path); - } - - /** - * check if a file can be shared - * - * @param string $path - * @return bool - */ - public function isSharable($path) { - return $this->storage->isSharable($path); - } - - /** - * get the full permissions of a path. - * Should return a combination of the PERMISSION_ constants defined in lib/public/constants.php - * - * @param string $path - * @return int - */ - public function getPermissions($path) { - return $this->storage->getPermissions($path); - } - - /** - * see http://php.net/manual/en/function.file_exists.php - * - * @param string $path - * @return bool - */ - public function file_exists($path) { - return $this->storage->file_exists($path); - } - - /** - * see http://php.net/manual/en/function.filemtime.php - * - * @param string $path - * @return int - */ - public function filemtime($path) { - return $this->storage->filemtime($path); - } - - /** - * see http://php.net/manual/en/function.file_get_contents.php - * - * @param string $path - * @return string - */ - public function file_get_contents($path) { - return $this->storage->file_get_contents($path); - } - - /** - * see http://php.net/manual/en/function.file_put_contents.php - * - * @param string $path - * @param string $data - * @return bool - */ - public function file_put_contents($path, $data) { - return $this->storage->file_put_contents($path, $data); - } - - /** - * see http://php.net/manual/en/function.unlink.php - * - * @param string $path - * @return bool - */ - public function unlink($path) { - return $this->storage->unlink($path); - } - - /** - * see http://php.net/manual/en/function.rename.php - * - * @param string $path1 - * @param string $path2 - * @return bool - */ - public function rename($path1, $path2) { - return $this->storage->rename($path1, $path2); - } - - /** - * see http://php.net/manual/en/function.copy.php - * - * @param string $path1 - * @param string $path2 - * @return bool - */ - public function copy($path1, $path2) { - return $this->storage->copy($path1, $path2); - } - - /** - * see http://php.net/manual/en/function.fopen.php - * - * @param string $path - * @param string $mode - * @return resource - */ - public function fopen($path, $mode) { - return $this->storage->fopen($path, $mode); - } - - /** - * get the mimetype for a file or folder - * The mimetype for a folder is required to be "httpd/unix-directory" - * - * @param string $path - * @return string - */ - public function getMimeType($path) { - return $this->storage->getMimeType($path); - } - - /** - * see http://php.net/manual/en/function.hash.php - * - * @param string $type - * @param string $path - * @param bool $raw - * @return string - */ - public function hash($type, $path, $raw = false) { - return $this->storage->hash($type, $path, $raw); - } - - /** - * see http://php.net/manual/en/function.free_space.php - * - * @param string $path - * @return int - */ - public function free_space($path) { - return $this->storage->free_space($path); - } - - /** - * search for occurrences of $query in file names - * - * @param string $query - * @return array - */ - public function search($query) { - return $this->storage->search($query); - } - - /** - * see http://php.net/manual/en/function.touch.php - * If the backend does not support the operation, false should be returned - * - * @param string $path - * @param int $mtime - * @return bool - */ - public function touch($path, $mtime = null) { - return $this->storage->touch($path, $mtime); - } - - /** - * get the path to a local version of the file. - * The local version of the file can be temporary and doesn't have to be persistent across requests - * - * @param string $path - * @return string - */ - public function getLocalFile($path) { - return $this->storage->getLocalFile($path); - } - - /** - * get the path to a local version of the folder. - * The local version of the folder can be temporary and doesn't have to be persistent across requests - * - * @param string $path - * @return string - */ - public function getLocalFolder($path) { - return $this->storage->getLocalFolder($path); - } - - /** - * check if a file or folder has been updated since $time - * - * @param string $path - * @param int $time - * @return bool - * - * hasUpdated for folders should return at least true if a file inside the folder is add, removed or renamed. - * returning true for other changes in the folder is optional - */ - public function hasUpdated($path, $time) { - return $this->storage->hasUpdated($path, $time); - } - - /** - * get a cache instance for the storage - * - * @param string $path - * @return \OC\Files\Cache\Cache - */ - public function getCache($path = '') { - return $this->storage->getCache($path); - } - - /** - * get a scanner instance for the storage - * - * @param string $path - * @return \OC\Files\Cache\Scanner - */ - public function getScanner($path = '') { - return $this->storage->getScanner($path); - } - - - /** - * get the user id of the owner of a file or folder - * - * @param string $path - * @return string - */ - public function getOwner($path) { - return $this->storage->getOwner($path); - } - - /** - * get a permissions cache instance for the cache - * - * @param string $path - * @return \OC\Files\Cache\Permissions - */ - public function getPermissionsCache($path = '') { - return $this->storage->getPermissionsCache($path); - } - - /** - * get a watcher instance for the cache - * - * @param string $path - * @return \OC\Files\Cache\Watcher - */ - public function getWatcher($path = '') { - return $this->storage->getWatcher($path); - } - - /** - * @return \OC\Files\Cache\Storage - */ - public function getStorageCache() { - return $this->storage->getStorageCache(); - } - - /** - * get the ETag for a file or folder - * - * @param string $path - * @return string - */ - public function getETag($path) { - return $this->storage->getETag($path); - } -} |