From 6e5e8c6b46f24027ee86284844f43e744a3f5f4c Mon Sep 17 00:00:00 2001 From: Michael Gapczynski Date: Thu, 7 Mar 2013 22:30:12 -0500 Subject: [PATCH 1/2] Fix #2080 and fix #2141 --- core/js/share.js | 88 ++++++++++++++++++-------------------------- lib/public/share.php | 25 ++++++++----- 2 files changed, 51 insertions(+), 62 deletions(-) diff --git a/core/js/share.js b/core/js/share.js index 34f24da4df..0b6afda59c 100644 --- a/core/js/share.js +++ b/core/js/share.js @@ -10,8 +10,9 @@ OC.Share={ // Load all share icons $.get(OC.filePath('core', 'ajax', 'share.php'), { fetch: 'getItemsSharedStatuses', itemType: itemType }, function(result) { if (result && result.status === 'success') { - $.each(result.data, function(item, hasLink) { - OC.Share.statuses[item] = hasLink; + $.each(result.data, function(item, data) { + OC.Share.statuses[item] = data; + var hasLink = data['link']; // Links override shared in terms of icon display if (hasLink) { var image = OC.imagePath('core', 'actions/public'); @@ -21,30 +22,33 @@ OC.Share={ if (itemType != 'file' && itemType != 'folder') { $('a.share[data-item="'+item+'"]').css('background', 'url('+image+') no-repeat center'); } else { - var file = $('tr').filterAttr('data-file', OC.basename(item)); + var file = $('tr').filterAttr('data-id', item); if (file.length > 0) { var action = $(file).find('.fileactions .action').filterAttr('data-action', 'Share'); var img = action.find('img').attr('src', image); action.addClass('permanent'); action.html(' '+t('core', 'Shared')).prepend(img); - } - var dir = $('#dir').val(); - if (dir.length > 1) { - var last = ''; - var path = dir; - // Search for possible parent folders that are shared - while (path != last) { - if (path == item) { - var action = $('.fileactions .action').filterAttr('data-action', 'Share'); - var img = action.find('img'); - if (img.attr('src') != OC.imagePath('core', 'actions/public')) { - img.attr('src', image); - action.addClass('permanent'); - action.html(' '+t('core', 'Shared')).prepend(img); + } else { + var dir = $('#dir').val(); + if (dir.length > 1) { + var last = ''; + var path = dir; + // Search for possible parent folders that are shared + while (path != last) { + if (path == data['path']) { + var actions = $('.fileactions .action').filterAttr('data-action', 'Share'); + $.each(actions, function(index, action) { + var img = $(action).find('img'); + if (img.attr('src') != OC.imagePath('core', 'actions/public')) { + img.attr('src', image); + $(action).addClass('permanent'); + $(action).html(' '+t('core', 'Shared')).prepend(img); + } + }); } + last = path; + path = OC.Share.dirname(path); } - last = path; - path = OC.Share.dirname(path); } } } @@ -53,15 +57,6 @@ OC.Share={ }); }, updateIcon:function(itemType, itemSource) { - if (itemType == 'file' || itemType == 'folder') { - var file = $('tr').filterAttr('data-id', String(itemSource)); - var filename = file.data('file'); - if ($('#dir').val() == '/') { - itemSource = $('#dir').val() + filename; - } else { - itemSource = $('#dir').val() + '/' + filename; - } - } var shares = false; var link = false; var image = OC.imagePath('core', 'actions/share'); @@ -83,18 +78,21 @@ OC.Share={ if (itemType != 'file' && itemType != 'folder') { $('a.share[data-item="'+itemSource+'"]').css('background', 'url('+image+') no-repeat center'); } else { - var action = $(file).find('.fileactions .action').filterAttr('data-action', 'Share'); - var img = action.find('img').attr('src', image); - if (shares) { - action.addClass('permanent'); - action.html(' '+t('core', 'Shared')).prepend(img); - } else { - action.removeClass('permanent'); - action.html(' '+t('core', 'Share')).prepend(img); + var file = $('tr').filterAttr('data-id', String(itemSource)); + if (file.length > 0) { + var action = $(file).find('.fileactions .action').filterAttr('data-action', 'Share'); + var img = action.find('img').attr('src', image); + if (shares) { + action.addClass('permanent'); + action.html(' '+t('core', 'Shared')).prepend(img); + } else { + action.removeClass('permanent'); + action.html(' '+t('core', 'Share')).prepend(img); + } } } if (shares) { - OC.Share.statuses[itemSource] = link; + OC.Share.statuses[itemSource]['link'] = link; } else { delete OC.Share.statuses[itemSource]; } @@ -102,21 +100,7 @@ OC.Share={ loadItem:function(itemType, itemSource) { var data = ''; 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') { + if (typeof OC.Share.statuses[itemSource] === 'undefined') { // NOTE: Check does not always work and misses some shares, fix later checkShares = true; } else { diff --git a/lib/public/share.php b/lib/public/share.php index 59f41a9bfd..d1ae0312bf 100644 --- a/lib/public/share.php +++ b/lib/public/share.php @@ -759,7 +759,7 @@ class Share { if ($format == self::FORMAT_STATUSES) { if ($itemType == 'file' || $itemType == 'folder') { $select = '`*PREFIX*share`.`id`, `item_type`, `*PREFIX*share`.`parent`,' - .' `share_type`, `file_source`, `path`, `expiration`'; + .' `share_type`, `file_source`, `path`, `expiration`, `storage`'; } else { $select = '`id`, `item_type`, `item_source`, `parent`, `share_type`, `expiration`'; } @@ -768,7 +768,7 @@ class Share { if ($itemType == 'file' || $itemType == 'folder') { $select = '`*PREFIX*share`.`id`, `item_type`, `*PREFIX*share`.`parent`,' .' `share_type`, `share_with`, `file_source`, `path`, `permissions`, `stime`,' - .' `expiration`, `token`'; + .' `expiration`, `token`, `storage`'; } else { $select = '`id`, `item_type`, `item_source`, `parent`, `share_type`, `share_with`, `permissions`,' .' `stime`, `file_source`, `expiration`, `token`'; @@ -804,6 +804,7 @@ class Share { $items = array(); $targets = array(); $switchedItems = array(); + $mounts = array(); while ($row = $result->fetchRow()) { // Filter out duplicate group shares for users with unique targets if ($row['share_type'] == self::$shareTypeGroupUserUnique && isset($items[$row['parent']])) { @@ -848,8 +849,13 @@ class Share { if (isset($row['parent'])) { $row['path'] = '/Shared/'.basename($row['path']); } else { - // Strip 'files' from path - $row['path'] = substr($row['path'], 5); + if (!isset($mounts[$row['storage']])) { + $mounts[$row['storage']] = \OC\Files\Mount::findByNumericId($row['storage']); + } + if ($mounts[$row['storage']]) { + $path = $mounts[$row['storage']]->getMountPoint().$row['path']; + $row['path'] = substr($path, $root); + } } } if (isset($row['expiration'])) { @@ -957,15 +963,14 @@ 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_LINK) { - $statuses[$item[$column]] = true; + $statuses[$item[$column]]['link'] = true; } else if (!isset($statuses[$item[$column]])) { - $statuses[$item[$column]] = false; + $statuses[$item[$column]]['link'] = false; + } + if ($itemType == 'file' || $itemType == 'folder') { + $statuses[$item[$column]]['path'] = $item['path']; } } return $statuses; From 9ad03b61a357fa1edb322ffd1aab4d62daa856e5 Mon Sep 17 00:00:00 2001 From: Bernhard Posselt Date: Fri, 8 Mar 2013 17:29:05 +0100 Subject: [PATCH 2/2] Update share.js Added HTML escaping --- core/js/share.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/js/share.js b/core/js/share.js index 0b6afda59c..8e767663f1 100644 --- a/core/js/share.js +++ b/core/js/share.js @@ -84,10 +84,10 @@ OC.Share={ var img = action.find('img').attr('src', image); if (shares) { action.addClass('permanent'); - action.html(' '+t('core', 'Shared')).prepend(img); + action.html(' '+ escapeHTML(t('core', 'Shared'))).prepend(img); } else { action.removeClass('permanent'); - action.html(' '+t('core', 'Share')).prepend(img); + action.html(' '+ escapeHTML(t('core', 'Share'))).prepend(img); } } }