|
56 | 56 | class Group_LDAP extends ABackend implements GroupInterface, IGroupLDAP, IGetDisplayNameBackend, IDeleteGroupBackend { |
57 | 57 | protected bool $enabled = false; |
58 | 58 |
|
59 | | - /** @var CappedMemoryCache<string[]> $cachedGroupMembers array of users with gid as key */ |
| 59 | + /** @var CappedMemoryCache<string[]> $cachedGroupMembers array of user DN with gid as key */ |
60 | 60 | protected CappedMemoryCache $cachedGroupMembers; |
61 | | - /** @var CappedMemoryCache<array[]> $cachedGroupsByMember array of groups with uid as key */ |
| 61 | + /** @var CappedMemoryCache<array[]> $cachedGroupsByMember array of groups with user DN as key */ |
62 | 62 | protected CappedMemoryCache $cachedGroupsByMember; |
63 | 63 | /** @var CappedMemoryCache<string[]> $cachedNestedGroups array of groups with gid (DN) as key */ |
64 | 64 | protected CappedMemoryCache $cachedNestedGroups; |
@@ -1357,4 +1357,35 @@ public function getDisplayName(string $gid): string { |
1357 | 1357 | public function dn2GroupName(string $dn): string|false { |
1358 | 1358 | return $this->access->dn2groupname($dn); |
1359 | 1359 | } |
| 1360 | + |
| 1361 | + public function addRelationshipToCaches(string $uid, ?string $dnUser, string $gid): void { |
| 1362 | + $dnGroup = $this->access->groupname2dn($gid); |
| 1363 | + $dnUser ??= $this->access->username2dn($uid); |
| 1364 | + if ($dnUser === false || $dnGroup === false) { |
| 1365 | + return; |
| 1366 | + } |
| 1367 | + if (isset($this->cachedGroupMembers[$gid])) { |
| 1368 | + $this->cachedGroupMembers[$gid] = array_merge($this->cachedGroupMembers[$gid], [$dnUser]); |
| 1369 | + } |
| 1370 | + unset($this->cachedGroupsByMember[$dnUser]); |
| 1371 | + unset($this->cachedNestedGroups[$gid]); |
| 1372 | + $cacheKey = 'inGroup' . $uid . ':' . $gid; |
| 1373 | + $this->access->connection->writeToCache($cacheKey, true); |
| 1374 | + $cacheKeyMembers = 'inGroup-members:' . $gid; |
| 1375 | + if (!is_null($data = $this->access->connection->getFromCache($cacheKeyMembers))) { |
| 1376 | + $this->access->connection->writeToCache($cacheKeyMembers, array_merge($data, [$dnUser])); |
| 1377 | + } |
| 1378 | + $cacheKey = '_groupMembers' . $dnGroup; |
| 1379 | + if (!is_null($data = $this->access->connection->getFromCache($cacheKey))) { |
| 1380 | + $this->access->connection->writeToCache($cacheKey, array_merge($data, [$dnUser])); |
| 1381 | + } |
| 1382 | + $cacheKey = 'getUserGroups' . $uid; |
| 1383 | + if (!is_null($data = $this->access->connection->getFromCache($cacheKey))) { |
| 1384 | + $this->access->connection->writeToCache($cacheKey, array_merge($data, [$gid])); |
| 1385 | + } |
| 1386 | + // These cache keys cannot be easily updated: |
| 1387 | + // $cacheKey = 'usersInGroup-' . $gid . '-' . $search . '-' . $limit . '-' . $offset; |
| 1388 | + // $cacheKey = 'usersInGroup-' . $gid . '-' . $search; |
| 1389 | + // $cacheKey = 'countUsersInGroup-' . $gid . '-' . $search; |
| 1390 | + } |
1360 | 1391 | } |
0 commit comments