diff --git a/lib/CirclesQueryHelper.php b/lib/CirclesQueryHelper.php index 5dbf0cd43..8524bbc58 100644 --- a/lib/CirclesQueryHelper.php +++ b/lib/CirclesQueryHelper.php @@ -142,6 +142,8 @@ public function limitToInheritedMembers( [CoreQueryBuilder::HELPER], [ 'getData' => $fullDetails, + 'filterPersonalCircles' => true, + 'includePersonalCircles' => true, 'minimumLevel' => Member::LEVEL_MEMBER ] ); diff --git a/lib/Command/CirclesMaintenance.php b/lib/Command/CirclesMaintenance.php index 916364c46..453abdfca 100644 --- a/lib/Command/CirclesMaintenance.php +++ b/lib/Command/CirclesMaintenance.php @@ -91,8 +91,8 @@ protected function configure() { 'clean-shares', '', InputOption::VALUE_NONE, 'remove Circles\' shares' ) ->addOption( - 'uninstall', '', InputOption::VALUE_NONE, - 'Uninstall the apps and everything related to the app from the database' + 'uninstall', '', InputOption::VALUE_NONE, + 'Uninstall the apps and everything related to the app from the database' ) ->addOption('force-refresh', '', InputOption::VALUE_NONE, 'enforce some refresh'); } diff --git a/lib/Db/CoreQueryBuilder.php b/lib/Db/CoreQueryBuilder.php index 01268ea0d..7a5fb7cbe 100644 --- a/lib/Db/CoreQueryBuilder.php +++ b/lib/Db/CoreQueryBuilder.php @@ -1326,7 +1326,7 @@ function (string $alias) use ($orXLevelCheck, $minimumLevel) { $orXLevelCheck->add( $this->expr()->gte( $alias . '.level', - $this->createNamedParameter($minimumLevel) + $this->createNamedParameter($minimumLevel, self::PARAM_INT) ) ); }, diff --git a/lib/Service/FederatedUserService.php b/lib/Service/FederatedUserService.php index e3fd406bd..7a30e81f7 100644 --- a/lib/Service/FederatedUserService.php +++ b/lib/Service/FederatedUserService.php @@ -721,14 +721,22 @@ public function getFederatedMember(string $userId, int $level = Member::LEVEL_ME * @throws RequestBuilderException */ public function getFederatedUser(string $federatedId, int $type = Member::TYPE_SINGLE): FederatedUser { - // if type=user, we check that handle@domain is not an actual local user - if ($type === Member::TYPE_USER) { - try { - return $this->getLocalFederatedUser($federatedId); - } catch (Exception $e) { + // first testing federatedId string as a whole; + try { + switch ($type) { + case Member::TYPE_USER: + return $this->getLocalFederatedUser($federatedId); + case Member::TYPE_GROUP: + return $this->getFederatedUser_Group($federatedId); + case Member::TYPE_MAIL: + return $this->getFederatedUser_Mail($federatedId); + case Member::TYPE_CONTACT: + return $this->getFederatedUser_Contact($federatedId); } + } catch (Exception $e) { } + // then if nothing found, extract remote instance from string [$singleId, $instance] = $this->extractIdAndInstance($federatedId); switch ($type) { @@ -739,10 +747,6 @@ public function getFederatedUser(string $federatedId, int $type = Member::TYPE_S return $this->getFederatedUser_User($singleId, $instance); case Member::TYPE_GROUP: return $this->getFederatedUser_Group($singleId, $instance); - case Member::TYPE_MAIL: - return $this->getFederatedUser_Mail($federatedId); - case Member::TYPE_CONTACT: - return $this->getFederatedUser_Contact($federatedId); } throw new UserTypeNotFoundException(); @@ -879,14 +883,14 @@ private function getFederatedUser_User(string $userId, string $instance): Federa * @throws UnknownRemoteException * @throws RequestBuilderException */ - public function getFederatedUser_Group(string $groupName, string $instance): FederatedUser { + public function getFederatedUser_Group(string $groupName, string $instance = ''): FederatedUser { if ($this->configService->isLocalInstance($instance)) { $circle = $this->getGroupCircle($groupName); $federatedGroup = new FederatedUser(); return $federatedGroup->importFromCircle($circle); } else { - // TODO: implement remote groups + throw new FederatedUserNotFoundException('remote group not supported yet. Use singleId'); } } @@ -948,11 +952,13 @@ public function getFederatedUser_Contact(string $contactPath): FederatedUser { */ public function extractIdAndInstance(string $federatedId): array { $federatedId = trim($federatedId, '@'); - if (strrpos($federatedId, '@') === false) { + $pos = strrpos($federatedId, '@'); + if ($pos === false) { $userId = $federatedId; $instance = $this->interfaceService->getLocalInstance(); } else { - [$userId, $instance] = explode('@', $federatedId); + $userId = substr($federatedId, 0, $pos); + $instance = substr($federatedId, $pos + 1); } return [$userId, $instance];