Fix fetching source path of shared files
This commit is contained in:
parent
e5a497c924
commit
a5cab28bea
|
@ -73,7 +73,9 @@ class OC_Share_Backend_File implements OCP\Share_Backend_File_Dependent {
|
||||||
if ($format == self::FORMAT_SHARED_STORAGE) {
|
if ($format == self::FORMAT_SHARED_STORAGE) {
|
||||||
// Only 1 item should come through for this format call
|
// Only 1 item should come through for this format call
|
||||||
return array(
|
return array(
|
||||||
|
'parent' => $items[key($items)]['parent'],
|
||||||
'path' => $items[key($items)]['path'],
|
'path' => $items[key($items)]['path'],
|
||||||
|
'storage' => $items[key($items)]['storage'],
|
||||||
'permissions' => $items[key($items)]['permissions'],
|
'permissions' => $items[key($items)]['permissions'],
|
||||||
'uid_owner' => $items[key($items)]['uid_owner']
|
'uid_owner' => $items[key($items)]['uid_owner']
|
||||||
);
|
);
|
||||||
|
@ -139,13 +141,28 @@ class OC_Share_Backend_File implements OCP\Share_Backend_File_Dependent {
|
||||||
$source = \OCP\Share::getItemSharedWith('folder', $folder, \OC_Share_Backend_File::FORMAT_SHARED_STORAGE);
|
$source = \OCP\Share::getItemSharedWith('folder', $folder, \OC_Share_Backend_File::FORMAT_SHARED_STORAGE);
|
||||||
if ($source) {
|
if ($source) {
|
||||||
$source['path'] = $source['path'].substr($target, strlen($folder));
|
$source['path'] = $source['path'].substr($target, strlen($folder));
|
||||||
return $source;
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$source = \OCP\Share::getItemSharedWith('file', $target, \OC_Share_Backend_File::FORMAT_SHARED_STORAGE);
|
$source = \OCP\Share::getItemSharedWith('file', $target, \OC_Share_Backend_File::FORMAT_SHARED_STORAGE);
|
||||||
if ($source) {
|
}
|
||||||
return $source;
|
if ($source) {
|
||||||
|
if (isset($source['parent'])) {
|
||||||
|
$parent = $source['parent'];
|
||||||
|
while (isset($parent)) {
|
||||||
|
$query = \OC_DB::prepare('SELECT `parent`, `uid_owner` FROM `*PREFIX*share` WHERE `id` = ?', 1);
|
||||||
|
$item = $query->execute(array($parent))->fetchRow();
|
||||||
|
if (isset($item['parent'])) {
|
||||||
|
$parent = $item['parent'];
|
||||||
|
} else {
|
||||||
|
$fileOwner = $item['uid_owner'];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$fileOwner = $source['uid_owner'];
|
||||||
}
|
}
|
||||||
|
$source['fileOwner'] = $fileOwner;
|
||||||
|
return $source;
|
||||||
}
|
}
|
||||||
\OCP\Util::writeLog('files_sharing', 'File source not found for: '.$target, \OCP\Util::ERROR);
|
\OCP\Util::writeLog('files_sharing', 'File source not found for: '.$target, \OCP\Util::ERROR);
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -45,11 +45,7 @@ class Shared extends \OC\Files\Storage\Common {
|
||||||
*/
|
*/
|
||||||
private function getFile($target) {
|
private function getFile($target) {
|
||||||
if (!isset($this->files[$target])) {
|
if (!isset($this->files[$target])) {
|
||||||
$source = \OC_Share_Backend_File::getSource($target);
|
$this->files[$target] = \OC_Share_Backend_File::getSource($target);
|
||||||
if ($source) {
|
|
||||||
$source['path'] = '/'.$source['uid_owner'].'/'.$source['path'];
|
|
||||||
}
|
|
||||||
$this->files[$target] = $source;
|
|
||||||
}
|
}
|
||||||
return $this->files[$target];
|
return $this->files[$target];
|
||||||
}
|
}
|
||||||
|
@ -62,8 +58,16 @@ class Shared extends \OC\Files\Storage\Common {
|
||||||
private function getSourcePath($target) {
|
private function getSourcePath($target) {
|
||||||
$source = $this->getFile($target);
|
$source = $this->getFile($target);
|
||||||
if ($source) {
|
if ($source) {
|
||||||
\OC\Files\Filesystem::initMountPoints($source['uid_owner']);
|
if (!isset($source['fullPath'])) {
|
||||||
return $source['path'];
|
\OC\Files\Filesystem::initMountPoints($source['fileOwner']);
|
||||||
|
$mount = \OC\Files\Mount::findByNumericId($source['storage']);
|
||||||
|
if ($mount) {
|
||||||
|
$this->files[$target]['fullPath'] = $mount->getMountPoint().$source['path'];
|
||||||
|
} else {
|
||||||
|
$this->files[$target]['fullPath'] = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $this->files[$target]['fullPath'];
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -430,7 +434,7 @@ class Shared extends \OC\Files\Storage\Common {
|
||||||
}
|
}
|
||||||
$source = $this->getFile($path);
|
$source = $this->getFile($path);
|
||||||
if ($source) {
|
if ($source) {
|
||||||
return $source['uid_owner'];
|
return $source['fileOwner'];
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -176,10 +176,12 @@ class Mount {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Find mounts by storage id
|
||||||
|
*
|
||||||
* @param string $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) {
|
if (strlen($id) > 64) {
|
||||||
$id = md5($id);
|
$id = md5($id);
|
||||||
}
|
}
|
||||||
|
@ -191,4 +193,24 @@ class Mount {
|
||||||
}
|
}
|
||||||
return $result;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -960,7 +960,7 @@ class View {
|
||||||
*/
|
*/
|
||||||
public function getPath($id) {
|
public function getPath($id) {
|
||||||
list($storage, $internalPath) = Cache\Cache::getById($id);
|
list($storage, $internalPath) = Cache\Cache::getById($id);
|
||||||
$mounts = Mount::findById($storage);
|
$mounts = Mount::findByStorageId($storage);
|
||||||
foreach ($mounts as $mount) {
|
foreach ($mounts as $mount) {
|
||||||
/**
|
/**
|
||||||
* @var \OC\Files\Mount $mount
|
* @var \OC\Files\Mount $mount
|
||||||
|
|
|
@ -786,7 +786,7 @@ class Share {
|
||||||
} else {
|
} else {
|
||||||
$select = '`*PREFIX*share`.`id`, `item_type`, `item_source`, `item_target`,
|
$select = '`*PREFIX*share`.`id`, `item_type`, `item_source`, `item_target`,
|
||||||
`*PREFIX*share`.`parent`, `share_type`, `share_with`, `uid_owner`,
|
`*PREFIX*share`.`parent`, `share_type`, `share_with`, `uid_owner`,
|
||||||
`file_source`, `path`, `file_target`, `permissions`, `stime`, `expiration`, `token`';
|
`file_source`, `path`, `file_target`, `permissions`, `stime`, `expiration`, `token`, `storage`';
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$select = '*';
|
$select = '*';
|
||||||
|
|
|
@ -42,7 +42,7 @@ class Mount extends \PHPUnit_Framework_TestCase {
|
||||||
$this->assertEquals(array($mount), \OC\Files\Mount::findById($id));
|
$this->assertEquals(array($mount), \OC\Files\Mount::findById($id));
|
||||||
|
|
||||||
$mount2 = new \OC\Files\Mount($storage, '/foo/bar');
|
$mount2 = new \OC\Files\Mount($storage, '/foo/bar');
|
||||||
$this->assertEquals(array($mount, $mount2), \OC\Files\Mount::findById($id));
|
$this->assertEquals(array($mount, $mount2), \OC\Files\Mount::findByStorageId($id));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testLong() {
|
public function testLong() {
|
||||||
|
@ -51,8 +51,8 @@ class Mount extends \PHPUnit_Framework_TestCase {
|
||||||
|
|
||||||
$id = $mount->getStorageId();
|
$id = $mount->getStorageId();
|
||||||
$storageId = $storage->getId();
|
$storageId = $storage->getId();
|
||||||
$this->assertEquals(array($mount), \OC\Files\Mount::findById($id));
|
$this->assertEquals(array($mount), \OC\Files\Mount::findByStorageId($id));
|
||||||
$this->assertEquals(array($mount), \OC\Files\Mount::findById($storageId));
|
$this->assertEquals(array($mount), \OC\Files\Mount::findByStorageId($storageId));
|
||||||
$this->assertEquals(array($mount), \OC\Files\Mount::findById(md5($storageId)));
|
$this->assertEquals(array($mount), \OC\Files\Mount::findByStorageId(md5($storageId)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue