diff --git a/apps/files_sharing/lib/External/Manager.php b/apps/files_sharing/lib/External/Manager.php index 0cf7d89923..aeb95a8f2f 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 47a787350d..1f73396996 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 05b3094e6a..61c6236415 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 9ce88b5af2..57b5304b10 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 3b16fcaec0..a4d120da5f 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 *