Skip to content

Commit 5916ab7

Browse files
committed
fix redis before append or remove cache array
1 parent aea0705 commit 5916ab7

File tree

7 files changed

+113
-43
lines changed

7 files changed

+113
-43
lines changed

resources/lib/UnityGroup.php

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -206,10 +206,17 @@ public function cancelGroupJoinRequest(UnityUser $user, bool $send_mail = true):
206206
// // now we delete the ldap entry
207207
// $this->entry->ensureExists();
208208
// $this->entry->delete();
209-
// $this->REDIS->removeCacheArray("sorted_groups", "", $this->gid);
209+
// $default_value_getter = [$this->LDAP, "getSortedGroupsForRedis"];
210+
// $this->REDIS->removeCacheArray("sorted_groups", "", $this->gid, $default_value_getter);
210211
// foreach ($users as $user) {
211-
// $this->REDIS->removeCacheArray($user->uid, "groups", $this->gid);
212+
// $this->REDIS->removeCacheArray(
213+
// $user->uid,
214+
// "groups",
215+
// $this->gid,
216+
// fn() => $this->getGroupMemberUIDs(true),
217+
// );
212218
// }
219+
// // FIXME group not removed from user's groups array
213220

214221
// // send email to every user of the now deleted PI group
215222
// if ($send_mail) {
@@ -417,7 +424,8 @@ private function init(): void
417424
$this->entry->setAttribute("gidnumber", strval($nextGID));
418425
$this->entry->setAttribute("memberuid", [$owner->uid]);
419426
$this->entry->write();
420-
$this->REDIS->appendCacheArray("sorted_groups", "", $this->gid);
427+
$default_value_getter = [$this->LDAP, "getSortedGroupsForRedis"];
428+
$this->REDIS->appendCacheArray("sorted_groups", "", $this->gid, $default_value_getter);
421429
// TODO if we ever make this project based,
422430
// we need to update the cache here with the memberuid
423431
}
@@ -426,16 +434,36 @@ private function addUserToGroup(UnityUser $new_user): void
426434
{
427435
$this->entry->appendAttribute("memberuid", $new_user->uid);
428436
$this->entry->write();
429-
$this->REDIS->appendCacheArray($this->gid, "members", $new_user->uid);
430-
$this->REDIS->appendCacheArray($new_user->uid, "groups", $this->gid);
437+
$this->REDIS->appendCacheArray(
438+
$this->gid,
439+
"members",
440+
$new_user->uid,
441+
fn() => $this->getGroupMemberUIDs(true),
442+
);
443+
$this->REDIS->appendCacheArray(
444+
$new_user->uid,
445+
"groups",
446+
$this->gid,
447+
fn() => $this->LDAP->getPIGroupGIDsWithMemberUID($new_user->uid),
448+
);
431449
}
432450

433451
private function removeUserFromGroup(UnityUser $old_user): void
434452
{
435453
$this->entry->removeAttributeEntryByValue("memberuid", $old_user->uid);
436454
$this->entry->write();
437-
$this->REDIS->removeCacheArray($this->gid, "members", $old_user->uid);
438-
$this->REDIS->removeCacheArray($old_user->uid, "groups", $this->gid);
455+
$this->REDIS->removeCacheArray(
456+
$this->gid,
457+
"members",
458+
$old_user->uid,
459+
fn() => $this->getGroupMemberUIDs(true),
460+
);
461+
$this->REDIS->removeCacheArray(
462+
$old_user->uid,
463+
"groups",
464+
$this->gid,
465+
fn() => $this->LDAP->getPIGroupGIDsWithMemberUID($old_user->uid),
466+
);
439467
}
440468

441469
public function memberExists(UnityUser $user): bool

resources/lib/UnityLDAP.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -458,4 +458,27 @@ public function getUidFromEmail(string $email): LDAPEntry
458458
}
459459
throw new exceptions\EntryNotFoundException($email);
460460
}
461+
462+
public function getSortedQualifiedUsersForRedis(): array
463+
{
464+
$qualified_users = $this->getQualifiedUsersUIDs();
465+
sort($qualified_users);
466+
return $qualified_users;
467+
}
468+
469+
public function getSortedOrgsForRedis(): array
470+
{
471+
$attributes = $this->getAllOrgGroupsAttributes(["cn"]);
472+
$groups = array_map(fn($x) => $x["cn"][0], $attributes);
473+
sort($groups);
474+
return $groups;
475+
}
476+
477+
public function getSortedGroupsForRedis(): array
478+
{
479+
$attributes = $this->getAllPIGroupsAttributes(["cn"]);
480+
$groups = array_map(fn($x) => $x["cn"][0], $attributes);
481+
sort($groups);
482+
return $groups;
483+
}
461484
}

