diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php index 0717a1c25..16b518a9d 100644 --- a/lib/AppInfo/Application.php +++ b/lib/AppInfo/Application.php @@ -12,6 +12,7 @@ namespace OCA\Circles\AppInfo; use Closure; +use OCA\Circles\ConfigLexicon; use OCA\Circles\Dashboard\TeamDashboardWidget; use OCA\Circles\Events\AddingCircleMemberEvent; use OCA\Circles\Events\CircleMemberAddedEvent; @@ -122,6 +123,8 @@ public function register(IRegistrationContext $context): void { $context->registerDashboardWidget(TeamDashboardWidget::class); $context->registerTeamResourceProvider(FileSharingTeamResourceProvider::class); + + $context->registerConfigLexicon(ConfigLexicon::class); } diff --git a/lib/ConfigLexicon.php b/lib/ConfigLexicon.php new file mode 100644 index 000000000..797a7bffb --- /dev/null +++ b/lib/ConfigLexicon.php @@ -0,0 +1,39 @@ +userSession = $userSession; $this->userManager = $userManager; @@ -520,11 +523,44 @@ public function getLocalFederatedUser(string $userId, bool $check = true, bool $ $federatedUser = new FederatedUser(); $federatedUser->set($userId, '', Member::TYPE_USER, $displayName); - $this->fillSingleCircleId($federatedUser, ($check || $generate)); + + $cached = $this->getCachedLocalFederatedUser($federatedUser); + if (!$cached) { + $this->fillSingleCircleId($federatedUser, ($check || $generate)); + $this->userConfig->setValueString($userId, Application::APP_ID, ConfigLexicon::USER_SINGLE_ID, $federatedUser->getSingleId()); + } return $federatedUser; } + /** + * get singleId from UserConfig (already loaded from database) + * and emulate FederatedUser for local accounts. + */ + private function getCachedLocalFederatedUser(IFederatedUser $federatedUser): bool { + if ($federatedUser->getUserType() !== Member::TYPE_USER || !$federatedUser->isLocal()) { + return false; + } + + $userSingleId = $this->userConfig->getValueString($federatedUser->getUserId(), Application::APP_ID, ConfigLexicon::USER_SINGLE_ID); + if ($userSingleId === '') { + return false; + } + + $federatedUser->setSingleId($userSingleId); + // setBasedOn() should be useless, but we want to keep backward compatibility + $federatedUser->setBasedOn( + (new Circle())->import([ + 'id' => $userSingleId, + 'name' => 'user:' . $federatedUser->getUserId() . ':' . $userSingleId, + 'displayName' => $federatedUser->getDisplayName(), + 'source' => 1, + 'config' => 1, + ]) + ); + + return true; + } /** * Get the full FederatedUser for a local user.