From dcdbea54e60d13d2508b71ebdcb7992f2ae5ef34 Mon Sep 17 00:00:00 2001
From: Joas Schilling <coding@schilljs.com>
Date: Wed, 21 Aug 2019 16:15:23 +0200
Subject: [PATCH] Respect the accepted flag for group and user shares

Signed-off-by: Joas Schilling <coding@schilljs.com>
---
 apps/files_sharing/lib/External/Manager.php  |  3 +-
 apps/files_sharing/lib/MountProvider.php     | 12 ++++++-
 lib/private/Share20/DefaultShareProvider.php |  3 ++
 lib/private/Share20/Share.php                | 17 ++++++++++
 lib/public/Share/IShare.php                  | 34 ++++++++++++++++++++
 5 files changed, 67 insertions(+), 2 deletions(-)

diff --git a/apps/files_sharing/lib/External/Manager.php b/apps/files_sharing/lib/External/Manager.php
index 0cf7d899234..aeb95a8f2f9 100644
--- a/apps/files_sharing/lib/External/Manager.php
+++ b/apps/files_sharing/lib/External/Manager.php
@@ -44,6 +44,7 @@ use OCP\IUserManager;
 use OCP\Notification\IManager;
 use OCP\OCS\IDiscoveryService;
 use OCP\Share;
