summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoas Schilling <nickvergessen@owncloud.com>2015-02-27 16:04:17 +0100
committerJoas Schilling <nickvergessen@owncloud.com>2015-05-04 10:42:21 +0200
commit6a6acd2a465e6d5f4c831a0a8107b89f3acc91e8 (patch)
treeb58a288cf53f18a424dc3d1868b2c42a98c50928
parenta2af0aae5e556d603a16aea406f2d8d23f5c7508 (diff)
downloadnextcloud-server-6a6acd2a465e6d5f4c831a0a8107b89f3acc91e8.tar.gz
nextcloud-server-6a6acd2a465e6d5f4c831a0a8107b89f3acc91e8.zip
Correctly get the unique mountpoint name when mounting the share
Previously the mount name was checked for uniqueness prior to inserting the share. This caused problems, when two shares with the same name where done or folder, mount point, local share with the same name was done, between sending and accepting of the remote share
-rw-r--r--apps/files_sharing/ajax/external.php2
-rw-r--r--apps/files_sharing/api/server2server.php2
-rw-r--r--apps/files_sharing/lib/external/manager.php41
3 files changed, 36 insertions, 9 deletions
diff --git a/apps/files_sharing/ajax/external.php b/apps/files_sharing/ajax/external.php
index 30c1f38801e..153285e11ff 100644
--- a/apps/files_sharing/ajax/external.php
+++ b/apps/files_sharing/ajax/external.php
@@ -38,8 +38,6 @@ $externalManager = new \OCA\Files_Sharing\External\Manager(
\OC::$server->getUserSession()->getUser()->getUID()
);
-$name = OCP\Files::buildNotExistingFileName('/', $name);
-
// check for ssl cert
if (substr($remote, 0, 5) === 'https' and !OC_Util::getUrlContent($remote)) {
\OCP\JSON::error(array('data' => array('message' => $l->t('Invalid or untrusted SSL certificate'))));
diff --git a/apps/files_sharing/api/server2server.php b/apps/files_sharing/api/server2server.php
index f2f7561598f..89a0262481c 100644
--- a/apps/files_sharing/api/server2server.php
+++ b/apps/files_sharing/api/server2server.php
@@ -64,8 +64,6 @@ class Server2Server {
$shareWith
);
- $name = \OCP\Files::buildNotExistingFileName('/', $name);
-
try {
$externalManager->addShare($remote, $token, '', $name, $owner, false, $shareWith, $remoteId);
diff --git a/apps/files_sharing/lib/external/manager.php b/apps/files_sharing/lib/external/manager.php
index 490e5e5003d..eb030656894 100644
--- a/apps/files_sharing/lib/external/manager.php
+++ b/apps/files_sharing/lib/external/manager.php
@@ -9,6 +9,7 @@
namespace OCA\Files_Sharing\External;
use OC\Files\Filesystem;
+use OCP\Files;
class Manager {
const STORAGE = '\OCA\Files_Sharing\External\Storage';
@@ -71,15 +72,39 @@ class Manager {
$user = $user ? $user : $this->uid;
$accepted = $accepted ? 1 : 0;
+ $name = Filesystem::normalizePath('/' . $name);
- $mountPoint = Filesystem::normalizePath('/' . $name);
+ if ($accepted) {
+ $mountPoint = Files::buildNotExistingFileName('/', $name);
+ $mountPoint = Filesystem::normalizePath('/' . $mountPoint);
+ $hash = md5($mountPoint);
+ } else {
+ // To avoid conflicts with the mount point generation later,
+ // we only use a temporary mount point name here. The real
+ // mount point name will be generated when accepting the share,
+ // using the original share item name.
+ $tmpMountPointName = Filesystem::normalizePath('/TemporaryMountPointName-' . $name);
+ $mountPoint = $tmpMountPointName;
+ $hash = md5($tmpMountPointName);
+
+ $query = $this->connection->prepare('SELECT `id` FROM `*PREFIX*share_external` WHERE `user` = ? AND `mountpoint_hash` = ?', 1);
+ $query->execute([$user, $hash]);
+
+ $i = 1;
+ while ($query->fetch()) {
+ // The external share already exists for the user
+ $mountPoint = $tmpMountPointName . '-' . $i;
+ $hash = md5($mountPoint);
+ $query->execute([$user, $hash]);
+ $i++;
+ }
+ }
$query = $this->connection->prepare('
INSERT INTO `*PREFIX*share_external`
(`remote`, `share_token`, `password`, `name`, `owner`, `user`, `mountpoint`, `mountpoint_hash`, `accepted`, `remote_id`)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
');
- $hash = md5($mountPoint);
$query->execute(array($remote, $token, $password, $name, $owner, $user, $mountPoint, $hash, $accepted, $remoteId));
if ($accepted) {
@@ -124,7 +149,7 @@ class Manager {
*/
private function getShare($id) {
$getShare = $this->connection->prepare('
- SELECT `remote`, `share_token`
+ SELECT `remote`, `share_token`, `name`
FROM `*PREFIX*share_external`
WHERE `id` = ? AND `user` = ?');
$result = $getShare->execute(array($id, $this->uid));
@@ -142,11 +167,17 @@ class Manager {
$share = $this->getShare($id);
if ($share) {
+ $mountPoint = Files::buildNotExistingFileName('/', $share['name']);
+ $mountPoint = Filesystem::normalizePath('/' . $mountPoint);
+ $hash = md5($mountPoint);
+
$acceptShare = $this->connection->prepare('
UPDATE `*PREFIX*share_external`
- SET `accepted` = ?
+ SET `accepted` = ?,
+ `mountpoint` = ?,
+ `mountpoint_hash` = ?
WHERE `id` = ? AND `user` = ?');
- $acceptShare->execute(array(1, $id, $this->uid));
+ $acceptShare->execute(array(1, $mountPoint, $hash, $id, $this->uid));
$this->sendFeedbackToRemote($share['remote'], $share['share_token'], $id, 'accept');
}
}