summaryrefslogtreecommitdiffstats
path: root/lib/files
diff options
context:
space:
mode:
authorMichael Gapczynski <mtgap@owncloud.com>2013-03-08 15:28:45 -0500
committerMichael Gapczynski <mtgap@owncloud.com>2013-03-08 15:28:45 -0500
commitd7beac6d6f3ad588cee6c5ba8a2145b42fa184a2 (patch)
tree613f576938ee8ef88a5a93304a824f60fbb85a7a /lib/files
parent2ed850e05b46d820528813c2f2415dad60c1c570 (diff)
parent546fb72b25fb8ebdc70aa75ccc7a095d7d83b174 (diff)
downloadnextcloud-server-d7beac6d6f3ad588cee6c5ba8a2145b42fa184a2.tar.gz
nextcloud-server-d7beac6d6f3ad588cee6c5ba8a2145b42fa184a2.zip
Merge branch 'master' into filecache_mtime
Conflicts: lib/files/view.php lib/util.php tests/lib/files/cache/cache.php
Diffstat (limited to 'lib/files')
-rw-r--r--lib/files/cache/cache.php18
-rw-r--r--lib/files/cache/legacy.php6
-rw-r--r--lib/files/cache/permissions.php25
-rw-r--r--lib/files/cache/upgrade.php9
-rw-r--r--lib/files/filesystem.php49
-rw-r--r--lib/files/mapper.php24
-rw-r--r--lib/files/mount.php32
-rw-r--r--lib/files/storage/common.php221
-rw-r--r--lib/files/storage/mappedlocal.php6
-rw-r--r--lib/files/view.php20
10 files changed, 262 insertions, 148 deletions
diff --git a/lib/files/cache/cache.php b/lib/files/cache/cache.php
index 65f33c5f797..2413c05b8cd 100644
--- a/lib/files/cache/cache.php
+++ b/lib/files/cache/cache.php
@@ -48,6 +48,9 @@ class Cache {
} else {
$this->storageId = $storage;
}
+ if (strlen($this->storageId) > 64) {
+ $this->storageId = md5($this->storageId);
+ }
$query = \OC_DB::prepare('SELECT `numeric_id` FROM `*PREFIX*storages` WHERE `id` = ?');
$result = $query->execute(array($this->storageId));
@@ -205,7 +208,7 @@ class Cache {
$valuesPlaceholder = array_fill(0, count($queryParts), '?');
$query = \OC_DB::prepare('INSERT INTO `*PREFIX*filecache`(' . implode(', ', $queryParts) . ')'
- .' VALUES(' . implode(', ', $valuesPlaceholder) . ')');
+ . ' VALUES(' . implode(', ', $valuesPlaceholder) . ')');
$query->execute($params);
return (int)\OC_DB::insertid('*PREFIX*filecache');
@@ -223,7 +226,7 @@ class Cache {
$params[] = $id;
$query = \OC_DB::prepare('UPDATE `*PREFIX*filecache` SET ' . implode(' = ?, ', $queryParts) . '=?'
- .' WHERE fileid = ?');
+ . ' WHERE fileid = ?');
$query->execute($params);
}
@@ -321,6 +324,9 @@ class Cache {
}
$query = \OC_DB::prepare('DELETE FROM `*PREFIX*filecache` WHERE `fileid` = ?');
$query->execute(array($entry['fileid']));
+
+ $permissionsCache = new Permissions($this->storageId);
+ $permissionsCache->remove($entry['fileid']);
}
/**
@@ -346,7 +352,7 @@ class Cache {
}
$query = \OC_DB::prepare('UPDATE `*PREFIX*filecache` SET `path` = ?, `path_hash` = ?, `parent` =?'
- .' WHERE `fileid` = ?');
+ . ' WHERE `fileid` = ?');
$query->execute(array($target, md5($target), $newParentId, $sourceId));
}
@@ -507,9 +513,9 @@ class Cache {
*/
public function getIncomplete() {
$query = \OC_DB::prepare('SELECT `path` FROM `*PREFIX*filecache`'
- .' WHERE `storage` = ? AND `size` = -1 ORDER BY `fileid` DESC LIMIT 1');
- $query->execute(array($this->numericId));
- if ($row = $query->fetchRow()) {
+ . ' WHERE `storage` = ? AND `size` = -1 ORDER BY `fileid` DESC LIMIT 1');
+ $result = $query->execute(array($this->numericId));
+ if ($row = $result->fetchRow()) {
return $row['path'];
} else {
return false;
diff --git a/lib/files/cache/legacy.php b/lib/files/cache/legacy.php
index 6d1ffa7b40b..2b8689fcbda 100644
--- a/lib/files/cache/legacy.php
+++ b/lib/files/cache/legacy.php
@@ -51,12 +51,12 @@ class Legacy {
$this->cacheHasItems = false;
return false;
}
-
+
if ($result === false || property_exists($result, 'error_message_prefix')) {
$this->cacheHasItems = false;
return false;
- }
-
+ }
+
$this->cacheHasItems = (bool)$result->fetchRow();
return $this->cacheHasItems;
}
diff --git a/lib/files/cache/permissions.php b/lib/files/cache/permissions.php
index e1735831b94..a5c9c144054 100644
--- a/lib/files/cache/permissions.php
+++ b/lib/files/cache/permissions.php
@@ -17,10 +17,10 @@ class Permissions {
/**
* @param \OC\Files\Storage\Storage|string $storage
*/
- public function __construct($storage){
- if($storage instanceof \OC\Files\Storage\Storage) {
+ public function __construct($storage) {
+ if ($storage instanceof \OC\Files\Storage\Storage) {
$this->storageId = $storage->getId();
- }else{
+ } else {
$this->storageId = $storage;
}
}
@@ -52,10 +52,10 @@ class Permissions {
public function set($fileId, $user, $permissions) {
if (self::get($fileId, $user) !== -1) {
$query = \OC_DB::prepare('UPDATE `*PREFIX*permissions` SET `permissions` = ?'
- .' WHERE `user` = ? AND `fileid` = ?');
+ . ' WHERE `user` = ? AND `fileid` = ?');
} else {
$query = \OC_DB::prepare('INSERT INTO `*PREFIX*permissions`(`permissions`, `user`, `fileid`)'
- .' VALUES(?, ?,? )');
+ . ' VALUES(?, ?,? )');
}
$query->execute(array($permissions, $user, $fileId));
}
@@ -76,7 +76,7 @@ class Permissions {
$inPart = implode(', ', array_fill(0, count($fileIds), '?'));
$query = \OC_DB::prepare('SELECT `fileid`, `permissions` FROM `*PREFIX*permissions`'
- .' WHERE `fileid` IN (' . $inPart . ') AND `user` = ?');
+ . ' WHERE `fileid` IN (' . $inPart . ') AND `user` = ?');
$result = $query->execute($params);
$filePermissions = array();
while ($row = $result->fetchRow()) {
@@ -91,14 +91,19 @@ class Permissions {
* @param int $fileId
* @param string $user
*/
- public function remove($fileId, $user) {
- $query = \OC_DB::prepare('DELETE FROM `*PREFIX*permissions` WHERE `fileid` = ? AND `user` = ?');
- $query->execute(array($fileId, $user));
+ public function remove($fileId, $user = null) {
+ if (is_null($user)) {
+ $query = \OC_DB::prepare('DELETE FROM `*PREFIX*permissions` WHERE `fileid` = ?');
+ $query->execute(array($fileId));
+ } else {
+ $query = \OC_DB::prepare('DELETE FROM `*PREFIX*permissions` WHERE `fileid` = ? AND `user` = ?');
+ $query->execute(array($fileId, $user));
+ }
}
public function removeMultiple($fileIds, $user) {
$query = \OC_DB::prepare('DELETE FROM `*PREFIX*permissions` WHERE `fileid` = ? AND `user` = ?');
- foreach($fileIds as $fileId){
+ foreach ($fileIds as $fileId) {
$query->execute(array($fileId, $user));
}
}
diff --git a/lib/files/cache/upgrade.php b/lib/files/cache/upgrade.php
index 1fe4c584686..811d82d7437 100644
--- a/lib/files/cache/upgrade.php
+++ b/lib/files/cache/upgrade.php
@@ -64,7 +64,7 @@ class Upgrade {
* @param array $data the data for the new cache
*/
function insert($data) {
- if (!$this->inCache($data['storage'], $data['path_hash'])) {
+ if (!$this->inCache($data['storage'], $data['path_hash'], $data['id'])) {
$insertQuery = \OC_DB::prepare('INSERT INTO `*PREFIX*filecache`
( `fileid`, `storage`, `path`, `path_hash`, `parent`, `name`, `mimetype`, `mimepart`, `size`, `mtime`, `encrypted` )
VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');
@@ -78,11 +78,12 @@ class Upgrade {
/**
* @param string $storage
* @param string $pathHash
+ * @param string $id
* @return bool
*/
- function inCache($storage, $pathHash) {
- $query = \OC_DB::prepare('SELECT `fileid` FROM `*PREFIX*filecache` WHERE `storage` = ? AND `path_hash` = ?');
- $result = $query->execute(array($storage, $pathHash));
+ function inCache($storage, $pathHash, $id) {
+ $query = \OC_DB::prepare('SELECT `fileid` FROM `*PREFIX*filecache` WHERE (`storage` = ? AND `path_hash` = ?) OR `fileid` = ?');
+ $result = $query->execute(array($storage, $pathHash, $id));
return (bool)$result->fetchRow();
}
diff --git a/lib/files/filesystem.php b/lib/files/filesystem.php
index f4530868077..0bbd7550d74 100644
--- a/lib/files/filesystem.php
+++ b/lib/files/filesystem.php
@@ -29,6 +29,8 @@
namespace OC\Files;
+const FREE_SPACE_UNKNOWN = -2;
+
class Filesystem {
public static $loaded = false;
/**
@@ -215,9 +217,18 @@ class Filesystem {
if ($user == '') {
$user = \OC_User::getUser();
}
+ $parser = new \OC\ArrayParser();
+
+ $root = \OC_User::getHome($user);
+ self::mount('\OC\Files\Storage\Local', array('datadir' => $root), $user);
+
// Load system mount points
- if (is_file(\OC::$SERVERROOT . '/config/mount.php')) {
- $mountConfig = include 'config/mount.php';
+ if (is_file(\OC::$SERVERROOT . '/config/mount.php') or is_file(\OC::$SERVERROOT . '/config/mount.json')) {
+ if (is_file(\OC::$SERVERROOT . '/config/mount.json')) {
+ $mountConfig = json_decode(file_get_contents(\OC::$SERVERROOT . '/config/mount.json'), true);
+ } elseif (is_file(\OC::$SERVERROOT . '/config/mount.php')) {
+ $mountConfig = $parser->parsePHP(file_get_contents(\OC::$SERVERROOT . '/config/mount.php'));
+ }
if (isset($mountConfig['global'])) {
foreach ($mountConfig['global'] as $mountPoint => $options) {
self::mount($options['class'], $options['options'], $mountPoint);
@@ -251,10 +262,12 @@ class Filesystem {
}
}
// Load personal mount points
- $root = \OC_User::getHome($user);
- self::mount('\OC\Files\Storage\Local', array('datadir' => $root), $user);
- if (is_file($root . '/mount.php')) {
- $mountConfig = include $root . '/mount.php';
+ if (is_file($root . '/mount.php') or is_file($root . '/mount.json')) {
+ if (is_file($root . '/mount.json')) {
+ $mountConfig = json_decode(file_get_contents($root . '/mount.json'), true);
+ } elseif (is_file($root . '/mount.php')) {
+ $mountConfig = $parser->parsePHP(file_get_contents($root . '/mount.php'));
+ }
if (isset($mountConfig['user'][$user])) {
foreach ($mountConfig['user'][$user] as $mountPoint => $options) {
self::mount($options['class'], $options['options'], $mountPoint);
@@ -377,21 +390,29 @@ class Filesystem {
* @param array $data from hook
*/
static public function isBlacklisted($data) {
- $blacklist = \OC_Config::getValue('blacklisted_files', array('.htaccess'));
if (isset($data['path'])) {
$path = $data['path'];
} else if (isset($data['newpath'])) {
$path = $data['newpath'];
}
if (isset($path)) {
- $filename = strtolower(basename($path));
- if (in_array($filename, $blacklist)) {
+ if (self::isFileBlacklisted($path)) {
$data['run'] = false;
}
}
}
/**
+ * @param string $filename
+ * @return bool
+ */
+ static public function isFileBlacklisted($filename) {
+ $blacklist = \OC_Config::getValue('blacklisted_files', array('.htaccess'));
+ $filename = strtolower(basename($filename));
+ return (in_array($filename, $blacklist));
+ }
+
+ /**
* following functions are equivalent to their php builtin equivalents for arguments/return values.
*/
static public function mkdir($path) {
@@ -613,11 +634,11 @@ class Filesystem {
}
/**
- * Get the owner for a file or folder
- *
- * @param string $path
- * @return string
- */
+ * Get the owner for a file or folder
+ *
+ * @param string $path
+ * @return string
+ */
public static function getOwner($path) {
return self::$defaultInstance->getOwner($path);
}
diff --git a/lib/files/mapper.php b/lib/files/mapper.php
index cd163dcbfcd..520fadbd8c6 100644
--- a/lib/files/mapper.php
+++ b/lib/files/mapper.php
@@ -7,6 +7,12 @@ namespace OC\Files;
*/
class Mapper
{
+ private $unchangedPhysicalRoot;
+
+ public function __construct($rootDir) {
+ $this->unchangedPhysicalRoot = $rootDir;
+ }
+
/**
* @param string $logicPath
* @param bool $create indicates if the generated physical name shall be stored in the database or not
@@ -23,7 +29,7 @@ class Mapper
/**
* @param string $physicalPath
- * @return string|null
+ * @return string
*/
public function physicalToLogic($physicalPath) {
$logicPath = $this->resolvePhysicalPath($physicalPath);
@@ -39,6 +45,7 @@ class Mapper
* @param string $path
* @param bool $isLogicPath indicates if $path is logical or physical
* @param $recursive
+ * @return void
*/
public function removePath($path, $isLogicPath, $recursive) {
if ($recursive) {
@@ -159,14 +166,11 @@ class Mapper
}
private function slugifyPath($path, $index=null) {
+ $path = $this->stripRootFolder($path, $this->unchangedPhysicalRoot);
+
$pathElements = explode('/', $path);
$sluggedElements = array();
- // skip slugging the drive letter on windows - TODO: test if local path
- if (\OC_Util::runningOnWindows()) {
- $sluggedElements[]= $pathElements[0];
- array_shift($pathElements);
- }
foreach ($pathElements as $pathElement) {
// remove empty elements
if (empty($pathElement)) {
@@ -186,12 +190,8 @@ class Mapper
array_push($sluggedElements, $last.'-'.$index);
}
- // on non-windows systems add the leading / if necessary
- if (!\OC_Util::runningOnWindows() and $path[0] === '/') {
- return DIRECTORY_SEPARATOR.implode(DIRECTORY_SEPARATOR, $sluggedElements);
- }
-
- return implode(DIRECTORY_SEPARATOR, $sluggedElements);
+ $sluggedPath = $this->unchangedPhysicalRoot.implode(DIRECTORY_SEPARATOR, $sluggedElements);
+ return $this->stripLast($sluggedPath);
}
/**
diff --git a/lib/files/mount.php b/lib/files/mount.php
index 74ee483b1be..1c9382d78e7 100644
--- a/lib/files/mount.php
+++ b/lib/files/mount.php
@@ -93,6 +93,9 @@ class Mount {
$this->storage = $this->createStorage();
}
$this->storageId = $this->storage->getId();
+ if (strlen($this->storageId) > 64) {
+ $this->storageId = md5($this->storageId);
+ }
}
return $this->storageId;
}
@@ -173,10 +176,15 @@ class Mount {
}
/**
+ * Find mounts by storage id
+ *
* @param string $id
- * @return \OC\Files\Storage\Storage[]
+ * @return Mount[]
*/
- public static function findById($id) {
+ public static function findByStorageId($id) {
+ if (strlen($id) > 64) {
+ $id = md5($id);
+ }
$result = array();
foreach (self::$mounts as $mount) {
if ($mount->getStorageId() === $id) {
@@ -185,4 +193,24 @@ class Mount {
}
return $result;
}
+
+ /**
+ * Find mounts by numeric storage id
+ *
+ * @param string $id
+ * @return Mount
+ */
+ public static function findByNumericId($id) {
+ $query = \OC_DB::prepare('SELECT `id` FROM `*PREFIX*storages` WHERE `numeric_id` = ?');
+ $result = $query->execute(array($id))->fetchOne();
+ if ($result) {
+ $id = $result;
+ foreach (self::$mounts as $mount) {
+ if ($mount->getStorageId() === $id) {
+ return $mount;
+ }
+ }
+ }
+ return false;
+ }
}
diff --git a/lib/files/storage/common.php b/lib/files/storage/common.php
index 4cdabf1c8a6..8aa227ec0b7 100644
--- a/lib/files/storage/common.php
+++ b/lib/files/storage/common.php
@@ -22,83 +22,104 @@ namespace OC\Files\Storage;
abstract class Common implements \OC\Files\Storage\Storage {
- public function __construct($parameters) {}
+ public function __construct($parameters) {
+ }
+
public function is_dir($path) {
- return $this->filetype($path)=='dir';
+ return $this->filetype($path) == 'dir';
}
+
public function is_file($path) {
- return $this->filetype($path)=='file';
+ return $this->filetype($path) == 'file';
}
+
public function filesize($path) {
- if($this->is_dir($path)) {
- return 0;//by definition
- }else{
+ if ($this->is_dir($path)) {
+ return 0; //by definition
+ } else {
$stat = $this->stat($path);
- return $stat['size'];
+ 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){
+
+ public function getPermissions($path) {
$permissions = 0;
- if($this->isCreatable($path)) {
+ if ($this->isCreatable($path)) {
$permissions |= \OCP\PERMISSION_CREATE;
}
- if($this->isReadable($path)) {
+ if ($this->isReadable($path)) {
$permissions |= \OCP\PERMISSION_READ;
}
- if($this->isUpdatable($path)) {
+ if ($this->isUpdatable($path)) {
$permissions |= \OCP\PERMISSION_UPDATE;
}
- if($this->isDeletable($path)) {
+ if ($this->isDeletable($path)) {
$permissions |= \OCP\PERMISSION_DELETE;
}
- if($this->isSharable($path)) {
+ if ($this->isSharable($path)) {
$permissions |= \OCP\PERMISSION_SHARE;
}
return $permissions;
}
+
public function filemtime($path) {
$stat = $this->stat($path);
- return $stat['mtime'];
+ if (isset($stat['mtime'])) {
+ return $stat['mtime'];
+ } else {
+ return 0;
+ }
}
+
public function file_get_contents($path) {
$handle = $this->fopen($path, "r");
- if(!$handle) {
+ if (!$handle) {
return false;
}
- $size=$this->filesize($path);
- if($size==0) {
+ $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)) {
+ if ($this->copy($path1, $path2)) {
return $this->unlink($path1);
- }else{
+ } else {
return false;
}
}
+
public function copy($path1, $path2) {
- $source=$this->fopen($path1, 'r');
- $target=$this->fopen($path2, 'w');
- $count=\OC_Helper::streamCopy($source, $target);
- return $count>0;
+ $source = $this->fopen($path1, 'r');
+ $target = $this->fopen($path2, 'w');
+ list($count, $result) = \OC_Helper::streamCopy($source, $target);
+ return $result;
}
/**
@@ -110,29 +131,30 @@ abstract class Common implements \OC\Files\Storage\Storage {
* @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 ) {
+ public function deleteAll($directory, $empty = false) {
$directory = trim($directory, '/');
- if ( !$this->file_exists( \OCP\USER::getUser() . '/' . $directory )
- || !$this->is_dir( \OCP\USER::getUser() . '/' . $directory ) ) {
+ if (!$this->file_exists(\OCP\USER::getUser() . '/' . $directory)
+ || !$this->is_dir(\OCP\USER::getUser() . '/' . $directory)
+ ) {
return false;
- } elseif( !$this->isReadable( \OCP\USER::getUser() . '/' . $directory ) ) {
+ } elseif (!$this->isReadable(\OCP\USER::getUser() . '/' . $directory)) {
return false;
} else {
- $directoryHandle = $this->opendir( \OCP\USER::getUser() . '/' . $directory );
- while ( $contents = readdir( $directoryHandle ) ) {
- if ( $contents != '.' && $contents != '..') {
+ $directoryHandle = $this->opendir(\OCP\USER::getUser() . '/' . $directory);
+ while ($contents = readdir($directoryHandle)) {
+ if ($contents != '.' && $contents != '..') {
$path = $directory . "/" . $contents;
- if ( $this->is_dir( $path ) ) {
- $this->deleteAll( $path );
+ if ($this->is_dir($path)) {
+ $this->deleteAll($path);
} else {
- $this->unlink( \OCP\USER::getUser() .'/' . $path ); // TODO: make unlink use same system path as is_dir
+ $this->unlink(\OCP\USER::getUser() . '/' . $path); // TODO: make unlink use same system path as is_dir
}
}
}
//$this->closedir( $directoryHandle ); // TODO: implement closedir in OC_FSV
- if ( $empty == false ) {
- if ( !$this->rmdir( $directory ) ) {
+ if ($empty == false) {
+ if (!$this->rmdir($directory)) {
return false;
}
}
@@ -140,88 +162,95 @@ abstract class Common implements \OC\Files\Storage\Storage {
}
}
+
public function getMimeType($path) {
- if(!$this->file_exists($path)) {
+ if (!$this->file_exists($path)) {
return false;
}
- if($this->is_dir($path)) {
+ if ($this->is_dir($path)) {
return 'httpd/unix-directory';
}
- $source=$this->fopen($path, 'r');
- if(!$source) {
+ $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='';
+ $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);
+ $tmpFile = \OC_Helper::tmpFile($extension);
file_put_contents($tmpFile, $head);
- $mime=\OC_Helper::getMimeType($tmpFile);
+ $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);
+ $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) {
+
+ 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='';
+ if ($pos = strrpos($path, '.')) {
+ $extension = substr($path, $pos);
+ } else {
+ $extension = '';
}
- $tmpFile=\OC_Helper::tmpFile($extension);
- $target=fopen($tmpFile, 'w');
+ $tmpFile = \OC_Helper::tmpFile($extension);
+ $target = fopen($tmpFile, 'w');
\OC_Helper::streamCopy($source, $target);
return $tmpFile;
}
+
public function getLocalFolder($path) {
- $baseDir=\OC_Helper::tmpFolder();
+ $baseDir = \OC_Helper::tmpFolder();
$this->addLocalFolder($path, $baseDir);
return $baseDir;
}
+
private function addLocalFolder($path, $target) {
- if($dh=$this->opendir($path)) {
- while($file=readdir($dh)) {
- 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);
+ if ($dh = $this->opendir($path)) {
+ while ($file = readdir($dh)) {
+ 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($dh) {
- while($item=readdir($dh)) {
+ protected function searchInDir($query, $dir = '') {
+ $files = array();
+ $dh = $this->opendir($dir);
+ if ($dh) {
+ while ($item = readdir($dh)) {
if ($item == '.' || $item == '..') continue;
- if(strstr(strtolower($item), strtolower($query))!==false) {
- $files[]=$dir.'/'.$item;
+ 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));
+ if ($this->is_dir($dir . '/' . $item)) {
+ $files = array_merge($files, $this->searchInDir($query, $dir . '/' . $item));
}
}
}
@@ -230,32 +259,34 @@ abstract class Common implements \OC\Files\Storage\Storage {
/**
* 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;
+ return $this->filemtime($path) > $time;
}
- public function getCache($path=''){
+ public function getCache($path = '') {
return new \OC\Files\Cache\Cache($this);
}
- public function getScanner($path=''){
+ public function getScanner($path = '') {
return new \OC\Files\Cache\Scanner($this);
}
- public function getPermissionsCache($path=''){
+ public function getPermissionsCache($path = '') {
return new \OC\Files\Cache\Permissions($this);
}
- public function getWatcher($path=''){
+ public function getWatcher($path = '') {
return new \OC\Files\Cache\Watcher($this);
}
/**
* get the owner of a path
+ *
* @param string $path The path to get the owner
* @return string uid or false
*/
@@ -269,19 +300,20 @@ abstract class Common implements \OC\Files\Storage\Storage {
* @param string $path
* @return string
*/
- public function getETag($path){
+ public function getETag($path) {
$ETagFunction = \OC_Connector_Sabre_Node::$ETagFunction;
- if($ETagFunction) {
+ if ($ETagFunction) {
$hash = call_user_func($ETagFunction, $path);
return $hash;
- }else{
+ } 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
*/
@@ -289,7 +321,7 @@ abstract class Common implements \OC\Files\Storage\Storage {
if (strlen($path) == 0 or $path[0] != '/') {
$path = '/' . $path;
}
-
+
$output = array();
foreach (explode('/', $path) as $chunk) {
if ($chunk == '..') {
@@ -301,4 +333,21 @@ abstract class Common implements \OC\Files\Storage\Storage {
}
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\FREE_SPACE_UNKNOWN;
+ }
}
diff --git a/lib/files/storage/mappedlocal.php b/lib/files/storage/mappedlocal.php
index e707f71d71c..434c10bcbf7 100644
--- a/lib/files/storage/mappedlocal.php
+++ b/lib/files/storage/mappedlocal.php
@@ -20,7 +20,7 @@ class MappedLocal extends \OC\Files\Storage\Common{
$this->datadir.='/';
}
- $this->mapper= new \OC\Files\Mapper();
+ $this->mapper= new \OC\Files\Mapper($this->datadir);
}
public function __destruct() {
if (defined('PHPUNIT_RUN')) {
@@ -274,7 +274,7 @@ class MappedLocal extends \OC\Files\Storage\Common{
return $this->buildPath($path);
}
- protected function searchInDir($query, $dir='', $isLogicPath=true) {
+ protected function searchInDir($query, $dir='') {
$files=array();
$physicalDir = $this->buildPath($dir);
foreach (scandir($physicalDir) as $item) {
@@ -287,7 +287,7 @@ class MappedLocal extends \OC\Files\Storage\Common{
$files[]=$dir.'/'.$item;
}
if(is_dir($physicalItem)) {
- $files=array_merge($files, $this->searchInDir($query, $physicalItem, false));
+ $files=array_merge($files, $this->searchInDir($query, $dir.'/'.$item));
}
}
return $files;
diff --git a/lib/files/view.php b/lib/files/view.php
index 3348244715e..3cea8b082dc 100644
--- a/lib/files/view.php
+++ b/lib/files/view.php
@@ -199,7 +199,7 @@ class View {
@ob_end_clean();
$handle = $this->fopen($path, 'rb');
if ($handle) {
- $chunkSize = 8192; // 8 MB chunks
+ $chunkSize = 8192; // 8 kB chunks
while (!feof($handle)) {
echo fread($handle, $chunkSize);
flush();
@@ -245,7 +245,11 @@ class View {
if (!is_null($mtime) and !is_numeric($mtime)) {
$mtime = strtotime($mtime);
}
- $result = $this->basicOperation('touch', $path, array('write'), $mtime);
+ $hooks = array('touch');
+ if (!$this->file_exists($path)) {
+ $hooks[] = 'write';
+ }
+ $result = $this->basicOperation('touch', $path, $hooks, $mtime);
if (!$result) { //if native touch fails, we emulate it by changing the mtime in the cache
$this->putFileInfo($path, array('mtime' => $mtime));
}
@@ -289,7 +293,7 @@ class View {
}
$target = $this->fopen($path, 'w');
if ($target) {
- $count = \OC_Helper::streamCopy($data, $target);
+ list ($count, $result) = \OC_Helper::streamCopy($data, $target);
fclose($target);
fclose($data);
if ($this->fakeRoot == Filesystem::getRoot()) {
@@ -307,7 +311,7 @@ class View {
);
}
\OC_FileProxy::runPostProxies('file_put_contents', $absolutePath, $count);
- return $count > 0;
+ return $result;
} else {
return false;
}
@@ -365,10 +369,9 @@ class View {
} else {
$source = $this->fopen($path1 . $postFix1, 'r');
$target = $this->fopen($path2 . $postFix2, 'w');
- $count = \OC_Helper::streamCopy($source, $target);
+ list($count, $result) = \OC_Helper::streamCopy($source, $target);
list($storage1, $internalPath1) = Filesystem::resolvePath($absolutePath1 . $postFix1);
$storage1->unlink($internalPath1);
- $result = $count > 0;
}
if ($this->fakeRoot == Filesystem::getRoot()) {
\OC_Hook::emit(
@@ -448,7 +451,7 @@ class View {
} else {
$source = $this->fopen($path1 . $postFix1, 'r');
$target = $this->fopen($path2 . $postFix2, 'w');
- $result = \OC_Helper::streamCopy($source, $target);
+ list($count, $result) = \OC_Helper::streamCopy($source, $target);
}
if ($this->fakeRoot == Filesystem::getRoot()) {
\OC_Hook::emit(
@@ -601,6 +604,7 @@ class View {
if ($path == null) {
return false;
}
+
$run = $this->runHooks($hooks, $path);
list($storage, $internalPath) = Filesystem::resolvePath($absolutePath . $postFix);
if ($run and $storage) {
@@ -965,7 +969,7 @@ class View {
*/
public function getPath($id) {
list($storage, $internalPath) = Cache\Cache::getById($id);
- $mounts = Mount::findById($storage);
+ $mounts = Mount::findByStorageId($storage);
foreach ($mounts as $mount) {
/**
* @var \OC\Files\Mount $mount