summaryrefslogtreecommitdiffstats
path: root/lib/private/share20
diff options
context:
space:
mode:
authorThomas Müller <thomas.mueller@tmit.eu>2016-02-02 13:34:50 +0100
committerThomas Müller <thomas.mueller@tmit.eu>2016-02-02 13:34:50 +0100
commitce053b980860070957bedb13e6fcd9d45fe50b9b (patch)
tree4d31c74f75d43629b815d4184e3f93be46f1cee1 /lib/private/share20
parent2d1d89ee29e49412192b051412755610e0538198 (diff)
parent2316cb1f8b9704621b47e6eb1c2cbf30c06c552d (diff)
downloadnextcloud-server-ce053b980860070957bedb13e6fcd9d45fe50b9b.tar.gz
nextcloud-server-ce053b980860070957bedb13e6fcd9d45fe50b9b.zip
Merge pull request #22013 from owncloud/share2_moveshare
[Share 2.0] Allow moving of shares
Diffstat (limited to 'lib/private/share20')
-rw-r--r--lib/private/share20/defaultshareprovider.php58
-rw-r--r--lib/private/share20/manager.php19
2 files changed, 77 insertions, 0 deletions
diff --git a/lib/private/share20/defaultshareprovider.php b/lib/private/share20/defaultshareprovider.php
index ed9c03020b6..224dddf4019 100644
--- a/lib/private/share20/defaultshareprovider.php
+++ b/lib/private/share20/defaultshareprovider.php
@@ -20,6 +20,7 @@
*/
namespace OC\Share20;
+use OCP\Files\File;
use OCP\Share\IShareProvider;
use OC\Share20\Exception\InvalidShare;
use OC\Share20\Exception\ProviderException;
@@ -384,6 +385,63 @@ class DefaultShareProvider implements IShareProvider {
}
/**
+ * @inheritdoc
+ */
+ public function move(\OCP\Share\IShare $share, IUser $recipient) {
+ if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
+ // Just update the target
+ $qb = $this->dbConn->getQueryBuilder();
+ $qb->update('share')
+ ->set('file_target', $qb->createNamedParameter($share->getTarget()))
+ ->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId())))
+ ->execute();
+
+ } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
+
+ // Check if there is a usergroup share
+ $qb = $this->dbConn->getQueryBuilder();
+ $stmt = $qb->select('id')
+ ->from('share')
+ ->where($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)))
+ ->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($recipient->getUID())))
+ ->andWhere($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
+ ->setMaxResults(1)
+ ->execute();
+
+ $data = $stmt->fetch();
+ $stmt->closeCursor();
+
+ if ($data === false) {
+ // No usergroup share yet. Create one.
+ $qb = $this->dbConn->getQueryBuilder();
+ $qb->insert('share')
+ ->values([
+ 'share_type' => $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP),
+ 'share_with' => $qb->createNamedParameter($recipient->getUID()),
+ 'uid_owner' => $qb->createNamedParameter($share->getShareOwner()->getUID()),
+ 'uid_initiator' => $qb->createNamedParameter($share->getSharedBy()->getUID()),
+ 'parent' => $qb->createNamedParameter($share->getId()),
+ 'item_type' => $qb->createNamedParameter($share->getNode() instanceof File ? 'file' : 'folder'),
+ 'item_source' => $qb->createNamedParameter($share->getNode()->getId()),
+ 'file_source' => $qb->createNamedParameter($share->getNode()->getId()),
+ 'file_target' => $qb->createNamedParameter($share->getTarget()),
+ 'permissions' => $qb->createNamedParameter($share->getPermissions()),
+ 'stime' => $qb->createNamedParameter($share->getShareTime()->getTimestamp()),
+ ])->execute();
+ } else {
+ // Already a usergroup share. Update it.
+ $qb = $this->dbConn->getQueryBuilder();
+ $qb->update('share')
+ ->set('file_target', $qb->createNamedParameter($share->getTarget()))
+ ->where($qb->expr()->eq('id', $qb->createNamedParameter($data['id'])))
+ ->execute();
+ }
+ }
+
+ return $share;
+ }
+
+ /**
* Get all shares by the given user. Sharetype and path can be used to filter.
*
* @param IUser $user
diff --git a/lib/private/share20/manager.php b/lib/private/share20/manager.php
index ac82fe05df4..b22b81bb404 100644
--- a/lib/private/share20/manager.php
+++ b/lib/private/share20/manager.php
@@ -715,6 +715,25 @@ class Manager implements IManager {
}
/**
+ * @inheritdoc
+ */
+ public function moveShare(\OCP\Share\IShare $share, IUser $recipient) {
+ if ($share->getShareType() === \OCP\Share::SHARE_TYPE_LINK) {
+ throw new \InvalidArgumentException('Can\'t change target of link share');
+ }
+
+ if (($share->getShareType() === \OCP\Share::SHARE_TYPE_USER && $share->getSharedWith() !== $recipient) ||
+ ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP && !$share->getSharedWith()->inGroup($recipient))) {
+ throw new \InvalidArgumentException('Invalid recipient');
+ }
+
+ list($providerId, ) = $this->splitFullId($share->getId());
+ $provider = $this->factory->getProvider($providerId);
+
+ $provider->move($share, $recipient);
+ }
+
+ /**
* Get shares shared by (initiated) by the provided user.
*
* @param IUser $user