diff --git a/apps/calendar/lib/sabre/object.php b/apps/calendar/lib/sabre/object.php index 25954e6ee5..0d1bfa397c 100644 --- a/apps/calendar/lib/sabre/object.php +++ b/apps/calendar/lib/sabre/object.php @@ -45,11 +45,11 @@ class OC_Connector_Sabre_CalDAV_CalendarObject extends Sabre_CalDAV_CalendarObje $uid = OC_Calendar_Calendar::extractUserID($this->getOwner()); if($uid != OCP\USER::getUser()) { - $sharedAddressbook = OCP\Share::getItemSharedWithBySource('calendar', $this->$calendarInfo['id']); - if ($sharedAddressbook && ($sharedAddressbook['permissions'] & OCP\Share::PERMISSION_READ)) { + $sharedCalendar = OCP\Share::getItemSharedWithBySource('calendar', $this->$calendarInfo['id']); + if ($sharedCalendar && ($sharedCalendar['permissions'] & OCP\Share::PERMISSION_READ)) { $readprincipal = 'principals/' . OCP\USER::getUser(); } - if ($sharedAddressbook && ($sharedAddressbook['permissions'] & OCP\Share::PERMISSION_UPDATE)) { + if ($sharedCalendar && ($sharedCalendar['permissions'] & OCP\Share::PERMISSION_UPDATE)) { $writeprincipal = 'principals/' . OCP\USER::getUser(); } } diff --git a/apps/files/js/fileactions.js b/apps/files/js/fileactions.js index 39e848cec8..89e7bdd7ad 100644 --- a/apps/files/js/fileactions.js +++ b/apps/files/js/fileactions.js @@ -77,6 +77,10 @@ FileActions={ parent.children('a.name').append(''); var defaultAction=FileActions.getDefault(FileActions.getCurrentMimeType(),FileActions.getCurrentType(), FileActions.getCurrentPermissions()); for(name in actions){ + // NOTE: Temporary fix to prevent rename action in root of Shared directory + if (name == 'Rename' && $('#dir').val() == '/Shared') { + continue; + } if((name=='Download' || actions[name]!=defaultAction) && name!='Delete'){ var img=FileActions.icons[name]; if(img.call){ diff --git a/apps/files/templates/part.list.php b/apps/files/templates/part.list.php index 6667b5488a..8faeae3939 100644 --- a/apps/files/templates/part.list.php +++ b/apps/files/templates/part.list.php @@ -9,7 +9,7 @@ $name = str_replace('%2F','/', $name); $directory = str_replace('+','%20',urlencode($file['directory'])); $directory = str_replace('%2F','/', $directory); ?> - ' data-permissions=''> + ' data-permissions=''> diff --git a/apps/files_sharing/js/share.js b/apps/files_sharing/js/share.js index bcfd42ce21..8754b16b06 100644 --- a/apps/files_sharing/js/share.js +++ b/apps/files_sharing/js/share.js @@ -2,7 +2,7 @@ $(document).ready(function() { if (typeof FileActions !== 'undefined') { OC.Share.loadIcons('file'); - FileActions.register('all', 'Share', FileActions.PERMISSION_SHARE, function(filename) { + FileActions.register('all', 'Share', FileActions.PERMISSION_READ, function(filename) { // Return the correct sharing icon if (scanFiles.scanning) { return; } // workaround to prevent additional http request block scanning feedback if ($('#dir').val() == '/') { @@ -36,27 +36,27 @@ $(document).ready(function() { } else { var item = $('#dir').val() + '/' + filename; } - if ($('tr').filterAttr('data-file', filename).data('type') == 'dir') { + var tr = $('tr').filterAttr('data-file', filename); + if ($(tr).data('type') == 'dir') { var itemType = 'folder'; - var possiblePermissions = OC.Share.PERMISSION_CREATE | OC.Share.PERMISSION_UPDATE | OC.Share.PERMISSION_DELETE | OC.Share.PERMISSION_SHARE; } else { var itemType = 'file'; - var possiblePermissions = OC.Share.PERMISSION_UPDATE | OC.Share.PERMISSION_DELETE | OC.Share.PERMISSION_SHARE; } - var appendTo = $('tr').filterAttr('data-file', filename).find('td.filename'); + var possiblePermissions = $(tr).data('permissions'); + var appendTo = $(tr).find('td.filename'); // Check if drop down is already visible for a different file if (OC.Share.droppedDown) { if (item != $('#dropdown').data('item')) { OC.Share.hideDropDown(function () { - $('tr').filterAttr('data-file', filename).addClass('mouseOver'); - OC.Share.showDropDown(itemType, item, appendTo, true, possiblePermissions); + $(tr).addClass('mouseOver'); + OC.Share.showDropDown(itemType, $(tr).data('id'), appendTo, true, possiblePermissions); }); } else { OC.Share.hideDropDown(); } } else { - $('tr').filterAttr('data-file',filename).addClass('mouseOver'); - OC.Share.showDropDown(itemType, item, appendTo, true, possiblePermissions); + $(tr).addClass('mouseOver'); + OC.Share.showDropDown(itemType, $(tr).data('id'), appendTo, true, possiblePermissions); } }); } diff --git a/apps/files_sharing/lib/share/file.php b/apps/files_sharing/lib/share/file.php index ae6315600f..5005d9a39d 100644 --- a/apps/files_sharing/lib/share/file.php +++ b/apps/files_sharing/lib/share/file.php @@ -26,30 +26,40 @@ class OC_Share_Backend_File implements OCP\Share_Backend_File_Dependent { const FORMAT_FILE_APP_ROOT = 2; const FORMAT_OPENDIR = 3; - public function isValidSource($item, $uid) { - if (OC_Filesystem::file_exists($item)) { + private $path; + + public function isValidSource($itemSource, $uidOwner) { + $path = OC_FileCache::getPath($itemSource, $uidOwner); + if (OC_Filesystem::file_exists($path)) { + $this->path = $path; return true; } return false; } - public function getFilePath($item, $uid) { - return $item; + public function getFilePath($itemSource, $uidOwner) { + if (isset($this->path)) { + $path = $this->path; + $this->path = null; + return $path; + } + return false; } - public function generateTarget($item, $uid, $exclude = null) { + public function generateTarget($itemSource, $shareWith, $exclude = null) { // TODO Make sure target path doesn't exist already - return $item; + return $itemSource; } public function formatItems($items, $format, $parameters = null) { if ($format == self::FORMAT_SHARED_STORAGE) { // Only 1 item should come through for this format call - return array('path' => $items[key($items)]['file_source'], 'permissions' => $items[key($items)]['permissions']); + return array('path' => $items[key($items)]['path'], 'permissions' => $items[key($items)]['permissions']); } else if ($format == self::FORMAT_FILE_APP) { $files = array(); foreach ($items as $item) { $file = array(); + $file['id'] = $item['file_source']; $file['path'] = $item['file_target']; $file['name'] = basename($item['file_target']); $file['ctime'] = $item['ctime']; @@ -77,7 +87,7 @@ class OC_Share_Backend_File implements OCP\Share_Backend_File_Dependent { } $size += $item['size']; } - return array(0 => array('name' => 'Shared', 'mtime' => $mtime, 'mimetype' => 'httpd/unix-directory', 'size' => $size, 'writable' => false, 'type' => 'dir', 'directory' => '', 'permissions' => OCP\Share::PERMISSION_READ)); + return array(0 => array('id' => -1, 'name' => 'Shared', 'mtime' => $mtime, 'mimetype' => 'httpd/unix-directory', 'size' => $size, 'writable' => false, 'type' => 'dir', 'directory' => '', 'permissions' => OCP\Share::PERMISSION_READ)); } else if ($format == self::FORMAT_OPENDIR) { $files = array(); foreach ($items as $item) { diff --git a/apps/files_sharing/lib/share/folder.php b/apps/files_sharing/lib/share/folder.php index b6db96614f..665583e83a 100644 --- a/apps/files_sharing/lib/share/folder.php +++ b/apps/files_sharing/lib/share/folder.php @@ -24,7 +24,7 @@ class OC_Share_Backend_Folder extends OC_Share_Backend_File { public function formatItems($items, $format, $parameters = null) { if ($format == self::FORMAT_SHARED_STORAGE) { // Only 1 item should come through for this format call - return array('path' => $items[key($items)]['file_source'], 'permissions' => $items[key($items)]['permissions']); + return array('path' => $items[key($items)]['path'], 'permissions' => $items[key($items)]['permissions']); } else if ($format == self::FORMAT_FILE_APP && isset($parameters['folder'])) { // Only 1 item should come through for this format call $folder = $items[key($items)]; @@ -33,7 +33,7 @@ class OC_Share_Backend_Folder extends OC_Share_Backend_File { } else { $mimetype_filter = ''; } - $path = $folder['file_source'].substr($parameters['folder'], 7 + strlen($folder['file_target'])); + $path = $folder['path'].substr($parameters['folder'], 7 + strlen($folder['file_target'])); $files = OC_FileCache::getFolderContent($path, '', $mimetype_filter); foreach ($files as &$file) { $file['directory'] = $parameters['folder']; diff --git a/apps/files_sharing/lib/sharedstorage.php b/apps/files_sharing/lib/sharedstorage.php index 582c9c6617..527cec0afe 100644 --- a/apps/files_sharing/lib/sharedstorage.php +++ b/apps/files_sharing/lib/sharedstorage.php @@ -312,21 +312,32 @@ class OC_Filestorage_Shared extends OC_Filestorage_Common { } public function rename($path1, $path2) { - if ($oldSource = $this->getSourcePath($path1)) { - $root1 = substr($path1, 0, strpos($path1, '/')); - $root2 = substr($path2, 0, strpos($path2, '/')); - // Moving/renaming is only allowed within the same shared folder - if ($root1 == $root2) { - $storage = OC_Filesystem::getStorage($oldSource); - $newSource = substr($oldSource, 0, strpos($oldSource, $root1)).$path2; - if (dirname($path1) == dirname($path2)) { - // Rename the file if UPDATE permission is granted - if ($this->isUpdatable($path1)) { + // Renaming/moving is only allowed within shared folders + $pos1 = strpos($path1, '/', 1); + $pos2 = strpos($path2, '/', 1); + if ($pos1 !== false && $pos2 !== false && ($oldSource = $this->getSourcePath($path1))) { + $newSource = $this->getSourcePath(dirname($path2)).'/'.basename($path2); + if (dirname($path1) == dirname($path2)) { + // Rename the file if UPDATE permission is granted + if ($this->isUpdatable($path1)) { + $storage = OC_Filesystem::getStorage($oldSource); + return $storage->rename($this->getInternalPath($oldSource), $this->getInternalPath($newSource)); + } + } else { + // Move the file if DELETE and CREATE permissions are granted + if ($this->isDeletable($path1) && $this->isCreatable(dirname($path2))) { + // Get the root shared folder + $folder1 = substr($path1, 0, $pos1); + $folder2 = substr($path2, 0, $pos2); + // Copy and unlink the file if it exists in a different shared folder + if ($folder1 != $folder2) { + if ($this->copy($path1, $path2)) { + return $this->unlink($path1); + } + } else { + $storage = OC_Filesystem::getStorage($oldSource); return $storage->rename($this->getInternalPath($oldSource), $this->getInternalPath($newSource)); } - // Move the file if DELETE and CREATE permissions are granted - } else if ($this->isDeletable($path1) && $this->isCreatable(dirname($path2))) { - return $storage->rename($this->getInternalPath($oldSource), $this->getInternalPath($newSource)); } } } @@ -335,12 +346,12 @@ class OC_Filestorage_Shared extends OC_Filestorage_Common { public function copy($path1, $path2) { // Copy the file if CREATE permission is granted - if (($source = $this->getSourcePath($path1)) && $this->isCreatable(dirname($path2))) { + if ($this->isCreatable(dirname($path2))) { $source = $this->fopen($path1, 'r'); $target = $this->fopen($path2, 'w'); return OC_Helper::streamCopy($source, $target); } - return true; + return false; } public function fopen($path, $mode) { diff --git a/core/ajax/share.php b/core/ajax/share.php index 04294a36ac..806ca9fb98 100644 --- a/core/ajax/share.php +++ b/core/ajax/share.php @@ -56,9 +56,13 @@ if (isset($_POST['action']) && isset($_POST['itemType']) && isset($_POST['itemSo } break; case 'getItem': - if (isset($_GET['itemType']) && isset($_GET['itemSource']) && isset($_GET['checkShares'])) { - $reshare = OCP\Share::getItemSharedWithBySource($_GET['itemType'], $_GET['itemSource'], OCP\Share::FORMAT_NONE, null, true); - if ($_GET['checkShares'] == "true") { + if (isset($_GET['itemType']) && isset($_GET['itemSource']) && isset($_GET['checkReshare']) && isset($_GET['checkShares'])) { + if ($_GET['checkReshare'] == 'true') { + $reshare = OCP\Share::getItemSharedWithBySource($_GET['itemType'], $_GET['itemSource'], OCP\Share::FORMAT_NONE, null, true); + } else { + $reshare = false; + } + if ($_GET['checkShares'] == 'true') { $shares = OCP\Share::getItemShared($_GET['itemType'], $_GET['itemSource']); } else { $shares = false; diff --git a/core/css/share.css b/core/css/share.css index a683a24a11..e4b4870dd1 100644 --- a/core/css/share.css +++ b/core/css/share.css @@ -2,10 +2,11 @@ This file is licensed under the Affero General Public License version 3 or later. See the COPYING-README file. */ -#dropdown { display:block; position:absolute; z-index:500; width:16em; right:0; margin-right:7em; background:#eee; padding:1em; +#dropdown { display:block; position:absolute; z-index:500; width:19em; right:0; margin-right:7em; background:#eee; padding:1em; -moz-box-shadow:0 1px 1px #777; -webkit-box-shadow:0 1px 1px #777; box-shadow:0 1px 1px #777; -moz-border-radius-bottomleft:1em; -webkit-border-bottom-left-radius:1em; border-bottom-left-radius:1em; -moz-border-radius-bottomright:1em; -webkit-border-bottom-right-radius:1em; border-bottom-right-radius:1em; } +.reshare { padding-left:0.5em; } #shareWithList { padding:0.5em; list-style-type: none; } #shareWithList li { padding-top:0.1em; } #dropdown label { font-weight:normal; } diff --git a/core/js/share.js b/core/js/share.js index e765303a26..3db69dc690 100644 --- a/core/js/share.js +++ b/core/js/share.js @@ -30,14 +30,57 @@ OC.Share={ } }); }, + updateIcon:function(itemType, itemSource) { + if (itemType == 'file' || itemType == 'folder') { + var filename = $('tr').filterAttr('data-id', String(itemSource)).data('file'); + if ($('#dir').val() == '/') { + itemSource = $('#dir').val() + filename; + } else { + itemSource = $('#dir').val() + '/' + filename; + } + } + var shares = false; + $.each(OC.Share.itemShares, function(index) { + if (OC.Share.itemShares[index].length > 0) { + shares = true; + return; + } + }); + if (shares) { + $('a.share[data-item="'+itemSource+'"]').css('background', 'url('+OC.imagePath('core', 'actions/shared')+') no-repeat center'); + if (typeof OC.Share.statuses[itemSource] === 'undefined') { + OC.Share.statuses[itemSource] = false; + } + } else { + if (itemType != 'file' && itemType != 'folder') { + $('a.share[data-item="'+itemSource+'"]').css('background', 'url('+OC.imagePath('core', 'actions/share')+') no-repeat center'); + } + delete OC.Share.statuses[itemSource]; + } + }, loadItem:function(itemType, itemSource) { var data = ''; - if (typeof OC.Share.statuses[itemSource] === 'undefined') { + var checkReshare = true; + // Switch file sources to path to check if status is set + if (itemType == 'file' || itemType == 'folder') { + var filename = $('tr').filterAttr('data-id', String(itemSource)).data('file'); + if ($('#dir').val() == '/') { + var item = $('#dir').val() + filename; + } else { + var item = $('#dir').val() + '/' + filename; + } + if (item.substring(0, 8) != '/Shared/') { + checkReshare = false; + } + } else { + var item = itemSource; + } + if (typeof OC.Share.statuses[item] === 'undefined') { checkShares = false; } else { checkShares = true; } - $.ajax({type: 'GET', url: OC.filePath('core', 'ajax', 'share.php'), data: { fetch: 'getItem', itemType: itemType, itemSource: itemSource, checkShares: checkShares }, async: false, success: function(result) { + $.ajax({type: 'GET', url: OC.filePath('core', 'ajax', 'share.php'), data: { fetch: 'getItem', itemType: itemType, itemSource: itemSource, checkReshare: checkReshare, checkShares: checkShares }, async: false, success: function(result) { if (result && result.status === 'success') { data = result.data; } else { @@ -80,71 +123,79 @@ OC.Share={ var html = ''; - $(html).appendTo(appendTo); - // Reset item shares - OC.Share.itemShares = []; - if (data.shares) { - $.each(data.shares, function(index, share) { - if (share.share_type == OC.Share.SHARE_TYPE_PRIVATE_LINK) { - OC.Share.showPrivateLink(item, share.share_with); - } else { - OC.Share.addShareWith(share.share_type, share.share_with, share.permissions, possiblePermissions); - - } - }); - } - $('#shareWith').autocomplete({minLength: 2, source: function(search, response) { -// if (cache[search.term]) { -// response(cache[search.term]); -// } else { - $.get(OC.filePath('core', 'ajax', 'share.php'), { fetch: 'getShareWith', search: search.term, itemShares: OC.Share.itemShares }, function(result) { - if (result.status == 'success' && result.data.length > 0) { - response(result.data); + $(html).appendTo(appendTo); + // Reset item shares + OC.Share.itemShares = []; + if (data.shares) { + $.each(data.shares, function(index, share) { + if (share.share_type == OC.Share.SHARE_TYPE_PRIVATE_LINK) { + OC.Share.showPrivateLink(item, share.share_with); } else { - // Suggest sharing via email if valid email address - var pattern = new RegExp(/^[+a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/i); - if (pattern.test(search.term)) { - response([{label: 'Share via email: '+search.term, value: {shareType: OC.Share.SHARE_TYPE_EMAIL, shareWith: search.term}}]); - } else { - response(['No people found']); - } + OC.Share.addShareWith(share.share_type, share.share_with, share.permissions, possiblePermissions); } }); -// } - }, - focus: function(event, focused) { - event.preventDefault(); - }, - select: function(event, selected) { - var shareType = selected.item.value.shareType; - var shareWith = selected.item.value.shareWith; - $(this).val(shareWith); - // Default permissions are Read and Share - var permissions = OC.Share.PERMISSION_READ | OC.Share.PERMISSION_SHARE; - OC.Share.share($('#dropdown').data('item-type'), $('#dropdown').data('item-source'), shareType, shareWith, permissions, function() { - OC.Share.addShareWith(shareType, shareWith, permissions, possiblePermissions); - $('#shareWith').val(''); + } + $('#shareWith').autocomplete({minLength: 2, source: function(search, response) { + // if (cache[search.term]) { + // response(cache[search.term]); + // } else { + $.get(OC.filePath('core', 'ajax', 'share.php'), { fetch: 'getShareWith', search: search.term, itemShares: OC.Share.itemShares }, function(result) { + if (result.status == 'success' && result.data.length > 0) { + response(result.data); + } else { + // Suggest sharing via email if valid email address + var pattern = new RegExp(/^[+a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/i); + if (pattern.test(search.term)) { + response([{label: 'Share via email: '+search.term, value: {shareType: OC.Share.SHARE_TYPE_EMAIL, shareWith: search.term}}]); + } else { + response(['No people found']); + } + } + }); + // } + }, + focus: function(event, focused) { + event.preventDefault(); + }, + select: function(event, selected) { + var itemType = $('#dropdown').data('item-type'); + var itemSource = $('#dropdown').data('item-source'); + var shareType = selected.item.value.shareType; + var shareWith = selected.item.value.shareWith; + $(this).val(shareWith); + // Default permissions are Read and Share + var permissions = OC.Share.PERMISSION_READ | OC.Share.PERMISSION_SHARE; + OC.Share.share(itemType, itemSource, shareType, shareWith, permissions, function() { + OC.Share.addShareWith(shareType, shareWith, permissions, possiblePermissions); + $('#shareWith').val(''); + OC.Share.updateIcon(itemType, itemSource); + }); + return false; + } }); - return false; + } else { + html += ''; + html += ''; + $(html).appendTo(appendTo); } - }); $('#dropdown').show('blind', function() { OC.Share.droppedDown = true; }); @@ -306,12 +357,15 @@ $(document).ready(function() { $('.unshare').live('click', function() { var li = $(this).parent(); + var itemType = $('#dropdown').data('item-type'); + var itemSource = $('#dropdown').data('item-source'); var shareType = $(li).data('share-type'); var shareWith = $(li).data('share-with'); - OC.Share.unshare($('#dropdown').data('item-type'), $('#dropdown').data('item-source'), shareType, shareWith, function() { + OC.Share.unshare(itemType, itemSource, shareType, shareWith, function() { $(li).remove(); var index = OC.Share.itemShares[shareType].indexOf(shareWith); OC.Share.itemShares[shareType].splice(index, 1); + OC.Share.updateIcon(itemType, itemSource); }); }); diff --git a/lib/filecache/cached.php b/lib/filecache/cached.php index 17a792a23d..1e17666717 100644 --- a/lib/filecache/cached.php +++ b/lib/filecache/cached.php @@ -58,7 +58,7 @@ class OC_FileCache_Cached{ if($parent==-1){ return array(); } - $query=OC_DB::prepare('SELECT path,name,ctime,mtime,mimetype,size,encrypted,versioned,writable FROM *PREFIX*fscache WHERE parent=? AND (mimetype LIKE ? OR mimetype = ?)'); + $query=OC_DB::prepare('SELECT id,path,name,ctime,mtime,mimetype,size,encrypted,versioned,writable FROM *PREFIX*fscache WHERE parent=? AND (mimetype LIKE ? OR mimetype = ?)'); $result=$query->execute(array($parent, $mimetype_filter.'%', 'httpd/unix-directory'))->fetchAll(); if(is_array($result)){ return $result; diff --git a/lib/public/share.php b/lib/public/share.php index 6221c75763..c894b31763 100644 --- a/lib/public/share.php +++ b/lib/public/share.php @@ -237,8 +237,16 @@ class Share { // Continue scanning into child folders array_push($files, $children); } else { + // Check file extension for an equivalent item type to convert to + $extension = strtolower(substr($itemSource, strrpos($itemSource, '.') + 1)); + foreach (self::$backends as $type => $backend) { + if (isset($backend->dependsOn) && $backend->dependsOn == 'file' && isset($backend->supportedFileExtensions) && in_array($extension, $backend->supportedFileExtensions)) { + $itemType = $type; + break; + } + } // Pass on to put() to check if this item should be converted, the item won't be inserted into the database unless it can be converted - self::put('file', $name, $shareType, $shareWith, $uidOwner, $permissions, $parentFolder); + self::put($itemType, $name, $shareType, $shareWith, $uidOwner, $permissions, $parentFolder); } } return true; @@ -425,7 +433,7 @@ class Share { } else { $fileDependent = false; $root = ''; - if ($includeCollections && !isset($item) && $collectionTypes = self::getCollectionItemTypes($itemType)) { + if ($includeCollections && !isset($item) && ($collectionTypes = self::getCollectionItemTypes($itemType))) { // If includeCollections is true, find collections of this item type, e.g. a music album contains songs $itemTypes = array_merge(array($itemType), $collectionTypes); $placeholders = join(',', array_fill(0, count($itemTypes), '?')); @@ -481,12 +489,11 @@ class Share { if (isset($uidOwner) || $itemShareWithBySource) { // If item type is a file, file source needs to be checked in case the item was converted if ($itemType == 'file' || $itemType == 'folder') { - $where .= " AND path = ?"; - $queryArgs[] = $root.$item; + $where .= ' AND file_source = ?'; + $column = 'file_source'; } else { $where .= " AND item_source = ?"; $column = 'item_source'; - $queryArgs[] = $item; } } else { if ($itemType == 'file' || $itemType == 'folder') { @@ -494,8 +501,8 @@ class Share { } else { $where .= " AND item_target = ?"; } - $queryArgs[] = $item; } + $queryArgs[] = $item; if ($includeCollections && $collectionTypes = self::getCollectionItemTypes($itemType)) { // TODO Bart - this doesn't work with only one argument // $placeholders = join(',', array_fill(0, count($collectionTypes), '?')); @@ -519,23 +526,23 @@ class Share { // TODO Optimize selects if ($format == self::FORMAT_STATUSES) { if ($itemType == 'file' || $itemType == 'folder') { - $select = '*PREFIX*share.id, item_type, *PREFIX*share.parent, share_type, *PREFIX*fscache.path as file_source'; + $select = '*PREFIX*share.id, item_type, *PREFIX*share.parent, share_type, file_source, path'; } else { $select = 'id, item_type, item_source, parent, share_type'; } } else { if (isset($uidOwner)) { if ($itemType == 'file' || $itemType == 'folder') { - $select = '*PREFIX*share.id, item_type, *PREFIX*fscache.path as file_source, *PREFIX*share.parent, share_type, share_with, permissions, stime'; + $select = '*PREFIX*share.id, item_type, *PREFIX*share.parent, share_type, share_with, file_source, path, permissions, stime'; } else { $select = 'id, item_type, item_source, parent, share_type, share_with, permissions, stime, file_source'; } } else { if ($fileDependent) { if (($itemType == 'file' || $itemType == 'folder') && $format == \OC_Share_Backend_File::FORMAT_FILE_APP || $format == \OC_Share_Backend_File::FORMAT_FILE_APP_ROOT) { - $select = '*PREFIX*share.id, item_type, *PREFIX*share.parent, share_type, share_with, permissions, file_target, *PREFIX*fscache.id, path as file_source, name, ctime, mtime, mimetype, size, encrypted, versioned, writable'; + $select = '*PREFIX*share.id, item_type, *PREFIX*share.parent, share_type, share_with, file_source, path, file_target, permissions, name, ctime, mtime, mimetype, size, encrypted, versioned, writable'; } else { - $select = '*PREFIX*share.id, item_type, item_source, item_target, *PREFIX*share.parent, share_type, share_with, uid_owner, permissions, stime, path as file_source, file_target'; + $select = '*PREFIX*share.id, item_type, item_source, item_target, *PREFIX*share.parent, share_type, share_with, uid_owner, file_source, path, file_target, permissions, stime'; } } else { $select = '*'; @@ -580,11 +587,11 @@ class Share { } } // Remove root from file source paths if retrieving own shared items - if (isset($uidOwner) && isset($row['file_source'])) { + if (isset($uidOwner) && isset($row['path'])) { if (isset($row['parent'])) { - $row['file_source'] = '/Shared/'.basename($row['file_source']); + $row['path'] = '/Shared/'.basename($row['path']); } else { - $row['file_source'] = substr($row['file_source'], $root); + $row['path'] = substr($row['path'], $root); } } $items[$row['id']] = $row; @@ -601,7 +608,7 @@ class Share { } } // Check if this is a collection of the requested item type - if ($includeCollections && $row['item_type'] != $itemType && $collectionBackend = self::getBackend($row['item_type']) && $collectionBackend instanceof Share_Backend_Collection) { + if ($includeCollections && $row['item_type'] != $itemType && ($collectionBackend = self::getBackend($row['item_type'])) && $collectionBackend instanceof Share_Backend_Collection) { $row['collection'] = array('item_type' => $itemType, $column => $row[$column]); // Fetch all of the children sources $children = $collectionBackend->getChildren($row[$column]); @@ -636,6 +643,10 @@ class Share { return $items; } else if ($format == self::FORMAT_STATUSES) { $statuses = array(); + // Switch column to path for files and folders, used for determining statuses inside of folders + if ($itemType == 'file' || $itemType == 'folder') { + $column = 'path'; + } foreach ($items as $item) { if ($item['share_type'] == self::SHARE_TYPE_PRIVATE_LINK) { $statuses[$item[$column]] = true; @@ -664,20 +675,6 @@ class Share { * @return bool Returns true on success or false on failure */ private static function put($itemType, $itemSource, $shareType, $shareWith, $uidOwner, $permissions, $parentFolder = null) { - // Check file extension for an equivalent item type to convert to - if ($itemType == 'file') { - $extension = strtolower(substr($itemSource, strrpos($itemSource, '.') + 1)); - foreach (self::$backends as $type => $backend) { - if (isset($backend->dependsOn) && $backend->dependsOn == 'file' && isset($backend->supportedFileExtensions) && in_array($extension, $backend->supportedFileExtensions)) { - $itemType = $type; - break; - } - } - // Exit if this is being called for a file inside a folder, and no equivalent item type is found - if (isset($parentFolder) && $itemType == 'file') { - return false; - } - } $backend = self::getBackend($itemType); // Check if this is a reshare if ($checkReshare = self::getItemSharedWithBySource($itemType, $itemSource, self::FORMAT_NONE, null, true)) { @@ -686,24 +683,6 @@ class Share { $message = 'Sharing '.$itemSource.' failed, because the user '.$shareWith.' is the original sharer'; \OC_Log::write('OCP\Share', $message, \OC_Log::ERROR); throw new \Exception($message); - // Check if attempting to share back to group TODO Check unique user target - } else if ($shareType == self::SHARE_TYPE_GROUP && $checkReshare['share_with'] == $shareWith['group']) { - $message = 'Sharing '.$itemSource.' failed, because the item was orignally shared with the group '.$shareWith['group']; - \OC_Log::write('OCP\Share', $message, \OC_Log::ERROR); - throw new \Exception($message); - // Check if attempting to share back a group share to a member of the same group - } else if (($checkReshare['share_type'] == self::SHARE_TYPE_GROUP || $checkReshare['share_type'] == self::$shareTypeGroupUserUnique) && $shareType == self::SHARE_TYPE_USER) { - if ($checkReshare['share_type'] == self::$shareTypeGroupUserUnique) { - $query = \OC_DB::prepare('SELECT share_with FROM *PREFIX*share WHERE id = ?'); - $group = $query->execute(array($checkReshare['parent']))->fetchOne(); - } else { - $group = $checkReshare['share_with']; - } - if (\OC_Group::inGroup($shareWith, $group)) { - $message = 'Sharing '.$itemSource.' failed, because the user '.$shareWith.' is a member of the original group share'; - \OC_Log::write('OCP\Share', $message, \OC_Log::ERROR); - throw new \Exception($message); - } } // Check if share permissions is granted if ((int)$checkReshare['permissions'] & self::PERMISSION_SHARE) { @@ -734,9 +713,12 @@ class Share { } $parent = null; if ($backend instanceof Share_Backend_File_Dependent) { - // NOTE Apps should start using the file cache ids in their tables $filePath = $backend->getFilePath($itemSource, $uidOwner); - $fileSource = \OC_FileCache::getId($filePath); + if ($itemType == 'file' && $itemType == 'folder') { + $fileSource = $itemSource; + } else { + $fileSource = \OC_FileCache::getId($filePath); + } if ($fileSource == -1) { $message = 'Sharing '.$itemSource.' failed, because the file could not be found in the file cache'; \OC_Log::write('OCP\Share', $message, \OC_Log::ERROR);