+use OCP\Share\IShare;
 
 class Manager {
 	const STORAGE = '\OCA\Files_Sharing\External\Storage';
@@ -151,7 +152,7 @@ class Manager {
 	public function addShare($remote, $token, $password, $name, $owner, $shareType, $accepted=false, $user = null, $remoteId = -1, $parent = -1) {
 
 		$user = $user ? $user : $this->uid;
-		$accepted = $accepted ? 1 : 0;
+		$accepted = $accepted ? IShare::STATUS_ACCEPTED : IShare::STATUS_PENDING;
 		$name = Filesystem::normalizePath('/' . $name);
 
 		if (!$accepted) {
diff --git a/apps/files_sharing/lib/MountProvider.php b/apps/files_sharing/lib/MountProvider.php
index 47a787350d5..1f733969966 100644
--- a/apps/files_sharing/lib/MountProvider.php
+++ b/apps/files_sharing/lib/MountProvider.php
@@ -35,6 +35,7 @@ use OCP\IConfig;
 use OCP\ILogger;
 use OCP\IUser;
 use OCP\Share\IManager;
+use OCP\Share\IShare;
 
 class MountProvider implements IMountProvider {
 	/**
@@ -94,6 +95,11 @@ class MountProvider implements IMountProvider {
 			try {
 				/** @var \OCP\Share\IShare $parentShare */
 				$parentShare = $share[0];
+
+				if ($parentShare->getStatus() !== IShare::STATUS_ACCEPTED) {
+					continue;
+				}
+
 				$owner = $parentShare->getShareOwner();
 				if (!isset($ownerViews[$owner])) {
 					$ownerViews[$owner] = new View('/' . $parentShare->getShareOwner() . '/files');
@@ -188,8 +194,11 @@ class MountProvider implements IMountProvider {
 
 			// use most permissive permissions
 			$permissions = 0;
+			$status = IShare::STATUS_PENDING;
 			foreach ($shares as $share) {
 				$permissions |= $share->getPermissions();
+				$status = max($status, $share->getStatus());
+
 				if ($share->getTarget() !== $superShare->getTarget()) {
 					// adjust target, for database consistency
 					$share->setTarget($superShare->getTarget());
@@ -216,7 +225,8 @@ class MountProvider implements IMountProvider {
 				}
 			}
 
-			$superShare->setPermissions($permissions);
+			$superShare->setPermissions($permissions)
+				->setStatus($status);
 
 			$result[] = [$superShare, $shares];
 		}
diff --git a/lib/private/Share20/DefaultShareProvider.php b/lib/private/Share20/DefaultShareProvider.php
index 05b3094e6a2..61c62364153 100644
--- a/lib/private/Share20/DefaultShareProvider.php
+++ b/lib/private/Share20/DefaultShareProvider.php
@@ -142,6 +142,7 @@ class DefaultShareProvider implements IShareProvider {
 		if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
 			//Set the UID of the user we share with
 			$qb->setValue('share_with', $qb->createNamedParameter($share->getSharedWith()));
+			$qb->setValue('accepted', $qb->createNamedParameter(IShare::STATUS_PENDING));
 		} else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
 			//Set the GID of the group we share with
 			$qb->setValue('share_with', $qb->createNamedParameter($share->getSharedWith()));
@@ -932,6 +933,7 @@ class DefaultShareProvider implements IShareProvider {
 			->setTarget($data['file_target'])
 			->setNote($data['note'])
 			->setMailSend((bool)$data['mail_send'])
+			->setStatus((int)$data['accepted'])
 			->setLabel($data['label']);
 
 		$shareTime = new \DateTime();
@@ -1020,6 +1022,7 @@ class DefaultShareProvider implements IShareProvider {
 
 			while($data = $stmt->fetch()) {
 				$shareMap[$data['parent']]->setPermissions((int)$data['permissions']);
+				$shareMap[$data['parent']]->setStatus((int)$data['accepted']);
 				$shareMap[$data['parent']]->setTarget($data['file_target']);
 				$shareMap[$data['parent']]->setParent($data['parent']);
 			}
diff --git a/lib/private/Share20/Share.php b/lib/private/Share20/Share.php
index 9ce88b5af22..57b5304b102 100644
--- a/lib/private/Share20/Share.php
+++ b/lib/private/Share20/Share.php
@@ -58,6 +58,8 @@ class Share implements \OCP\Share\IShare {
 	private $shareOwner;
 	/** @var int */
 	private $permissions;
+	/** @var int */
+	private $status;
 	/** @var string */
 	private $note = '';
 	/** @var \DateTime */
@@ -318,6 +320,21 @@ class Share implements \OCP\Share\IShare {
 		return $this->permissions;
 	}
 
+	/**
+	 * @inheritdoc
+	 */
+	public function setStatus(int $status): IShare {
+		$this->status = $status;
+		return $this;
+	}
+
+	/**
+	 * @inheritdoc
+	 */
+	public function getStatus(): int {
+		return $this->status;
+	}
+
 	/**
 	 * @inheritdoc
 	 */
diff --git a/lib/public/Share/IShare.php b/lib/public/Share/IShare.php
index 3b16fcaec0f..a4d120da5f4 100644
--- a/lib/public/Share/IShare.php
+++ b/lib/public/Share/IShare.php
@@ -96,6 +96,21 @@ interface IShare {
 	 */
 	// const TYPE_USERROOM = 11;
 
+	/**
+	 * @since 18.0.0
+	 */
+	public const STATUS_PENDING = 0;
+
+	/**
+	 * @since 18.0.0
+	 */
+	public const STATUS_ACCEPTED = 1;
+
+	/**
+	 * @since 18.0.0
+	 */
+	public const STATUS_REJECTED = 2;
+
 	/**
 	 * Set the internal id of the share
 	 * It is only allowed to set the internal id of a share once.
@@ -279,6 +294,25 @@ interface IShare {
 	 */
 	public function getPermissions();
 
+	/**
+	 * Set the accepted status
+	 * See self::STATUS_*
+	 *
+	 * @param int $status
+	 * @return IShare The modified object
+	 * @since 18.0.0
+	 */
+	public function setStatus(int $status): IShare;
+
+	/**
+	 * Get the accepted status
+	 * See self::STATUS_*
+	 *
+	 * @return int
+	 * @since 18.0.0
+	 */
+	public function getStatus(): int;
+
 	/**
 	 * Attach a note to a share
 	 *
-- 
GitLab