|
14 | 14 | use Exception; |
15 | 15 | use OC; |
16 | 16 | use OCA\Circles\AppInfo\Application; |
| 17 | +use OCA\Circles\ConfigLexicon; |
17 | 18 | use OCA\Circles\Db\AccountsRequest; |
18 | 19 | use OCA\Circles\Db\CircleRequest; |
19 | 20 | use OCA\Circles\Db\MemberRequest; |
|
54 | 55 | use OCA\Circles\Tools\Traits\TDeserialize; |
55 | 56 | use OCA\Circles\Tools\Traits\TNCLogger; |
56 | 57 | use OCA\Circles\Tools\Traits\TStringTools; |
| 58 | +use OCP\Config\IUserConfig; |
57 | 59 | use OCP\ICache; |
58 | 60 | use OCP\ICacheFactory; |
59 | 61 | use OCP\IGroupManager; |
@@ -177,6 +179,7 @@ public function __construct( |
177 | 179 | ContactService $contactService, |
178 | 180 | InterfaceService $interfaceService, |
179 | 181 | ConfigService $configService, |
| 182 | + private readonly IUserConfig $userConfig, |
180 | 183 | ) { |
181 | 184 | $this->userSession = $userSession; |
182 | 185 | $this->userManager = $userManager; |
@@ -520,11 +523,44 @@ public function getLocalFederatedUser(string $userId, bool $check = true, bool $ |
520 | 523 |
|
521 | 524 | $federatedUser = new FederatedUser(); |
522 | 525 | $federatedUser->set($userId, '', Member::TYPE_USER, $displayName); |
523 | | - $this->fillSingleCircleId($federatedUser, ($check || $generate)); |
| 526 | + |
| 527 | + $cached = $this->getCachedLocalFederatedUser($federatedUser); |
| 528 | + if (!$cached) { |
| 529 | + $this->fillSingleCircleId($federatedUser, ($check || $generate)); |
| 530 | + $this->userConfig->setValueString($userId, Application::APP_ID, ConfigLexicon::USER_SINGLE_ID, $federatedUser->getSingleId()); |
| 531 | + } |
524 | 532 |
|
525 | 533 | return $federatedUser; |
526 | 534 | } |
527 | 535 |
|
| 536 | + /** |
| 537 | + * get singleId from UserConfig (already loaded from database) |
| 538 | + * and emulate FederatedUser for local accounts. |
| 539 | + */ |
| 540 | + private function getCachedLocalFederatedUser(IFederatedUser $federatedUser): bool { |
| 541 | + if ($federatedUser->getUserType() !== Member::TYPE_USER || !$federatedUser->isLocal()) { |
| 542 | + return false; |
| 543 | + } |
| 544 | + |
| 545 | + $userSingleId = $this->userConfig->getValueString($federatedUser->getUserId(), Application::APP_ID, ConfigLexicon::USER_SINGLE_ID); |
| 546 | + if ($userSingleId === '') { |
| 547 | + return false; |
| 548 | + } |
| 549 | + |
| 550 | + $federatedUser->setSingleId($userSingleId); |
| 551 | + // setBasedOn() should be useless, but we want to keep backward compatibility |
| 552 | + $federatedUser->setBasedOn( |
| 553 | + (new Circle())->import([ |
| 554 | + 'id' => $userSingleId, |
| 555 | + 'name' => 'user:' . $federatedUser->getUserId() . ':' . $userSingleId, |
| 556 | + 'displayName' => $federatedUser->getDisplayName(), |
| 557 | + 'source' => 1, |
| 558 | + 'config' => 1, |
| 559 | + ]) |
| 560 | + ); |
| 561 | + |
| 562 | + return true; |
| 563 | + } |
528 | 564 |
|
529 | 565 | /** |
530 | 566 | * Get the full FederatedUser for a local user. |
|
0 commit comments