]> source.dussan.org Git - nextcloud-server.git/commitdiff
Add SHARE_TYPE_SCIENCEMESH
authorMichiel de Jong <michiel@unhosted.org>
Mon, 20 Feb 2023 09:50:31 +0000 (09:50 +0000)
committerLouis Chemineau <louis@chmn.me>
Wed, 8 Mar 2023 15:46:55 +0000 (16:46 +0100)
Signed-off-by: Michiel de Jong <michiel@unhosted.org>
18 files changed:
apps/admin_audit/lib/Actions/Sharing.php
apps/dav/lib/Connector/Sabre/SharesPlugin.php
apps/dav/tests/unit/Connector/Sabre/SharesPluginTest.php
apps/files/lib/Controller/ApiController.php
apps/files/lib/Service/OwnershipTransferService.php
apps/files_sharing/lib/Controller/DeletedShareAPIController.php
apps/files_sharing/lib/Controller/ShareAPIController.php
apps/files_sharing/lib/Controller/ShareesAPIController.php
apps/files_sharing/lib/MountProvider.php
apps/files_sharing/src/components/SharingInput.vue
apps/files_sharing/src/index.js
apps/files_sharing/src/share.js
apps/files_sharing/tests/Controller/ShareAPIControllerTest.php
apps/files_sharing/tests/MountProviderTest.php
lib/private/Share/Constants.php
lib/private/Share20/Manager.php
lib/private/Share20/ProviderFactory.php
lib/public/Share/IShare.php

index 329ed740b53c56a84c59910f0c73824ce227afc0..fd61d862e910048b82c954f6dd1e43f44ef6dbcf 100644 (file)
@@ -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',
+                               ]
+                       );
                }
        }
 
index 9fa6775c3b5cc2439ae1db11ee279662a6d93de0..3d52a44b6a65973f767a77795add46b62b7ce488 100644 (file)
@@ -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(
index abbf13d547986017f39a8841e2dd3fb405be8967..e6e90838966d3392e6f9af3bfa54e9e3b9f3d955 100644 (file)
@@ -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]],
index 604cf9a3c647224469d9d6132ef50755ed4c209d..9baf5e97892af3b13e375d07526b7e8b067e90cb 100644 (file)
@@ -209,6 +209,7 @@ class ApiController extends Controller {
                        IShare::TYPE_EMAIL,
                        IShare::TYPE_ROOM,
                        IShare::TYPE_DECK,
+                       IShare::TYPE_SCIENCEMESH,
                ];
                $shareTypes = [];
 
index 661a7e66e10392d0daa0218459da6c96865bc9a1..c744573ac9928f6fded8776e4806c2573406821b 100644 (file)
@@ -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);
index 1d625b35322a1bf661eb79deda3337983cb75414..19d1cbd0af6023be8d703aea1f763067513b8d34 100644 (file)
@@ -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');
+       }
 }
index ab318a81fc2325d4dc77825291c203b1fddfbf63..48146bc6599c8953155935ad52bcc7e331546e0d 100644 (file)
@@ -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);
        }
 
 
index 5a2e200c2380fc7aafb85415d8f3d6d18dc2f875..8daa7dc5ab9c7186972733a8629663b9e33211bd 100644 (file)
@@ -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)) {
index a9705e94906c754605d557408203ca9d2f53d5b6..2ad7ede8e40a6c536c0a16b9c3650e15687b7f5e 100644 (file)
@@ -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
index 8dadb4689ff4b559aaf5fa119cbd5d9fe8bbe201..de6812c9569f53703d375ac2b1b35fc078d4febb 100644 (file)
@@ -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 {}
                        }
index 9f80c79270e01222926e84ea8a7294f174cff4f9..95ed017bbf909aea4d1d19297b8cca8c4d8fb971 100644 (file)
@@ -34,5 +34,6 @@ Object.assign(OC, {
                SHARE_TYPE_REMOTE_GROUP: 9,
                SHARE_TYPE_ROOM: 10,
                SHARE_TYPE_DECK: 12,
+               SHARE_TYPE_SCIENCEMESH: 15,
        },
 })
index ca4dba7c8888603dcc659a33b60d848a2dd9b15f..06eea5807a1d2f16f65bee713de73c82eb6b2a3a 100644 (file)
@@ -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)
index 6405181d0dcc3c74a5acf3725ab343418e8f0931..2a2a7d940be5bf7f23ff1b8011c05e04c512861b 100644 (file)
@@ -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();
index 37e7e3d9d0354358d1eb1fc2f2c3a52f0534dfe0..f7cf5156ec53fc0dabe973ee3c3836e6c0a7152e 100644 (file)
@@ -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')
index 03c4c2ba828ec03dd25ebd42bdf1f116a85a054b..0c8fad17e07f1ec15ffb38a71800341dd11cda48 100644 (file)
@@ -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
index 7fd99545668b18b5039dcdbe55176ccf40037355..f84ed1671ba71449df5506ed33f8ca571438c022 100644 (file)
@@ -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');
index 16f9a17ee4229e7e82aa356181e8d2526a9d6efa..6abfb372a4d1ebdb173a8408b8c5529bd63f130f 100644 (file)
@@ -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');
                }
 
 
index f8f75be4c419a6a3ebdf1dfb37dfb8c01daaef4d..40548c6c73d2f9fab26c07141cbd56eeaee33cf9 100644 (file)
@@ -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
         */