]> source.dussan.org Git - nextcloud-server.git/commitdiff
Correctly get the unique mountpoint name when mounting the share
authorJoas Schilling <nickvergessen@owncloud.com>
Fri, 27 Feb 2015 15:04:17 +0000 (16:04 +0100)
committerJoas Schilling <nickvergessen@owncloud.com>
Tue, 17 Mar 2015 15:03:24 +0000 (16:03 +0100)
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

apps/files_sharing/ajax/external.php
apps/files_sharing/api/server2server.php
apps/files_sharing/lib/external/manager.php

index 30c1f38801ea457fdb3b02a15fef97248ed17d34..153285e11ffb37ccbb7964e0597f3b90055942ad 100644 (file)
@@ -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'))));
index f2f7561598fd380d1c76cd36d3a6ad6fc074cb9e..89a0262481c9beaa974ff17c9b614842d7c638fe 100644 (file)
@@ -64,8 +64,6 @@ class Server2Server {
                                        $shareWith
                                );
 
-                       $name = \OCP\Files::buildNotExistingFileName('/', $name);
-
                        try {
                                $externalManager->addShare($remote, $token, '', $name, $owner, false, $shareWith, $remoteId);
 
index 8985aeb3fcecdbbe819be7da6292e048d3d3aa46..eb030656894e710a5ef6ebb3fa378cbdcd411988 100644 (file)
@@ -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');
                }
        }
@@ -321,4 +352,4 @@ class Manager {
                return $result ? $openShares->fetchAll() : array();
 
        }
-}
\ No newline at end of file
+}