From 37b62793986c2df10e9ff0a758aa97c1746ca314 Mon Sep 17 00:00:00 2001 From: Maxence Lange Date: Sun, 19 May 2024 21:59:33 -0100 Subject: [PATCH] implements getAccessList Signed-off-by: Maxence Lange --- lib/Db/ShareWrapperRequest.php | 24 +++++++++++++++++ lib/Service/ShareWrapperService.php | 11 ++++++++ lib/ShareByCircleProvider.php | 39 ++++++++++++++++++++++++++- lib/Tools/Db/ExtendedQueryBuilder.php | 4 --- 4 files changed, 73 insertions(+), 5 deletions(-) diff --git a/lib/Db/ShareWrapperRequest.php b/lib/Db/ShareWrapperRequest.php index 957f0c993..50dc7f73f 100644 --- a/lib/Db/ShareWrapperRequest.php +++ b/lib/Db/ShareWrapperRequest.php @@ -275,6 +275,30 @@ public function getSharesByFileId(int $fileId, bool $getData = false): array { } + /** + * returns all share, related to a list of fileids. + * if $getData is true, will return details about the recipient circle. + * + * @param array $fileIds + * @param bool $getData + * + * @return ShareWrapper[] + * @throws RequestBuilderException + */ + public function getSharesByFileIds(array $fileIds, bool $getData = false): array { + $qb = $this->getShareSelectSql(); + $qb->limitToFileSourceArray($fileIds); + + if ($getData) { + $qb->setOptions([CoreQueryBuilder::SHARE], ['getData' => $getData]); + $qb->leftJoinCircle(CoreQueryBuilder::SHARE, null, 'share_with'); + $qb->limitNull('parent', false); + } + + return $this->getItemsFromRequest($qb); + } + + /** * @param FederatedUser $federatedUser * @param int $nodeId diff --git a/lib/Service/ShareWrapperService.php b/lib/Service/ShareWrapperService.php index a6ffe2528..a2b62e49c 100644 --- a/lib/Service/ShareWrapperService.php +++ b/lib/Service/ShareWrapperService.php @@ -193,6 +193,17 @@ public function getSharesByFileId(int $fileId, bool $getData = false): array { return $this->shareWrapperRequest->getSharesByFileId($fileId, $getData); } + /** + * @param array $fileIds + * @param bool $getData + * + * @return ShareWrapper[] + * @throws RequestBuilderException + */ + public function getSharesByFileIds(array $fileIds, bool $getData = false): array { + return $this->shareWrapperRequest->getSharesByFileIds($fileIds, $getData); + } + /** * @param string $token * @param FederatedUser|null $federatedUser diff --git a/lib/ShareByCircleProvider.php b/lib/ShareByCircleProvider.php index 5a837a2a7..f024d1b0a 100644 --- a/lib/ShareByCircleProvider.php +++ b/lib/ShareByCircleProvider.php @@ -58,6 +58,7 @@ use OCA\Circles\FederatedItems\Files\FileShare; use OCA\Circles\FederatedItems\Files\FileUnshare; use OCA\Circles\Model\Federated\FederatedEvent; +use OCA\Circles\Model\Member; use OCA\Circles\Model\Probes\CircleProbe; use OCA\Circles\Model\Probes\DataProbe; use OCA\Circles\Model\ShareWrapper; @@ -654,7 +655,43 @@ public function userDeletedFromGroup($uid, $gid): void { * @return array */ public function getAccessList($nodes, $currentAccess): array { - return []; + $ids = []; + foreach ($nodes as $node) { + $ids[] = $node->getId(); + } + + $users = $remote = $mails = []; + $shares = $this->shareWrapperService->getSharesByFileIds($ids, true); + + foreach($shares as $share) { + $circle = $share->getCircle(); + foreach ($circle->getInheritedMembers() as $member) { + switch ($member->getUserType()) { + case Member::TYPE_USER: + if ($member->isLocal()) { + if (!in_array($member->getUserId(), $users)) { + $users[] = $member->getUserId(); + } + } else { + if (!in_array($member->getUserId(), $remote)) { + $remote[] = $member->getUserid() . '@' . $member->getInstance(); + } + } + break; + case Member::TYPE_MAIL: + if (!in_array($member->getUserId(), $mails)) { + $mails[] = $member->getUserId(); + } + break; + } + } + } + + return [ + 'users' => $users, + 'remote' => $remote, + 'email' => $mails + ]; } diff --git a/lib/Tools/Db/ExtendedQueryBuilder.php b/lib/Tools/Db/ExtendedQueryBuilder.php index 414a4b797..31af5d890 100644 --- a/lib/Tools/Db/ExtendedQueryBuilder.php +++ b/lib/Tools/Db/ExtendedQueryBuilder.php @@ -528,10 +528,6 @@ public function exprLimitArray( string $alias = '', bool $cs = true ): ICompositeExpression { - if ($this->getType() === DBALQueryBuilder::SELECT) { - $field = (($alias === '') ? $this->getDefaultSelectAlias() : $alias) . '.' . $field; - } - $andX = $this->expr()->andX(); foreach ($values as $value) { if (is_integer($value)) {