Merge pull request #24605 from nextcloud/enh/share-deck
Add deck share provider support
This commit is contained in:
commit
3c693db0ca
|
@ -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',
|
||||
]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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]],
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -1,2 +1,2 @@
|
|||
!function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="/js/",r(r.s=341)}({341:function(e,t){Object.assign(OC,{Share:{SHARE_TYPE_USER:0,SHARE_TYPE_GROUP:1,SHARE_TYPE_LINK:3,SHARE_TYPE_EMAIL:4,SHARE_TYPE_REMOTE:6,SHARE_TYPE_CIRCLE:7,SHARE_TYPE_GUEST:8,SHARE_TYPE_REMOTE_GROUP:9,SHARE_TYPE_ROOM:10}})}});
|
||||
!function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="/js/",r(r.s=341)}({341:function(e,t){Object.assign(OC,{Share:{SHARE_TYPE_USER:0,SHARE_TYPE_GROUP:1,SHARE_TYPE_LINK:3,SHARE_TYPE_EMAIL:4,SHARE_TYPE_REMOTE:6,SHARE_TYPE_CIRCLE:7,SHARE_TYPE_GUEST:8,SHARE_TYPE_REMOTE_GROUP:9,SHARE_TYPE_ROOM:10,SHARE_TYPE_DECK:12}})}});
|
||||
//# sourceMappingURL=main.js.map
|
File diff suppressed because one or more lines are too long
|
@ -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);
|
||||
|
@ -211,6 +220,23 @@ class DeletedShareAPIController extends OCSController {
|
|||
throw new QueryException();
|
||||
}
|
||||
|
||||
return $this->serverContainer->query('\OCA\Talk\Share\Helper\DeletedShareAPIController');
|
||||
return $this->serverContainer->get('\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->get('\OCA\Deck\Sharing\ShareAPIHelper');
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
@ -1517,9 +1558,25 @@ class ShareAPIController extends OCSController {
|
|||
throw new QueryException();
|
||||
}
|
||||
|
||||
return $this->serverContainer->query('\OCA\Talk\Share\Helper\ShareAPIController');
|
||||
return $this->serverContainer->get('\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->get('\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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -29,13 +29,16 @@
|
|||
:tooltip-message="share.type === SHARE_TYPES.SHARE_TYPE_USER ? share.shareWith : ''"
|
||||
:menu-position="'left'"
|
||||
:url="share.shareWithAvatar" />
|
||||
<div v-tooltip.auto="tooltip" class="sharing-entry__desc">
|
||||
<component :is="share.shareWithLink ? 'a' : 'div'"
|
||||
:href="share.shareWithLink"
|
||||
v-tooltip.auto="tooltip"
|
||||
class="sharing-entry__desc">
|
||||
<h5>{{ title }}</h5>
|
||||
<p v-if="hasStatus">
|
||||
<span>{{ share.status.icon || '' }}</span>
|
||||
<span>{{ share.status.message || '' }}</span>
|
||||
</p>
|
||||
</div>
|
||||
</component>
|
||||
<Actions
|
||||
menu-align="right"
|
||||
class="sharing-entry__actions"
|
||||
|
|
|
@ -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) {
|
||||
|
@ -365,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 ''
|
||||
|
@ -384,6 +387,8 @@ export default {
|
|||
desc = t('files_sharing', 'on {server}', { server: result.value.server })
|
||||
} else if (result.value.shareType === this.SHARE_TYPES.SHARE_TYPE_EMAIL) {
|
||||
desc = result.value.shareWith
|
||||
} else {
|
||||
desc = result.shareWithDescription ?? ''
|
||||
}
|
||||
|
||||
return {
|
||||
|
|
|
@ -32,5 +32,6 @@ Object.assign(OC, {
|
|||
SHARE_TYPE_GUEST: 8,
|
||||
SHARE_TYPE_REMOTE_GROUP: 9,
|
||||
SHARE_TYPE_ROOM: 10,
|
||||
SHARE_TYPE_DECK: 12,
|
||||
},
|
||||
})
|
||||
|
|
|
@ -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,
|
||||
},
|
||||
|
|
|
@ -150,6 +150,17 @@ export default class Share {
|
|||
|| this.#share.share_with
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the share with entity link
|
||||
*
|
||||
* @returns {string}
|
||||
* @readonly
|
||||
* @memberof Share
|
||||
*/
|
||||
get shareWithLink() {
|
||||
return this.#share.share_with_link
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the share with avatar if any
|
||||
*
|
||||
|
|
|
@ -161,6 +161,8 @@ import escapeHTML from 'escape-html'
|
|||
hasShares = true
|
||||
} else if (shareType === OC.Share.SHARE_TYPE_ROOM) {
|
||||
hasShares = true
|
||||
} else if (shareType === OC.Share.SHARE_TYPE_DECK) {
|
||||
hasShares = true
|
||||
}
|
||||
})
|
||||
OCA.Sharing.Util._updateFileActionIcon($tr, hasShares, hasLink)
|
||||
|
|
|
@ -196,10 +196,10 @@ class ShareAPIControllerTest extends TestCase {
|
|||
$this->expectExceptionMessage('Wrong share ID, share doesn\'t exist');
|
||||
|
||||
$this->shareManager
|
||||
->expects($this->exactly(5))
|
||||
->expects($this->exactly(6))
|
||||
->method('getShareById')
|
||||
->willReturnCallback(function ($id) {
|
||||
if ($id === 'ocinternal:42' || $id === 'ocRoomShare:42' || $id === 'ocFederatedSharing:42' || $id === 'ocCircleShare:42' || $id === 'ocMailShare:42') {
|
||||
if ($id === 'ocinternal:42' || $id === 'ocRoomShare:42' || $id === 'ocFederatedSharing:42' || $id === 'ocCircleShare:42' || $id === 'ocMailShare:42' || $id === 'deck:42') {
|
||||
throw new \OCP\Share\Exceptions\ShareNotFound();
|
||||
} else {
|
||||
throw new \Exception();
|
||||
|
@ -1558,7 +1558,7 @@ class ShareAPIControllerTest extends TestCase {
|
|||
->with($share, $this->currentUser)
|
||||
->willReturn($canAccessShareByHelper);
|
||||
|
||||
$this->serverContainer->method('query')
|
||||
$this->serverContainer->method('get')
|
||||
->with('\OCA\Talk\Share\Helper\ShareAPIController')
|
||||
->willReturn($helper);
|
||||
}
|
||||
|
@ -2222,7 +2222,7 @@ class ShareAPIControllerTest extends TestCase {
|
|||
}
|
||||
);
|
||||
|
||||
$this->serverContainer->method('query')
|
||||
$this->serverContainer->method('get')
|
||||
->with('\OCA\Talk\Share\Helper\ShareAPIController')
|
||||
->willReturn($helper);
|
||||
|
||||
|
@ -2340,7 +2340,7 @@ class ShareAPIControllerTest extends TestCase {
|
|||
}
|
||||
);
|
||||
|
||||
$this->serverContainer->method('query')
|
||||
$this->serverContainer->method('get')
|
||||
->with('\OCA\Talk\Share\Helper\ShareAPIController')
|
||||
->willReturn($helper);
|
||||
|
||||
|
@ -4404,7 +4404,7 @@ class ShareAPIControllerTest extends TestCase {
|
|||
->with($share)
|
||||
->willReturn($formatShareByHelper);
|
||||
|
||||
$this->serverContainer->method('query')
|
||||
$this->serverContainer->method('get')
|
||||
->with('\OCA\Talk\Share\Helper\ShareAPIController')
|
||||
->willReturn($helper);
|
||||
}
|
||||
|
|
|
@ -123,6 +123,12 @@ class MountProviderTest extends \Test\TestCase {
|
|||
$this->makeMockShare(8, 102, 'user2', '/share6', 31),
|
||||
$this->makeMockShare(9, 102, 'user2', '/share6', 31),
|
||||
];
|
||||
$deckShares = [
|
||||
$this->makeMockShare(10, 103, 'user2', '/share7', 0),
|
||||
$this->makeMockShare(11, 103, 'user1', '/share7', 31),
|
||||
$this->makeMockShare(12, 103, 'user2', '/share7', 31),
|
||||
$this->makeMockShare(13, 103, 'user2', '/share7', 31),
|
||||
];
|
||||
// tests regarding circles are made in the app itself.
|
||||
$circleShares = [];
|
||||
$this->user->expects($this->any())
|
||||
|
@ -144,16 +150,21 @@ class MountProviderTest extends \Test\TestCase {
|
|||
->method('getSharedWith')
|
||||
->with('user1', IShare::TYPE_ROOM, null, -1)
|
||||
->willReturn($roomShares);
|
||||
$this->shareManager->expects($this->at(4))
|
||||
->method('getSharedWith')
|
||||
->with('user1', IShare::TYPE_DECK, null, -1)
|
||||
->willReturn($deckShares);
|
||||
$this->shareManager->expects($this->any())
|
||||
->method('newShare')
|
||||
->willReturnCallback(function () use ($rootFolder, $userManager) {
|
||||
return new \OC\Share20\Share($rootFolder, $userManager);
|
||||
});
|
||||
$mounts = $this->provider->getMountsForUser($this->user, $this->loader);
|
||||
$this->assertCount(3, $mounts);
|
||||
$this->assertCount(4, $mounts);
|
||||
$this->assertInstanceOf('OCA\Files_Sharing\SharedMount', $mounts[0]);
|
||||
$this->assertInstanceOf('OCA\Files_Sharing\SharedMount', $mounts[1]);
|
||||
$this->assertInstanceOf('OCA\Files_Sharing\SharedMount', $mounts[2]);
|
||||
$this->assertInstanceOf('OCA\Files_Sharing\SharedMount', $mounts[3]);
|
||||
$mountedShare1 = $mounts[0]->getShare();
|
||||
$this->assertEquals('2', $mountedShare1->getId());
|
||||
$this->assertEquals('user2', $mountedShare1->getShareOwner());
|
||||
|
@ -172,6 +183,12 @@ class MountProviderTest extends \Test\TestCase {
|
|||
$this->assertEquals(102, $mountedShare3->getNodeId());
|
||||
$this->assertEquals('/share6', $mountedShare3->getTarget());
|
||||
$this->assertEquals(31, $mountedShare3->getPermissions());
|
||||
$mountedShare4 = $mounts[3]->getShare();
|
||||
$this->assertEquals('12', $mountedShare4->getId());
|
||||
$this->assertEquals('user2', $mountedShare4->getShareOwner());
|
||||
$this->assertEquals(103, $mountedShare4->getNodeId());
|
||||
$this->assertEquals('/share7', $mountedShare4->getTarget());
|
||||
$this->assertEquals(31, $mountedShare4->getPermissions());
|
||||
}
|
||||
|
||||
public function mergeSharesDataProvider() {
|
||||
|
@ -337,6 +354,7 @@ class MountProviderTest extends \Test\TestCase {
|
|||
// tests regarding circles are made in the app itself.
|
||||
$circleShares = [];
|
||||
$roomShares = [];
|
||||
$deckShares = [];
|
||||
$this->shareManager->expects($this->at(0))
|
||||
->method('getSharedWith')
|
||||
->with('user1', IShare::TYPE_USER)
|
||||
|
@ -353,6 +371,10 @@ class MountProviderTest extends \Test\TestCase {
|
|||
->method('getSharedWith')
|
||||
->with('user1', IShare::TYPE_ROOM, null, -1)
|
||||
->willReturn($roomShares);
|
||||
$this->shareManager->expects($this->at(4))
|
||||
->method('getSharedWith')
|
||||
->with('user1', IShare::TYPE_DECK, null, -1)
|
||||
->willReturn($deckShares);
|
||||
$this->shareManager->expects($this->any())
|
||||
->method('newShare')
|
||||
->willReturnCallback(function () use ($rootFolder, $userManager) {
|
||||
|
|
|
@ -1613,12 +1613,6 @@
|
|||
<code>getUserFolder</code>
|
||||
</UndefinedInterfaceMethod>
|
||||
</file>
|
||||
<file src="apps/files_sharing/lib/Controller/DeletedShareAPIController.php">
|
||||
<UndefinedDocblockClass occurrences="2">
|
||||
<code>$this->getRoomShareHelper()</code>
|
||||
<code>\OCA\Talk\Share\Helper\DeletedShareAPIController</code>
|
||||
</UndefinedDocblockClass>
|
||||
</file>
|
||||
<file src="apps/files_sharing/lib/Controller/ShareAPIController.php">
|
||||
<InvalidScalarArgument occurrences="3">
|
||||
<code>$code</code>
|
||||
|
@ -5051,16 +5045,13 @@
|
|||
<code>FederatedShareProvider</code>
|
||||
<code>ShareByMailProvider</code>
|
||||
</InvalidNullableReturnType>
|
||||
<InvalidReturnStatement occurrences="5">
|
||||
<InvalidReturnStatement occurrences="4">
|
||||
<code>$provider</code>
|
||||
<code>$provider</code>
|
||||
<code>$shares</code>
|
||||
<code>$this->roomShareProvider</code>
|
||||
<code>$this->shareByCircleProvider</code>
|
||||
</InvalidReturnStatement>
|
||||
<InvalidReturnType occurrences="3">
|
||||
<code>getAllProviders</code>
|
||||
<code>getProvider</code>
|
||||
<InvalidReturnType occurrences="1">
|
||||
<code>getProviderForType</code>
|
||||
</InvalidReturnType>
|
||||
<NullableReturnStatement occurrences="6">
|
||||
|
|
|
@ -70,6 +70,11 @@ 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_DECK instead
|
||||
*/
|
||||
public const SHARE_TYPE_DECK = 12;
|
||||
// const SHARE_TYPE_DECK_USER = 13; // Internal type used by DeckShareProvider
|
||||
|
||||
public const FORMAT_NONE = -1;
|
||||
public const FORMAT_STATUSES = -2;
|
||||
|
|
|
@ -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');
|
||||
|
@ -1887,6 +1888,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();
|
||||
|
||||
|
|
|
@ -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.');
|
||||
}
|
||||
|
@ -295,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');
|
||||
}
|
||||
|
||||
|
||||
|
@ -320,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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -416,6 +416,12 @@ interface IManager {
|
|||
*/
|
||||
public function shareProviderExists($shareType);
|
||||
|
||||
/**
|
||||
* @param string $shareProviderClass
|
||||
* @since 21.0.0
|
||||
*/
|
||||
public function registerShareProvider(string $shareProviderClass): void;
|
||||
|
||||
/**
|
||||
* @Internal
|
||||
*
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -105,6 +105,17 @@ interface IShare {
|
|||
*/
|
||||
// const TYPE_USERROOM = 11;
|
||||
|
||||
/**
|
||||
* @since 21.0.0
|
||||
*/
|
||||
public const TYPE_DECK = 12;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
* @since 21.0.0
|
||||
*/
|
||||
public const TYPE_DECK_USER = 13;
|
||||
|
||||
/**
|
||||
* @since 18.0.0
|
||||
*/
|
||||
|
|
|
@ -85,5 +85,12 @@
|
|||
<file name="core/register_command.php" />
|
||||
</errorLevel>
|
||||
</UndefinedGlobalVariable>
|
||||
<UndefinedDocblockClass>
|
||||
<errorLevel type="suppress">
|
||||
<!-- Helper classes for sharing API integration from other apps -->
|
||||
<referencedClass name="OCA\Deck\Sharing\ShareAPIHelper" />
|
||||
<referencedClass name="OCA\Talk\Share\Helper\DeletedShareAPIController" />
|
||||
</errorLevel>
|
||||
</UndefinedDocblockClass>
|
||||
</issueHandlers>
|
||||
</psalm>
|
||||
|
|
|
@ -4362,6 +4362,9 @@ class DummyFactory implements IProviderFactory {
|
|||
public function getAllProviders() {
|
||||
return [$this->provider];
|
||||
}
|
||||
|
||||
public function registerProvider(string $shareProvier): void {
|
||||
}
|
||||
}
|
||||
|
||||
class DummyFactory2 extends DummyFactory {
|
||||
|
@ -4378,4 +4381,7 @@ class DummyFactory2 extends DummyFactory {
|
|||
public function getAllProviders() {
|
||||
return [$this->provider, $this->provider2];
|
||||
}
|
||||
|
||||
public function registerProvider(string $shareProvier): void {
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue