From fdea545415f63c9b3dba8af9badb698f4d23e670 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julius=20H=C3=A4rtl?= Date: Thu, 3 Dec 2020 15:51:58 +0100 Subject: [PATCH 01/17] Allow apps to register their share providers from outside MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Julius Härtl --- lib/private/Share20/Manager.php | 4 ++++ lib/private/Share20/ProviderFactory.php | 23 +++++++++++++++++++++++ lib/public/Share/IManager.php | 6 ++++++ lib/public/Share/IProviderFactory.php | 6 ++++++ 4 files changed, 39 insertions(+) diff --git a/lib/private/Share20/Manager.php b/lib/private/Share20/Manager.php index e9895edf95..9f2d885f4f 100644 --- a/lib/private/Share20/Manager.php +++ b/lib/private/Share20/Manager.php @@ -1887,6 +1887,10 @@ class Manager implements IManager { return true; } + public function registerShareProvider(string $shareProviderClass): void { + $this->factory->registerProvider($shareProviderClass); + } + public function getAllShares(): iterable { $providers = $this->factory->getAllProviders(); diff --git a/lib/private/Share20/ProviderFactory.php b/lib/private/Share20/ProviderFactory.php index 2d4c4e6d40..933125c10b 100644 --- a/lib/private/Share20/ProviderFactory.php +++ b/lib/private/Share20/ProviderFactory.php @@ -44,6 +44,7 @@ use OCP\EventDispatcher\IEventDispatcher; use OCP\IServerContainer; use OCP\Share\IProviderFactory; use OCP\Share\IShare; +use OCP\Share\IShareProvider; /** * Class ProviderFactory @@ -67,6 +68,10 @@ class ProviderFactory implements IProviderFactory { /** @var \OCA\Talk\Share\RoomShareProvider */ private $roomShareProvider = null; + private $registeredShareProviders = []; + + private $shareProviders = []; + /** * IProviderFactory constructor. * @@ -76,6 +81,10 @@ class ProviderFactory implements IProviderFactory { $this->serverContainer = $serverContainer; } + public function registerProvider(string $shareProviderClass): void { + $this->registeredShareProviders[] = $shareProviderClass; + } + /** * Create the default share provider. * @@ -257,6 +266,10 @@ class ProviderFactory implements IProviderFactory { */ public function getProvider($id) { $provider = null; + if (isset($this->shareProviders[$id])) { + return $this->shareProviders[$id]; + } + if ($id === 'ocinternal') { $provider = $this->defaultShareProvider(); } elseif ($id === 'ocFederatedSharing') { @@ -269,6 +282,16 @@ class ProviderFactory implements IProviderFactory { $provider = $this->getRoomShareProvider(); } + foreach ($this->registeredShareProviders as $shareProvider) { + /** @var IShareProvider $instance */ + $instance = $this->serverContainer->get($shareProvider); + $this->shareProviders[$instance->identifier()] = $instance; + } + + if (isset($this->shareProviders[$id])) { + $provider = $this->shareProviders[$id]; + } + if ($provider === null) { throw new ProviderException('No provider with id .' . $id . ' found.'); } diff --git a/lib/public/Share/IManager.php b/lib/public/Share/IManager.php index cc2ec45cc9..635ccc1483 100644 --- a/lib/public/Share/IManager.php +++ b/lib/public/Share/IManager.php @@ -416,6 +416,12 @@ interface IManager { */ public function shareProviderExists($shareType); + /** + * @param string $shareProviderClass + * @since 21.0.0 + */ + public function registerShareProvider(string $shareProviderClass): void; + /** * @Internal * diff --git a/lib/public/Share/IProviderFactory.php b/lib/public/Share/IProviderFactory.php index 27218497e5..480837404f 100644 --- a/lib/public/Share/IProviderFactory.php +++ b/lib/public/Share/IProviderFactory.php @@ -53,4 +53,10 @@ interface IProviderFactory { * @since 11.0.0 */ public function getAllProviders(); + + /** + * @since 21.0.0 + * @param string $shareProvier + */ + public function registerProvider(string $shareProvier): void; } From fcc0d358959f9134ad5f2023f66fa833f6383fba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julius=20H=C3=A4rtl?= Date: Thu, 3 Dec 2020 15:52:43 +0100 Subject: [PATCH 02/17] Add share type for deck MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Julius Härtl --- lib/private/Share20/ProviderFactory.php | 2 ++ lib/public/Share/IShare.php | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/lib/private/Share20/ProviderFactory.php b/lib/private/Share20/ProviderFactory.php index 933125c10b..db333ee99a 100644 --- a/lib/private/Share20/ProviderFactory.php +++ b/lib/private/Share20/ProviderFactory.php @@ -318,6 +318,8 @@ class ProviderFactory implements IProviderFactory { $provider = $this->getShareByCircleProvider(); } elseif ($shareType === IShare::TYPE_ROOM) { $provider = $this->getRoomShareProvider(); + } elseif ($shareType === IShare::TYPE_DECK) { + $provider = $this->getProvider('deck'); } diff --git a/lib/public/Share/IShare.php b/lib/public/Share/IShare.php index 7b38e00df4..1e40d7f665 100644 --- a/lib/public/Share/IShare.php +++ b/lib/public/Share/IShare.php @@ -105,6 +105,11 @@ interface IShare { */ // const TYPE_USERROOM = 11; + /** + * @since 21.0.0 + */ + public const TYPE_DECK = 12; + /** * @since 18.0.0 */ From e906138d8da5908917fb523cb3e3484372cea16b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julius=20H=C3=A4rtl?= Date: Thu, 3 Dec 2020 16:02:47 +0100 Subject: [PATCH 03/17] Let sharees endpoint properly handle deck shares MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Julius Härtl --- .../lib/Controller/ShareesAPIController.php | 10 ++++++++++ apps/files_sharing/src/components/SharingInput.vue | 1 + apps/files_sharing/src/index.js | 1 + apps/files_sharing/src/mixins/ShareTypes.js | 1 + lib/private/Share/Constants.php | 4 ++++ 5 files changed, 17 insertions(+) diff --git a/apps/files_sharing/lib/Controller/ShareesAPIController.php b/apps/files_sharing/lib/Controller/ShareesAPIController.php index 0509ba72f1..a2b39b4077 100644 --- a/apps/files_sharing/lib/Controller/ShareesAPIController.php +++ b/apps/files_sharing/lib/Controller/ShareesAPIController.php @@ -83,6 +83,7 @@ class ShareesAPIController extends OCSController { 'emails' => [], 'circles' => [], 'rooms' => [], + 'deck' => [], ], 'users' => [], 'groups' => [], @@ -92,6 +93,7 @@ class ShareesAPIController extends OCSController { 'lookup' => [], 'circles' => [], 'rooms' => [], + 'deck' => [], 'lookupEnabled' => false, ]; @@ -183,6 +185,10 @@ class ShareesAPIController extends OCSController { if ($this->shareManager->shareProviderExists(IShare::TYPE_ROOM)) { $shareTypes[] = IShare::TYPE_ROOM; } + + if ($this->shareManager->shareProviderExists(IShare::TYPE_DECK)) { + $shareTypes[] = IShare::TYPE_DECK; + } } else { $shareTypes[] = IShare::TYPE_GROUP; $shareTypes[] = IShare::TYPE_EMAIL; @@ -193,6 +199,10 @@ class ShareesAPIController extends OCSController { $shareTypes[] = IShare::TYPE_CIRCLE; } + if ($this->shareManager->shareProviderExists(IShare::TYPE_DECK)) { + $shareTypes[] = IShare::TYPE_DECK; + } + if ($shareType !== null && is_array($shareType)) { $shareTypes = array_intersect($shareTypes, $shareType); } elseif (is_numeric($shareType)) { diff --git a/apps/files_sharing/src/components/SharingInput.vue b/apps/files_sharing/src/components/SharingInput.vue index 588ed63416..5326eaf01d 100644 --- a/apps/files_sharing/src/components/SharingInput.vue +++ b/apps/files_sharing/src/components/SharingInput.vue @@ -186,6 +186,7 @@ export default { this.SHARE_TYPES.SHARE_TYPE_CIRCLE, this.SHARE_TYPES.SHARE_TYPE_ROOM, this.SHARE_TYPES.SHARE_TYPE_GUEST, + this.SHARE_TYPES.SHARE_TYPE_DECK, ] if (OC.getCapabilities().files_sharing.public.enabled === true) { diff --git a/apps/files_sharing/src/index.js b/apps/files_sharing/src/index.js index 786b648aea..3c0d0e65c8 100644 --- a/apps/files_sharing/src/index.js +++ b/apps/files_sharing/src/index.js @@ -32,5 +32,6 @@ Object.assign(OC, { SHARE_TYPE_GUEST: 8, SHARE_TYPE_REMOTE_GROUP: 9, SHARE_TYPE_ROOM: 10, + SHARE_TYPE_DECK: 12, }, }) diff --git a/apps/files_sharing/src/mixins/ShareTypes.js b/apps/files_sharing/src/mixins/ShareTypes.js index b84dbf96d9..6e9524ce95 100644 --- a/apps/files_sharing/src/mixins/ShareTypes.js +++ b/apps/files_sharing/src/mixins/ShareTypes.js @@ -31,6 +31,7 @@ export default { SHARE_TYPE_REMOTE: OC.Share.SHARE_TYPE_REMOTE, SHARE_TYPE_CIRCLE: OC.Share.SHARE_TYPE_CIRCLE, SHARE_TYPE_GUEST: OC.Share.SHARE_TYPE_GUEST, + SHARE_TYPE_DECK: OC.Share.SHARE_TYPE_DECK, SHARE_TYPE_REMOTE_GROUP: OC.Share.SHARE_TYPE_REMOTE_GROUP, SHARE_TYPE_ROOM: OC.Share.SHARE_TYPE_ROOM, }, diff --git a/lib/private/Share/Constants.php b/lib/private/Share/Constants.php index 2310859c5b..0ba68428c8 100644 --- a/lib/private/Share/Constants.php +++ b/lib/private/Share/Constants.php @@ -70,6 +70,10 @@ class Constants { */ public const SHARE_TYPE_ROOM = 10; // const SHARE_TYPE_USERROOM = 11; // Internal type used by RoomShareProvider + /** + * @deprecated 21.0.0 - use IShare::TYPE_ROOM instead + */ + public const SHARE_TYPE_DECK = 12; public const FORMAT_NONE = -1; public const FORMAT_STATUSES = -2; From f2f3ad733f4b29e1595bbececf3e19f0ff052b70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julius=20H=C3=A4rtl?= Date: Thu, 3 Dec 2020 16:03:09 +0100 Subject: [PATCH 04/17] Dummy general share checks for deck MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Julius Härtl --- lib/private/Share20/Manager.php | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/private/Share20/Manager.php b/lib/private/Share20/Manager.php index 9f2d885f4f..6b782237b8 100644 --- a/lib/private/Share20/Manager.php +++ b/lib/private/Share20/Manager.php @@ -248,6 +248,7 @@ class Manager implements IManager { throw new \InvalidArgumentException('SharedWith is not a valid circle'); } } elseif ($share->getShareType() === IShare::TYPE_ROOM) { + } elseif ($share->getShareType() === IShare::TYPE_DECK) { } else { // We can't handle other types yet throw new \InvalidArgumentException('unknown share type'); From bac1651380f8330a5660d44d098f427f1cef8b4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julius=20H=C3=A4rtl?= Date: Tue, 8 Dec 2020 12:56:54 +0100 Subject: [PATCH 05/17] Handle deck share type in audit and dav app MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Julius Härtl --- apps/admin_audit/lib/Actions/Sharing.php | 25 +++++++++++++++++++ apps/dav/lib/Connector/Sabre/SharesPlugin.php | 1 + .../unit/Connector/Sabre/SharesPluginTest.php | 1 + 3 files changed, 27 insertions(+) diff --git a/apps/admin_audit/lib/Actions/Sharing.php b/apps/admin_audit/lib/Actions/Sharing.php index 2c28660a56..cab02ab188 100644 --- a/apps/admin_audit/lib/Actions/Sharing.php +++ b/apps/admin_audit/lib/Actions/Sharing.php @@ -146,6 +146,19 @@ class Sharing extends Action { 'id', ] ); + } elseif ($params['shareType'] === IShare::TYPE_DECK) { + $this->log( + 'The %s "%s" with ID "%s" has been shared to the deck card "%s" with permissions "%s" (Share ID: %s)', + $params, + [ + 'itemType', + 'itemTarget', + 'itemSource', + 'shareWith', + 'permissions', + 'id', + ] + ); } } @@ -250,6 +263,18 @@ class Sharing extends Action { 'id', ] ); + } elseif ($params['shareType'] === IShare::TYPE_DECK) { + $this->log( + 'The %s "%s" with ID "%s" has been unshared from the deck card "%s" (Share ID: %s)', + $params, + [ + 'itemType', + 'fileTarget', + 'itemSource', + 'shareWith', + 'id', + ] + ); } } diff --git a/apps/dav/lib/Connector/Sabre/SharesPlugin.php b/apps/dav/lib/Connector/Sabre/SharesPlugin.php index 3abdf6c254..c4b8f0a462 100644 --- a/apps/dav/lib/Connector/Sabre/SharesPlugin.php +++ b/apps/dav/lib/Connector/Sabre/SharesPlugin.php @@ -121,6 +121,7 @@ class SharesPlugin extends \Sabre\DAV\ServerPlugin { IShare::TYPE_EMAIL, IShare::TYPE_ROOM, IShare::TYPE_CIRCLE, + IShare::TYPE_DECK, ]; foreach ($requestedShareTypes as $requestedShareType) { $shares = $this->shareManager->getSharesBy( diff --git a/apps/dav/tests/unit/Connector/Sabre/SharesPluginTest.php b/apps/dav/tests/unit/Connector/Sabre/SharesPluginTest.php index 27af0b1501..f48e652272 100644 --- a/apps/dav/tests/unit/Connector/Sabre/SharesPluginTest.php +++ b/apps/dav/tests/unit/Connector/Sabre/SharesPluginTest.php @@ -276,6 +276,7 @@ class SharesPluginTest extends \Test\TestCase { [[IShare::TYPE_LINK]], [[IShare::TYPE_REMOTE]], [[IShare::TYPE_ROOM]], + [[IShare::TYPE_DECK]], [[IShare::TYPE_USER, IShare::TYPE_GROUP]], [[IShare::TYPE_USER, IShare::TYPE_GROUP, IShare::TYPE_LINK]], [[IShare::TYPE_USER, IShare::TYPE_LINK]], From f3150f29a7256a502df6990dd9f8126d76fe3a80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julius=20H=C3=A4rtl?= Date: Thu, 3 Dec 2020 16:03:35 +0100 Subject: [PATCH 06/17] Introduce deck share type to ShareAPIController MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Julius Härtl --- apps/files/lib/Controller/ApiController.php | 3 +- .../lib/Service/OwnershipTransferService.php | 2 +- .../Controller/DeletedShareAPIController.php | 28 +++++++- .../lib/Controller/ShareAPIController.php | 68 +++++++++++++++++-- lib/private/Share20/ProviderFactory.php | 11 +++ 5 files changed, 105 insertions(+), 7 deletions(-) diff --git a/apps/files/lib/Controller/ApiController.php b/apps/files/lib/Controller/ApiController.php index ee4d86bc36..7c0f9bba25 100644 --- a/apps/files/lib/Controller/ApiController.php +++ b/apps/files/lib/Controller/ApiController.php @@ -221,7 +221,8 @@ class ApiController extends Controller { IShare::TYPE_LINK, IShare::TYPE_REMOTE, IShare::TYPE_EMAIL, - IShare::TYPE_ROOM + IShare::TYPE_ROOM, + IShare::TYPE_DECK ]; foreach ($requestedShareTypes as $requestedShareType) { // one of each type is enough to find out about the types diff --git a/apps/files/lib/Service/OwnershipTransferService.php b/apps/files/lib/Service/OwnershipTransferService.php index fa979c2006..bd8520b92f 100644 --- a/apps/files/lib/Service/OwnershipTransferService.php +++ b/apps/files/lib/Service/OwnershipTransferService.php @@ -252,7 +252,7 @@ class OwnershipTransferService { $shares = []; $progress = new ProgressBar($output); - foreach ([IShare::TYPE_GROUP, IShare::TYPE_USER, IShare::TYPE_LINK, IShare::TYPE_REMOTE, IShare::TYPE_ROOM, IShare::TYPE_EMAIL, IShare::TYPE_CIRCLE] as $shareType) { + foreach ([IShare::TYPE_GROUP, IShare::TYPE_USER, IShare::TYPE_LINK, IShare::TYPE_REMOTE, IShare::TYPE_ROOM, IShare::TYPE_EMAIL, IShare::TYPE_CIRCLE, IShare::TYPE_DECK] as $shareType) { $offset = 0; while (true) { $sharePage = $this->shareManager->getSharesBy($sourceUid, $shareType, null, true, 50, $offset); diff --git a/apps/files_sharing/lib/Controller/DeletedShareAPIController.php b/apps/files_sharing/lib/Controller/DeletedShareAPIController.php index 9b367e0654..1981c0c194 100644 --- a/apps/files_sharing/lib/Controller/DeletedShareAPIController.php +++ b/apps/files_sharing/lib/Controller/DeletedShareAPIController.php @@ -151,6 +151,14 @@ class DeletedShareAPIController extends OCSController { $result = array_merge($result, $this->getRoomShareHelper()->formatShare($share)); } catch (QueryException $e) { } + } elseif ($share->getShareType() === IShare::TYPE_DECK) { + $result['share_with'] = $share->getSharedWith(); + $result['share_with_displayname'] = ''; + + try { + $result = array_merge($result, $this->getDeckShareHelper()->formatShare($share)); + } catch (QueryException $e) { + } } return $result; @@ -162,8 +170,9 @@ class DeletedShareAPIController extends OCSController { public function index(): DataResponse { $groupShares = $this->shareManager->getDeletedSharedWith($this->userId, IShare::TYPE_GROUP, null, -1, 0); $roomShares = $this->shareManager->getDeletedSharedWith($this->userId, IShare::TYPE_ROOM, null, -1, 0); + $deckShares = $this->shareManager->getDeletedSharedWith($this->userId, IShare::TYPE_DECK, null, -1, 0); - $shares = array_merge($groupShares, $roomShares); + $shares = array_merge($groupShares, $roomShares, $deckShares); $shares = array_map(function (IShare $share) { return $this->formatShare($share); @@ -213,4 +222,21 @@ class DeletedShareAPIController extends OCSController { return $this->serverContainer->query('\OCA\Talk\Share\Helper\DeletedShareAPIController'); } + + /** + * Returns the helper of ShareAPIHelper for deck shares. + * + * If the Deck application is not enabled or the helper is not available + * a QueryException is thrown instead. + * + * @return \OCA\Deck\Sharing\ShareAPIHelper + * @throws QueryException + */ + private function getDeckShareHelper() { + if (!$this->appManager->isEnabledForUser('deck')) { + throw new QueryException(); + } + + return $this->serverContainer->query('\OCA\Deck\Sharing\ShareAPIHelper'); + } } diff --git a/apps/files_sharing/lib/Controller/ShareAPIController.php b/apps/files_sharing/lib/Controller/ShareAPIController.php index aaca16b32e..399ff18fba 100644 --- a/apps/files_sharing/lib/Controller/ShareAPIController.php +++ b/apps/files_sharing/lib/Controller/ShareAPIController.php @@ -303,6 +303,14 @@ class ShareAPIController extends OCSController { $result = array_merge($result, $this->getRoomShareHelper()->formatShare($share)); } catch (QueryException $e) { } + } elseif ($share->getShareType() === IShare::TYPE_DECK) { + $result['share_with'] = $share->getSharedWith(); + $result['share_with_displayname'] = ''; + + try { + $result = array_merge($result, $this->getDeckShareHelper()->formatShare($share)); + } catch (QueryException $e) { + } } @@ -603,6 +611,12 @@ class ShareAPIController extends OCSController { } catch (QueryException $e) { throw new OCSForbiddenException($this->l->t('Sharing %s failed because the back end does not support room shares', [$path->getPath()])); } + } elseif ($shareType === IShare::TYPE_DECK) { + try { + $this->getDeckShareHelper()->createShare($share, $shareWith, $permissions, $expireDate); + } catch (QueryException $e) { + throw new OCSForbiddenException($this->l->t('Sharing %s failed because the back end does not support room shares', [$path->getPath()])); + } } else { throw new OCSBadRequestException($this->l->t('Unknown share type')); } @@ -635,8 +649,9 @@ class ShareAPIController extends OCSController { $groupShares = $this->shareManager->getSharedWith($this->currentUser, IShare::TYPE_GROUP, $node, -1, 0); $circleShares = $this->shareManager->getSharedWith($this->currentUser, IShare::TYPE_CIRCLE, $node, -1, 0); $roomShares = $this->shareManager->getSharedWith($this->currentUser, IShare::TYPE_ROOM, $node, -1, 0); + $deckShares = $this->shareManager->getSharedWith($this->currentUser, IShare::TYPE_DECK, $node, -1, 0); - $shares = array_merge($userShares, $groupShares, $circleShares, $roomShares); + $shares = array_merge($userShares, $groupShares, $circleShares, $roomShares, $deckShares); $filteredShares = array_filter($shares, function (IShare $share) { return $share->getShareOwner() !== $this->currentUser; @@ -1296,6 +1311,14 @@ class ShareAPIController extends OCSController { } } + if ($share->getShareType() === IShare::TYPE_DECK) { + try { + return $this->getDeckShareHelper()->canAccessShare($share, $this->currentUser); + } catch (QueryException $e) { + return false; + } + } + return false; } @@ -1371,7 +1394,8 @@ class ShareAPIController extends OCSController { */ protected function canDeleteShareFromSelf(\OCP\Share\IShare $share): bool { if ($share->getShareType() !== IShare::TYPE_GROUP && - $share->getShareType() !== IShare::TYPE_ROOM + $share->getShareType() !== IShare::TYPE_ROOM && + $share->getShareType() !== IShare::TYPE_DECK ) { return false; } @@ -1400,6 +1424,14 @@ class ShareAPIController extends OCSController { } } + if ($share->getShareType() === IShare::TYPE_DECK) { + try { + return $this->getDeckShareHelper()->canAccessShare($share, $this->currentUser); + } catch (QueryException $e) { + return false; + } + } + return false; } @@ -1474,6 +1506,15 @@ class ShareAPIController extends OCSController { // Do nothing, just try the other share type } + try { + if ($this->shareManager->shareProviderExists(IShare::TYPE_DECK)) { + $share = $this->shareManager->getShareById('deck:' . $id, $this->currentUser); + return $share; + } + } catch (ShareNotFound $e) { + // Do nothing, just try the other share type + } + if (!$this->shareManager->outgoingServer2ServerSharesAllowed()) { throw new ShareNotFound(); } @@ -1520,6 +1561,22 @@ class ShareAPIController extends OCSController { return $this->serverContainer->query('\OCA\Talk\Share\Helper\ShareAPIController'); } + /** + * Returns the helper of ShareAPIHelper for deck shares. + * + * If the Deck application is not enabled or the helper is not available + * a QueryException is thrown instead. + * + * @return \OCA\Deck\Sharing\ShareAPIHelper + * @throws QueryException + */ + private function getDeckShareHelper() { + if (!$this->appManager->isEnabledForUser('deck')) { + throw new QueryException(); + } + + return $this->serverContainer->query('\OCA\Deck\Sharing\ShareAPIHelper'); + } /** * @param string $viewer @@ -1536,7 +1593,8 @@ class ShareAPIController extends OCSController { IShare::TYPE_EMAIL, IShare::TYPE_EMAIL, IShare::TYPE_CIRCLE, - IShare::TYPE_ROOM + IShare::TYPE_ROOM, + IShare::TYPE_DECK ]; // Should we assume that the (currentUser) viewer is the owner of the node !? @@ -1689,6 +1747,8 @@ class ShareAPIController extends OCSController { // TALK SHARES $roomShares = $this->shareManager->getSharesBy($this->currentUser, IShare::TYPE_ROOM, $path, $reshares, -1, 0); + $deckShares = $this->shareManager->getSharesBy($this->currentUser, IShare::TYPE_DECK, $path, $reshares, -1, 0); + // FEDERATION if ($this->shareManager->outgoingServer2ServerSharesAllowed()) { $federatedShares = $this->shareManager->getSharesBy($this->currentUser, IShare::TYPE_REMOTE, $path, $reshares, -1, 0); @@ -1701,7 +1761,7 @@ class ShareAPIController extends OCSController { $federatedGroupShares = []; } - return array_merge($userShares, $groupShares, $linkShares, $mailShares, $circleShares, $roomShares, $federatedShares, $federatedGroupShares); + return array_merge($userShares, $groupShares, $linkShares, $mailShares, $circleShares, $roomShares, $deckShares, $federatedShares, $federatedGroupShares); } diff --git a/lib/private/Share20/ProviderFactory.php b/lib/private/Share20/ProviderFactory.php index db333ee99a..9f93df46ac 100644 --- a/lib/private/Share20/ProviderFactory.php +++ b/lib/private/Share20/ProviderFactory.php @@ -345,6 +345,17 @@ class ProviderFactory implements IProviderFactory { $shares[] = $roomShare; } + foreach ($this->registeredShareProviders as $shareProvider) { + /** @var IShareProvider $instance */ + $instance = $this->serverContainer->get($shareProvider); + if (!isset($this->shareProviders[$instance->identifier()])) { + $this->shareProviders[$instance->identifier()] = $instance; + } + $shares[] = $this->shareProviders[$instance->identifier()]; + } + + + return $shares; } } From c770d337177b135fa6d225a28b5517dfb5483bd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julius=20H=C3=A4rtl?= Date: Tue, 8 Dec 2020 12:59:09 +0100 Subject: [PATCH 07/17] Add internal DECK_USER type to allow unsharing for individual users MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Julius Härtl --- lib/public/Share/IShare.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/public/Share/IShare.php b/lib/public/Share/IShare.php index 1e40d7f665..4bd290d66c 100644 --- a/lib/public/Share/IShare.php +++ b/lib/public/Share/IShare.php @@ -110,6 +110,11 @@ interface IShare { */ public const TYPE_DECK = 12; + /** + * @internal 21.00 + */ + public const TYPE_DECK_USER = 13; + /** * @since 18.0.0 */ From 53bb44c09ffb47e062790a2430cf99b98a80a8e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julius=20H=C3=A4rtl?= Date: Tue, 8 Dec 2020 12:59:30 +0100 Subject: [PATCH 08/17] Include deck shares in sharing mounts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Julius Härtl --- apps/files_sharing/lib/MountProvider.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/files_sharing/lib/MountProvider.php b/apps/files_sharing/lib/MountProvider.php index 3e703a4a6b..3ab3185b95 100644 --- a/apps/files_sharing/lib/MountProvider.php +++ b/apps/files_sharing/lib/MountProvider.php @@ -78,6 +78,8 @@ class MountProvider implements IMountProvider { $shares = array_merge($shares, $this->shareManager->getSharedWith($user->getUID(), IShare::TYPE_GROUP, null, -1)); $shares = array_merge($shares, $this->shareManager->getSharedWith($user->getUID(), IShare::TYPE_CIRCLE, null, -1)); $shares = array_merge($shares, $this->shareManager->getSharedWith($user->getUID(), IShare::TYPE_ROOM, null, -1)); + $shares = array_merge($shares, $this->shareManager->getSharedWith($user->getUID(), IShare::TYPE_DECK, null, -1)); + // filter out excluded shares and group shares that includes self $shares = array_filter($shares, function (\OCP\Share\IShare $share) use ($user) { From f1a54cb6aad8dcb9c98f0070ba4d74b4941aefe3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julius=20H=C3=A4rtl?= Date: Tue, 8 Dec 2020 13:00:43 +0100 Subject: [PATCH 09/17] Add share type deck to search results MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Julius Härtl --- apps/files_sharing/src/components/SharingInput.vue | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/files_sharing/src/components/SharingInput.vue b/apps/files_sharing/src/components/SharingInput.vue index 5326eaf01d..c1331146ee 100644 --- a/apps/files_sharing/src/components/SharingInput.vue +++ b/apps/files_sharing/src/components/SharingInput.vue @@ -366,6 +366,8 @@ export default { return 'icon-circle' case this.SHARE_TYPES.SHARE_TYPE_ROOM: return 'icon-room' + case this.SHARE_TYPES.SHARE_TYPE_DECK: + return 'icon-deck' default: return '' From 8131965b740377cad5c64910ea76070cbf81868a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julius=20H=C3=A4rtl?= Date: Tue, 8 Dec 2020 13:01:29 +0100 Subject: [PATCH 10/17] Allow share results to have a detailed description and share entries to have a link MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Julius Härtl --- apps/files_sharing/src/components/SharingEntry.vue | 7 +++++-- apps/files_sharing/src/components/SharingInput.vue | 2 ++ apps/files_sharing/src/models/Share.js | 11 +++++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/apps/files_sharing/src/components/SharingEntry.vue b/apps/files_sharing/src/components/SharingEntry.vue index 55bdbb8fdc..407221037d 100644 --- a/apps/files_sharing/src/components/SharingEntry.vue +++ b/apps/files_sharing/src/components/SharingEntry.vue @@ -29,13 +29,16 @@ :tooltip-message="share.type === SHARE_TYPES.SHARE_TYPE_USER ? share.shareWith : ''" :menu-position="'left'" :url="share.shareWithAvatar" /> - +