Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 9 additions & 8 deletions apps/files_sharing/lib/mountprovider.php
Original file line number Diff line number Diff line change
Expand Up @@ -55,19 +55,20 @@ public function getMountsForUser(IUser $user, IStorageFactory $storageFactory) {
$shares = array_filter($shares, function ($share) {
return $share['permissions'] > 0;
});
$shares = array_map(function ($share) use ($user, $storageFactory) {

return new SharedMount(
$mounts = [];
foreach ($shares as $share) {
$mounts[] = new SharedMount(
'\OC\Files\Storage\Shared',
'/' . $user->getUID() . '/' . $share['file_target'],
array(
$mounts,
[
'share' => $share,
'user' => $user->getUID()
),
],
$storageFactory
);
}, $shares);
}

// array_filter removes the null values from the array
return array_filter($shares);
return array_filter($mounts);
}
}
47 changes: 40 additions & 7 deletions apps/files_sharing/lib/sharedmount.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@

namespace OCA\Files_Sharing;

use OC\Files\Filesystem;
use OC\Files\Mount\MountPoint;
use OC\Files\Mount\MoveableMount;
use OC\Files\View;
Expand All @@ -50,14 +51,14 @@ class SharedMount extends MountPoint implements MoveableMount {

/**
* @param string $storage
* @param string $mountpoint
* @param SharedMount[] $mountpoints
* @param array|null $arguments
* @param \OCP\Files\Storage\IStorageFactory $loader
*/
public function __construct($storage, $mountpoint, $arguments = null, $loader = null) {
public function __construct($storage, array $mountpoints, $arguments = null, $loader = null) {
$this->user = $arguments['user'];
$this->recipientView = new View('/' . $this->user . '/files');
$newMountPoint = $this->verifyMountPoint($arguments['share']);
$newMountPoint = $this->verifyMountPoint($arguments['share'], $mountpoints);
$absMountPoint = '/' . $this->user . '/files' . $newMountPoint;
$arguments['ownerView'] = new View('/' . $arguments['share']['uid_owner'] . '/files');
parent::__construct($storage, $absMountPoint, $arguments, $loader);
Expand All @@ -67,9 +68,10 @@ public function __construct($storage, $mountpoint, $arguments = null, $loader =
* check if the parent folder exists otherwise move the mount point up
*
* @param array $share
* @param SharedMount[] $mountpoints
* @return string
*/
private function verifyMountPoint(&$share) {
private function verifyMountPoint(&$share, array $mountpoints) {

$mountPoint = basename($share['file_target']);
$parent = dirname($share['file_target']);
Expand All @@ -78,10 +80,10 @@ private function verifyMountPoint(&$share) {
$parent = Helper::getShareFolder();
}

$newMountPoint = \OCA\Files_Sharing\Helper::generateUniqueTarget(
$newMountPoint = $this->generateUniqueTarget(
\OC\Files\Filesystem::normalizePath($parent . '/' . $mountPoint),
[],
$this->recipientView
$this->recipientView,
$mountpoints
);

if ($newMountPoint !== $share['file_target']) {
Expand All @@ -93,6 +95,37 @@ private function verifyMountPoint(&$share) {
return $newMountPoint;
}

/**
* @param string $path
* @param View $view
* @param SharedMount[] $mountpoints
* @return mixed
*/
private function generateUniqueTarget($path, $view, array $mountpoints) {
$pathinfo = pathinfo($path);
$ext = (isset($pathinfo['extension'])) ? '.'.$pathinfo['extension'] : '';
$name = $pathinfo['filename'];
$dir = $pathinfo['dirname'];

// Helper function to find existing mount points
$mountpointExists = function($path) use ($mountpoints) {
foreach ($mountpoints as $mountpoint) {
if ($mountpoint->getShare()['file_target'] === $path) {
return true;
}
}
return false;
};

$i = 2;
while ($view->file_exists($path) || $mountpointExists($path)) {
$path = Filesystem::normalizePath($dir . '/' . $name . ' ('.$i.')' . $ext);
$i++;
}

return $path;
}

/**
* update fileTarget in the database if the mount point changed
*
Expand Down
12 changes: 12 additions & 0 deletions build/integration/features/sharing-v1.feature
Original file line number Diff line number Diff line change
Expand Up @@ -670,3 +670,15 @@ Feature: sharing
When as "user1" gets properties of folder "/tmp" with
|{http://owncloud.org/ns}share-permissions|
Then the single response should contain a property "{http://owncloud.org/ns}share-permissions" with value "15"

Scenario: unique target names for incomming shares
Given user "user0" exists
And user "user1" exists
And user "user2" exists
And user "user0" created a folder "/foo"
And user "user1" created a folder "/foo"
When file "/foo" of user "user0" is shared with user "user2"
And file "/foo" of user "user1" is shared with user "user2"
Then user "user2" should see following elements
| /foo/ |
| /foo%20(2)/ |