Browse Source

Add SHARE_TYPE_SCIENCEMESH

Signed-off-by: Michiel de Jong <michiel@unhosted.org>
Michiel de Jong 1 year ago
parent
commit
b2c8be171d

+ 25 - 0
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',
+				]
+			);
 		}
 	}
 

+ 1 - 0
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(

+ 1 - 0
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]],

+ 1 - 0
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 = [];
 

+ 1 - 1
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);

+ 28 - 2
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');
+	}
 }

+ 67 - 4
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);
 	}
 
 

+ 8 - 0
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)) {

+ 1 - 0
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

+ 6 - 0
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 {}
 			}

+ 1 - 0
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,
 	},
 })

+ 2 - 0
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)

+ 2 - 2
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();

+ 9 - 3
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')

+ 2 - 0
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

+ 1 - 0
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');

+ 2 - 0
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');
 		}
 
 

+ 5 - 0
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
 	 */