summaryrefslogtreecommitdiff
path: root/rt/docs/design_docs/recursive_group_membership_algorithm
blob: 250b9ad0d8c9f69c0b1f00a64f93ecd12e8e67dc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
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.