Merge pull request #6898 from owncloud/encryption_infinite_loop
[encryption] infinite loop on sharing
This commit is contained in:
commit
0daabe5b6a
2 changed files with 30 additions and 45 deletions
|
@ -2,9 +2,10 @@
|
||||||
/**
|
/**
|
||||||
* ownCloud
|
* ownCloud
|
||||||
*
|
*
|
||||||
* @author Sam Tuke, Frank Karlitschek
|
* @author Sam Tuke, Frank Karlitschek, Bjoern Schiessle
|
||||||
* @copyright 2012 Sam Tuke <samtuke@owncloud.com>,
|
* @copyright 2012 Sam Tuke <samtuke@owncloud.com>,
|
||||||
* Frank Karlitschek <frank@owncloud.org>
|
* Frank Karlitschek <frank@owncloud.org>,
|
||||||
|
* Bjoern Schiessle <schiessle@owncloud.com>
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||||
|
@ -1360,59 +1361,32 @@ class Util {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief go recursively through a dir and collect all files and sub files.
|
* @brief go recursively through a dir and collect all files and sub files.
|
||||||
* @param string $dir relative to the users files folder
|
* @param string $dir relative to the users files folder
|
||||||
* @return array with list of files relative to the users files folder
|
* @return array with list of files relative to the users files folder
|
||||||
*/
|
*/
|
||||||
public function getAllFiles($dir) {
|
public function getAllFiles($dir) {
|
||||||
|
|
||||||
$result = array();
|
$result = array();
|
||||||
|
$dirList = array($dir);
|
||||||
|
|
||||||
$content = $this->view->getDirectoryContent(\OC\Files\Filesystem::normalizePath(
|
while ($dirList) {
|
||||||
$this->userFilesDir . '/' . $dir));
|
$dir = array_pop($dirList);
|
||||||
|
$content = $this->view->getDirectoryContent(\OC\Files\Filesystem::normalizePath(
|
||||||
// handling for re shared folders
|
$this->userFilesDir . '/' . $dir));
|
||||||
$pathSplit = explode('/', $dir);
|
|
||||||
|
|
||||||
foreach ($content as $c) {
|
|
||||||
|
|
||||||
$sharedPart = $pathSplit[sizeof($pathSplit) - 1];
|
|
||||||
$targetPathSplit = array_reverse(explode('/', $c['path']));
|
|
||||||
|
|
||||||
$path = '';
|
|
||||||
|
|
||||||
// rebuild path
|
|
||||||
foreach ($targetPathSplit as $pathPart) {
|
|
||||||
|
|
||||||
if ($pathPart !== $sharedPart) {
|
|
||||||
|
|
||||||
$path = '/' . $pathPart . $path;
|
|
||||||
|
|
||||||
|
foreach ($content as $c) {
|
||||||
|
$usersPath = isset($c['usersPath']) ? $c['usersPath'] : $c['path'];
|
||||||
|
if ($c['type'] === 'dir') {
|
||||||
|
$dirList[] = substr($usersPath, strlen("files"));
|
||||||
} else {
|
} else {
|
||||||
|
$result[] = substr($usersPath, strlen("files"));
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$path = $dir . $path;
|
|
||||||
|
|
||||||
if ($c['type'] === 'dir') {
|
|
||||||
|
|
||||||
$result = array_merge($result, $this->getAllFiles($path));
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
$result[] = $path;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return $result;
|
return $result;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -127,7 +127,18 @@ class Shared_Cache extends Cache {
|
||||||
return $files;
|
return $files;
|
||||||
} else {
|
} else {
|
||||||
if ($cache = $this->getSourceCache($folder)) {
|
if ($cache = $this->getSourceCache($folder)) {
|
||||||
return $cache->getFolderContents($this->files[$folder]);
|
$sourceFolderContent = $cache->getFolderContents($this->files[$folder]);
|
||||||
|
foreach ($sourceFolderContent as $key => $c) {
|
||||||
|
$ownerPathParts = explode('/', \OC_Filesystem::normalizePath($c['path']));
|
||||||
|
$userPathParts = explode('/', \OC_Filesystem::normalizePath($folder));
|
||||||
|
$usersPath = 'files/Shared/'.$userPathParts[1];
|
||||||
|
foreach (array_slice($ownerPathParts, 3) as $part) {
|
||||||
|
$usersPath .= '/'.$part;
|
||||||
|
}
|
||||||
|
$sourceFolderContent[$key]['usersPath'] = $usersPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $sourceFolderContent;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -260,7 +271,7 @@ class Shared_Cache extends Cache {
|
||||||
return $this->searchWithWhere($where, $value);
|
return $this->searchWithWhere($where, $value);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The maximum number of placeholders that can be used in an SQL query.
|
* The maximum number of placeholders that can be used in an SQL query.
|
||||||
* Value MUST be <= 1000 for oracle:
|
* Value MUST be <= 1000 for oracle:
|
||||||
|
@ -268,7 +279,7 @@ class Shared_Cache extends Cache {
|
||||||
* FIXME we should get this from doctrine as other DBs allow a lot more placeholders
|
* FIXME we should get this from doctrine as other DBs allow a lot more placeholders
|
||||||
*/
|
*/
|
||||||
const MAX_SQL_CHUNK_SIZE = 1000;
|
const MAX_SQL_CHUNK_SIZE = 1000;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* search for files with a custom where clause and value
|
* search for files with a custom where clause and value
|
||||||
* the $wherevalue will be array_merge()d with the file id chunks
|
* the $wherevalue will be array_merge()d with the file id chunks
|
||||||
|
@ -282,16 +293,16 @@ class Shared_Cache extends Cache {
|
||||||
$ids = $this->getAll();
|
$ids = $this->getAll();
|
||||||
|
|
||||||
$files = array();
|
$files = array();
|
||||||
|
|
||||||
// divide into chunks
|
// divide into chunks
|
||||||
$chunks = array_chunk($ids, $chunksize);
|
$chunks = array_chunk($ids, $chunksize);
|
||||||
|
|
||||||
foreach ($chunks as $chunk) {
|
foreach ($chunks as $chunk) {
|
||||||
$placeholders = join(',', array_fill(0, count($chunk), '?'));
|
$placeholders = join(',', array_fill(0, count($chunk), '?'));
|
||||||
$sql = 'SELECT `fileid`, `storage`, `path`, `parent`, `name`, `mimetype`, `mimepart`, `size`, `mtime`,
|
$sql = 'SELECT `fileid`, `storage`, `path`, `parent`, `name`, `mimetype`, `mimepart`, `size`, `mtime`,
|
||||||
`encrypted`, `unencrypted_size`, `etag`
|
`encrypted`, `unencrypted_size`, `etag`
|
||||||
FROM `*PREFIX*filecache` WHERE ' . $sqlwhere . ' `fileid` IN (' . $placeholders . ')';
|
FROM `*PREFIX*filecache` WHERE ' . $sqlwhere . ' `fileid` IN (' . $placeholders . ')';
|
||||||
|
|
||||||
$stmt = \OC_DB::prepare($sql);
|
$stmt = \OC_DB::prepare($sql);
|
||||||
|
|
||||||
$result = $stmt->execute(array_merge(array($wherevalue), $chunk));
|
$result = $stmt->execute(array_merge(array($wherevalue), $chunk));
|
||||||
|
|
Loading…
Reference in a new issue