From: Michiel de Jong Date: Mon, 20 Feb 2023 09:50:31 +0000 (+0000) Subject: Add SHARE_TYPE_SCIENCEMESH X-Git-Tag: v27.0.0beta1~364^2~1 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=c0e84cb512ca76cea263642918f9e045aed3c5c4;p=nextcloud-server.git Add SHARE_TYPE_SCIENCEMESH Signed-off-by: Michiel de Jong --- diff --git a/apps/admin_audit/lib/Actions/Sharing.php b/apps/admin_audit/lib/Actions/Sharing.php index 329ed740b53..fd61d862e91 100644 --- a/apps/admin_audit/lib/Actions/Sharing.php +++ b/apps/admin_audit/lib/Actions/Sharing.php @@ -160,6 +160,19 @@ class Sharing extends Action { 'id', ] ); + } elseif ($params['shareType'] === IShare::TYPE_SCIENCEMESH) { + $this->log( + 'The %s "%s" with ID "%s" has been shared to the sciencemesh user "%s" with permissions "%s" (Share ID: %s)', + $params, + [ + 'itemType', + 'path', + 'itemSource', + 'shareWith', + 'permissions', + 'id', + ] + ); } } @@ -276,6 +289,18 @@ class Sharing extends Action { 'id', ] ); + } elseif ($params['shareType'] === IShare::TYPE_SCIENCEMESH) { + $this->log( + 'The %s "%s" with ID "%s" has been unshared from the sciencemesh user "%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 9fa6775c3b5..3d52a44b6a6 100644 --- a/apps/dav/lib/Connector/Sabre/SharesPlugin.php +++ b/apps/dav/lib/Connector/Sabre/SharesPlugin.php @@ -110,6 +110,7 @@ class SharesPlugin extends \Sabre\DAV\ServerPlugin { IShare::TYPE_ROOM, IShare::TYPE_CIRCLE, IShare::TYPE_DECK, + IShare::TYPE_SCIENCEMESH, ]; 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 abbf13d5479..e6e90838966 100644 --- a/apps/dav/tests/unit/Connector/Sabre/SharesPluginTest.php +++ b/apps/dav/tests/unit/Connector/Sabre/SharesPluginTest.php @@ -278,6 +278,7 @@ class SharesPluginTest extends \Test\TestCase { [[IShare::TYPE_REMOTE]], [[IShare::TYPE_ROOM]], [[IShare::TYPE_DECK]], + [[IShare::TYPE_SCIENCEMESH]], [[IShare::TYPE_USER, IShare::TYPE_GROUP]], [[IShare::TYPE_USER, IShare::TYPE_GROUP, IShare::TYPE_LINK]], [[IShare::TYPE_USER, IShare::TYPE_LINK]], diff --git a/apps/files/lib/Controller/ApiController.php b/apps/files/lib/Controller/ApiController.php index 604cf9a3c64..9baf5e97892 100644 --- a/apps/files/lib/Controller/ApiController.php +++ b/apps/files/lib/Controller/ApiController.php @@ -209,6 +209,7 @@ class ApiController extends Controller { IShare::TYPE_EMAIL, IShare::TYPE_ROOM, IShare::TYPE_DECK, + IShare::TYPE_SCIENCEMESH, ]; $shareTypes = []; diff --git a/apps/files/lib/Service/OwnershipTransferService.php b/apps/files/lib/Service/OwnershipTransferService.php index 661a7e66e10..c744573ac99 100644 --- a/apps/files/lib/Service/OwnershipTransferService.php +++ b/apps/files/lib/Service/OwnershipTransferService.php @@ -286,7 +286,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, IShare::TYPE_DECK] 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, IShare::TYPE_SCIENCEMESH] 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 1d625b35322..19d1cbd0af6 100644 --- a/apps/files_sharing/lib/Controller/DeletedShareAPIController.php +++ b/apps/files_sharing/lib/Controller/DeletedShareAPIController.php @@ -159,6 +159,14 @@ class DeletedShareAPIController extends OCSController { $result = array_merge($result, $this->getDeckShareHelper()->formatShare($share)); } catch (QueryException $e) { } + } elseif ($share->getShareType() === IShare::TYPE_SCIENCEMESH) { + $result['share_with'] = $share->getSharedWith(); + $result['share_with_displayname'] = ''; + + try { + $result = array_merge($result, $this->getSciencemeshShareHelper()->formatShare($share)); + } catch (QueryException $e) { + } } return $result; @@ -171,8 +179,9 @@ class DeletedShareAPIController extends OCSController { $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); + $sciencemeshShares = $this->shareManager->getDeletedSharedWith($this->userId, IShare::TYPE_SCIENCEMESH, null, -1, 0); - $shares = array_merge($groupShares, $roomShares, $deckShares); + $shares = array_merge($groupShares, $roomShares, $deckShares, $sciencemeshShares); $shares = array_map(function (IShare $share) { return $this->formatShare($share); @@ -224,7 +233,7 @@ class DeletedShareAPIController extends OCSController { } /** - * Returns the helper of ShareAPIHelper for deck shares. + * Returns the helper of DeletedShareAPIHelper for deck shares. * * If the Deck application is not enabled or the helper is not available * a QueryException is thrown instead. @@ -239,4 +248,21 @@ class DeletedShareAPIController extends OCSController { return $this->serverContainer->get('\OCA\Deck\Sharing\ShareAPIHelper'); } + + /** + * Returns the helper of DeletedShareAPIHelper for sciencemesh shares. + * + * If the sciencemesh application is not enabled or the helper is not available + * a QueryException is thrown instead. + * + * @return \OCA\Deck\Sharing\ShareAPIHelper + * @throws QueryException + */ + private function getSciencemeshShareHelper() { + if (!$this->appManager->isEnabledForUser('sciencemesh')) { + throw new QueryException(); + } + + return $this->serverContainer->get('\OCA\ScienceMesh\Sharing\ShareAPIHelper'); + } } diff --git a/apps/files_sharing/lib/Controller/ShareAPIController.php b/apps/files_sharing/lib/Controller/ShareAPIController.php index ab318a81fc2..48146bc6599 100644 --- a/apps/files_sharing/lib/Controller/ShareAPIController.php +++ b/apps/files_sharing/lib/Controller/ShareAPIController.php @@ -320,6 +320,14 @@ class ShareAPIController extends OCSController { $result = array_merge($result, $this->getDeckShareHelper()->formatShare($share)); } catch (QueryException $e) { } + } elseif ($share->getShareType() === IShare::TYPE_SCIENCEMESH) { + $result['share_with'] = $share->getSharedWith(); + $result['share_with_displayname'] = ''; + + try { + $result = array_merge($result, $this->getSciencemeshShareHelper()->formatShare($share)); + } catch (QueryException $e) { + } } @@ -692,6 +700,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', [$node->getPath()])); } + } elseif ($shareType === IShare::TYPE_SCIENCEMESH) { + try { + $this->getSciencemeshShareHelper()->createShare($share, $shareWith, $permissions, $expireDate); + } catch (QueryException $e) { + throw new OCSForbiddenException($this->l->t('Sharing %s failed because the back end does not support sciencemesh shares', [$node->getPath()])); + } } else { throw new OCSBadRequestException($this->l->t('Unknown share type')); } @@ -730,8 +744,9 @@ class ShareAPIController extends OCSController { $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); + $sciencemeshShares = $this->shareManager->getSharedWith($this->currentUser, IShare::TYPE_SCIENCEMESH, $node, -1, 0); - $shares = array_merge($userShares, $groupShares, $circleShares, $roomShares, $deckShares); + $shares = array_merge($userShares, $groupShares, $circleShares, $roomShares, $deckShares, $sciencemeshShares); $filteredShares = array_filter($shares, function (IShare $share) { return $share->getShareOwner() !== $this->currentUser; @@ -1414,6 +1429,14 @@ class ShareAPIController extends OCSController { } } + if ($share->getShareType() === IShare::TYPE_SCIENCEMESH) { + try { + return $this->getSciencemeshShareHelper()->canAccessShare($share, $this->currentUser); + } catch (QueryException $e) { + return false; + } + } + return false; } @@ -1490,7 +1513,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_DECK + $share->getShareType() !== IShare::TYPE_DECK && + $share->getShareType() !== IShare::TYPE_SCIENCEMESH ) { return false; } @@ -1527,6 +1551,14 @@ class ShareAPIController extends OCSController { } } + if ($share->getShareType() === IShare::TYPE_SCIENCEMESH) { + try { + return $this->getSciencemeshShareHelper()->canAccessShare($share, $this->currentUser); + } catch (QueryException $e) { + return false; + } + } + return false; } @@ -1606,6 +1638,15 @@ class ShareAPIController extends OCSController { // Do nothing, just try the other share type } + try { + if ($this->shareManager->shareProviderExists(IShare::TYPE_SCIENCEMESH)) { + $share = $this->shareManager->getShareById('sciencemesh:' . $id, $this->currentUser); + return $share; + } + } catch (ShareNotFound $e) { + // Do nothing, just try the other share type + } + if (!$this->shareManager->outgoingServer2ServerSharesAllowed()) { throw new ShareNotFound(); } @@ -1669,6 +1710,23 @@ class ShareAPIController extends OCSController { return $this->serverContainer->get('\OCA\Deck\Sharing\ShareAPIHelper'); } + /** + * Returns the helper of ShareAPIHelper for sciencemesh shares. + * + * If the sciencemesh application is not enabled or the helper is not available + * a QueryException is thrown instead. + * + * @return \OCA\Deck\Sharing\ShareAPIHelper + * @throws QueryException + */ + private function getSciencemeshShareHelper() { + if (!$this->appManager->isEnabledForUser('sciencemesh')) { + throw new QueryException(); + } + + return $this->serverContainer->get('\OCA\ScienceMesh\Sharing\ShareAPIHelper'); + } + /** * @param string $viewer * @param Node $node @@ -1684,7 +1742,8 @@ class ShareAPIController extends OCSController { IShare::TYPE_EMAIL, IShare::TYPE_CIRCLE, IShare::TYPE_ROOM, - IShare::TYPE_DECK + IShare::TYPE_DECK, + IShare::TYPE_SCIENCEMESH ]; // Should we assume that the (currentUser) viewer is the owner of the node !? @@ -1837,8 +1896,12 @@ class ShareAPIController extends OCSController { // TALK SHARES $roomShares = $this->shareManager->getSharesBy($this->currentUser, IShare::TYPE_ROOM, $path, $reshares, -1, 0); + // DECK SHARES $deckShares = $this->shareManager->getSharesBy($this->currentUser, IShare::TYPE_DECK, $path, $reshares, -1, 0); + // SCIENCEMESH SHARES + $sciencemeshShares = $this->shareManager->getSharesBy($this->currentUser, IShare::TYPE_SCIENCEMESH, $path, $reshares, -1, 0); + // FEDERATION if ($this->shareManager->outgoingServer2ServerSharesAllowed()) { $federatedShares = $this->shareManager->getSharesBy($this->currentUser, IShare::TYPE_REMOTE, $path, $reshares, -1, 0); @@ -1851,7 +1914,7 @@ class ShareAPIController extends OCSController { $federatedGroupShares = []; } - return array_merge($userShares, $groupShares, $linkShares, $mailShares, $circleShares, $roomShares, $deckShares, $federatedShares, $federatedGroupShares); + return array_merge($userShares, $groupShares, $linkShares, $mailShares, $circleShares, $roomShares, $deckShares, $sciencemeshShares, $federatedShares, $federatedGroupShares); } diff --git a/apps/files_sharing/lib/Controller/ShareesAPIController.php b/apps/files_sharing/lib/Controller/ShareesAPIController.php index 5a2e200c238..8daa7dc5ab9 100644 --- a/apps/files_sharing/lib/Controller/ShareesAPIController.php +++ b/apps/files_sharing/lib/Controller/ShareesAPIController.php @@ -186,6 +186,10 @@ class ShareesAPIController extends OCSController { if ($this->shareManager->shareProviderExists(IShare::TYPE_ROOM)) { $shareTypes[] = IShare::TYPE_ROOM; } + + if ($this->shareManager->shareProviderExists(IShare::TYPE_SCIENCEMESH)) { + $shareTypes[] = IShare::TYPE_SCIENCEMESH; + } } else { if ($this->shareManager->allowGroupSharing()) { $shareTypes[] = IShare::TYPE_GROUP; @@ -198,6 +202,10 @@ class ShareesAPIController extends OCSController { $shareTypes[] = IShare::TYPE_CIRCLE; } + if ($this->shareManager->shareProviderExists(IShare::TYPE_SCIENCEMESH)) { + $shareTypes[] = IShare::TYPE_SCIENCEMESH; + } + if ($shareType !== null && is_array($shareType)) { $shareTypes = array_intersect($shareTypes, $shareType); } elseif (is_numeric($shareType)) { diff --git a/apps/files_sharing/lib/MountProvider.php b/apps/files_sharing/lib/MountProvider.php index a9705e94906..2ad7ede8e40 100644 --- a/apps/files_sharing/lib/MountProvider.php +++ b/apps/files_sharing/lib/MountProvider.php @@ -97,6 +97,7 @@ class MountProvider implements IMountProvider { $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)); + $shares = array_merge($shares, $this->shareManager->getSharedWith($user->getUID(), IShare::TYPE_SCIENCEMESH, null, -1)); // filter out excluded shares and group shares that includes self diff --git a/apps/files_sharing/src/components/SharingInput.vue b/apps/files_sharing/src/components/SharingInput.vue index 8dadb4689ff..de6812c9569 100644 --- a/apps/files_sharing/src/components/SharingInput.vue +++ b/apps/files_sharing/src/components/SharingInput.vue @@ -194,6 +194,7 @@ export default { this.SHARE_TYPES.SHARE_TYPE_ROOM, this.SHARE_TYPES.SHARE_TYPE_GUEST, this.SHARE_TYPES.SHARE_TYPE_DECK, + this.SHARE_TYPES.SHARE_TYPE_SCIENCEMESH, ] if (OC.getCapabilities().files_sharing.public.enabled === true) { @@ -420,6 +421,11 @@ export default { icon: 'icon-deck', iconTitle: t('files_sharing', 'Deck board'), } + case this.SHARE_TYPES.SHARE_TYPE_SCIENCEMESH: + return { + icon: 'icon-sciencemesh', + iconTitle: t('files_sharing', 'Science Mesh'), + } default: return {} } diff --git a/apps/files_sharing/src/index.js b/apps/files_sharing/src/index.js index 9f80c79270e..95ed017bbf9 100644 --- a/apps/files_sharing/src/index.js +++ b/apps/files_sharing/src/index.js @@ -34,5 +34,6 @@ Object.assign(OC, { SHARE_TYPE_REMOTE_GROUP: 9, SHARE_TYPE_ROOM: 10, SHARE_TYPE_DECK: 12, + SHARE_TYPE_SCIENCEMESH: 15, }, }) diff --git a/apps/files_sharing/src/share.js b/apps/files_sharing/src/share.js index ca4dba7c888..06eea5807a1 100644 --- a/apps/files_sharing/src/share.js +++ b/apps/files_sharing/src/share.js @@ -201,6 +201,8 @@ import { getCapabilities } from '@nextcloud/capabilities' hasShares = true } else if (shareType === ShareTypes.SHARE_TYPE_DECK) { hasShares = true + } else if (shareType === ShareTypes.SHARE_TYPE_SCIENCEMESH) { + hasShares = true } }) OCA.Sharing.Util._updateFileActionIcon($tr, hasShares, hasLink) diff --git a/apps/files_sharing/tests/Controller/ShareAPIControllerTest.php b/apps/files_sharing/tests/Controller/ShareAPIControllerTest.php index 6405181d0dc..2a2a7d940be 100644 --- a/apps/files_sharing/tests/Controller/ShareAPIControllerTest.php +++ b/apps/files_sharing/tests/Controller/ShareAPIControllerTest.php @@ -218,10 +218,10 @@ class ShareAPIControllerTest extends TestCase { $this->expectExceptionMessage('Wrong share ID, share does not exist'); $this->shareManager - ->expects($this->exactly(6)) + ->expects($this->exactly(7)) ->method('getShareById') ->willReturnCallback(function ($id) { - if ($id === 'ocinternal:42' || $id === 'ocRoomShare:42' || $id === 'ocFederatedSharing:42' || $id === 'ocCircleShare:42' || $id === 'ocMailShare:42' || $id === 'deck:42') { + if ($id === 'ocinternal:42' || $id === 'ocRoomShare:42' || $id === 'ocFederatedSharing:42' || $id === 'ocCircleShare:42' || $id === 'ocMailShare:42' || $id === 'deck:42' || $id === 'sciencemesh:42') { throw new \OCP\Share\Exceptions\ShareNotFound(); } else { throw new \Exception(); diff --git a/apps/files_sharing/tests/MountProviderTest.php b/apps/files_sharing/tests/MountProviderTest.php index 37e7e3d9d03..f7cf5156ec5 100644 --- a/apps/files_sharing/tests/MountProviderTest.php +++ b/apps/files_sharing/tests/MountProviderTest.php @@ -163,12 +163,13 @@ class MountProviderTest extends \Test\TestCase { $this->makeMockShare(12, 103, 'user2', '/share7', 31), $this->makeMockShare(13, 103, 'user2', '/share7', 31), ]; - // tests regarding circles are made in the app itself. + // tests regarding circles and sciencemesh are made in the apps themselves. $circleShares = []; + $sciencemeshShares = []; $this->user->expects($this->any()) ->method('getUID') ->willReturn('user1'); - $this->shareManager->expects($this->exactly(5)) + $this->shareManager->expects($this->exactly(6)) ->method('getSharedWith') ->withConsecutive( ['user1', IShare::TYPE_USER], @@ -176,12 +177,14 @@ class MountProviderTest extends \Test\TestCase { ['user1', IShare::TYPE_CIRCLE, null, -1], ['user1', IShare::TYPE_ROOM, null, -1], ['user1', IShare::TYPE_DECK, null, -1], + ['user1', IShare::TYPE_SCIENCEMESH, null, -1], )->willReturnOnConsecutiveCalls( $userShares, $groupShares, $circleShares, $roomShares, $deckShares, + $sciencemeshShares ); $this->shareManager->expects($this->any()) ->method('newShare') @@ -386,7 +389,8 @@ class MountProviderTest extends \Test\TestCase { $circleShares = []; $roomShares = []; $deckShares = []; - $this->shareManager->expects($this->exactly(5)) + $sciencemeshShares = []; + $this->shareManager->expects($this->exactly(6)) ->method('getSharedWith') ->withConsecutive( ['user1', IShare::TYPE_USER], @@ -394,12 +398,14 @@ class MountProviderTest extends \Test\TestCase { ['user1', IShare::TYPE_CIRCLE, null, -1], ['user1', IShare::TYPE_ROOM, null, -1], ['user1', IShare::TYPE_DECK, null, -1], + ['user1', IShare::TYPE_SCIENCEMESH, null, -1], )->willReturnOnConsecutiveCalls( $userShares, $groupShares, $circleShares, $roomShares, $deckShares, + $sciencemeshShares ); $this->shareManager->expects($this->any()) ->method('newShare') diff --git a/lib/private/Share/Constants.php b/lib/private/Share/Constants.php index 03c4c2ba828..0c8fad17e07 100644 --- a/lib/private/Share/Constants.php +++ b/lib/private/Share/Constants.php @@ -74,6 +74,8 @@ class Constants { public const SHARE_TYPE_DECK = 12; // const SHARE_TYPE_DECK_USER = 13; // Internal type used by DeckShareProvider + // Note to developers: Do not add new share types here + public const FORMAT_NONE = -1; public const FORMAT_STATUSES = -2; public const FORMAT_SOURCES = -3; // ToDo Check if it is still in use otherwise remove it diff --git a/lib/private/Share20/Manager.php b/lib/private/Share20/Manager.php index 7fd99545668..f84ed1671ba 100644 --- a/lib/private/Share20/Manager.php +++ b/lib/private/Share20/Manager.php @@ -244,6 +244,7 @@ class Manager implements IManager { } } elseif ($share->getShareType() === IShare::TYPE_ROOM) { } elseif ($share->getShareType() === IShare::TYPE_DECK) { + } elseif ($share->getShareType() === IShare::TYPE_SCIENCEMESH) { } else { // We cannot handle other types yet throw new \InvalidArgumentException('unknown share type'); diff --git a/lib/private/Share20/ProviderFactory.php b/lib/private/Share20/ProviderFactory.php index 16f9a17ee42..6abfb372a4d 100644 --- a/lib/private/Share20/ProviderFactory.php +++ b/lib/private/Share20/ProviderFactory.php @@ -340,6 +340,8 @@ class ProviderFactory implements IProviderFactory { $provider = $this->getRoomShareProvider(); } elseif ($shareType === IShare::TYPE_DECK) { $provider = $this->getProvider('deck'); + } elseif ($shareType === IShare::TYPE_SCIENCEMESH) { + $provider = $this->getProvider('sciencemesh'); } diff --git a/lib/public/Share/IShare.php b/lib/public/Share/IShare.php index f8f75be4c41..40548c6c73d 100644 --- a/lib/public/Share/IShare.php +++ b/lib/public/Share/IShare.php @@ -117,6 +117,11 @@ interface IShare { */ public const TYPE_DECK_USER = 13; + /** + * @since 26.0.0 + */ + public const TYPE_SCIENCEMESH = 15; + /** * @since 18.0.0 */