aboutsummaryrefslogtreecommitdiffstats
path: root/apps/files_sharing/lib/share/file.php
diff options
context:
space:
mode:
authorRobin Appelman <icewind@owncloud.com>2014-04-25 11:47:06 +0200
committerRobin Appelman <icewind@owncloud.com>2014-04-25 11:47:06 +0200
commit6c20a014eaecd19c3f68143485c6f74891ee9643 (patch)
tree84bd8e37536e7f28a25afd7586c209d38a25d610 /apps/files_sharing/lib/share/file.php
parentcd0c5990f895bcdce47acf2dbf11ebadd920a404 (diff)
parent3fc809dfd80a296d7da922a06f9e13d446b3d3f0 (diff)
downloadnextcloud-server-6c20a014eaecd19c3f68143485c6f74891ee9643.tar.gz
nextcloud-server-6c20a014eaecd19c3f68143485c6f74891ee9643.zip
merge master into webdav-injection
Diffstat (limited to 'apps/files_sharing/lib/share/file.php')
-rw-r--r--apps/files_sharing/lib/share/file.php141
1 files changed, 77 insertions, 64 deletions
diff --git a/apps/files_sharing/lib/share/file.php b/apps/files_sharing/lib/share/file.php
index 5e00050fe1e..c0c9e0c107e 100644
--- a/apps/files_sharing/lib/share/file.php
+++ b/apps/files_sharing/lib/share/file.php
@@ -2,8 +2,9 @@
/**
* ownCloud
*
-* @author Michael Gapczynski
-* @copyright 2012 Michael Gapczynski mtgap@owncloud.com
+* @author Bjoern Schiessle, Michael Gapczynski
+* @copyright 2012 Michael Gapczynski <mtgap@owncloud.com>
+ * 2014 Bjoern Schiessle <schiessle@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
@@ -27,6 +28,7 @@ class OC_Share_Backend_File implements OCP\Share_Backend_File_Dependent {
const FORMAT_OPENDIR = 3;
const FORMAT_GET_ALL = 4;
const FORMAT_PERMISSIONS = 5;
+ const FORMAT_TARGET_NAMES = 6;
private $path;
@@ -49,24 +51,37 @@ class OC_Share_Backend_File implements OCP\Share_Backend_File_Dependent {
return false;
}
+ /**
+ * @brief create unique target
+ * @param string $filePath
+ * @param string $shareWith
+ * @param string $exclude
+ * @return string
+ */
public function generateTarget($filePath, $shareWith, $exclude = null) {
$target = '/'.basename($filePath);
- if (isset($exclude)) {
- if ($pos = strrpos($target, '.')) {
- $name = substr($target, 0, $pos);
- $ext = substr($target, $pos);
- } else {
- $name = $target;
- $ext = '';
- }
- $i = 2;
- $append = '';
- while (in_array($name.$append.$ext, $exclude)) {
- $append = ' ('.$i.')';
- $i++;
- }
- $target = $name.$append.$ext;
+
+ // for group shares we return the target right away
+ if ($shareWith === false) {
+ return $target;
+ }
+
+ \OC\Files\Filesystem::initMountPoints($shareWith);
+ $view = new \OC\Files\View('/' . $shareWith . '/files');
+ $excludeList = \OCP\Share::getItemsSharedWithUser('file', $shareWith, self::FORMAT_TARGET_NAMES);
+ if (is_array($exclude)) {
+ $excludeList = array_merge($excludeList, $exclude);
+ }
+
+ $pathinfo = pathinfo($target);
+ $ext = (isset($pathinfo['extension'])) ? '.'.$pathinfo['extension'] : '';
+ $name = $pathinfo['filename'];
+ $i = 2;
+ while ($view->file_exists($target) || in_array($target, $excludeList)) {
+ $target = '/' . $name . ' ('.$i.')' . $ext;
+ $i++;
}
+
return $target;
}
@@ -78,7 +93,7 @@ class OC_Share_Backend_File implements OCP\Share_Backend_File_Dependent {
'path' => $items[key($items)]['path'],
'storage' => $items[key($items)]['storage'],
'permissions' => $items[key($items)]['permissions'],
- 'uid_owner' => $items[key($items)]['uid_owner']
+ 'uid_owner' => $items[key($items)]['uid_owner'],
);
} else if ($format == self::FORMAT_GET_FOLDER_CONTENTS) {
$files = array();
@@ -108,22 +123,6 @@ class OC_Share_Backend_File implements OCP\Share_Backend_File_Dependent {
$files[] = $file;
}
return $files;
- } else if ($format == self::FORMAT_FILE_APP_ROOT) {
- $mtime = 0;
- $size = 0;
- foreach ($items as $item) {
- if ($item['mtime'] > $mtime) {
- $mtime = $item['mtime'];
- }
- $size += (int)$item['size'];
- }
- return array(
- 'fileid' => -1,
- 'name' => 'Shared',
- 'mtime' => $mtime,
- 'mimetype' => 'httpd/unix-directory',
- 'size' => $size
- );
} else if ($format == self::FORMAT_OPENDIR) {
$files = array();
foreach ($items as $item) {
@@ -142,46 +141,60 @@ class OC_Share_Backend_File implements OCP\Share_Backend_File_Dependent {
$filePermissions[$item['file_source']] = $item['permissions'];
}
return $filePermissions;
+ } else if ($format === self::FORMAT_TARGET_NAMES) {
+ $targets = array();
+ foreach ($items as $item) {
+ $targets[] = $item['file_target'];
+ }
+ return $targets;
}
return array();
}
- public static function getSource($target) {
- if ($target == '') {
- return false;
+ /**
+ * @brief resolve reshares to return the correct source item
+ * @param array $source
+ * @return array source item
+ */
+ protected static function resolveReshares($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'];
}
- $target = '/'.$target;
- $target = rtrim($target, '/');
- $pos = strpos($target, '/', 1);
- // Get shared folder name
- if ($pos !== false) {
- $folder = substr($target, 0, $pos);
- $source = \OCP\Share::getItemSharedWith('folder', $folder, \OC_Share_Backend_File::FORMAT_SHARED_STORAGE);
- if ($source) {
- $source['path'] = $source['path'].substr($target, strlen($folder));
+ if (isset($fileOwner)) {
+ $source['fileOwner'] = $fileOwner;
+ } else {
+ \OCP\Util::writeLog('files_sharing', "No owner found for reshare", \OCP\Util::ERROR);
+ }
+
+ return $source;
+ }
+
+ public static function getSource($target, $mountPoint, $itemType) {
+
+ if ($itemType === 'folder') {
+ $source = \OCP\Share::getItemSharedWith('folder', $mountPoint, \OC_Share_Backend_File::FORMAT_SHARED_STORAGE);
+ if ($source && $target !== '') {
+ $source['path'] = $source['path'].'/'.$target;
}
} else {
- $source = \OCP\Share::getItemSharedWith('file', $target, \OC_Share_Backend_File::FORMAT_SHARED_STORAGE);
+ $source = \OCP\Share::getItemSharedWith('file', $mountPoint, \OC_Share_Backend_File::FORMAT_SHARED_STORAGE);
}
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;
+ return self::resolveReshares($source);
}
+
\OCP\Util::writeLog('files_sharing', 'File source not found for: '.$target, \OCP\Util::DEBUG);
return false;
}