mirror of
https://github.com/nextcloud/server.git
synced 2026-03-03 14:01:34 -05:00
refactor(external-share): Port more code to string as type for the id
Signed-off-by: Carl Schwan <carl.schwan@nextcloud.com>
This commit is contained in:
parent
91d3c63222
commit
3183ea79d2
19 changed files with 293 additions and 644 deletions
|
|
@ -7,9 +7,7 @@
|
|||
*/
|
||||
namespace OCA\FederatedFileSharing\Controller;
|
||||
|
||||
use OCA\FederatedFileSharing\AddressHandler;
|
||||
use OCA\FederatedFileSharing\FederatedShareProvider;
|
||||
use OCA\FederatedFileSharing\Notifications;
|
||||
use OCP\App\IAppManager;
|
||||
use OCP\AppFramework\Http;
|
||||
use OCP\AppFramework\Http\Attribute\NoCSRFRequired;
|
||||
|
|
@ -29,7 +27,6 @@ use OCP\Federation\ICloudIdManager;
|
|||
use OCP\HintException;
|
||||
use OCP\IDBConnection;
|
||||
use OCP\IRequest;
|
||||
use OCP\IUserManager;
|
||||
use OCP\Log\Audit\CriticalActionPerformedEvent;
|
||||
use OCP\Server;
|
||||
use OCP\Share;
|
||||
|
|
@ -44,10 +41,6 @@ class RequestHandlerController extends OCSController {
|
|||
IRequest $request,
|
||||
private FederatedShareProvider $federatedShareProvider,
|
||||
private IDBConnection $connection,
|
||||
private Share\IManager $shareManager,
|
||||
private Notifications $notifications,
|
||||
private AddressHandler $addressHandler,
|
||||
private IUserManager $userManager,
|
||||
private ICloudIdManager $cloudIdManager,
|
||||
private LoggerInterface $logger,
|
||||
private ICloudFederationFactory $cloudFederationFactory,
|
||||
|
|
@ -66,10 +59,10 @@ class RequestHandlerController extends OCSController {
|
|||
* @param string|null $owner Display name of the receiver
|
||||
* @param string|null $sharedBy Display name of the sender
|
||||
* @param string|null $shareWith ID of the user that receives the share
|
||||
* @param int|null $remoteId ID of the remote
|
||||
* @param string|null $remoteId ID of the remote
|
||||
* @param string|null $sharedByFederatedId Federated ID of the sender
|
||||
* @param string|null $ownerFederatedId Federated ID of the receiver
|
||||
* @return Http\DataResponse<Http::STATUS_OK, list<empty>, array{}>
|
||||
* @return DataResponse<Http::STATUS_OK, list<empty>, array{}>
|
||||
* @throws OCSException
|
||||
*
|
||||
* 200: Share created successfully
|
||||
|
|
@ -83,10 +76,10 @@ class RequestHandlerController extends OCSController {
|
|||
?string $owner = null,
|
||||
?string $sharedBy = null,
|
||||
?string $shareWith = null,
|
||||
?int $remoteId = null,
|
||||
?string $remoteId = null,
|
||||
?string $sharedByFederatedId = null,
|
||||
?string $ownerFederatedId = null,
|
||||
) {
|
||||
): DataResponse {
|
||||
if ($ownerFederatedId === null) {
|
||||
$ownerFederatedId = $this->cloudIdManager->getCloudId($owner, $this->cleanupRemote($remote))->getId();
|
||||
}
|
||||
|
|
@ -132,11 +125,11 @@ class RequestHandlerController extends OCSController {
|
|||
/**
|
||||
* create re-share on behalf of another user
|
||||
*
|
||||
* @param int $id ID of the share
|
||||
* @param string $id ID of the share
|
||||
* @param string|null $token Shared secret between servers
|
||||
* @param string|null $shareWith ID of the user that receives the share
|
||||
* @param int|null $remoteId ID of the remote
|
||||
* @return Http\DataResponse<Http::STATUS_OK, array{token: string, remoteId: string}, array{}>
|
||||
* @return DataResponse<Http::STATUS_OK, array{token: string, remoteId: string}, array{}>
|
||||
* @throws OCSBadRequestException Re-sharing is not possible
|
||||
* @throws OCSException
|
||||
*
|
||||
|
|
@ -144,7 +137,7 @@ class RequestHandlerController extends OCSController {
|
|||
*/
|
||||
#[NoCSRFRequired]
|
||||
#[PublicPage]
|
||||
public function reShare(int $id, ?string $token = null, ?string $shareWith = null, ?int $remoteId = 0) {
|
||||
public function reShare(string $id, ?string $token = null, ?string $shareWith = null, ?int $remoteId = 0): DataResponse {
|
||||
if ($token === null
|
||||
|| $shareWith === null
|
||||
|| $remoteId === null
|
||||
|
|
@ -181,9 +174,9 @@ class RequestHandlerController extends OCSController {
|
|||
/**
|
||||
* accept server-to-server share
|
||||
*
|
||||
* @param int $id ID of the remote share
|
||||
* @param string $id ID of the remote share
|
||||
* @param string|null $token Shared secret between servers
|
||||
* @return Http\DataResponse<Http::STATUS_OK, list<empty>, array{}>
|
||||
* @return DataResponse<Http::STATUS_OK, list<empty>, array{}>
|
||||
* @throws OCSException
|
||||
* @throws ShareNotFound
|
||||
* @throws HintException
|
||||
|
|
@ -192,7 +185,7 @@ class RequestHandlerController extends OCSController {
|
|||
*/
|
||||
#[NoCSRFRequired]
|
||||
#[PublicPage]
|
||||
public function acceptShare(int $id, ?string $token = null) {
|
||||
public function acceptShare(string $id, ?string $token = null): DataResponse {
|
||||
$notification = [
|
||||
'sharedSecret' => $token,
|
||||
'message' => 'Recipient accept the share'
|
||||
|
|
@ -216,16 +209,16 @@ class RequestHandlerController extends OCSController {
|
|||
/**
|
||||
* decline server-to-server share
|
||||
*
|
||||
* @param int $id ID of the remote share
|
||||
* @param string $id ID of the remote share
|
||||
* @param string|null $token Shared secret between servers
|
||||
* @return Http\DataResponse<Http::STATUS_OK, list<empty>, array{}>
|
||||
* @return DataResponse<Http::STATUS_OK, list<empty>, array{}>
|
||||
* @throws OCSException
|
||||
*
|
||||
* 200: Share declined successfully
|
||||
*/
|
||||
#[NoCSRFRequired]
|
||||
#[PublicPage]
|
||||
public function declineShare(int $id, ?string $token = null) {
|
||||
public function declineShare(string $id, ?string $token = null) {
|
||||
$notification = [
|
||||
'sharedSecret' => $token,
|
||||
'message' => 'Recipient declined the share'
|
||||
|
|
@ -249,16 +242,16 @@ class RequestHandlerController extends OCSController {
|
|||
/**
|
||||
* remove server-to-server share if it was unshared by the owner
|
||||
*
|
||||
* @param int $id ID of the share
|
||||
* @param string $id ID of the share
|
||||
* @param string|null $token Shared secret between servers
|
||||
* @return Http\DataResponse<Http::STATUS_OK, list<empty>, array{}>
|
||||
* @return DataResponse<Http::STATUS_OK, list<empty>, array{}>
|
||||
* @throws OCSException
|
||||
*
|
||||
* 200: Share unshared successfully
|
||||
*/
|
||||
#[NoCSRFRequired]
|
||||
#[PublicPage]
|
||||
public function unshare(int $id, ?string $token = null) {
|
||||
public function unshare(string $id, ?string $token = null) {
|
||||
if (!$this->isS2SEnabled()) {
|
||||
throw new OCSException('Server does not support federated cloud sharing', 503);
|
||||
}
|
||||
|
|
@ -275,7 +268,7 @@ class RequestHandlerController extends OCSController {
|
|||
return new DataResponse();
|
||||
}
|
||||
|
||||
private function cleanupRemote($remote) {
|
||||
private function cleanupRemote(string $remote): string {
|
||||
$remote = substr($remote, strpos($remote, '://') + 3);
|
||||
|
||||
return rtrim($remote, '/');
|
||||
|
|
@ -285,16 +278,16 @@ class RequestHandlerController extends OCSController {
|
|||
/**
|
||||
* federated share was revoked, either by the owner or the re-sharer
|
||||
*
|
||||
* @param int $id ID of the share
|
||||
* @param string $id ID of the share
|
||||
* @param string|null $token Shared secret between servers
|
||||
* @return Http\DataResponse<Http::STATUS_OK, list<empty>, array{}>
|
||||
* @return DataResponse<Http::STATUS_OK, list<empty>, array{}>
|
||||
* @throws OCSBadRequestException Revoking the share is not possible
|
||||
*
|
||||
* 200: Share revoked successfully
|
||||
*/
|
||||
#[NoCSRFRequired]
|
||||
#[PublicPage]
|
||||
public function revoke(int $id, ?string $token = null) {
|
||||
public function revoke(string $id, ?string $token = null) {
|
||||
try {
|
||||
$provider = $this->cloudFederationProviderManager->getCloudFederationProvider('file');
|
||||
$notification = ['sharedSecret' => $token];
|
||||
|
|
@ -324,19 +317,19 @@ class RequestHandlerController extends OCSController {
|
|||
}
|
||||
|
||||
/**
|
||||
* update share information to keep federated re-shares in sync
|
||||
* Update share information to keep federated re-shares in sync.
|
||||
*
|
||||
* @param int $id ID of the share
|
||||
* @param string $id ID of the share
|
||||
* @param string|null $token Shared secret between servers
|
||||
* @param int|null $permissions New permissions
|
||||
* @return Http\DataResponse<Http::STATUS_OK, list<empty>, array{}>
|
||||
* @return DataResponse<Http::STATUS_OK, list<empty>, array{}>
|
||||
* @throws OCSBadRequestException Updating permissions is not possible
|
||||
*
|
||||
* 200: Permissions updated successfully
|
||||
*/
|
||||
#[NoCSRFRequired]
|
||||
#[PublicPage]
|
||||
public function updatePermissions(int $id, ?string $token = null, ?int $permissions = null) {
|
||||
public function updatePermissions(string $id, ?string $token = null, ?int $permissions = null) {
|
||||
$ncPermissions = $permissions;
|
||||
|
||||
try {
|
||||
|
|
@ -385,7 +378,7 @@ class RequestHandlerController extends OCSController {
|
|||
* @param string|null $token Shared secret between servers
|
||||
* @param string|null $remote Address of the remote
|
||||
* @param string|null $remote_id ID of the remote
|
||||
* @return Http\DataResponse<Http::STATUS_OK, array{remote: string, owner: string}, array{}>
|
||||
* @return DataResponse<Http::STATUS_OK, array{remote: string, owner: string}, array{}>
|
||||
* @throws OCSBadRequestException Moving share is not possible
|
||||
*
|
||||
* 200: Share moved successfully
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@ use OCP\Share\Exceptions\ShareNotFound;
|
|||
use OCP\Share\IShare;
|
||||
use OCP\Share\IShareProvider;
|
||||
use OCP\Share\IShareProviderSupportsAllSharesInFolder;
|
||||
use Override;
|
||||
use Psr\Log\LoggerInterface;
|
||||
|
||||
/**
|
||||
|
|
@ -140,7 +141,7 @@ class FederatedShareProvider implements IShareProvider, IShareProviderSupportsAl
|
|||
if ($remoteShare) {
|
||||
try {
|
||||
$ownerCloudId = $this->cloudIdManager->getCloudId($remoteShare['owner'], $remoteShare['remote']);
|
||||
$shareId = $this->addShareToDB($itemSource, $itemType, $shareWith, $sharedBy, $ownerCloudId->getId(), $permissions, 'tmp_token_' . time(), $shareType, $expirationDate);
|
||||
$shareId = (string)$this->addShareToDB($itemSource, $itemType, $shareWith, $sharedBy, $ownerCloudId->getId(), $permissions, 'tmp_token_' . time(), $shareType, $expirationDate);
|
||||
$share->setId($shareId);
|
||||
[$token, $remoteId] = $this->askOwnerToReShare($shareWith, $share, $shareId);
|
||||
// remote share was create successfully if we get a valid token as return
|
||||
|
|
@ -168,16 +169,14 @@ class FederatedShareProvider implements IShareProvider, IShareProviderSupportsAl
|
|||
}
|
||||
|
||||
/**
|
||||
* create federated share and inform the recipient
|
||||
* Create federated share and inform the recipient.
|
||||
*
|
||||
* @param IShare $share
|
||||
* @return int
|
||||
* @throws ShareNotFound
|
||||
* @throws \Exception
|
||||
*/
|
||||
protected function createFederatedShare(IShare $share) {
|
||||
protected function createFederatedShare(IShare $share): string {
|
||||
$token = $this->tokenHandler->generateToken();
|
||||
$shareId = $this->addShareToDB(
|
||||
$shareId = (string)$this->addShareToDB(
|
||||
$share->getNodeId(),
|
||||
$share->getNodeType(),
|
||||
$share->getSharedWith(),
|
||||
|
|
@ -321,12 +320,9 @@ class FederatedShareProvider implements IShareProvider, IShareProviderSupportsAl
|
|||
}
|
||||
|
||||
/**
|
||||
* Update a share
|
||||
*
|
||||
* @param IShare $share
|
||||
* @return IShare The share object
|
||||
* Update a share.
|
||||
*/
|
||||
public function update(IShare $share) {
|
||||
public function update(IShare $share): IShare {
|
||||
/*
|
||||
* We allow updating the permissions of federated shares
|
||||
*/
|
||||
|
|
@ -348,13 +344,12 @@ class FederatedShareProvider implements IShareProvider, IShareProviderSupportsAl
|
|||
}
|
||||
|
||||
/**
|
||||
* send the updated permission to the owner/initiator, if they are not the same
|
||||
* Send the updated permission to the owner/initiator, if they are not the same.
|
||||
*
|
||||
* @param IShare $share
|
||||
* @throws ShareNotFound
|
||||
* @throws HintException
|
||||
*/
|
||||
protected function sendPermissionUpdate(IShare $share) {
|
||||
protected function sendPermissionUpdate(IShare $share): void {
|
||||
$remoteId = $this->getRemoteId($share);
|
||||
// if the local user is the owner we send the permission change to the initiator
|
||||
if ($this->userManager->userExists($share->getShareOwner())) {
|
||||
|
|
@ -367,12 +362,9 @@ class FederatedShareProvider implements IShareProvider, IShareProviderSupportsAl
|
|||
|
||||
|
||||
/**
|
||||
* update successful reShare with the correct token
|
||||
*
|
||||
* @param int $shareId
|
||||
* @param string $token
|
||||
* Update successful reShare with the correct token.
|
||||
*/
|
||||
protected function updateSuccessfulReShare($shareId, $token) {
|
||||
protected function updateSuccessfulReShare(string $shareId, string $token): void {
|
||||
$query = $this->dbConnection->getQueryBuilder();
|
||||
$query->update('share')
|
||||
->where($query->expr()->eq('id', $query->createNamedParameter($shareId)))
|
||||
|
|
@ -381,12 +373,9 @@ class FederatedShareProvider implements IShareProvider, IShareProviderSupportsAl
|
|||
}
|
||||
|
||||
/**
|
||||
* store remote ID in federated reShare table
|
||||
*
|
||||
* @param $shareId
|
||||
* @param $remoteId
|
||||
* Store remote ID in federated reShare table.
|
||||
*/
|
||||
public function storeRemoteId(int $shareId, string $remoteId): void {
|
||||
public function storeRemoteId(string $shareId, string $remoteId): void {
|
||||
$query = $this->dbConnection->getQueryBuilder();
|
||||
$query->insert('federated_reshares')
|
||||
->values(
|
||||
|
|
@ -399,10 +388,8 @@ class FederatedShareProvider implements IShareProvider, IShareProviderSupportsAl
|
|||
}
|
||||
|
||||
/**
|
||||
* get share ID on remote server for federated re-shares
|
||||
* Get share ID on remote server for federated re-shares.
|
||||
*
|
||||
* @param IShare $share
|
||||
* @return string
|
||||
* @throws ShareNotFound
|
||||
*/
|
||||
public function getRemoteId(IShare $share): string {
|
||||
|
|
@ -512,11 +499,9 @@ class FederatedShareProvider implements IShareProvider, IShareProviderSupportsAl
|
|||
}
|
||||
|
||||
/**
|
||||
* remove share from table
|
||||
*
|
||||
* @param string $shareId
|
||||
* Remove share from table.
|
||||
*/
|
||||
private function removeShareFromTableById($shareId) {
|
||||
private function removeShareFromTableById(string $shareId): void {
|
||||
$qb = $this->dbConnection->getQueryBuilder();
|
||||
$qb->delete('share')
|
||||
->where($qb->expr()->eq('id', $qb->createNamedParameter($shareId)))
|
||||
|
|
@ -748,13 +733,8 @@ class FederatedShareProvider implements IShareProvider, IShareProviderSupportsAl
|
|||
return $shares;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a share by token
|
||||
*
|
||||
* @param string $token
|
||||
* @throws ShareNotFound
|
||||
*/
|
||||
public function getShareByToken($token): IShare {
|
||||
#[Override]
|
||||
public function getShareByToken(string $token): IShare {
|
||||
$qb = $this->dbConnection->getQueryBuilder();
|
||||
|
||||
$cursor = $qb->select('*')
|
||||
|
|
|
|||
|
|
@ -618,7 +618,7 @@ class CloudFederationProviderFiles implements ISignedCloudFederationProvider {
|
|||
$share->setSharedBy($share->getSharedWith());
|
||||
$share->setSharedWith($shareWith);
|
||||
$result = $this->federatedShareProvider->create($share);
|
||||
$this->federatedShareProvider->storeRemoteId((int)$result->getId(), $senderId);
|
||||
$this->federatedShareProvider->storeRemoteId($result->getId(), $senderId);
|
||||
return ['token' => $result->getToken(), 'providerId' => $result->getId()];
|
||||
} else {
|
||||
throw new ProviderCouldNotAddShareException('resharing not allowed for share: ' . $id);
|
||||
|
|
|
|||
|
|
@ -192,8 +192,7 @@
|
|||
"description": "ID of the user that receives the share"
|
||||
},
|
||||
"remoteId": {
|
||||
"type": "integer",
|
||||
"format": "int64",
|
||||
"type": "string",
|
||||
"nullable": true,
|
||||
"default": null,
|
||||
"description": "ID of the remote"
|
||||
|
|
@ -313,8 +312,7 @@
|
|||
"description": "ID of the share",
|
||||
"required": true,
|
||||
"schema": {
|
||||
"type": "integer",
|
||||
"format": "int64"
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -405,7 +403,7 @@
|
|||
"/ocs/v2.php/cloud/shares/{id}/permissions": {
|
||||
"post": {
|
||||
"operationId": "request_handler-update-permissions",
|
||||
"summary": "update share information to keep federated re-shares in sync",
|
||||
"summary": "Update share information to keep federated re-shares in sync.",
|
||||
"tags": [
|
||||
"request_handler"
|
||||
],
|
||||
|
|
@ -450,8 +448,7 @@
|
|||
"description": "ID of the share",
|
||||
"required": true,
|
||||
"schema": {
|
||||
"type": "integer",
|
||||
"format": "int64"
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -566,8 +563,7 @@
|
|||
"description": "ID of the remote share",
|
||||
"required": true,
|
||||
"schema": {
|
||||
"type": "integer",
|
||||
"format": "int64"
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -664,8 +660,7 @@
|
|||
"description": "ID of the remote share",
|
||||
"required": true,
|
||||
"schema": {
|
||||
"type": "integer",
|
||||
"format": "int64"
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -752,8 +747,7 @@
|
|||
"description": "ID of the share",
|
||||
"required": true,
|
||||
"schema": {
|
||||
"type": "integer",
|
||||
"format": "int64"
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -840,8 +834,7 @@
|
|||
"description": "ID of the share",
|
||||
"required": true,
|
||||
"schema": {
|
||||
"type": "integer",
|
||||
"format": "int64"
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
|
|||
|
|
@ -8,10 +8,8 @@ declare(strict_types=1);
|
|||
*/
|
||||
namespace OCA\FederatedFileSharing\Tests;
|
||||
|
||||
use OCA\FederatedFileSharing\AddressHandler;
|
||||
use OCA\FederatedFileSharing\Controller\RequestHandlerController;
|
||||
use OCA\FederatedFileSharing\FederatedShareProvider;
|
||||
use OCA\FederatedFileSharing\Notifications;
|
||||
use OCP\AppFramework\Http\DataResponse;
|
||||
use OCP\EventDispatcher\IEventDispatcher;
|
||||
use OCP\Federation\ICloudFederationFactory;
|
||||
|
|
@ -21,8 +19,6 @@ use OCP\Federation\ICloudFederationShare;
|
|||
use OCP\Federation\ICloudIdManager;
|
||||
use OCP\IDBConnection;
|
||||
use OCP\IRequest;
|
||||
use OCP\IUserManager;
|
||||
use OCP\Share;
|
||||
use OCP\Share\IShare;
|
||||
use PHPUnit\Framework\MockObject\MockObject;
|
||||
use Psr\Log\LoggerInterface;
|
||||
|
|
@ -42,15 +38,11 @@ class RequestHandlerControllerTest extends \Test\TestCase {
|
|||
|
||||
private RequestHandlerController $requestHandler;
|
||||
private FederatedShareProvider&MockObject $federatedShareProvider;
|
||||
private Notifications&MockObject $notifications;
|
||||
private AddressHandler&MockObject $addressHandler;
|
||||
private IUserManager&MockObject $userManager;
|
||||
private IShare&MockObject $share;
|
||||
private ICloudIdManager&MockObject $cloudIdManager;
|
||||
private LoggerInterface&MockObject $logger;
|
||||
private IRequest&MockObject $request;
|
||||
private IDBConnection&MockObject $connection;
|
||||
private Share\IManager&MockObject $shareManager;
|
||||
private ICloudFederationFactory&MockObject $cloudFederationFactory;
|
||||
private ICloudFederationProviderManager&MockObject $cloudFederationProviderManager;
|
||||
private ICloudFederationProvider&MockObject $cloudFederationProvider;
|
||||
|
|
@ -67,13 +59,9 @@ class RequestHandlerControllerTest extends \Test\TestCase {
|
|||
$this->federatedShareProvider->expects($this->any())->method('getShareById')
|
||||
->willReturn($this->share);
|
||||
|
||||
$this->notifications = $this->createMock(Notifications::class);
|
||||
$this->addressHandler = $this->createMock(AddressHandler::class);
|
||||
$this->userManager = $this->createMock(IUserManager::class);
|
||||
$this->cloudIdManager = $this->createMock(ICloudIdManager::class);
|
||||
$this->request = $this->createMock(IRequest::class);
|
||||
$this->connection = $this->createMock(IDBConnection::class);
|
||||
$this->shareManager = $this->createMock(Share\IManager::class);
|
||||
$this->cloudFederationFactory = $this->createMock(ICloudFederationFactory::class);
|
||||
$this->cloudFederationProviderManager = $this->createMock(ICloudFederationProviderManager::class);
|
||||
$this->cloudFederationProvider = $this->createMock(ICloudFederationProvider::class);
|
||||
|
|
@ -88,10 +76,6 @@ class RequestHandlerControllerTest extends \Test\TestCase {
|
|||
$this->request,
|
||||
$this->federatedShareProvider,
|
||||
$this->connection,
|
||||
$this->shareManager,
|
||||
$this->notifications,
|
||||
$this->addressHandler,
|
||||
$this->userManager,
|
||||
$this->cloudIdManager,
|
||||
$this->logger,
|
||||
$this->cloudFederationFactory,
|
||||
|
|
@ -106,7 +90,7 @@ class RequestHandlerControllerTest extends \Test\TestCase {
|
|||
$this->user2,
|
||||
'name',
|
||||
'',
|
||||
1,
|
||||
'1',
|
||||
$this->ownerCloudId,
|
||||
$this->owner,
|
||||
$this->user1CloudId,
|
||||
|
|
@ -125,13 +109,13 @@ class RequestHandlerControllerTest extends \Test\TestCase {
|
|||
$this->cloudFederationProvider->expects($this->once())->method('shareReceived')
|
||||
->with($this->cloudFederationShare);
|
||||
|
||||
$result = $this->requestHandler->createShare('localhost', 'token', 'name', $this->owner, $this->user1, $this->user2, 1, $this->user1CloudId, $this->ownerCloudId);
|
||||
$result = $this->requestHandler->createShare('localhost', 'token', 'name', $this->owner, $this->user1, $this->user2, '1', $this->user1CloudId, $this->ownerCloudId);
|
||||
|
||||
$this->assertInstanceOf(DataResponse::class, $result);
|
||||
}
|
||||
|
||||
public function testDeclineShare(): void {
|
||||
$id = 42;
|
||||
$id = '42';
|
||||
|
||||
$notification = [
|
||||
'sharedSecret' => 'token',
|
||||
|
|
@ -154,7 +138,7 @@ class RequestHandlerControllerTest extends \Test\TestCase {
|
|||
|
||||
|
||||
public function testAcceptShare(): void {
|
||||
$id = 42;
|
||||
$id = '42';
|
||||
|
||||
$notification = [
|
||||
'sharedSecret' => 'token',
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@ class ShareInfoController extends ApiController {
|
|||
try {
|
||||
$share = $this->shareManager->getShareByToken($t);
|
||||
} catch (ShareNotFound $e) {
|
||||
$response = new JSONResponse(["message" => "Not found " . $t . " "], Http::STATUS_NOT_FOUND);
|
||||
$response = new JSONResponse([], Http::STATUS_NOT_FOUND);
|
||||
$response->throttle(['token' => $t]);
|
||||
return $response;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -39,14 +39,11 @@ use function usort;
|
|||
*/
|
||||
class ShareesAPIController extends OCSController {
|
||||
|
||||
/** @var int */
|
||||
protected $offset = 0;
|
||||
|
||||
/** @var int */
|
||||
protected $limit = 10;
|
||||
protected int $offset = 0;
|
||||
protected int $limit = 10;
|
||||
|
||||
/** @var Files_SharingShareesSearchResult */
|
||||
protected $result = [
|
||||
protected array $result = [
|
||||
'exact' => [
|
||||
'users' => [],
|
||||
'groups' => [],
|
||||
|
|
@ -67,8 +64,6 @@ class ShareesAPIController extends OCSController {
|
|||
'lookupEnabled' => false,
|
||||
];
|
||||
|
||||
protected $reachedEndFor = [];
|
||||
|
||||
public function __construct(
|
||||
string $appName,
|
||||
IRequest $request,
|
||||
|
|
|
|||
|
|
@ -106,7 +106,7 @@ class ExternalShare extends Entity implements \JsonSerializable {
|
|||
'owner' => $this->getOwner(),
|
||||
'user' => $this->getUser(),
|
||||
'mountpoint' => $this->getMountpoint(),
|
||||
'accepted' => $this->getAccepted(),
|
||||
'accepted' => $this->getAccepted() === IShare::STATUS_ACCEPTED,
|
||||
|
||||
// Added later on
|
||||
'file_id' => null,
|
||||
|
|
|
|||
6
apps/files_sharing/lib/External/Manager.php
vendored
6
apps/files_sharing/lib/External/Manager.php
vendored
|
|
@ -38,9 +38,7 @@ use OCP\Snowflake\IGenerator;
|
|||
use Psr\Log\LoggerInterface;
|
||||
|
||||
class Manager {
|
||||
public const STORAGE = '\OCA\Files_Sharing\External\Storage';
|
||||
|
||||
private ?IUser $user = null;
|
||||
private ?IUser $user;
|
||||
|
||||
public function __construct(
|
||||
private IDBConnection $connection,
|
||||
|
|
@ -410,7 +408,7 @@ class Manager {
|
|||
$mountPoint = '/' . $user->getUID() . '/files' . $data['mountpoint'];
|
||||
$data['mountpoint'] = $mountPoint;
|
||||
$data['certificateManager'] = $this->certificateManager;
|
||||
return new Mount(self::STORAGE, $mountPoint, $data, $this, $this->storageLoader);
|
||||
return new Mount(Storage::class, $mountPoint, $data, $this, $this->storageLoader);
|
||||
}
|
||||
|
||||
protected function mountShare(array $data, ?IUser $user = null): Mount {
|
||||
|
|
|
|||
6
apps/files_sharing/lib/External/Storage.php
vendored
6
apps/files_sharing/lib/External/Storage.php
vendored
|
|
@ -192,7 +192,7 @@ class Storage extends DAV implements ISharedStorage, IDisableEncryptionStorage,
|
|||
* @throws StorageNotAvailableException
|
||||
* @throws StorageInvalidException
|
||||
*/
|
||||
public function checkStorageAvailability() {
|
||||
public function checkStorageAvailability(): void {
|
||||
// see if we can find out why the share is unavailable
|
||||
try {
|
||||
$this->getShareInfo(0);
|
||||
|
|
@ -230,9 +230,7 @@ class Storage extends DAV implements ISharedStorage, IDisableEncryptionStorage,
|
|||
}
|
||||
|
||||
/**
|
||||
* Check if the configured remote is a valid federated share provider
|
||||
*
|
||||
* @return bool
|
||||
* Check if the configured remote is a valid-federated share provider
|
||||
*/
|
||||
protected function testRemote(): bool {
|
||||
try {
|
||||
|
|
|
|||
|
|
@ -90,9 +90,6 @@ class CapabilitiesTest extends \Test\TestCase {
|
|||
$this->createMock(IProviderFactory::class),
|
||||
$this->createMock(IUserManager::class),
|
||||
$this->createMock(IRootFolder::class),
|
||||
$this->createMock(IMailer::class),
|
||||
$this->createMock(IURLGenerator::class),
|
||||
$this->createMock(\OC_Defaults::class),
|
||||
$this->createMock(IEventDispatcher::class),
|
||||
$this->createMock(IUserSession::class),
|
||||
$this->createMock(KnownUserService::class),
|
||||
|
|
|
|||
|
|
@ -1261,17 +1261,6 @@
|
|||
)]]></code>
|
||||
</DeprecatedMethod>
|
||||
</file>
|
||||
<file src="apps/federatedfilesharing/lib/Controller/RequestHandlerController.php">
|
||||
<InvalidArgument>
|
||||
<code><![CDATA[$id]]></code>
|
||||
<code><![CDATA[$id]]></code>
|
||||
<code><![CDATA[$id]]></code>
|
||||
<code><![CDATA[$id]]></code>
|
||||
<code><![CDATA[$id]]></code>
|
||||
<code><![CDATA[$id]]></code>
|
||||
<code><![CDATA[$remoteId]]></code>
|
||||
</InvalidArgument>
|
||||
</file>
|
||||
<file src="apps/federatedfilesharing/lib/FederatedShareProvider.php">
|
||||
<DeprecatedMethod>
|
||||
<code><![CDATA[getAppValue]]></code>
|
||||
|
|
@ -1282,13 +1271,6 @@
|
|||
<code><![CDATA[getAppValue]]></code>
|
||||
<code><![CDATA[getAppValue]]></code>
|
||||
</DeprecatedMethod>
|
||||
<InvalidArgument>
|
||||
<code><![CDATA[$shareId]]></code>
|
||||
<code><![CDATA[$shareId]]></code>
|
||||
<code><![CDATA[$shareId]]></code>
|
||||
<code><![CDATA[$shareId]]></code>
|
||||
<code><![CDATA[(int)$data['id']]]></code>
|
||||
</InvalidArgument>
|
||||
</file>
|
||||
<file src="apps/federatedfilesharing/lib/Notifications.php">
|
||||
<DeprecatedMethod>
|
||||
|
|
|
|||
|
|
@ -325,6 +325,9 @@ class Event implements IEvent {
|
|||
if (isset($objectName[4000])) {
|
||||
throw new InvalidValueException('objectName');
|
||||
}
|
||||
if (is_string($objectId) && isset($objectId[19])) {
|
||||
throw new InvalidValueException('objectId');
|
||||
}
|
||||
$this->objectType = $objectType;
|
||||
$this->objectId = $objectId;
|
||||
$this->objectName = $objectName;
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ namespace OC\Share20;
|
|||
use OC\Core\AppInfo\ConfigLexicon;
|
||||
use OC\Files\Mount\MoveableMount;
|
||||
use OC\KnownUser\KnownUserService;
|
||||
use OC\Share\Helper;
|
||||
use OC\Share20\Exception\ProviderException;
|
||||
use OCA\Files_Sharing\AppInfo\Application;
|
||||
use OCA\Files_Sharing\SharedStorage;
|
||||
|
|
@ -29,12 +30,10 @@ use OCP\IConfig;
|
|||
use OCP\IDateTimeZone;
|
||||
use OCP\IGroupManager;
|
||||
use OCP\IL10N;
|
||||
use OCP\IURLGenerator;
|
||||
use OCP\IUser;
|
||||
use OCP\IUserManager;
|
||||
use OCP\IUserSession;
|
||||
use OCP\L10N\IFactory;
|
||||
use OCP\Mail\IMailer;
|
||||
use OCP\Security\Events\ValidatePasswordPolicyEvent;
|
||||
use OCP\Security\IHasher;
|
||||
use OCP\Security\ISecureRandom;
|
||||
|
|
@ -56,6 +55,7 @@ use OCP\Share\IShareProvider;
|
|||
use OCP\Share\IShareProviderSupportsAccept;
|
||||
use OCP\Share\IShareProviderSupportsAllSharesInFolder;
|
||||
use OCP\Share\IShareProviderWithNotification;
|
||||
use Override;
|
||||
use Psr\Log\LoggerInterface;
|
||||
|
||||
/**
|
||||
|
|
@ -77,9 +77,6 @@ class Manager implements IManager {
|
|||
private IProviderFactory $factory,
|
||||
private IUserManager $userManager,
|
||||
private IRootFolder $rootFolder,
|
||||
private IMailer $mailer,
|
||||
private IURLGenerator $urlGenerator,
|
||||
private \OC_Defaults $defaults,
|
||||
private IEventDispatcher $dispatcher,
|
||||
private IUserSession $userSession,
|
||||
private KnownUserService $knownUserService,
|
||||
|
|
@ -96,20 +93,18 @@ class Manager implements IManager {
|
|||
/**
|
||||
* Convert from a full share id to a tuple (providerId, shareId)
|
||||
*
|
||||
* @param string $id
|
||||
* @return string[]
|
||||
*/
|
||||
private function splitFullId($id) {
|
||||
private function splitFullId(string $id): array {
|
||||
return explode(':', $id, 2);
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify if a password meets all requirements
|
||||
*
|
||||
* @param string $password
|
||||
* @throws HintException
|
||||
*/
|
||||
protected function verifyPassword($password) {
|
||||
protected function verifyPassword(?string $password): void {
|
||||
if ($password === null) {
|
||||
// No password is set, check if this is allowed.
|
||||
if ($this->shareApiLinkEnforcePassword()) {
|
||||
|
|
@ -138,7 +133,7 @@ class Manager implements IManager {
|
|||
*
|
||||
* @suppress PhanUndeclaredClassMethod
|
||||
*/
|
||||
protected function generalCreateChecks(IShare $share, bool $isUpdate = false) {
|
||||
protected function generalCreateChecks(IShare $share, bool $isUpdate = false): void {
|
||||
if ($share->getShareType() === IShare::TYPE_USER) {
|
||||
// We expect a valid user as sharedWith for user shares
|
||||
if (!$this->userManager->userExists($share->getSharedWith())) {
|
||||
|
|
@ -278,7 +273,7 @@ class Manager implements IManager {
|
|||
* @throws \InvalidArgumentException
|
||||
* @throws \Exception
|
||||
*/
|
||||
protected function validateExpirationDateInternal(IShare $share) {
|
||||
protected function validateExpirationDateInternal(IShare $share): IShare {
|
||||
$isRemote = $share->getShareType() === IShare::TYPE_REMOTE || $share->getShareType() === IShare::TYPE_REMOTE_GROUP;
|
||||
|
||||
$expirationDate = $share->getExpirationDate();
|
||||
|
|
@ -369,7 +364,7 @@ class Manager implements IManager {
|
|||
* @throws \InvalidArgumentException
|
||||
* @throws \Exception
|
||||
*/
|
||||
protected function validateExpirationDateLink(IShare $share) {
|
||||
protected function validateExpirationDateLink(IShare $share): IShare {
|
||||
$expirationDate = $share->getExpirationDate();
|
||||
$isEnforced = $this->shareApiLinkDefaultExpireDateEnforced();
|
||||
|
||||
|
|
@ -446,10 +441,9 @@ class Manager implements IManager {
|
|||
/**
|
||||
* Check for pre share requirements for user shares
|
||||
*
|
||||
* @param IShare $share
|
||||
* @throws \Exception
|
||||
*/
|
||||
protected function userCreateChecks(IShare $share) {
|
||||
protected function userCreateChecks(IShare $share): void {
|
||||
// Check if we can share with group members only
|
||||
if ($this->shareWithGroupMembersOnly()) {
|
||||
$sharedBy = $this->userManager->get($share->getSharedBy());
|
||||
|
|
@ -508,10 +502,9 @@ class Manager implements IManager {
|
|||
/**
|
||||
* Check for pre share requirements for group shares
|
||||
*
|
||||
* @param IShare $share
|
||||
* @throws \Exception
|
||||
*/
|
||||
protected function groupCreateChecks(IShare $share) {
|
||||
protected function groupCreateChecks(IShare $share): void {
|
||||
// Verify group shares are allowed
|
||||
if (!$this->allowGroupSharing()) {
|
||||
throw new \Exception($this->l->t('Group sharing is now allowed'));
|
||||
|
|
@ -554,10 +547,9 @@ class Manager implements IManager {
|
|||
/**
|
||||
* Check for pre share requirements for link shares
|
||||
*
|
||||
* @param IShare $share
|
||||
* @throws \Exception
|
||||
*/
|
||||
protected function linkCreateChecks(IShare $share) {
|
||||
protected function linkCreateChecks(IShare $share): void {
|
||||
// Are link shares allowed?
|
||||
if (!$this->shareApiAllowLinks()) {
|
||||
throw new \Exception($this->l->t('Link sharing is not allowed'));
|
||||
|
|
@ -578,10 +570,8 @@ class Manager implements IManager {
|
|||
* See: https://github.com/owncloud/core/issues/22295
|
||||
*
|
||||
* FIXME: Remove once multiple link shares can be properly displayed
|
||||
*
|
||||
* @param IShare $share
|
||||
*/
|
||||
protected function setLinkParent(IShare $share) {
|
||||
protected function setLinkParent(IShare $share): void {
|
||||
$storage = $share->getNode()->getStorage();
|
||||
if ($storage->instanceOfStorage(SharedStorage::class)) {
|
||||
/** @var \OCA\Files_Sharing\SharedStorage $storage */
|
||||
|
|
@ -589,10 +579,7 @@ class Manager implements IManager {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param File|Folder $path
|
||||
*/
|
||||
protected function pathCreateChecks($path) {
|
||||
protected function pathCreateChecks(Node $path): void {
|
||||
// Make sure that we do not share a path that contains a shared mountpoint
|
||||
if ($path instanceof \OCP\Files\Folder) {
|
||||
$mounts = $this->mountManager->findIn($path->getPath());
|
||||
|
|
@ -611,10 +598,9 @@ class Manager implements IManager {
|
|||
/**
|
||||
* Check if the user that is sharing can actually share
|
||||
*
|
||||
* @param IShare $share
|
||||
* @throws \Exception
|
||||
*/
|
||||
protected function canShare(IShare $share) {
|
||||
protected function canShare(IShare $share): void {
|
||||
if (!$this->shareApiEnabled()) {
|
||||
throw new \Exception($this->l->t('Sharing is disabled'));
|
||||
}
|
||||
|
|
@ -624,16 +610,9 @@ class Manager implements IManager {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Share a path
|
||||
*
|
||||
* @param IShare $share
|
||||
* @return IShare The share object
|
||||
* @throws \Exception
|
||||
*
|
||||
* TODO: handle link share permissions or check them
|
||||
*/
|
||||
public function createShare(IShare $share) {
|
||||
#[Override]
|
||||
public function createShare(IShare $share): IShare {
|
||||
// TODO: handle link share permissions or check them
|
||||
$this->canShare($share);
|
||||
|
||||
$this->generalCreateChecks($share);
|
||||
|
|
@ -766,15 +745,8 @@ class Manager implements IManager {
|
|||
return $share;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update a share
|
||||
*
|
||||
* @param IShare $share
|
||||
* @return IShare The share object
|
||||
* @throws \InvalidArgumentException
|
||||
* @throws HintException
|
||||
*/
|
||||
public function updateShare(IShare $share, bool $onlyValid = true) {
|
||||
#[Override]
|
||||
public function updateShare(IShare $share, bool $onlyValid = true): IShare {
|
||||
$expirationDateUpdated = false;
|
||||
|
||||
$this->canShare($share);
|
||||
|
|
@ -915,15 +887,7 @@ class Manager implements IManager {
|
|||
return $share;
|
||||
}
|
||||
|
||||
/**
|
||||
* Accept a share.
|
||||
*
|
||||
* @param IShare $share
|
||||
* @param string $recipientId
|
||||
* @return IShare The share object
|
||||
* @throws \InvalidArgumentException Thrown if the provider does not implement `IShareProviderSupportsAccept`
|
||||
* @since 9.0.0
|
||||
*/
|
||||
#[Override]
|
||||
public function acceptShare(IShare $share, string $recipientId): IShare {
|
||||
[$providerId,] = $this->splitFullId($share->getFullId());
|
||||
$provider = $this->factory->getProvider($providerId);
|
||||
|
|
@ -947,9 +911,9 @@ class Manager implements IManager {
|
|||
* @param IShare $share the share to update its password.
|
||||
* @param IShare $originalShare the original share to compare its
|
||||
* password with.
|
||||
* @return boolean whether the password was updated or not.
|
||||
* @return bool whether the password was updated or not.
|
||||
*/
|
||||
private function updateSharePasswordIfNeeded(IShare $share, IShare $originalShare) {
|
||||
private function updateSharePasswordIfNeeded(IShare $share, IShare $originalShare): bool {
|
||||
$passwordsAreDifferent = ($share->getPassword() !== $originalShare->getPassword())
|
||||
&& (($share->getPassword() !== null && $originalShare->getPassword() === null)
|
||||
|| ($share->getPassword() === null && $originalShare->getPassword() !== null)
|
||||
|
|
@ -1009,9 +973,9 @@ class Manager implements IManager {
|
|||
* Delete all the children of this share
|
||||
*
|
||||
* @param IShare $share
|
||||
* @return IShare[] List of deleted shares
|
||||
* @return list<IShare> List of deleted shares
|
||||
*/
|
||||
protected function deleteChildren(IShare $share) {
|
||||
protected function deleteChildren(IShare $share): array {
|
||||
$deletedShares = [];
|
||||
|
||||
$provider = $this->factory->getProviderForType($share->getShareType());
|
||||
|
|
@ -1118,14 +1082,8 @@ class Manager implements IManager {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete a share
|
||||
*
|
||||
* @param IShare $share
|
||||
* @throws ShareNotFound
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
public function deleteShare(IShare $share) {
|
||||
#[Override]
|
||||
public function deleteShare(IShare $share): void {
|
||||
try {
|
||||
$share->getFullId();
|
||||
} catch (\UnexpectedValueException $e) {
|
||||
|
|
@ -1147,17 +1105,8 @@ class Manager implements IManager {
|
|||
$this->promoteReshares($share);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Unshare a file as the recipient.
|
||||
* This can be different from a regular delete for example when one of
|
||||
* the users in a groups deletes that share. But the provider should
|
||||
* handle this.
|
||||
*
|
||||
* @param IShare $share
|
||||
* @param string $recipientId
|
||||
*/
|
||||
public function deleteFromSelf(IShare $share, $recipientId) {
|
||||
#[Override]
|
||||
public function deleteFromSelf(IShare $share, string $recipientId): void {
|
||||
[$providerId,] = $this->splitFullId($share->getFullId());
|
||||
$provider = $this->factory->getProvider($providerId);
|
||||
|
||||
|
|
@ -1166,6 +1115,7 @@ class Manager implements IManager {
|
|||
$this->dispatchEvent($event, 'leave share');
|
||||
}
|
||||
|
||||
#[Override]
|
||||
public function restoreShare(IShare $share, string $recipientId): IShare {
|
||||
[$providerId,] = $this->splitFullId($share->getFullId());
|
||||
$provider = $this->factory->getProvider($providerId);
|
||||
|
|
@ -1173,10 +1123,8 @@ class Manager implements IManager {
|
|||
return $provider->restore($share, $recipientId);
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function moveShare(IShare $share, $recipientId) {
|
||||
#[Override]
|
||||
public function moveShare(IShare $share, string $recipientId): IShare {
|
||||
if ($share->getShareType() === IShare::TYPE_LINK
|
||||
|| $share->getShareType() === IShare::TYPE_EMAIL) {
|
||||
throw new \InvalidArgumentException($this->l->t('Cannot change target of link share'));
|
||||
|
|
@ -1203,7 +1151,8 @@ class Manager implements IManager {
|
|||
return $provider->move($share, $recipientId);
|
||||
}
|
||||
|
||||
public function getSharesInFolder($userId, Folder $node, $reshares = false, $shallow = true) {
|
||||
#[Override]
|
||||
public function getSharesInFolder($userId, Folder $node, bool $reshares = false, bool $shallow = true): array {
|
||||
$providers = $this->factory->getAllProviders();
|
||||
if (!$shallow) {
|
||||
throw new \Exception('non-shallow getSharesInFolder is no longer supported');
|
||||
|
|
@ -1233,10 +1182,8 @@ class Manager implements IManager {
|
|||
return $shares;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function getSharesBy($userId, $shareType, $path = null, $reshares = false, $limit = 50, $offset = 0, bool $onlyValid = true) {
|
||||
#[Override]
|
||||
public function getSharesBy(string $userId, int $shareType, ?Node $path = null, bool $reshares = false, int $limit = 50, int $offset = 0, bool $onlyValid = true): array {
|
||||
if ($path !== null
|
||||
&& !($path instanceof \OCP\Files\File)
|
||||
&& !($path instanceof \OCP\Files\Folder)) {
|
||||
|
|
@ -1317,10 +1264,8 @@ class Manager implements IManager {
|
|||
return $shares;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function getSharedWith($userId, $shareType, $node = null, $limit = 50, $offset = 0) {
|
||||
#[Override]
|
||||
public function getSharedWith(string $userId, int $shareType, ?Node $node = null, int $limit = 50, int $offset = 0): array {
|
||||
try {
|
||||
$provider = $this->factory->getProviderForType($shareType);
|
||||
} catch (ProviderException $e) {
|
||||
|
|
@ -1341,29 +1286,17 @@ class Manager implements IManager {
|
|||
return $shares;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function getDeletedSharedWith($userId, $shareType, $node = null, $limit = 50, $offset = 0) {
|
||||
#[Override]
|
||||
public function getDeletedSharedWith(string $userId, int $shareType, ?Node $node = null, int $limit = 50, int $offset = 0): array {
|
||||
$shares = $this->getSharedWith($userId, $shareType, $node, $limit, $offset);
|
||||
|
||||
// Only get deleted shares
|
||||
$shares = array_filter($shares, function (IShare $share) {
|
||||
return $share->getPermissions() === 0;
|
||||
});
|
||||
|
||||
// Only get shares where the owner still exists
|
||||
$shares = array_filter($shares, function (IShare $share) {
|
||||
return $this->userManager->userExists($share->getShareOwner());
|
||||
});
|
||||
|
||||
return $shares;
|
||||
// Only get shares deleted shares and where the owner still exists
|
||||
return array_filter($shares, fn (IShare $share): bool => $share->getPermissions() === 0
|
||||
&& $this->userManager->userExists($share->getShareOwner()));
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function getShareById($id, $recipient = null, bool $onlyValid = true) {
|
||||
#[Override]
|
||||
public function getShareById($id, $recipient = null, bool $onlyValid = true): IShare {
|
||||
if ($id === null) {
|
||||
throw new ShareNotFound();
|
||||
}
|
||||
|
|
@ -1385,28 +1318,8 @@ class Manager implements IManager {
|
|||
return $share;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all the shares for a given path
|
||||
*
|
||||
* @param \OCP\Files\Node $path
|
||||
* @param int $page
|
||||
* @param int $perPage
|
||||
*
|
||||
* @return Share[]
|
||||
*/
|
||||
public function getSharesByPath(\OCP\Files\Node $path, $page = 0, $perPage = 50) {
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the share by token possible with password
|
||||
*
|
||||
* @param string $token
|
||||
* @return IShare
|
||||
*
|
||||
* @throws ShareNotFound
|
||||
*/
|
||||
public function getShareByToken($token): IShare {
|
||||
#[Override]
|
||||
public function getShareByToken(string $token): IShare {
|
||||
// tokens cannot be valid local usernames
|
||||
if ($this->userManager->userExists($token)) {
|
||||
throw new ShareNotFound();
|
||||
|
|
@ -1507,14 +1420,8 @@ class Manager implements IManager {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify the password of a public share
|
||||
*
|
||||
* @param IShare $share
|
||||
* @param ?string $password
|
||||
* @return bool
|
||||
*/
|
||||
public function checkPassword(IShare $share, $password) {
|
||||
#[Override]
|
||||
public function checkPassword(IShare $share, ?string $password): bool {
|
||||
|
||||
// if there is no password on the share object / passsword is null, there is nothing to check
|
||||
if ($password === null || $share->getPassword() === null) {
|
||||
|
|
@ -1541,10 +1448,8 @@ class Manager implements IManager {
|
|||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function userDeleted($uid) {
|
||||
#[Override]
|
||||
public function userDeleted(string $uid): void {
|
||||
$types = [IShare::TYPE_USER, IShare::TYPE_GROUP, IShare::TYPE_LINK, IShare::TYPE_REMOTE, IShare::TYPE_EMAIL];
|
||||
|
||||
foreach ($types as $type) {
|
||||
|
|
@ -1557,10 +1462,8 @@ class Manager implements IManager {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function groupDeleted($gid) {
|
||||
#[Override]
|
||||
public function groupDeleted(string $gid): void {
|
||||
foreach ([IShare::TYPE_GROUP, IShare::TYPE_REMOTE_GROUP] as $type) {
|
||||
try {
|
||||
$provider = $this->factory->getProviderForType($type);
|
||||
|
|
@ -1584,10 +1487,8 @@ class Manager implements IManager {
|
|||
$this->config->setAppValue('core', 'shareapi_exclude_groups_list', json_encode($excludedGroups));
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function userDeletedFromGroup($uid, $gid) {
|
||||
#[Override]
|
||||
public function userDeletedFromGroup(string $uid, string $gid): void {
|
||||
foreach ([IShare::TYPE_GROUP, IShare::TYPE_REMOTE_GROUP] as $type) {
|
||||
try {
|
||||
$provider = $this->factory->getProviderForType($type);
|
||||
|
|
@ -1599,7 +1500,7 @@ class Manager implements IManager {
|
|||
}
|
||||
|
||||
#[\Override]
|
||||
public function getAccessList(\OCP\Files\Node $path, $recursive = true, $currentAccess = false) {
|
||||
public function getAccessList(\OCP\Files\Node $path, $recursive = true, $currentAccess = false): array {
|
||||
$owner = $path->getOwner();
|
||||
|
||||
if ($owner === null) {
|
||||
|
|
@ -1683,31 +1584,18 @@ class Manager implements IManager {
|
|||
return $al;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new share
|
||||
*
|
||||
* @return IShare
|
||||
*/
|
||||
public function newShare() {
|
||||
#[Override]
|
||||
public function newShare(): IShare {
|
||||
return new \OC\Share20\Share($this->rootFolder, $this->userManager);
|
||||
}
|
||||
|
||||
/**
|
||||
* Is the share API enabled
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function shareApiEnabled() {
|
||||
#[Override]
|
||||
public function shareApiEnabled(): bool {
|
||||
return $this->config->getAppValue('core', 'shareapi_enabled', 'yes') === 'yes';
|
||||
}
|
||||
|
||||
/**
|
||||
* Is public link sharing enabled
|
||||
*
|
||||
* @param ?IUser $user User to check against group exclusions, defaults to current session user
|
||||
* @return bool
|
||||
*/
|
||||
public function shareApiAllowLinks(?IUser $user = null) {
|
||||
#[Override]
|
||||
public function shareApiAllowLinks(?IUser $user = null): bool {
|
||||
if ($this->config->getAppValue('core', 'shareapi_allow_links', 'yes') !== 'yes') {
|
||||
return false;
|
||||
}
|
||||
|
|
@ -1734,13 +1622,8 @@ class Manager implements IManager {
|
|||
return $this->shareApiAllowLinks($user);
|
||||
}
|
||||
|
||||
/**
|
||||
* Is password on public link requires
|
||||
*
|
||||
* @param bool Check group membership exclusion
|
||||
* @return bool
|
||||
*/
|
||||
public function shareApiLinkEnforcePassword(bool $checkGroupMembership = true) {
|
||||
#[Override]
|
||||
public function shareApiLinkEnforcePassword(bool $checkGroupMembership = true): bool {
|
||||
$excludedGroups = $this->config->getAppValue('core', 'shareapi_enforce_links_password_excluded_groups', '');
|
||||
if ($excludedGroups !== '' && $checkGroupMembership) {
|
||||
$excludedGroups = json_decode($excludedGroups);
|
||||
|
|
@ -1755,117 +1638,66 @@ class Manager implements IManager {
|
|||
return $this->appConfig->getValueBool('core', ConfigLexicon::SHARE_LINK_PASSWORD_ENFORCED);
|
||||
}
|
||||
|
||||
/**
|
||||
* Is default link expire date enabled
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function shareApiLinkDefaultExpireDate() {
|
||||
#[Override]
|
||||
public function shareApiLinkDefaultExpireDate(): bool {
|
||||
return $this->appConfig->getValueBool('core', ConfigLexicon::SHARE_LINK_EXPIRE_DATE_DEFAULT);
|
||||
}
|
||||
|
||||
/**
|
||||
* Is default link expire date enforced
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function shareApiLinkDefaultExpireDateEnforced() {
|
||||
#[Override]
|
||||
public function shareApiLinkDefaultExpireDateEnforced(): bool {
|
||||
return $this->shareApiLinkDefaultExpireDate()
|
||||
&& $this->appConfig->getValueBool('core', ConfigLexicon::SHARE_LINK_EXPIRE_DATE_ENFORCED);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Number of default link expire days
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function shareApiLinkDefaultExpireDays() {
|
||||
#[Override]
|
||||
public function shareApiLinkDefaultExpireDays(): int {
|
||||
return (int)$this->config->getAppValue('core', 'shareapi_expire_after_n_days', '7');
|
||||
}
|
||||
|
||||
/**
|
||||
* Is default internal expire date enabled
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
#[Override]
|
||||
public function shareApiInternalDefaultExpireDate(): bool {
|
||||
return $this->config->getAppValue('core', 'shareapi_default_internal_expire_date', 'no') === 'yes';
|
||||
}
|
||||
|
||||
/**
|
||||
* Is default remote expire date enabled
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
#[Override]
|
||||
public function shareApiRemoteDefaultExpireDate(): bool {
|
||||
return $this->config->getAppValue('core', 'shareapi_default_remote_expire_date', 'no') === 'yes';
|
||||
}
|
||||
|
||||
/**
|
||||
* Is default expire date enforced
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
#[Override]
|
||||
public function shareApiInternalDefaultExpireDateEnforced(): bool {
|
||||
return $this->shareApiInternalDefaultExpireDate()
|
||||
&& $this->config->getAppValue('core', 'shareapi_enforce_internal_expire_date', 'no') === 'yes';
|
||||
}
|
||||
|
||||
/**
|
||||
* Is default expire date enforced for remote shares
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
#[Override]
|
||||
public function shareApiRemoteDefaultExpireDateEnforced(): bool {
|
||||
return $this->shareApiRemoteDefaultExpireDate()
|
||||
&& $this->config->getAppValue('core', 'shareapi_enforce_remote_expire_date', 'no') === 'yes';
|
||||
}
|
||||
|
||||
/**
|
||||
* Number of default expire days
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
#[Override]
|
||||
public function shareApiInternalDefaultExpireDays(): int {
|
||||
return (int)$this->config->getAppValue('core', 'shareapi_internal_expire_after_n_days', '7');
|
||||
}
|
||||
|
||||
/**
|
||||
* Number of default expire days for remote shares
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
#[Override]
|
||||
public function shareApiRemoteDefaultExpireDays(): int {
|
||||
return (int)$this->config->getAppValue('core', 'shareapi_remote_expire_after_n_days', '7');
|
||||
}
|
||||
|
||||
/**
|
||||
* Allow public upload on link shares
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function shareApiLinkAllowPublicUpload() {
|
||||
#[Override]
|
||||
public function shareApiLinkAllowPublicUpload(): bool {
|
||||
return $this->config->getAppValue('core', 'shareapi_allow_public_upload', 'yes') === 'yes';
|
||||
}
|
||||
|
||||
/**
|
||||
* check if user can only share with group members
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function shareWithGroupMembersOnly() {
|
||||
#[Override]
|
||||
public function shareWithGroupMembersOnly(): bool {
|
||||
return $this->config->getAppValue('core', 'shareapi_only_share_with_group_members', 'no') === 'yes';
|
||||
}
|
||||
|
||||
/**
|
||||
* If shareWithGroupMembersOnly is enabled, return an optional
|
||||
* list of groups that must be excluded from the principle of
|
||||
* belonging to the same group.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function shareWithGroupMembersOnlyExcludeGroupsList() {
|
||||
#[Override]
|
||||
public function shareWithGroupMembersOnlyExcludeGroupsList(): array {
|
||||
if (!$this->shareWithGroupMembersOnly()) {
|
||||
return [];
|
||||
}
|
||||
|
|
@ -1873,53 +1705,59 @@ class Manager implements IManager {
|
|||
return json_decode($excludeGroups, true) ?? [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if users can share with groups
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function allowGroupSharing() {
|
||||
#[Override]
|
||||
public function allowGroupSharing(): bool {
|
||||
return $this->config->getAppValue('core', 'shareapi_allow_group_sharing', 'yes') === 'yes';
|
||||
}
|
||||
|
||||
#[Override]
|
||||
public function allowEnumeration(): bool {
|
||||
return $this->config->getAppValue('core', 'shareapi_allow_share_dialog_user_enumeration', 'yes') === 'yes';
|
||||
}
|
||||
|
||||
#[Override]
|
||||
public function limitEnumerationToGroups(): bool {
|
||||
return $this->allowEnumeration()
|
||||
&& $this->config->getAppValue('core', 'shareapi_restrict_user_enumeration_to_group', 'no') === 'yes';
|
||||
}
|
||||
|
||||
#[Override]
|
||||
public function limitEnumerationToPhone(): bool {
|
||||
return $this->allowEnumeration()
|
||||
&& $this->config->getAppValue('core', 'shareapi_restrict_user_enumeration_to_phone', 'no') === 'yes';
|
||||
}
|
||||
|
||||
#[Override]
|
||||
public function allowEnumerationFullMatch(): bool {
|
||||
return $this->config->getAppValue('core', 'shareapi_restrict_user_enumeration_full_match', 'yes') === 'yes';
|
||||
}
|
||||
|
||||
#[Override]
|
||||
public function matchEmail(): bool {
|
||||
return $this->config->getAppValue('core', 'shareapi_restrict_user_enumeration_full_match_email', 'yes') === 'yes';
|
||||
}
|
||||
|
||||
#[Override]
|
||||
public function matchUserId(): bool {
|
||||
return $this->config->getAppValue('core', 'shareapi_restrict_user_enumeration_full_match_user_id', 'yes') === 'yes';
|
||||
}
|
||||
|
||||
#[Override]
|
||||
public function ignoreSecondDisplayName(): bool {
|
||||
return $this->config->getAppValue('core', 'shareapi_restrict_user_enumeration_full_match_ignore_second_dn', 'no') === 'yes';
|
||||
}
|
||||
|
||||
#[Override]
|
||||
public function allowCustomTokens(): bool {
|
||||
return $this->appConfig->getValueBool('core', ConfigLexicon::SHARE_CUSTOM_TOKEN);
|
||||
}
|
||||
|
||||
#[Override]
|
||||
public function allowViewWithoutDownload(): bool {
|
||||
return $this->appConfig->getValueBool('core', 'shareapi_allow_view_without_download', true);
|
||||
}
|
||||
|
||||
#[Override]
|
||||
public function currentUserCanEnumerateTargetUser(?IUser $currentUser, IUser $targetUser): bool {
|
||||
if ($this->allowEnumerationFullMatch()) {
|
||||
return true;
|
||||
|
|
@ -1956,31 +1794,23 @@ class Manager implements IManager {
|
|||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if sharing is disabled for the current user
|
||||
*/
|
||||
#[Override]
|
||||
public function sharingDisabledForUser(?string $userId): bool {
|
||||
return $this->shareDisableChecker->sharingDisabledForUser($userId);
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function outgoingServer2ServerSharesAllowed() {
|
||||
#[Override]
|
||||
public function outgoingServer2ServerSharesAllowed(): bool {
|
||||
return $this->config->getAppValue('files_sharing', 'outgoing_server2server_share_enabled', 'yes') === 'yes';
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function outgoingServer2ServerGroupSharesAllowed() {
|
||||
#[Override]
|
||||
public function outgoingServer2ServerGroupSharesAllowed(): bool {
|
||||
return $this->config->getAppValue('files_sharing', 'outgoing_server2server_group_share_enabled', 'no') === 'yes';
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function shareProviderExists($shareType) {
|
||||
#[Override]
|
||||
public function shareProviderExists(int $shareType): bool {
|
||||
try {
|
||||
$this->factory->getProviderForType($shareType);
|
||||
} catch (ProviderException $e) {
|
||||
|
|
@ -1994,6 +1824,7 @@ class Manager implements IManager {
|
|||
$this->factory->registerProvider($shareProviderClass);
|
||||
}
|
||||
|
||||
#[Override]
|
||||
public function getAllShares(): iterable {
|
||||
$providers = $this->factory->getAllProviders();
|
||||
|
||||
|
|
@ -2002,9 +1833,10 @@ class Manager implements IManager {
|
|||
}
|
||||
}
|
||||
|
||||
#[Override]
|
||||
public function generateToken(): string {
|
||||
// Initial token length
|
||||
$tokenLength = \OC\Share\Helper::getTokenLength();
|
||||
$tokenLength = Helper::getTokenLength();
|
||||
|
||||
do {
|
||||
$tokenExists = false;
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ interface ICloudFederationProvider {
|
|||
*
|
||||
* @since 14.0.0
|
||||
*/
|
||||
public function notificationReceived($notificationType, $providerId, array $notification);
|
||||
public function notificationReceived(string $notificationType, string $providerId, array $notification);
|
||||
|
||||
/**
|
||||
* get the supported share types, e.g. "user", "group", etc.
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@
|
|||
*/
|
||||
namespace OCP\Share;
|
||||
|
||||
use OCP\AppFramework\Attribute\Consumable;
|
||||
use OCP\Files\Folder;
|
||||
use OCP\Files\Node;
|
||||
|
||||
|
|
@ -18,22 +19,17 @@ use OCP\Share\Exceptions\ShareTokenException;
|
|||
/**
|
||||
* This interface allows to manage sharing files between users and groups.
|
||||
*
|
||||
* This interface must not be implemented in your application but
|
||||
* instead should be used as a service and injected in your code with
|
||||
* dependency injection.
|
||||
*
|
||||
* @since 9.0.0
|
||||
*/
|
||||
#[Consumable(since: '9.0.0')]
|
||||
interface IManager {
|
||||
/**
|
||||
* Create a Share
|
||||
*
|
||||
* @param IShare $share
|
||||
* @return IShare The share object
|
||||
* @throws \Exception
|
||||
* @since 9.0.0
|
||||
*/
|
||||
public function createShare(IShare $share);
|
||||
public function createShare(IShare $share): IShare;
|
||||
|
||||
/**
|
||||
* Update a share.
|
||||
|
|
@ -41,20 +37,15 @@ interface IManager {
|
|||
* The share can't be removed this way (permission 0): use deleteShare
|
||||
* The state can't be changed this way: use acceptShare
|
||||
*
|
||||
* @param IShare $share
|
||||
* @param bool $onlyValid Only updates valid shares, invalid shares will be deleted automatically and are not updated
|
||||
* @return IShare The share object
|
||||
* @throws \InvalidArgumentException
|
||||
* @since 9.0.0
|
||||
*/
|
||||
public function updateShare(IShare $share, bool $onlyValid = true);
|
||||
public function updateShare(IShare $share, bool $onlyValid = true): IShare;
|
||||
|
||||
/**
|
||||
* Accept a share.
|
||||
*
|
||||
* @param IShare $share
|
||||
* @param string $recipientId
|
||||
* @return IShare The share object
|
||||
* @throws \InvalidArgumentException
|
||||
* @since 18.0.0
|
||||
*/
|
||||
|
|
@ -63,12 +54,11 @@ interface IManager {
|
|||
/**
|
||||
* Delete a share
|
||||
*
|
||||
* @param IShare $share
|
||||
* @throws ShareNotFound
|
||||
* @throws \InvalidArgumentException
|
||||
* @since 9.0.0
|
||||
*/
|
||||
public function deleteShare(IShare $share);
|
||||
public function deleteShare(IShare $share): void;
|
||||
|
||||
/**
|
||||
* Unshare a file as the recipient.
|
||||
|
|
@ -76,11 +66,9 @@ interface IManager {
|
|||
* the users in a groups deletes that share. But the provider should
|
||||
* handle this.
|
||||
*
|
||||
* @param IShare $share
|
||||
* @param string $recipientId
|
||||
* @since 9.0.0
|
||||
*/
|
||||
public function deleteFromSelf(IShare $share, $recipientId);
|
||||
public function deleteFromSelf(IShare $share, string $recipientId): void;
|
||||
|
||||
/**
|
||||
* Restore the share when it has been deleted
|
||||
|
|
@ -100,13 +88,10 @@ interface IManager {
|
|||
* Move the share as a recipient of the share.
|
||||
* This is updating the share target. So where the recipient has the share mounted.
|
||||
*
|
||||
* @param IShare $share
|
||||
* @param string $recipientId
|
||||
* @return IShare
|
||||
* @throws \InvalidArgumentException If $share is a link share or the $recipient does not match
|
||||
* @since 9.0.0
|
||||
*/
|
||||
public function moveShare(IShare $share, $recipientId);
|
||||
public function moveShare(IShare $share, string $recipientId): IShare;
|
||||
|
||||
/**
|
||||
* Get all shares shared by (initiated) by the provided user in a folder.
|
||||
|
|
@ -115,16 +100,16 @@ interface IManager {
|
|||
* @param Folder $node
|
||||
* @param bool $reshares
|
||||
* @param bool $shallow Whether the method should stop at the first level, or look into sub-folders.
|
||||
* @return IShare[][] [$fileId => IShare[], ...]
|
||||
* @return array<int, list<IShare>> [$fileId => IShare[], ...]
|
||||
* @since 11.0.0
|
||||
*/
|
||||
public function getSharesInFolder($userId, Folder $node, $reshares = false, $shallow = true);
|
||||
public function getSharesInFolder(string $userId, Folder $node, bool $reshares = false, bool $shallow = true): array;
|
||||
|
||||
/**
|
||||
* Get shares shared by (initiated) by the provided user.
|
||||
*
|
||||
* @param string $userId
|
||||
* @param int $shareType
|
||||
* @param IShare::TYPE_* $shareType
|
||||
* @param Node|null $path
|
||||
* @param bool $reshares
|
||||
* @param int $limit The maximum number of returned results, -1 for all results
|
||||
|
|
@ -133,35 +118,32 @@ interface IManager {
|
|||
* @return IShare[]
|
||||
* @since 9.0.0
|
||||
*/
|
||||
public function getSharesBy($userId, $shareType, $path = null, $reshares = false, $limit = 50, $offset = 0, bool $onlyValid = true);
|
||||
public function getSharesBy(string $userId, int $shareType, ?Node $path = null, bool $reshares = false, int $limit = 50, int $offset = 0, bool $onlyValid = true): array;
|
||||
|
||||
/**
|
||||
* Get shares shared with $user.
|
||||
* Filter by $node if provided
|
||||
*
|
||||
* @param string $userId
|
||||
* @param int $shareType
|
||||
* @param IShare::TYPE_* $shareType
|
||||
* @param Node|null $node
|
||||
* @param int $limit The maximum number of shares returned, -1 for all
|
||||
* @param int $offset
|
||||
* @return IShare[]
|
||||
* @since 9.0.0
|
||||
*/
|
||||
public function getSharedWith($userId, $shareType, $node = null, $limit = 50, $offset = 0);
|
||||
public function getSharedWith(string $userId, int $shareType, ?Node $node = null, int $limit = 50, int $offset = 0): array;
|
||||
|
||||
/**
|
||||
* Get deleted shares shared with $user.
|
||||
* Filter by $node if provided
|
||||
*
|
||||
* @param string $userId
|
||||
* @param int $shareType
|
||||
* @param Node|null $node
|
||||
* @param IShare::TYPE_* $shareType
|
||||
* @param int $limit The maximum number of shares returned, -1 for all
|
||||
* @param int $offset
|
||||
* @return IShare[]
|
||||
* @since 14.0.0
|
||||
*/
|
||||
public function getDeletedSharedWith($userId, $shareType, $node = null, $limit = 50, $offset = 0);
|
||||
public function getDeletedSharedWith(string $userId, int $shareType, ?Node $node = null, int $limit = 50, int $offset = 0): array;
|
||||
|
||||
/**
|
||||
* Retrieve a share by the share id.
|
||||
|
|
@ -169,34 +151,27 @@ interface IManager {
|
|||
* This makes sure that if a user has moved/deleted a group share this
|
||||
* is reflected.
|
||||
*
|
||||
* @param string $id
|
||||
* @param string|null $recipient userID of the recipient
|
||||
* @param bool $onlyValid Only returns valid shares, invalid shares will be deleted automatically and are not returned
|
||||
* @return IShare
|
||||
* @throws ShareNotFound
|
||||
* @since 9.0.0
|
||||
*/
|
||||
public function getShareById($id, $recipient = null, bool $onlyValid = true);
|
||||
public function getShareById(string $id, ?string $recipient = null, bool $onlyValid = true): IShare;
|
||||
|
||||
/**
|
||||
* Get the share by token possible with password
|
||||
*
|
||||
* @param string $token
|
||||
* @return IShare
|
||||
* @throws ShareNotFound
|
||||
* @since 9.0.0
|
||||
*/
|
||||
public function getShareByToken($token);
|
||||
public function getShareByToken(string $token): IShare;
|
||||
|
||||
/**
|
||||
* Verify the password of a public share
|
||||
*
|
||||
* @param IShare $share
|
||||
* @param ?string $password
|
||||
* @return bool
|
||||
* @since 9.0.0
|
||||
*/
|
||||
public function checkPassword(IShare $share, $password);
|
||||
public function checkPassword(IShare $share, ?string $password): bool;
|
||||
|
||||
/**
|
||||
* The user with UID is deleted.
|
||||
|
|
@ -204,29 +179,25 @@ interface IManager {
|
|||
* as shares owned by this user.
|
||||
* Shares only initiated by this user are fine.
|
||||
*
|
||||
* @param string $uid
|
||||
* @since 9.1.0
|
||||
*/
|
||||
public function userDeleted($uid);
|
||||
public function userDeleted(string $uid): void;
|
||||
|
||||
/**
|
||||
* The group with $gid is deleted
|
||||
* We need to clear up all shares to this group
|
||||
*
|
||||
* @param string $gid
|
||||
* @since 9.1.0
|
||||
*/
|
||||
public function groupDeleted($gid);
|
||||
public function groupDeleted(string $gid): void;
|
||||
|
||||
/**
|
||||
* The user $uid is deleted from the group $gid
|
||||
* All user specific group shares have to be removed
|
||||
*
|
||||
* @param string $uid
|
||||
* @param string $gid
|
||||
* @since 9.1.0
|
||||
*/
|
||||
public function userDeletedFromGroup($uid, $gid);
|
||||
public function userDeletedFromGroup(string $uid, string $gid): void;
|
||||
|
||||
/**
|
||||
* Get access list to a path. This means
|
||||
|
|
@ -270,7 +241,6 @@ interface IManager {
|
|||
*
|
||||
* This is required for encryption/activity
|
||||
*
|
||||
* @param \OCP\Files\Node $path
|
||||
* @param bool $recursive Should we check all parent folders as well
|
||||
* @param bool $currentAccess Should the user have currently access to the file
|
||||
* @return ($currentAccess is true
|
||||
|
|
@ -283,24 +253,22 @@ interface IManager {
|
|||
* : array{users?: list<string>, remote?: bool, public?: bool, mail?: list<string>})
|
||||
* @since 12.0.0
|
||||
*/
|
||||
public function getAccessList(\OCP\Files\Node $path, $recursive = true, $currentAccess = false);
|
||||
public function getAccessList(Node $path, bool $recursive = true, bool $currentAccess = false): array;
|
||||
|
||||
/**
|
||||
* Instantiates a new share object. This is to be passed to
|
||||
* createShare.
|
||||
*
|
||||
* @return IShare
|
||||
* @since 9.0.0
|
||||
*/
|
||||
public function newShare();
|
||||
public function newShare(): IShare;
|
||||
|
||||
/**
|
||||
* Is the share API enabled
|
||||
*
|
||||
* @return bool
|
||||
* @since 9.0.0
|
||||
*/
|
||||
public function shareApiEnabled();
|
||||
public function shareApiEnabled(): bool;
|
||||
|
||||
/**
|
||||
* Is public link sharing enabled
|
||||
|
|
@ -310,46 +278,41 @@ interface IManager {
|
|||
* @since 9.0.0
|
||||
* @since 33.0.0 Added optional $user parameter
|
||||
*/
|
||||
public function shareApiAllowLinks(?IUser $user = null);
|
||||
public function shareApiAllowLinks(): bool;
|
||||
|
||||
/**
|
||||
* Is password on public link required
|
||||
*
|
||||
* @param bool $checkGroupMembership Check group membership exclusion
|
||||
* @return bool
|
||||
* @since 9.0.0
|
||||
* @since 24.0.0 Added optional $checkGroupMembership parameter
|
||||
*/
|
||||
public function shareApiLinkEnforcePassword(bool $checkGroupMembership = true);
|
||||
public function shareApiLinkEnforcePassword(bool $checkGroupMembership = true): bool;
|
||||
|
||||
/**
|
||||
* Is default expire date enabled
|
||||
*
|
||||
* @return bool
|
||||
* @since 9.0.0
|
||||
*/
|
||||
public function shareApiLinkDefaultExpireDate();
|
||||
public function shareApiLinkDefaultExpireDate(): bool;
|
||||
|
||||
/**
|
||||
* Is default expire date enforced
|
||||
*`
|
||||
* @return bool
|
||||
* @since 9.0.0
|
||||
*/
|
||||
public function shareApiLinkDefaultExpireDateEnforced();
|
||||
public function shareApiLinkDefaultExpireDateEnforced(): bool;
|
||||
|
||||
/**
|
||||
* Number of default expire days
|
||||
*
|
||||
* @return int
|
||||
* @since 9.0.0
|
||||
*/
|
||||
public function shareApiLinkDefaultExpireDays();
|
||||
public function shareApiLinkDefaultExpireDays(): int;
|
||||
|
||||
/**
|
||||
* Is default internal expire date enabled
|
||||
*
|
||||
* @return bool
|
||||
* @since 22.0.0
|
||||
*/
|
||||
public function shareApiInternalDefaultExpireDate(): bool;
|
||||
|
|
@ -357,7 +320,6 @@ interface IManager {
|
|||
/**
|
||||
* Is default remote expire date enabled
|
||||
*
|
||||
* @return bool
|
||||
* @since 22.0.0
|
||||
*/
|
||||
public function shareApiRemoteDefaultExpireDate(): bool;
|
||||
|
|
@ -365,7 +327,6 @@ interface IManager {
|
|||
/**
|
||||
* Is default expire date enforced
|
||||
*
|
||||
* @return bool
|
||||
* @since 22.0.0
|
||||
*/
|
||||
public function shareApiInternalDefaultExpireDateEnforced(): bool;
|
||||
|
|
@ -373,7 +334,6 @@ interface IManager {
|
|||
/**
|
||||
* Is default expire date enforced for remote shares
|
||||
*
|
||||
* @return bool
|
||||
* @since 22.0.0
|
||||
*/
|
||||
public function shareApiRemoteDefaultExpireDateEnforced(): bool;
|
||||
|
|
@ -381,7 +341,6 @@ interface IManager {
|
|||
/**
|
||||
* Number of default expire days
|
||||
*
|
||||
* @return int
|
||||
* @since 22.0.0
|
||||
*/
|
||||
public function shareApiInternalDefaultExpireDays(): int;
|
||||
|
|
@ -389,7 +348,6 @@ interface IManager {
|
|||
/**
|
||||
* Number of default expire days for remote shares
|
||||
*
|
||||
* @return int
|
||||
* @since 22.0.0
|
||||
*/
|
||||
public function shareApiRemoteDefaultExpireDays(): int;
|
||||
|
|
@ -397,17 +355,16 @@ interface IManager {
|
|||
/**
|
||||
* Allow public upload on link shares
|
||||
*
|
||||
* @return bool
|
||||
* @since 9.0.0
|
||||
*/
|
||||
public function shareApiLinkAllowPublicUpload();
|
||||
public function shareApiLinkAllowPublicUpload(): bool;
|
||||
|
||||
/**
|
||||
* check if user can only share with group members
|
||||
* @return bool
|
||||
* Check if user can only share with group members.
|
||||
*
|
||||
* @since 9.0.0
|
||||
*/
|
||||
public function shareWithGroupMembersOnly();
|
||||
public function shareWithGroupMembersOnly(): bool;
|
||||
|
||||
/**
|
||||
* If shareWithGroupMembersOnly is enabled, return an optional
|
||||
|
|
@ -416,19 +373,18 @@ interface IManager {
|
|||
* @return array
|
||||
* @since 27.0.0
|
||||
*/
|
||||
public function shareWithGroupMembersOnlyExcludeGroupsList();
|
||||
public function shareWithGroupMembersOnlyExcludeGroupsList(): array;
|
||||
|
||||
/**
|
||||
* Check if users can share with groups
|
||||
* @return bool
|
||||
*
|
||||
* @since 9.0.1
|
||||
*/
|
||||
public function allowGroupSharing();
|
||||
public function allowGroupSharing(): bool;
|
||||
|
||||
/**
|
||||
* Check if user enumeration is allowed
|
||||
*
|
||||
* @return bool
|
||||
* @since 19.0.0
|
||||
*/
|
||||
public function allowEnumeration(): bool;
|
||||
|
|
@ -436,7 +392,6 @@ interface IManager {
|
|||
/**
|
||||
* Check if user enumeration is limited to the users groups
|
||||
*
|
||||
* @return bool
|
||||
* @since 19.0.0
|
||||
*/
|
||||
public function limitEnumerationToGroups(): bool;
|
||||
|
|
@ -444,7 +399,6 @@ interface IManager {
|
|||
/**
|
||||
* Check if user enumeration is limited to the phonebook matches
|
||||
*
|
||||
* @return bool
|
||||
* @since 21.0.1
|
||||
*/
|
||||
public function limitEnumerationToPhone(): bool;
|
||||
|
|
@ -453,7 +407,6 @@ interface IManager {
|
|||
* Check if user enumeration is allowed to return also on full match
|
||||
* and ignore limitations to phonebook or groups.
|
||||
*
|
||||
* @return bool
|
||||
* @since 21.0.1
|
||||
*/
|
||||
public function allowEnumerationFullMatch(): bool;
|
||||
|
|
@ -462,7 +415,6 @@ interface IManager {
|
|||
* When `allowEnumerationFullMatch` is enabled and `matchEmail` is set,
|
||||
* then also return results for full email matches.
|
||||
*
|
||||
* @return bool
|
||||
* @since 25.0.0
|
||||
*/
|
||||
public function matchEmail(): bool;
|
||||
|
|
@ -471,7 +423,6 @@ interface IManager {
|
|||
* When `allowEnumerationFullMatch` is enabled and `matchUserId` is set,
|
||||
* then also return results for full user id matches.
|
||||
*
|
||||
* @return bool
|
||||
* @since 33.0.0
|
||||
*/
|
||||
public function matchUserId(): bool;
|
||||
|
|
@ -480,7 +431,6 @@ interface IManager {
|
|||
* When `allowEnumerationFullMatch` is enabled and `ignoreSecondDisplayName` is set,
|
||||
* then the search should ignore matches on the second displayname and only use the first.
|
||||
*
|
||||
* @return bool
|
||||
* @since 25.0.0
|
||||
*/
|
||||
public function ignoreSecondDisplayName(): bool;
|
||||
|
|
@ -504,9 +454,6 @@ interface IManager {
|
|||
/**
|
||||
* Check if the current user can enumerate the target user
|
||||
*
|
||||
* @param IUser|null $currentUser
|
||||
* @param IUser $targetUser
|
||||
* @return bool
|
||||
* @since 23.0.0
|
||||
*/
|
||||
public function currentUserCanEnumerateTargetUser(?IUser $currentUser, IUser $targetUser): bool;
|
||||
|
|
@ -520,26 +467,23 @@ interface IManager {
|
|||
|
||||
/**
|
||||
* Check if outgoing server2server shares are allowed
|
||||
* @return bool
|
||||
* @since 9.0.0
|
||||
*/
|
||||
public function outgoingServer2ServerSharesAllowed();
|
||||
public function outgoingServer2ServerSharesAllowed(): bool;
|
||||
|
||||
/**
|
||||
* Check if outgoing server2server shares are allowed
|
||||
* @return bool
|
||||
* @since 14.0.0
|
||||
*/
|
||||
public function outgoingServer2ServerGroupSharesAllowed();
|
||||
public function outgoingServer2ServerGroupSharesAllowed(): bool;
|
||||
|
||||
|
||||
/**
|
||||
* Check if a given share provider exists
|
||||
* @param int $shareType
|
||||
* @return bool
|
||||
* @param IShare::TYPE_* $shareType
|
||||
* @since 11.0.0
|
||||
*/
|
||||
public function shareProviderExists($shareType);
|
||||
public function shareProviderExists(int $shareType): bool;
|
||||
|
||||
/**
|
||||
* @param string $shareProviderClass
|
||||
|
|
|
|||
|
|
@ -95,7 +95,7 @@ interface IShareProvider {
|
|||
* @param Folder $node
|
||||
* @param bool $reshares Also get the shares where $user is the owner instead of just the shares where $user is the initiator
|
||||
* @param bool $shallow Whether the method should stop at the first level, or look into sub-folders.
|
||||
* @return \OCP\Share\IShare[][]
|
||||
* @return array<int, list<\OCP\Share\IShare>>
|
||||
* @since 11.0.0
|
||||
*/
|
||||
public function getSharesInFolder($userId, Folder $node, $reshares, $shallow = true);
|
||||
|
|
@ -155,7 +155,7 @@ interface IShareProvider {
|
|||
* @throws ShareNotFound
|
||||
* @since 9.0.0
|
||||
*/
|
||||
public function getShareByToken($token);
|
||||
public function getShareByToken(string $token);
|
||||
|
||||
/**
|
||||
* A user is deleted from the system
|
||||
|
|
@ -204,7 +204,7 @@ interface IShareProvider {
|
|||
* Get all the shares in this provider returned as iterable to reduce memory
|
||||
* overhead
|
||||
*
|
||||
* @return iterable
|
||||
* @return iterable<IShare>
|
||||
* @since 18.0.0
|
||||
*/
|
||||
public function getAllShares(): iterable;
|
||||
|
|
|
|||
23
openapi.json
23
openapi.json
|
|
@ -18047,8 +18047,7 @@
|
|||
"description": "ID of the user that receives the share"
|
||||
},
|
||||
"remoteId": {
|
||||
"type": "integer",
|
||||
"format": "int64",
|
||||
"type": "string",
|
||||
"nullable": true,
|
||||
"default": null,
|
||||
"description": "ID of the remote"
|
||||
|
|
@ -18168,8 +18167,7 @@
|
|||
"description": "ID of the share",
|
||||
"required": true,
|
||||
"schema": {
|
||||
"type": "integer",
|
||||
"format": "int64"
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -18260,7 +18258,7 @@
|
|||
"/ocs/v2.php/cloud/shares/{id}/permissions": {
|
||||
"post": {
|
||||
"operationId": "federatedfilesharing-request_handler-update-permissions",
|
||||
"summary": "update share information to keep federated re-shares in sync",
|
||||
"summary": "Update share information to keep federated re-shares in sync.",
|
||||
"tags": [
|
||||
"federatedfilesharing/request_handler"
|
||||
],
|
||||
|
|
@ -18305,8 +18303,7 @@
|
|||
"description": "ID of the share",
|
||||
"required": true,
|
||||
"schema": {
|
||||
"type": "integer",
|
||||
"format": "int64"
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -18421,8 +18418,7 @@
|
|||
"description": "ID of the remote share",
|
||||
"required": true,
|
||||
"schema": {
|
||||
"type": "integer",
|
||||
"format": "int64"
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -18519,8 +18515,7 @@
|
|||
"description": "ID of the remote share",
|
||||
"required": true,
|
||||
"schema": {
|
||||
"type": "integer",
|
||||
"format": "int64"
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -18607,8 +18602,7 @@
|
|||
"description": "ID of the share",
|
||||
"required": true,
|
||||
"schema": {
|
||||
"type": "integer",
|
||||
"format": "int64"
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -18695,8 +18689,7 @@
|
|||
"description": "ID of the share",
|
||||
"required": true,
|
||||
"schema": {
|
||||
"type": "integer",
|
||||
"format": "int64"
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
|
|||
|
|
@ -36,12 +36,10 @@ use OCP\IGroup;
|
|||
use OCP\IGroupManager;
|
||||
use OCP\IL10N;
|
||||
use OCP\IServerContainer;
|
||||
use OCP\IURLGenerator;
|
||||
use OCP\IUser;
|
||||
use OCP\IUserManager;
|
||||
use OCP\IUserSession;
|
||||
use OCP\L10N\IFactory;
|
||||
use OCP\Mail\IMailer;
|
||||
use OCP\Security\Events\ValidatePasswordPolicyEvent;
|
||||
use OCP\Security\IHasher;
|
||||
use OCP\Security\ISecureRandom;
|
||||
|
|
@ -59,6 +57,7 @@ use OCP\Share\IShare;
|
|||
use OCP\Share\IShareProvider;
|
||||
use OCP\Share\IShareProviderSupportsAllSharesInFolder;
|
||||
use OCP\Util;
|
||||
use PHPUnit\Framework\Attributes\DataProvider;
|
||||
use PHPUnit\Framework\MockObject\MockBuilder;
|
||||
use PHPUnit\Framework\MockObject\MockObject;
|
||||
use Psr\Log\LoggerInterface;
|
||||
|
|
@ -77,51 +76,26 @@ class DummyShareManagerListener {
|
|||
*/
|
||||
#[\PHPUnit\Framework\Attributes\Group('DB')]
|
||||
class ManagerTest extends \Test\TestCase {
|
||||
/** @var Manager */
|
||||
protected $manager;
|
||||
/** @var LoggerInterface|MockObject */
|
||||
protected $logger;
|
||||
/** @var IConfig|MockObject */
|
||||
protected $config;
|
||||
/** @var ISecureRandom|MockObject */
|
||||
protected $secureRandom;
|
||||
/** @var IHasher|MockObject */
|
||||
protected $hasher;
|
||||
/** @var IShareProvider|MockObject */
|
||||
protected $defaultProvider;
|
||||
/** @var IMountManager|MockObject */
|
||||
protected $mountManager;
|
||||
/** @var IGroupManager|MockObject */
|
||||
protected $groupManager;
|
||||
/** @var IL10N|MockObject */
|
||||
protected $l;
|
||||
/** @var IFactory|MockObject */
|
||||
protected $l10nFactory;
|
||||
/** @var DummyFactory */
|
||||
protected $factory;
|
||||
/** @var IUserManager|MockObject */
|
||||
protected $userManager;
|
||||
/** @var IRootFolder | MockObject */
|
||||
protected $rootFolder;
|
||||
/** @var IEventDispatcher|MockObject */
|
||||
protected $dispatcher;
|
||||
/** @var IMailer|MockObject */
|
||||
protected $mailer;
|
||||
/** @var IURLGenerator|MockObject */
|
||||
protected $urlGenerator;
|
||||
/** @var \OC_Defaults|MockObject */
|
||||
protected $defaults;
|
||||
/** @var IUserSession|MockObject */
|
||||
protected $userSession;
|
||||
/** @var KnownUserService|MockObject */
|
||||
protected $knownUserService;
|
||||
/** @var ShareDisableChecker|MockObject */
|
||||
protected $shareDisabledChecker;
|
||||
protected Manager $manager;
|
||||
protected LoggerInterface&MockObject $logger;
|
||||
protected IConfig&MockObject $config;
|
||||
protected ISecureRandom&MockObject $secureRandom;
|
||||
protected IHasher&MockObject $hasher;
|
||||
protected IShareProvider&MockObject $defaultProvider;
|
||||
protected IMountManager&MockObject $mountManager;
|
||||
protected IGroupManager&MockObject $groupManager;
|
||||
protected IL10N&MockObject $l;
|
||||
protected IFactory&MockObject $l10nFactory;
|
||||
protected DummyFactory $factory;
|
||||
protected IUserManager&MockObject $userManager;
|
||||
protected IRootFolder&MockObject $rootFolder;
|
||||
protected IEventDispatcher&MockObject $dispatcher;
|
||||
protected IUserSession&MockObject $userSession;
|
||||
protected KnownUserService&MockObject $knownUserService;
|
||||
protected ShareDisableChecker $shareDisabledChecker;
|
||||
private DateTimeZone $timezone;
|
||||
/** @var IDateTimeZone|MockObject */
|
||||
protected $dateTimeZone;
|
||||
/** @var IAppConfig|MockObject */
|
||||
protected $appConfig;
|
||||
protected IDateTimeZone&MockObject $dateTimeZone;
|
||||
protected IAppConfig&MockObject $appConfig;
|
||||
|
||||
protected function setUp(): void {
|
||||
$this->logger = $this->createMock(LoggerInterface::class);
|
||||
|
|
@ -132,9 +106,6 @@ class ManagerTest extends \Test\TestCase {
|
|||
$this->groupManager = $this->createMock(IGroupManager::class);
|
||||
$this->userManager = $this->createMock(IUserManager::class);
|
||||
$this->rootFolder = $this->createMock(IRootFolder::class);
|
||||
$this->mailer = $this->createMock(IMailer::class);
|
||||
$this->urlGenerator = $this->createMock(IURLGenerator::class);
|
||||
$this->defaults = $this->createMock(\OC_Defaults::class);
|
||||
$this->dispatcher = $this->createMock(IEventDispatcher::class);
|
||||
$this->userSession = $this->createMock(IUserSession::class);
|
||||
$this->knownUserService = $this->createMock(KnownUserService::class);
|
||||
|
|
@ -179,9 +150,6 @@ class ManagerTest extends \Test\TestCase {
|
|||
$factory,
|
||||
$this->userManager,
|
||||
$this->rootFolder,
|
||||
$this->mailer,
|
||||
$this->urlGenerator,
|
||||
$this->defaults,
|
||||
$this->dispatcher,
|
||||
$this->userSession,
|
||||
$this->knownUserService,
|
||||
|
|
@ -192,9 +160,9 @@ class ManagerTest extends \Test\TestCase {
|
|||
}
|
||||
|
||||
/**
|
||||
* @return MockBuilder
|
||||
* @return MockBuilder<Manager>
|
||||
*/
|
||||
private function createManagerMock() {
|
||||
private function createManagerMock(): MockBuilder {
|
||||
return $this->getMockBuilder(Manager::class)
|
||||
->setConstructorArgs([
|
||||
$this->logger,
|
||||
|
|
@ -207,9 +175,6 @@ class ManagerTest extends \Test\TestCase {
|
|||
$this->factory,
|
||||
$this->userManager,
|
||||
$this->rootFolder,
|
||||
$this->mailer,
|
||||
$this->urlGenerator,
|
||||
$this->defaults,
|
||||
$this->dispatcher,
|
||||
$this->userSession,
|
||||
$this->knownUserService,
|
||||
|
|
@ -245,7 +210,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
];
|
||||
}
|
||||
|
||||
#[\PHPUnit\Framework\Attributes\DataProvider('dataTestDelete')]
|
||||
#[DataProvider('dataTestDelete')]
|
||||
public function testDelete($shareType, $sharedWith): void {
|
||||
$manager = $this->createManagerMock()
|
||||
->onlyMethods(['getShareById', 'deleteChildren', 'promoteReshares'])
|
||||
|
|
@ -518,7 +483,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
});
|
||||
$manager->method('generalCreateChecks')->willThrowException(new GenericShareException());
|
||||
|
||||
$manager->expects($this->exactly(1))->method('updateShare')->with($reShare);
|
||||
$manager->expects($this->exactly(1))->method('updateShare')->with($reShare)->willReturn($reShare);
|
||||
|
||||
self::invokePrivate($manager, 'promoteReshares', [$share]);
|
||||
}
|
||||
|
|
@ -574,9 +539,10 @@ class ManagerTest extends \Test\TestCase {
|
|||
];
|
||||
$manager->expects($this->exactly(2))
|
||||
->method('updateShare')
|
||||
->willReturnCallback(function ($share) use (&$calls): void {
|
||||
->willReturnCallback(function ($share) use (&$calls): IShare {
|
||||
$expected = array_shift($calls);
|
||||
$this->assertEquals($expected, $share);
|
||||
return $expected;
|
||||
});
|
||||
|
||||
self::invokePrivate($manager, 'promoteReshares', [$share]);
|
||||
|
|
@ -602,7 +568,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
$reShare->method('getNode')->willReturn($folder);
|
||||
|
||||
$this->defaultProvider->method('getSharesBy')->willReturn([$reShare]);
|
||||
$manager->method('generalCreateChecks')->willReturn(true);
|
||||
$manager->method('generalCreateChecks');
|
||||
|
||||
/* No share is promoted because generalCreateChecks does not throw */
|
||||
$manager->expects($this->never())->method('updateShare');
|
||||
|
|
@ -668,9 +634,10 @@ class ManagerTest extends \Test\TestCase {
|
|||
];
|
||||
$manager->expects($this->exactly(2))
|
||||
->method('updateShare')
|
||||
->willReturnCallback(function ($share) use (&$calls): void {
|
||||
->willReturnCallback(function ($share) use (&$calls): IShare {
|
||||
$expected = array_shift($calls);
|
||||
$this->assertEquals($expected, $share);
|
||||
return $expected;
|
||||
});
|
||||
|
||||
self::invokePrivate($manager, 'promoteReshares', [$share]);
|
||||
|
|
@ -1056,7 +1023,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
return $mock;
|
||||
}
|
||||
|
||||
#[\PHPUnit\Framework\Attributes\DataProvider('dataGeneralChecks')]
|
||||
#[DataProvider('dataGeneralChecks')]
|
||||
public function testGeneralChecks(array $shareParams, ?string $exceptionMessage, bool $exception): void {
|
||||
if ($shareParams[2] !== null) {
|
||||
$shareParams[2] = $this->createNodeMock(...$shareParams[2]);
|
||||
|
|
@ -1107,8 +1074,6 @@ class ManagerTest extends \Test\TestCase {
|
|||
$this->expectException(\InvalidArgumentException::class);
|
||||
$this->expectExceptionMessage('You cannot share your root folder');
|
||||
|
||||
$thrown = null;
|
||||
|
||||
$this->userManager->method('userExists')->willReturnMap([
|
||||
['user0', true],
|
||||
['user1', true],
|
||||
|
|
@ -1132,7 +1097,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
return [[IShare::TYPE_USER], [IShare::TYPE_REMOTE], [IShare::TYPE_REMOTE_GROUP]];
|
||||
}
|
||||
|
||||
#[\PHPUnit\Framework\Attributes\DataProvider('validateExpirationDateInternalProvider')]
|
||||
#[DataProvider('validateExpirationDateInternalProvider')]
|
||||
public function testValidateExpirationDateInternalInPast($shareType): void {
|
||||
$this->expectException(GenericShareException::class);
|
||||
$this->expectExceptionMessage('Expiration date is in the past');
|
||||
|
|
@ -1148,7 +1113,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
self::invokePrivate($this->manager, 'validateExpirationDateInternal', [$share]);
|
||||
}
|
||||
|
||||
#[\PHPUnit\Framework\Attributes\DataProvider('validateExpirationDateInternalProvider')]
|
||||
#[DataProvider('validateExpirationDateInternalProvider')]
|
||||
public function testValidateExpirationDateInternalEnforceButNotSet($shareType): void {
|
||||
$this->expectException(\InvalidArgumentException::class);
|
||||
$this->expectExceptionMessage('Expiration date is enforced');
|
||||
|
|
@ -1173,7 +1138,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
self::invokePrivate($this->manager, 'validateExpirationDateInternal', [$share]);
|
||||
}
|
||||
|
||||
#[\PHPUnit\Framework\Attributes\DataProvider('validateExpirationDateInternalProvider')]
|
||||
#[DataProvider('validateExpirationDateInternalProvider')]
|
||||
public function testValidateExpirationDateInternalEnforceButNotEnabledAndNotSet($shareType): void {
|
||||
$share = $this->manager->newShare();
|
||||
$share->setProviderId('foo')->setId('bar');
|
||||
|
|
@ -1196,7 +1161,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
$this->assertNull($share->getExpirationDate());
|
||||
}
|
||||
|
||||
#[\PHPUnit\Framework\Attributes\DataProvider('validateExpirationDateInternalProvider')]
|
||||
#[DataProvider('validateExpirationDateInternalProvider')]
|
||||
public function testValidateExpirationDateInternalEnforceButNotSetNewShare($shareType): void {
|
||||
$share = $this->manager->newShare();
|
||||
$share->setShareType($shareType);
|
||||
|
|
@ -1229,7 +1194,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
$this->assertEquals($expected, $share->getExpirationDate());
|
||||
}
|
||||
|
||||
#[\PHPUnit\Framework\Attributes\DataProvider('validateExpirationDateInternalProvider')]
|
||||
#[DataProvider('validateExpirationDateInternalProvider')]
|
||||
public function testValidateExpirationDateInternalEnforceRelaxedDefaultButNotSetNewShare($shareType): void {
|
||||
$share = $this->manager->newShare();
|
||||
$share->setShareType($shareType);
|
||||
|
|
@ -1262,7 +1227,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
$this->assertEquals($expected, $share->getExpirationDate());
|
||||
}
|
||||
|
||||
#[\PHPUnit\Framework\Attributes\DataProvider('validateExpirationDateInternalProvider')]
|
||||
#[DataProvider('validateExpirationDateInternalProvider')]
|
||||
public function testValidateExpirationDateInternalEnforceTooFarIntoFuture($shareType): void {
|
||||
$this->expectException(GenericShareException::class);
|
||||
$this->expectExceptionMessage('Cannot set expiration date more than 3 days in the future');
|
||||
|
|
@ -1293,7 +1258,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
self::invokePrivate($this->manager, 'validateExpirationDateInternal', [$share]);
|
||||
}
|
||||
|
||||
#[\PHPUnit\Framework\Attributes\DataProvider('validateExpirationDateInternalProvider')]
|
||||
#[DataProvider('validateExpirationDateInternalProvider')]
|
||||
public function testValidateExpirationDateInternalEnforceValid($shareType): void {
|
||||
$future = new \DateTime('now', $this->dateTimeZone->getTimeZone());
|
||||
$future->add(new \DateInterval('P2D'));
|
||||
|
|
@ -1333,7 +1298,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
$this->assertEquals($expected, $share->getExpirationDate());
|
||||
}
|
||||
|
||||
#[\PHPUnit\Framework\Attributes\DataProvider('validateExpirationDateInternalProvider')]
|
||||
#[DataProvider('validateExpirationDateInternalProvider')]
|
||||
public function testValidateExpirationDateInternalNoDefault($shareType): void {
|
||||
$date = new \DateTime('now', $this->dateTimeZone->getTimeZone());
|
||||
$date->add(new \DateInterval('P5D'));
|
||||
|
|
@ -1357,7 +1322,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
$this->assertEquals($expected, $share->getExpirationDate());
|
||||
}
|
||||
|
||||
#[\PHPUnit\Framework\Attributes\DataProvider('validateExpirationDateInternalProvider')]
|
||||
#[DataProvider('validateExpirationDateInternalProvider')]
|
||||
public function testValidateExpirationDateInternalNoDateNoDefault($shareType): void {
|
||||
$hookListener = $this->createMock(DummyShareManagerListener::class);
|
||||
Util::connectHook('\OC\Share', 'verifyExpirationDate', $hookListener, 'listener');
|
||||
|
|
@ -1374,7 +1339,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
$this->assertNull($share->getExpirationDate());
|
||||
}
|
||||
|
||||
#[\PHPUnit\Framework\Attributes\DataProvider('validateExpirationDateInternalProvider')]
|
||||
#[DataProvider('validateExpirationDateInternalProvider')]
|
||||
public function testValidateExpirationDateInternalNoDateDefault($shareType): void {
|
||||
$share = $this->manager->newShare();
|
||||
$share->setShareType($shareType);
|
||||
|
|
@ -1411,7 +1376,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
$this->assertEquals($expected, $share->getExpirationDate());
|
||||
}
|
||||
|
||||
#[\PHPUnit\Framework\Attributes\DataProvider('validateExpirationDateInternalProvider')]
|
||||
#[DataProvider('validateExpirationDateInternalProvider')]
|
||||
public function testValidateExpirationDateInternalDefault($shareType): void {
|
||||
$future = new \DateTime('now', $this->timezone);
|
||||
$future->add(new \DateInterval('P5D'));
|
||||
|
|
@ -1451,7 +1416,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
$this->assertEquals($expected, $share->getExpirationDate());
|
||||
}
|
||||
|
||||
#[\PHPUnit\Framework\Attributes\DataProvider('validateExpirationDateInternalProvider')]
|
||||
#[DataProvider('validateExpirationDateInternalProvider')]
|
||||
public function testValidateExpirationDateInternalHookModification($shareType): void {
|
||||
$nextWeek = new \DateTime('now', $this->timezone);
|
||||
$nextWeek->add(new \DateInterval('P7D'));
|
||||
|
|
@ -1475,7 +1440,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
$this->assertEquals($save, $share->getExpirationDate());
|
||||
}
|
||||
|
||||
#[\PHPUnit\Framework\Attributes\DataProvider('validateExpirationDateInternalProvider')]
|
||||
#[DataProvider('validateExpirationDateInternalProvider')]
|
||||
public function testValidateExpirationDateInternalHookException($shareType): void {
|
||||
$this->expectException(\Exception::class);
|
||||
$this->expectExceptionMessage('Invalid date!');
|
||||
|
|
@ -1498,7 +1463,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
self::invokePrivate($this->manager, 'validateExpirationDateInternal', [$share]);
|
||||
}
|
||||
|
||||
#[\PHPUnit\Framework\Attributes\DataProvider('validateExpirationDateInternalProvider')]
|
||||
#[DataProvider('validateExpirationDateInternalProvider')]
|
||||
public function testValidateExpirationDateInternalExistingShareNoDefault($shareType): void {
|
||||
$share = $this->manager->newShare();
|
||||
$share->setShareType($shareType);
|
||||
|
|
@ -2426,7 +2391,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
* @param string[] $groupIds
|
||||
* @param bool $expected
|
||||
*/
|
||||
#[\PHPUnit\Framework\Attributes\DataProvider('dataIsSharingDisabledForUser')]
|
||||
#[DataProvider('dataIsSharingDisabledForUser')]
|
||||
public function testIsSharingDisabledForUser($excludeGroups, $groupList, $setList, $groupIds, $expected): void {
|
||||
$user = $this->createMock(IUser::class);
|
||||
|
||||
|
|
@ -2476,7 +2441,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
* @param string $sharingEnabled
|
||||
* @param bool $disabledForUser
|
||||
*/
|
||||
#[\PHPUnit\Framework\Attributes\DataProvider('dataCanShare')]
|
||||
#[DataProvider('dataCanShare')]
|
||||
public function testCanShare($expected, $sharingEnabled, $disabledForUser): void {
|
||||
$this->config->method('getAppValue')
|
||||
->willReturnMap([
|
||||
|
|
@ -2530,8 +2495,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
|
||||
$manager->expects($this->once())
|
||||
->method('canShare')
|
||||
->with($share)
|
||||
->willReturn(true);
|
||||
->with($share);
|
||||
$manager->expects($this->once())
|
||||
->method('generalCreateChecks')
|
||||
->with($share);
|
||||
|
|
@ -2585,8 +2549,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
|
||||
$manager->expects($this->once())
|
||||
->method('canShare')
|
||||
->with($share)
|
||||
->willReturn(true);
|
||||
->with($share);
|
||||
$manager->expects($this->once())
|
||||
->method('generalCreateChecks')
|
||||
->with($share);
|
||||
|
|
@ -2650,8 +2613,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
|
||||
$manager->expects($this->once())
|
||||
->method('canShare')
|
||||
->with($share)
|
||||
->willReturn(true);
|
||||
->with($share);
|
||||
$manager->expects($this->once())
|
||||
->method('generalCreateChecks')
|
||||
->with($share);
|
||||
|
|
@ -2756,8 +2718,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
|
||||
$manager->expects($this->once())
|
||||
->method('canShare')
|
||||
->with($share)
|
||||
->willReturn(true);
|
||||
->with($share);
|
||||
$manager->expects($this->once())
|
||||
->method('generalCreateChecks')
|
||||
->with($share);
|
||||
|
|
@ -2854,8 +2815,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
|
||||
$manager->expects($this->once())
|
||||
->method('canShare')
|
||||
->with($share)
|
||||
->willReturn(true);
|
||||
->with($share);
|
||||
$manager->expects($this->once())
|
||||
->method('generalCreateChecks')
|
||||
->with($share);
|
||||
|
|
@ -2933,8 +2893,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
|
||||
$manager->expects($this->once())
|
||||
->method('canShare')
|
||||
->with($share)
|
||||
->willReturn(true);
|
||||
->with($share);
|
||||
$manager->expects($this->once())
|
||||
->method('generalCreateChecks')
|
||||
->with($share);
|
||||
|
|
@ -3510,7 +3469,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
$originalShare = $this->manager->newShare();
|
||||
$originalShare->setShareType(IShare::TYPE_GROUP);
|
||||
|
||||
$manager->expects($this->once())->method('canShare')->willReturn(true);
|
||||
$manager->expects($this->once())->method('canShare');
|
||||
$manager->expects($this->once())->method('getShareById')->with('foo:42')->willReturn($originalShare);
|
||||
|
||||
$share = $this->manager->newShare();
|
||||
|
|
@ -3539,7 +3498,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
$originalShare->setShareType(IShare::TYPE_GROUP)
|
||||
->setSharedWith('origGroup');
|
||||
|
||||
$manager->expects($this->once())->method('canShare')->willReturn(true);
|
||||
$manager->expects($this->once())->method('canShare');
|
||||
$manager->expects($this->once())->method('getShareById')->with('foo:42')->willReturn($originalShare);
|
||||
|
||||
$share = $this->manager->newShare();
|
||||
|
|
@ -3567,7 +3526,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
$originalShare->setShareType(IShare::TYPE_USER)
|
||||
->setSharedWith('sharedWith');
|
||||
|
||||
$manager->expects($this->once())->method('canShare')->willReturn(true);
|
||||
$manager->expects($this->once())->method('canShare');
|
||||
$manager->expects($this->once())->method('getShareById')->with('foo:42')->willReturn($originalShare);
|
||||
|
||||
$share = $this->manager->newShare();
|
||||
|
|
@ -3602,7 +3561,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
$node->method('getId')->willReturn(100);
|
||||
$node->method('getPath')->willReturn('/newUser/files/myPath');
|
||||
|
||||
$manager->expects($this->once())->method('canShare')->willReturn(true);
|
||||
$manager->expects($this->once())->method('canShare');
|
||||
$manager->expects($this->once())->method('getShareById')->with('foo:42')->willReturn($originalShare);
|
||||
|
||||
$share = $this->manager->newShare();
|
||||
|
|
@ -3662,7 +3621,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
->setSharedWith('origUser')
|
||||
->setPermissions(31);
|
||||
|
||||
$manager->expects($this->once())->method('canShare')->willReturn(true);
|
||||
$manager->expects($this->once())->method('canShare');
|
||||
$manager->expects($this->once())->method('getShareById')->with('foo:42')->willReturn($originalShare);
|
||||
|
||||
$node = $this->createMock(File::class);
|
||||
|
|
@ -3728,7 +3687,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
->setNode($file)
|
||||
->setPermissions(15);
|
||||
|
||||
$manager->expects($this->once())->method('canShare')->willReturn(true);
|
||||
$manager->expects($this->once())->method('canShare');
|
||||
$manager->expects($this->once())->method('getShareById')->with('foo:42')->willReturn($originalShare);
|
||||
$manager->expects($this->once())->method('validateExpirationDateLink')->with($share);
|
||||
$manager->expects($this->once())->method('verifyPassword')->with('password');
|
||||
|
|
@ -3810,7 +3769,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
->setNode($file)
|
||||
->setPermissions(15);
|
||||
|
||||
$manager->expects($this->once())->method('canShare')->willReturn(true);
|
||||
$manager->expects($this->once())->method('canShare');
|
||||
$manager->expects($this->once())->method('getShareById')->with('foo:42')->willReturn($originalShare);
|
||||
$manager->expects($this->once())->method('generalCreateChecks')->with($share);
|
||||
$manager->expects($this->once())->method('linkCreateChecks')->with($share);
|
||||
|
|
@ -3875,7 +3834,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
->setNode($file)
|
||||
->setPermissions(Constants::PERMISSION_ALL);
|
||||
|
||||
$manager->expects($this->once())->method('canShare')->willReturn(true);
|
||||
$manager->expects($this->once())->method('canShare');
|
||||
$manager->expects($this->once())->method('getShareById')->with('foo:42')->willReturn($originalShare);
|
||||
$manager->expects($this->once())->method('generalCreateChecks')->with($share);
|
||||
$manager->expects($this->once())->method('verifyPassword')->with('password');
|
||||
|
|
@ -3958,7 +3917,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
->setNode($file)
|
||||
->setPermissions(Constants::PERMISSION_ALL);
|
||||
|
||||
$manager->expects($this->once())->method('canShare')->willReturn(true);
|
||||
$manager->expects($this->once())->method('canShare');
|
||||
$manager->expects($this->once())->method('getShareById')->with('foo:42')->willReturn($originalShare);
|
||||
$manager->expects($this->once())->method('generalCreateChecks')->with($share);
|
||||
$manager->expects($this->once())->method('verifyPassword')->with('password');
|
||||
|
|
@ -4041,7 +4000,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
->setNode($file)
|
||||
->setPermissions(Constants::PERMISSION_ALL);
|
||||
|
||||
$manager->expects($this->once())->method('canShare')->willReturn(true);
|
||||
$manager->expects($this->once())->method('canShare');
|
||||
$manager->expects($this->once())->method('getShareById')->with('foo:42')->willReturn($originalShare);
|
||||
$manager->expects($this->once())->method('generalCreateChecks')->with($share);
|
||||
$manager->expects($this->once())->method('verifyPassword')->with('password');
|
||||
|
|
@ -4132,7 +4091,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
->setNode($file)
|
||||
->setPermissions(Constants::PERMISSION_ALL);
|
||||
|
||||
$manager->expects($this->once())->method('canShare')->willReturn(true);
|
||||
$manager->expects($this->once())->method('canShare');
|
||||
$manager->expects($this->once())->method('getShareById')->with('foo:42')->willReturn($originalShare);
|
||||
$manager->expects($this->once())->method('generalCreateChecks')->with($share);
|
||||
$manager->expects($this->never())->method('verifyPassword');
|
||||
|
|
@ -4205,7 +4164,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
->setNode($file)
|
||||
->setPermissions(Constants::PERMISSION_ALL);
|
||||
|
||||
$manager->expects($this->once())->method('canShare')->willReturn(true);
|
||||
$manager->expects($this->once())->method('canShare');
|
||||
$manager->expects($this->once())->method('getShareById')->with('foo:42')->willReturn($originalShare);
|
||||
$manager->expects($this->once())->method('generalCreateChecks')->with($share);
|
||||
$manager->expects($this->once())->method('verifyPassword');
|
||||
|
|
@ -4278,7 +4237,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
->setNode($file)
|
||||
->setPermissions(Constants::PERMISSION_ALL);
|
||||
|
||||
$manager->expects($this->once())->method('canShare')->willReturn(true);
|
||||
$manager->expects($this->once())->method('canShare');
|
||||
$manager->expects($this->once())->method('getShareById')->with('foo:42')->willReturn($originalShare);
|
||||
$manager->expects($this->once())->method('generalCreateChecks')->with($share);
|
||||
$manager->expects($this->once())->method('verifyPassword');
|
||||
|
|
@ -4351,7 +4310,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
->setNode($file)
|
||||
->setPermissions(Constants::PERMISSION_ALL);
|
||||
|
||||
$manager->expects($this->once())->method('canShare')->willReturn(true);
|
||||
$manager->expects($this->once())->method('canShare');
|
||||
$manager->expects($this->once())->method('getShareById')->with('foo:42')->willReturn($originalShare);
|
||||
$manager->expects($this->once())->method('generalCreateChecks')->with($share);
|
||||
$manager->expects($this->never())->method('verifyPassword');
|
||||
|
|
@ -4425,7 +4384,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
->setNode($file)
|
||||
->setPermissions(Constants::PERMISSION_ALL);
|
||||
|
||||
$manager->expects($this->once())->method('canShare')->willReturn(true);
|
||||
$manager->expects($this->once())->method('canShare');
|
||||
$manager->expects($this->once())->method('getShareById')->with('foo:42')->willReturn($originalShare);
|
||||
$manager->expects($this->once())->method('generalCreateChecks')->with($share);
|
||||
$manager->expects($this->never())->method('verifyPassword');
|
||||
|
|
@ -4499,7 +4458,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
->setNode($file)
|
||||
->setPermissions(Constants::PERMISSION_ALL);
|
||||
|
||||
$manager->expects($this->once())->method('canShare')->willReturn(true);
|
||||
$manager->expects($this->once())->method('canShare');
|
||||
$manager->expects($this->once())->method('getShareById')->with('foo:42')->willReturn($originalShare);
|
||||
$manager->expects($this->once())->method('generalCreateChecks')->with($share);
|
||||
$manager->expects($this->never())->method('verifyPassword');
|
||||
|
|
@ -4538,9 +4497,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
$share = $this->manager->newShare();
|
||||
$share->setShareType(IShare::TYPE_LINK);
|
||||
|
||||
$recipient = $this->createMock(IUser::class);
|
||||
|
||||
$this->manager->moveShare($share, $recipient);
|
||||
$this->manager->moveShare($share, 'recipient');
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -4628,7 +4585,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
$this->addToAssertionCount(1);
|
||||
}
|
||||
|
||||
#[\PHPUnit\Framework\Attributes\DataProvider('dataTestShareProviderExists')]
|
||||
#[DataProvider('dataTestShareProviderExists')]
|
||||
public function testShareProviderExists($shareType, $expected): void {
|
||||
$factory = $this->getMockBuilder('OCP\Share\IProviderFactory')->getMock();
|
||||
$factory->expects($this->any())->method('getProviderForType')
|
||||
|
|
@ -5001,7 +4958,7 @@ class ManagerTest extends \Test\TestCase {
|
|||
/**
|
||||
* @param bool $expected
|
||||
*/
|
||||
#[\PHPUnit\Framework\Attributes\DataProvider('dataCurrentUserCanEnumerateTargetUser')]
|
||||
#[DataProvider('dataCurrentUserCanEnumerateTargetUser')]
|
||||
public function testCurrentUserCanEnumerateTargetUser(bool $currentUserIsGuest, bool $allowEnumerationFullMatch, bool $allowEnumeration, bool $limitEnumerationToPhone, bool $limitEnumerationToGroups, bool $isKnownToUser, bool $haveCommonGroup, bool $expected): void {
|
||||
/** @var IManager|MockObject $manager */
|
||||
$manager = $this->createManagerMock()
|
||||
|
|
|
|||
Loading…
Reference in a new issue