diff --git a/lib/Service/FederatedUserService.php b/lib/Service/FederatedUserService.php index 6a5ae6f46..ca792fe95 100644 --- a/lib/Service/FederatedUserService.php +++ b/lib/Service/FederatedUserService.php @@ -56,6 +56,7 @@ use OCA\Circles\Tools\Traits\TStringTools; use OCP\ICache; use OCP\ICacheFactory; +use OCP\IConfig; use OCP\IGroupManager; use OCP\IUser; use OCP\IUserManager; @@ -72,9 +73,9 @@ class FederatedUserService { use TNCLogger; use TDeserialize; - + public const USERPREF_SINGLE_CIRCLE = 'single_circle'; public const CACHE_SINGLE_CIRCLE = 'circles/singleCircle'; - public const CACHE_SINGLE_CIRCLE_TTL = 900; + public const CACHE_SINGLE_CIRCLE_TTL = 86400; public const CONFLICT_001 = 1; public const CONFLICT_002 = 2; @@ -82,6 +83,8 @@ class FederatedUserService { public const CONFLICT_004 = 4; public const CONFLICT_005 = 5; + /** @var IConfig $config */ + private $config; /** @var IUserSession */ private $userSession; @@ -163,6 +166,7 @@ class FederatedUserService { * @param ConfigService $configService */ public function __construct( + IConfig $config, IUserSession $userSession, IUserManager $userManager, IGroupManager $groupManager, @@ -178,6 +182,7 @@ public function __construct( InterfaceService $interfaceService, ConfigService $configService ) { + $this->config = $config; $this->userSession = $userSession; $this->userManager = $userManager; $this->groupManager = $groupManager; @@ -1263,8 +1268,9 @@ public function getGroupCircle(string $groupId): Circle { * @throws SingleCircleNotFoundException */ private function getCachedSingleCircle(FederatedUser $federatedUser): Circle { - $key = $this->generateCacheKey($federatedUser); - $cachedData = $this->cache->get($key); + $cachedData = ($federatedUser->getUserType() === Member::TYPE_USER) ? + $this->config->getUserValue($federatedUser->getUserId(), 'circles', self::USERPREF_SINGLE_CIRCLE) + : $this->cache->get($this->generateCacheKey($federatedUser)); if (!is_string($cachedData)) { throw new SingleCircleNotFoundException(); @@ -1285,6 +1291,11 @@ private function getCachedSingleCircle(FederatedUser $federatedUser): Circle { * @param Circle $singleCircle */ private function cacheSingleCircle(FederatedUser $federatedUser, Circle $singleCircle): void { + if ($federatedUser->getUserType() === Member::TYPE_USER) { + $this->config->setUserValue($federatedUser->getUserId(), 'circles', self::USERPREF_SINGLE_CIRCLE, json_encode($singleCircle)); + return; + } + $key = $this->generateCacheKey($federatedUser); $this->cache->set($key, json_encode($singleCircle), self::CACHE_SINGLE_CIRCLE_TTL); } diff --git a/lib/Tools/Traits/TDeserialize.php b/lib/Tools/Traits/TDeserialize.php index 61c17ceaf..b4e58a39c 100644 --- a/lib/Tools/Traits/TDeserialize.php +++ b/lib/Tools/Traits/TDeserialize.php @@ -11,6 +11,7 @@ namespace OCA\Circles\Tools\Traits; +use JsonException; use JsonSerializable; use OCA\Circles\Tools\Exceptions\InvalidItemException; use OCA\Circles\Tools\IDeserializable; @@ -110,7 +111,11 @@ public function deserializeList(string $json, string $class): array { * @throws InvalidItemException */ public function deserializeJson(string $json, string $class): IDeserializable { - $data = json_decode($json, true); + try { + $data = json_decode($json, true, flags: JSON_THROW_ON_ERROR); + } catch (JsonException) { + throw new InvalidItemException('not json'); + } return $this->deserialize($data, $class); }