diff --git a/lib/Command/CirclesDetails.php b/lib/Command/CirclesDetails.php index a1fe097ee..106233fa1 100644 --- a/lib/Command/CirclesDetails.php +++ b/lib/Command/CirclesDetails.php @@ -49,6 +49,7 @@ use OCA\Circles\Exceptions\UnknownRemoteException; use OCA\Circles\Exceptions\UserTypeNotFoundException; use OCA\Circles\Model\Member; +use OCA\Circles\Model\Probes\CircleProbe; use OCA\Circles\Service\CircleService; use OCA\Circles\Service\ConfigService; use OCA\Circles\Service\FederatedUserService; @@ -165,7 +166,11 @@ protected function execute(InputInterface $input, OutputInterface $output): int true ); - $circle = $this->circleService->getCircle($circleId, 0); + + $probe = new CircleProbe(); + $probe->includeNonVisibleCircles(); + + $circle = $this->circleService->getCircle($circleId, $probe); } catch (CircleNotFoundException $e) { throw new CircleNotFoundException( 'unknown circle, use --instance to retrieve the data from a remote instance' diff --git a/lib/Controller/AdminController.php b/lib/Controller/AdminController.php index aa84d868c..65c743e4a 100644 --- a/lib/Controller/AdminController.php +++ b/lib/Controller/AdminController.php @@ -291,7 +291,10 @@ public function circleDetails(string $emulated, string $circleId): DataResponse try { $this->setLocalFederatedUser($emulated); - return new DataResponse($this->serialize($this->circleService->getCircle($circleId))); + $probe = new CircleProbe(); + $probe->includeNonVisibleCircles(); + + return new DataResponse($this->serialize($this->circleService->getCircle($circleId, $probe))); } catch (Exception $e) { $this->e($e, ['emulated' => $emulated, 'circleId' => $circleId]); throw new OcsException($e->getMessage(), $e->getCode()); diff --git a/lib/Controller/LocalController.php b/lib/Controller/LocalController.php index 5d33d836f..1e42119f9 100644 --- a/lib/Controller/LocalController.php +++ b/lib/Controller/LocalController.php @@ -203,7 +203,10 @@ public function circleDetails(string $circleId): DataResponse { try { $this->setCurrentFederatedUser(); - return new DataResponse($this->serialize($this->circleService->getCircle($circleId))); + $probe = new CircleProbe(); + $probe->includeNonVisibleCircles(); + + return new DataResponse($this->serialize($this->circleService->getCircle($circleId, $probe))); } catch (Exception $e) { $this->e($e, ['circleId' => $circleId]); throw new OcsException($e->getMessage(), $e->getCode()); diff --git a/lib/Db/CoreQueryBuilder.php b/lib/Db/CoreQueryBuilder.php index 8c07b0f42..7122a38f9 100644 --- a/lib/Db/CoreQueryBuilder.php +++ b/lib/Db/CoreQueryBuilder.php @@ -1279,6 +1279,13 @@ protected function limitInitiatorVisibility(string $alias): ICompositeExpression $orX->add($this->exprLimitBitwise('config', Circle::CFG_VISIBLE, $alias)); } + if ($this->getBool('includeNonVisibleCircles', $options)) { + $andXNonVisible = $expr->andX(); + $andXNonVisible->add($this->exprLimitBitwise('config', Circle::CFG_OPEN, $alias)); + $andXNonVisible->add($this->exprFilterBitwise('config', Circle::CFG_VISIBLE, $alias)); + $orX->add($andXNonVisible); + } + // if Member can be Visitor, we only filter access to Personal Circles if ($this->getBool('viewableThroughKeyhole', $options, false)) { $andOpen = $expr->andX(); diff --git a/lib/Model/Probes/CircleProbe.php b/lib/Model/Probes/CircleProbe.php index 35add02c8..5058a5f49 100644 --- a/lib/Model/Probes/CircleProbe.php +++ b/lib/Model/Probes/CircleProbe.php @@ -47,6 +47,9 @@ class CircleProbe extends MemberProbe { /** @var int */ private $filter = Circle::CFG_SINGLE; + /** @var bool */ + private $includeNonVisible = false; + /** * CircleProbe constructor. @@ -125,6 +128,24 @@ public function includeBackendCircles(bool $include = true): self { return $this; } + /** + * @param bool $include + * + * @return $this + */ + public function includeNonVisibleCircles(bool $include = true): self { + $this->includeNonVisible = $include; + + return $this; + } + + /** + * @return bool + */ + public function nonVisibleCirclesIncluded(): bool { + return $this->includeNonVisible; + } + /** * @return int @@ -259,6 +280,7 @@ public function getAsOptions(): array { 'includeBackendCircles' => $this->isIncluded(Circle::CFG_BACKEND), 'includeSystemCircles' => $this->isIncluded(Circle::CFG_SYSTEM), 'includePersonalCircles' => $this->isIncluded(Circle::CFG_PERSONAL), + 'includeNonVisibleCircles' => $this->nonVisibleCirclesIncluded(), 'filtered' => $this->included(), 'filterHiddenCircles' => $this->isIncluded(Circle::CFG_HIDDEN), 'filterSingleCircles' => $this->isIncluded(Circle::CFG_SINGLE), diff --git a/lib/Service/CircleService.php b/lib/Service/CircleService.php index 9ea0bc2f6..df8f47ac2 100644 --- a/lib/Service/CircleService.php +++ b/lib/Service/CircleService.php @@ -377,7 +377,10 @@ public function updateSettings(string $circleId, array $settings): array { public function circleJoin(string $circleId): array { $this->federatedUserService->mustHaveCurrentUser(); - $circle = $this->circleRequest->getCircle($circleId, $this->federatedUserService->getCurrentUser()); + $probe = new CircleProbe(); + $probe->includeNonVisibleCircles(); + + $circle = $this->circleRequest->getCircle($circleId, $this->federatedUserService->getCurrentUser(), $probe); if (!$circle->getInitiator()->hasInvitedBy()) { $this->federatedUserService->setMemberPatron($circle->getInitiator()); } @@ -425,7 +428,7 @@ public function circleLeave(string $circleId, bool $force = false): array { /** * @param string $circleId - * @param int $filter + * @param CircleProbe|null $probe * * @return Circle * @throws CircleNotFoundException