resources/lib/UnityOrg.php

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ public function init(): void
3939
$this->entry->setAttribute("objectclass", UnityLDAP::POSIX_GROUP_CLASS);
4040
$this->entry->setAttribute("gidnumber", strval($nextGID));
4141
$this->entry->write();
42-
$this->REDIS->appendCacheArray("sorted_orgs", "", $this->gid);
42+
$default_value_getter = [$this->LDAP, "getSortedOrgsForRedis"];
43+
$this->REDIS->appendCacheArray("sorted_orgs", "", $this->gid, $default_value_getter);
4344
}
4445

4546
public function exists(): bool
@@ -94,13 +95,23 @@ public function addUser(UnityUser $user): void
9495
{
9596
$this->entry->appendAttribute("memberuid", $user->uid);
9697
$this->entry->write();
97-
$this->REDIS->appendCacheArray($this->gid, "members", $user->uid);
98+
$this->REDIS->appendCacheArray(
99+
$this->gid,
100+
"members",
101+
$user->uid,
102+
fn() => $this->getOrgMemberUIDs(true),
103+
);
98104
}
99105

100106
public function removeUser(UnityUser $user): void
101107
{
102108
$this->entry->removeAttributeEntryByValue("memberuid", $user->uid);
103109
$this->entry->write();
104-
$this->REDIS->removeCacheArray($this->gid, "members", $user->uid);
110+
$this->REDIS->removeCacheArray(
111+
$this->gid,
112+
"members",
113+
$user->uid,
114+
fn() => $this->getOrgMemberUIDs(true),
115+
);
105116
}
106117
}

resources/lib/UnityRedis.php

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,19 @@ public function getCache(string $object, string $key): mixed
6161
return null;
6262
}
6363

64-
public function appendCacheArray(string $object, string $key, mixed $value): void
65-
{
64+
public function appendCacheArray(
65+
string $object,
66+
string $key,
67+
mixed $value,
68+
callable $default_value_getter,
69+
): void {
6670
if (!$this->enabled) {
6771
return;
6872
}
6973

7074
$cached_val = $this->getCache($object, $key);
7175
if (is_null($cached_val)) {
72-
$this->setCache($object, $key, [$value]);
76+
$this->setCache($object, $key, $default_value_getter());
7377
} else {
7478
if (!is_array($cached_val)) {
7579
throw new Exception("This cache value is not an array");
@@ -82,15 +86,19 @@ public function appendCacheArray(string $object, string $key, mixed $value): voi
8286
}
8387

8488
// TODO return void
85-
public function removeCacheArray(string $object, string $key, mixed $value)
86-
{
89+
public function removeCacheArray(
90+
string $object,
91+
string $key,
92+
mixed $value,
93+
callable $default_value_getter,
94+
) {
8795
if (!$this->enabled) {
8896
return null;
8997
}
9098

9199
$cached_val = $this->getCache($object, $key);
92100
if (is_null($cached_val)) {
93-
$this->setCache($object, $key, []);
101+
$this->setCache($object, $key, $default_value_getter());
94102
} else {
95103
if (!is_array($cached_val)) {
96104
throw new Exception("This cache value is not an array");

resources/lib/UnityUser.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,13 @@ public function init(
108108
$this->LDAP->getQualifiedUserGroup()->appendAttribute("memberuid", $this->uid);
109109
$this->LDAP->getQualifiedUserGroup()->write();
110110

111-
$this->REDIS->appendCacheArray("sorted_qualified_users", "", $this->uid);
111+
$default_value_getter = [$this->LDAP, "getSortedQualifiedUsersForRedis"];
112+
$this->REDIS->appendCacheArray(
113+
"sorted_qualified_users",
114+
"",
115+
$this->uid,
116+
$default_value_getter,
117+
);
112118

113119
$this->SQL->addLog($this->uid, $_SERVER["REMOTE_ADDR"], "user_added", $this->uid);
114120

test/phpunit-bootstrap.php

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,8 @@ function ensureUserDoesNotExist()
193193
$all_users_group->write();
194194
ensure(!in_array($USER->uid, $all_users_group->getAttribute("memberuid")));
195195
}
196-
$REDIS->removeCacheArray("sorted_qualified_users", "", $USER->uid);
196+
$default_value_getter = [$LDAP, "getSortedQualifiedUsersForRedis"];
197+
$REDIS->removeCacheArray("sorted_qualified_users", "", $USER->uid, $default_value_getter);
197198
}
198199

199200
function ensureOrgGroupDoesNotExist()
@@ -204,7 +205,8 @@ function ensureOrgGroupDoesNotExist()
204205
$org_group->delete();
205206
ensure(!$org_group->exists());
206207
}
207-
$REDIS->removeCacheArray("sorted_orgs", "", $SSO["org"]);
208+
$default_value_getter = [$LDAP, "getSortedOrgsForRedis"];
209+
$REDIS->removeCacheArray("sorted_orgs", "", $SSO["org"], $default_value_getter);
208210
}
209211

210212
function ensureUserNotInPIGroup(UnityGroup $pi_group)
@@ -214,7 +216,12 @@ function ensureUserNotInPIGroup(UnityGroup $pi_group)
214216
$pi_group->removeUser($USER);
215217
ensure(!$pi_group->memberExists($USER));
216218
}
217-
$REDIS->removeCacheArray($pi_group->gid, "members", $USER->uid);
219+
$REDIS->removeCacheArray(
220+
$pi_group->gid,
221+
"members",
222+
$USER->uid,
223+
fn() => $pi_group->getGroupMemberUIDs(true),
224+
);
218225
}
219226

220227
function ensurePIGroupDoesNotExist()
@@ -225,7 +232,8 @@ function ensurePIGroupDoesNotExist()
225232
$LDAP->getPIGroupEntry($gid)->delete();
226233
ensure(!$USER->getPIGroup()->exists());
227234
}
228-
$REDIS->removeCacheArray("sorted_groups", "", $gid);
235+
$default_value_getter = [$LDAP, "getSortedGroupsForRedis"];
236+
$REDIS->removeCacheArray("sorted_groups", "", $gid, $default_value_getter);
229237
}
230238

