From 945721f48f74d5cfffef7c7cf3a3d6bc2521f5dd Mon Sep 17 00:00:00 2001 From: ivan Date: Tue, 15 Jul 2003 13:16:32 +0000 Subject: import of rt 3.0.4 --- .../recursive_group_membership_algorithm | 109 +++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 rt/docs/design_docs/recursive_group_membership_algorithm (limited to 'rt/docs/design_docs/recursive_group_membership_algorithm') diff --git a/rt/docs/design_docs/recursive_group_membership_algorithm b/rt/docs/design_docs/recursive_group_membership_algorithm new file mode 100644 index 0000000..250b9ad --- /dev/null +++ b/rt/docs/design_docs/recursive_group_membership_algorithm @@ -0,0 +1,109 @@ +Group A has members 1, 2, 3 + + Cached members 1 is a member of A via "" + 2 is a member of A via "" + 3 is a member of A via "" + + +Group B has members A, 4, 5 + + Cached members: 4 is a member of B via "" $1 + 5 is a member of B via "" $2 + A is a member of B via "" $3 + 1 is a member of B via "$3" $4 + 2 is a member of B via "$3" $5 + 3 is a member of B via "$3" $6 + +Group C has members A, B, 6 + 6 is a member of C via "" $7 + A is a member of C via "" $8 + 1 is a member of C via $8 $9 + 2 is a member of C via $8 $10 + 3 is a member of C via $8 $11 + B is a member of C via "" $12 + 4 is a member of C via $12 $13 + 5 is a member of C via $12 $14 + A is a member of C via $12 $15 + 1 is a member of C via $15 $16 + 2 is a member of C via $15 $17 + 3 is a member of C via $15 $18 + + + +Group D has members A, C + + A is a member of D via "" $19 + 1 is a member of D via $19 $20 + 2 is a member of D via $19 $21 + 3 is a member of D via $19 $22 + C is a member of D via "" $23 + 6 is a member of D via $23 $24 + A is a member of D via $23 $25 + 1 is a member of D via $25 $26 + 2 is a member of D via $25 $27 + 3 is a member of D via $25 $28 + B is a member of D via $23 $29 + 4 is a member of D via $29 $30 + 5 is a member of D via $29 $31 + A is a member of D via $29 $32 + 1 is a member of D via $32 $33 + 2 is a member of D via $32 $34 + 3 is a member of D via $32 $35 + + + +Adding a new user, 7, to group A. + + + Add the user to group A in the groups table. + + Find all entries for group A in the cache table. + + For each entry in that list: + Add "7 is a member of $entry->top via $entry->id" + +Deleting a user, 7, from group A: + + Remove the user from group A in the groups table. + find all entries in the cache table where the principal id is user 7 and + the parent id is A. (requires a self join) + nuke them + + Alternatively: + find all entries for A in the cache table. + For each one, find the child whose id is 7. + Nuke it + + +Adding a group, B to group D. + + Add group B as a member of D in the groups table. + In the cache table: + $id = Add group B as a member of D via "" + + For each member of group B (4, 5, A): + + $sid= 4 is a member of D via $id + $sid= 5 is a member of D via $id + $sid= A is a member of D via $id + + if the member is a group itself, recurse down: + + 1 is a member of D via $sid + 2 is a member of D via $sid + 3 is a member of D via $sid + + Find all places where D is a member of $foo. + Repeat the above procedure, substituting $foo for D + and making $id D's id. + +Removing B as a member of D: + + Remove B as a member of D in the groups table. + Find all references to D in the pseudogroups table. + Find all children of D which are B: + Recurse down with the following algorithm: + If it's a user, delete it. + If it's a group, recurse through each member, + deleting its children and then deleting the + group itself. -- cgit v1.1