summaryrefslogtreecommitdiffstats
path: root/apps/files_sharing/lib
diff options
context:
space:
mode:
Diffstat (limited to 'apps/files_sharing/lib')
-rw-r--r--apps/files_sharing/lib/activity.php2
-rw-r--r--apps/files_sharing/lib/connector/publicauth.php2
-rw-r--r--apps/files_sharing/lib/controllers/externalsharescontroller.php86
-rw-r--r--apps/files_sharing/lib/external/manager.php136
-rw-r--r--apps/files_sharing/lib/helper.php28
-rw-r--r--apps/files_sharing/lib/share/file.php14
-rw-r--r--apps/files_sharing/lib/updater.php7
7 files changed, 234 insertions, 41 deletions
diff --git a/apps/files_sharing/lib/activity.php b/apps/files_sharing/lib/activity.php
index 979df1c1da6..868830d80cd 100644
--- a/apps/files_sharing/lib/activity.php
+++ b/apps/files_sharing/lib/activity.php
@@ -98,7 +98,7 @@ class Activity implements \OCP\Activity\IExtension {
case self::SUBJECT_REMOTE_SHARE_DECLINED:
return $l->t('%1$s declined remote share %2$s', $params)->__toString();
case self::SUBJECT_REMOTE_SHARE_UNSHARED:
- return $l->t('%1$s unshared %2$s', $params)->__toString();
+ return $l->t('%1$s unshared %2$s from you', $params)->__toString();
}
}
}
diff --git a/apps/files_sharing/lib/connector/publicauth.php b/apps/files_sharing/lib/connector/publicauth.php
index 4144dafa379..a630d091fd4 100644
--- a/apps/files_sharing/lib/connector/publicauth.php
+++ b/apps/files_sharing/lib/connector/publicauth.php
@@ -69,6 +69,8 @@ class PublicAuth extends \Sabre\DAV\Auth\Backend\AbstractBasic {
} else {
return false;
}
+ } elseif ($linkItem['share_type'] == \OCP\Share::SHARE_TYPE_REMOTE) {
+ return true;
} else {
return false;
}
diff --git a/apps/files_sharing/lib/controllers/externalsharescontroller.php b/apps/files_sharing/lib/controllers/externalsharescontroller.php
new file mode 100644
index 00000000000..773ff8ce981
--- /dev/null
+++ b/apps/files_sharing/lib/controllers/externalsharescontroller.php
@@ -0,0 +1,86 @@
+<?php
+/**
+ * @author Lukas Reschke <lukas@owncloud.com>
+ * @copyright 2014 Lukas Reschke
+ *
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace OCA\Files_Sharing\Controllers;
+
+use OC;
+use OCP;
+use OCP\AppFramework\Controller;
+use OCP\IRequest;
+use OCP\AppFramework\Http\JSONResponse;
+
+/**
+ * Class ExternalSharesController
+ *
+ * @package OCA\Files_Sharing\Controllers
+ */
+class ExternalSharesController extends Controller {
+
+ /** @var bool */
+ private $incomingShareEnabled;
+ /** @var \OCA\Files_Sharing\External\Manager */
+ private $externalManager;
+
+ /**
+ * @param string $appName
+ * @param IRequest $request
+ * @param \OCA\Files_Sharing\External\Manager $externalManager
+ */
+ public function __construct($appName,
+ IRequest $request,
+ $incomingShareEnabled,
+ \OCA\Files_Sharing\External\Manager $externalManager) {
+ parent::__construct($appName, $request);
+ $this->incomingShareEnabled = $incomingShareEnabled;
+ $this->externalManager = $externalManager;
+ }
+
+ /**
+ * @NoAdminRequired
+ *
+ * @return JSONResponse
+ */
+ public function index() {
+ $shares = [];
+ if ($this->incomingShareEnabled) {
+ $shares = $this->externalManager->getOpenShares();
+ }
+ return new JSONResponse($shares);
+ }
+
+ /**
+ * @NoAdminRequired
+ *
+ * @param int $id
+ * @return JSONResponse
+ */
+ public function create($id) {
+ if ($this->incomingShareEnabled) {
+ $this->externalManager->acceptShare($id);
+ }
+
+ return new JSONResponse();
+ }
+
+ /**
+ * @NoAdminRequired
+ *
+ * @param $id
+ * @return JSONResponse
+ */
+ public function destroy($id) {
+ if ($this->incomingShareEnabled) {
+ $this->externalManager->declineShare($id);
+ }
+
+ return new JSONResponse();
+ }
+
+}
diff --git a/apps/files_sharing/lib/external/manager.php b/apps/files_sharing/lib/external/manager.php
index b52e1a5044e..665e47c0fe9 100644
--- a/apps/files_sharing/lib/external/manager.php
+++ b/apps/files_sharing/lib/external/manager.php
@@ -34,25 +34,41 @@ class Manager {
private $userSession;
/**
+ * @var \OC\HTTPHelper
+ */
+ private $httpHelper;
+
+ /**
* @param \OCP\IDBConnection $connection
* @param \OC\Files\Mount\Manager $mountManager
* @param \OC\User\Session $userSession
* @param \OC\Files\Storage\StorageFactory $storageLoader
*/
public function __construct(\OCP\IDBConnection $connection, \OC\Files\Mount\Manager $mountManager,
- \OC\Files\Storage\StorageFactory $storageLoader, \OC\User\Session $userSession) {
+ \OC\Files\Storage\StorageFactory $storageLoader, \OC\User\Session $userSession, \OC\HTTPHelper $httpHelper) {
$this->connection = $connection;
$this->mountManager = $mountManager;
$this->userSession = $userSession;
$this->storageLoader = $storageLoader;
+ $this->httpHelper = $httpHelper;
}
- public function addShare($remote, $token, $password, $name, $owner) {
- $user = $this->userSession->getUser();
- if ($user) {
- $mountPoint = Filesystem::normalizePath('/' . $name);
- \OCA\Files_Sharing\Helper::addServer2ServerShare($remote, $token, $name, $mountPoint, $owner, $user->getUID(), $password, -1, true);
+ public function addShare($remote, $token, $password, $name, $owner, $accepted=false, $user = null, $remoteId = -1) {
+
+ $user = $user ? $user: $this->userSession->getUser()->getUID();
+ $accepted = $accepted ? 1 : 0;
+ $mountPoint = Filesystem::normalizePath('/' . $name);
+
+ $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) {
$options = array(
'remote' => $remote,
'token' => $token,
@@ -87,12 +103,85 @@ class Manager {
}
}
+ /**
+ * get share
+ *
+ * @param int $id share id
+ * @return mixed share of false
+ */
+ private function getShare($id) {
+ $getShare = $this->connection->prepare('
+ SELECT `remote`, `share_token`
+ FROM `*PREFIX*share_external`
+ WHERE `id` = ? AND `user` = ?');
+ $result = $getShare->execute(array($id, $this->userSession->getUser()->getUID()));
+
+ return $result ? $getShare->fetch() : false;
+ }
+
+ /**
+ * accept server-to-server share
+ *
+ * @param int $id
+ */
+ public function acceptShare($id) {
+
+ $share = $this->getShare($id);
+
+ if ($share) {
+ $acceptShare = $this->connection->prepare('
+ UPDATE `*PREFIX*share_external`
+ SET `accepted` = ?
+ WHERE `id` = ? AND `user` = ?');
+ $acceptShare->execute(array(1, $id, $this->userSession->getUser()->getUID()));
+ $this->sendFeedbackToRemote($share['remote'], $share['share_token'], $id, 'accept');
+ }
+ }
+
+ /**
+ * decline server-to-server share
+ *
+ * @param int $id
+ */
+ public function declineShare($id) {
+
+ $share = $this->getShare($id);
+
+ if ($share) {
+ $removeShare = $this->connection->prepare('
+ DELETE FROM `*PREFIX*share_external` WHERE `id` = ? AND `user` = ?');
+ $removeShare->execute(array($id, $this->userSession->getUser()->getUID()));
+ $this->sendFeedbackToRemote($share['remote'], $share['share_token'], $id, 'decline');
+ }
+ }
+
+ /**
+ * inform remote server whether server-to-server share was accepted/declined
+ *
+ * @param string $remote
+ * @param string $token
+ * @param int $id
+ * @param string $feedback
+ * @return boolean
+ */
+ private function sendFeedbackToRemote($remote, $token, $id, $feedback) {
+
+ $url = $remote . \OCP\Share::BASE_PATH_TO_SHARE_API . '/' . $id . '/' . $feedback . '?format=' . \OCP\Share::RESPONSE_FORMAT;
+ $fields = array('token' => $token);
+
+ $result = $this->httpHelper->post($url, $fields);
+ $status = json_decode($result['result'], true);
+
+ return ($result['success'] && $status['ocs']['meta']['statuscode'] === 100);
+ }
+
public static function setup() {
$externalManager = new \OCA\Files_Sharing\External\Manager(
- \OC::$server->getDatabaseConnection(),
- \OC\Files\Filesystem::getMountManager(),
- \OC\Files\Filesystem::getLoader(),
- \OC::$server->getUserSession()
+ \OC::$server->getDatabaseConnection(),
+ \OC\Files\Filesystem::getMountManager(),
+ \OC\Files\Filesystem::getLoader(),
+ \OC::$server->getUserSession(),
+ \OC::$server->getHTTPHelper()
);
$externalManager->setupMounts();
}
@@ -151,6 +240,18 @@ class Manager {
$user = $this->userSession->getUser();
$mountPoint = $this->stripPath($mountPoint);
$hash = md5($mountPoint);
+
+ $getShare = $this->connection->prepare('
+ SELECT `remote`, `share_token`, `remote_id`
+ FROM `*PREFIX*share_external`
+ WHERE `mountpoint_hash` = ? AND `user` = ?');
+ $result = $getShare->execute(array($hash, $user->getUID()));
+
+ if ($result) {
+ $share = $getShare->fetch();
+ $this->sendFeedbackToRemote($share['remote'], $share['share_token'], $share['remote_id'], 'decline');
+ }
+
$query = $this->connection->prepare('
DELETE FROM `*PREFIX*share_external`
WHERE `mountpoint_hash` = ?
@@ -158,4 +259,17 @@ class Manager {
');
return (bool)$query->execute(array($hash, $user->getUID()));
}
-}
+
+ /**
+ * return a list of shares which are not yet accepted by the user
+ *
+ * @return array list of open server-to-server shares
+ */
+ public function getOpenShares() {
+ $openShares = $this->connection->prepare('SELECT * FROM `*PREFIX*share_external` WHERE `accepted` = ? AND `user` = ?');
+ $result = $openShares->execute(array(0, $this->userSession->getUser()->getUID()));
+
+ return $result ? $openShares->fetchAll() : array();
+
+ }
+} \ No newline at end of file
diff --git a/apps/files_sharing/lib/helper.php b/apps/files_sharing/lib/helper.php
index 71519bd1d4a..001d0387fa4 100644
--- a/apps/files_sharing/lib/helper.php
+++ b/apps/files_sharing/lib/helper.php
@@ -2,8 +2,6 @@
namespace OCA\Files_Sharing;
-use OC_Config;
-
class Helper {
public static function registerHooks() {
@@ -21,30 +19,6 @@ class Helper {
}
/**
- * add server-to-server share to database
- *
- * @param string $remote
- * @param string $token
- * @param string $name
- * @param string $mountPoint
- * @param string $owner
- * @param string $user
- * @param string $password
- * @param int $remoteId
- * @param bool $accepted
- */
- public static function addServer2ServerShare($remote, $token, $name, $mountPoint, $owner, $user, $password='', $remoteId=-1, $accepted = false) {
- $accepted = $accepted ? 1 : 0;
- $query = \OCP\DB::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));
- }
-
- /**
* Sets up the filesystem and user for public sharing
* @param string $token string share token
* @param string $relativePath optional path relative to the share
@@ -89,7 +63,7 @@ class Helper {
exit();
}
- if (isset($linkItem['share_with'])) {
+ if (isset($linkItem['share_with']) && (int)$linkItem['share_type'] === \OCP\Share::SHARE_TYPE_LINK) {
if (!self::authenticate($linkItem, $password)) {
\OC_Response::setStatus(403);
\OCP\JSON::error(array('success' => false));
diff --git a/apps/files_sharing/lib/share/file.php b/apps/files_sharing/lib/share/file.php
index a5b4e75bceb..93e4af3c393 100644
--- a/apps/files_sharing/lib/share/file.php
+++ b/apps/files_sharing/lib/share/file.php
@@ -160,6 +160,20 @@ class OC_Share_Backend_File implements OCP\Share_Backend_File_Dependent {
}
/**
+ * check if server2server share is enabled
+ *
+ * @param int $shareType
+ * @return boolean
+ */
+ public function isShareTypeAllowed($shareType) {
+ if ($shareType === \OCP\Share::SHARE_TYPE_REMOTE) {
+ return \OCA\Files_Sharing\Helper::isOutgoingServer2serverShareEnabled();
+ }
+
+ return true;
+ }
+
+ /**
* resolve reshares to return the correct source item
* @param array $source
* @return array source item
diff --git a/apps/files_sharing/lib/updater.php b/apps/files_sharing/lib/updater.php
index a34140f5a35..9d8ae7cbb4f 100644
--- a/apps/files_sharing/lib/updater.php
+++ b/apps/files_sharing/lib/updater.php
@@ -161,7 +161,10 @@ class Shared_Updater {
*/
static public function postUnshareHook($params) {
- if ($params['itemType'] === 'file' || $params['itemType'] === 'folder') {
+ // only update etags for file/folders shared to local users/groups
+ if (($params['itemType'] === 'file' || $params['itemType'] === 'folder') &&
+ $params['shareType'] !== \OCP\Share::SHARE_TYPE_LINK &&
+ $params['shareType'] !== \OCP\Share::SHARE_TYPE_REMOTE) {
$deletedShares = isset($params['deletedShares']) ? $params['deletedShares'] : array();
@@ -212,7 +215,7 @@ class Shared_Updater {
/**
* rename mount point from the children if the parent was renamed
- *
+ *
* @param string $oldPath old path relative to data/user/files
* @param string $newPath new path relative to data/user/files
*/