231239
function getNormalUser()

workers/update-ldap-cache.php

Lines changed: 8 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,11 @@
3838
echo "waiting for LDAP search (users)...\n";
3939
$users = $LDAP->search("objectClass=posixAccount", CONFIG["ldap"]["basedn"], []);
4040
echo "response received.\n";
41-
$user_CNs = $LDAP->getQualifiedUserGroup()->getAttribute("memberuid");
42-
sort($user_CNs);
43-
$REDIS->setCache("sorted_qualified_users", "", $user_CNs);
41+
$sorted_qualified_users_UIDs = $LDAP->getSortedQualifiedUsersForRedis();
42+
$REDIS->setCache("sorted_qualified_users", "", $sorted_qualified_users_UIDs);
4443
foreach ($users as $user) {
4544
$uid = $user->getAttribute("cn")[0];
46-
if (!in_array($uid, $user_CNs)) {
45+
if (!in_array($uid, $sorted_qualified_users_UIDs)) {
4746
continue;
4847
}
4948
$REDIS->setCache($uid, "firstname", $user->getAttribute("givenname")[0]);
@@ -59,13 +58,7 @@
5958
echo "waiting for LDAP search (org groups)...\n";
6059
$org_groups = $org_group_ou->getChildrenArrayStrict(["cn", "memberuid"], true);
6160
echo "response received.\n";
62-
// phpcs:disable
63-
$org_group_CNs = array_map(function ($x) {
64-
return $x["cn"][0];
65-
}, $org_groups);
66-
// phpcs:enable
67-
sort($org_group_CNs);
68-
$REDIS->setCache("sorted_orgs", "", $org_group_CNs);
61+
$REDIS->setCache("sorted_orgs", "", $LDAP->getSortedOrgsForRedis());
6962
foreach ($org_groups as $org_group) {
7063
$gid = $org_group["cn"][0];
7164
$REDIS->setCache($gid, "members", $org_group["memberuid"] ?? []);
@@ -75,27 +68,20 @@
7568
echo "waiting for LDAP search (pi groups)...\n";
7669
$pi_groups = $pi_group_ou->getChildrenArrayStrict(["cn", "memberuid"], true);
7770
echo "response received.\n";
78-
// phpcs:disable
79-
$pi_group_CNs = array_map(function ($x) {
80-
return $x["cn"][0];
81-
}, $pi_groups);
82-
// phpcs:enable
83-
sort($pi_group_CNs);
84-
// FIXME should be sorted_pi_groups
85-
$REDIS->setCache("sorted_groups", "", $pi_group_CNs);
71+
$REDIS->setCache("sorted_groups", "", $LDAP->getSortedGroupsForRedis());
8672

8773
$user_pi_group_member_of = [];
88-
foreach ($user_CNs as $uid) {
74+
foreach ($sorted_qualified_users_UIDs as $uid) {
8975
$user_pi_group_member_of[$uid] = [];
9076
}
9177
foreach ($pi_groups as $pi_group) {
9278
$gid = $pi_group["cn"][0];
9379
$members = $pi_group["memberuid"] ?? [];
9480
foreach ($members as $uid) {
95-
if (in_array($uid, $user_CNs)) {
81+
if (in_array($uid, $sorted_qualified_users_UIDs)) {
9682
array_push($user_pi_group_member_of[$uid], $gid);
9783
} else {
98-
echo "warning: group '$gid' has member '$uid' who is not in the users group!\n";
84+
echo "warning: group '$gid' has member '$uid' who is not qualfied!\n";
9985
}
10086
}
10187
$REDIS->setCache($gid, "members", $pi_group["memberuid"] ?? []);

0 commit comments

Comments
 (0)