@@ -64,8 +64,6 @@ function LoadGroups()
64
64
$ loguserGroup ['id ' ], $ secgroups , $ loguserid );
65
65
$ loguserPermset = LoadPermset ($ res );
66
66
67
- $ maxrank = FetchResult ("SELECT MAX(rank) FROM {usergroups} " );
68
-
69
67
$ loguser ['banned ' ] = ($ loguserGroup ['id ' ] == Settings::get ('bannedGroup ' ));
70
68
$ loguser ['root ' ] = ($ loguserGroup ['id ' ] == Settings::get ('rootGroup ' ));
71
69
}
@@ -172,6 +170,90 @@ function ForumsWithPermission($perm, $guest=false)
172
170
return $ ret ;
173
171
}
174
172
173
+ // retrieves the given permissions for the given users
174
+ // retrieves all possible permissions if $perms is left out
175
+ function GetUserPermissions ($ users , $ perms =null )
176
+ {
177
+ if (is_array ($ users ))
178
+ $ userclause = 'IN ({0c}) ' ;
179
+ else
180
+ $ userclause = '= {0} ' ;
181
+
182
+ // retrieve all the groups those users belong to
183
+ $ allgroups = Query ("
184
+ SELECT primarygroup gid, id uid, 0 type FROM {users} WHERE id {$ userclause }
185
+ UNION SELECT groupid gid, userid uid, 1 type FROM {secondarygroups} WHERE userid {$ userclause }" ,
186
+ $ users );
187
+
188
+ $ primgroups = array (); // primary group IDs
189
+ $ secgroups = array (); // secondary group IDs
190
+ $ groupusers = array (); // array of user IDs for each group
191
+
192
+ while ($ g = Fetch ($ allgroups ))
193
+ {
194
+ if ($ g ['type ' ])
195
+ $ secgroups [] = $ g ['gid ' ];
196
+ else
197
+ $ primgroups [] = $ g ['gid ' ];
198
+
199
+ $ groupusers [$ g ['gid ' ]][] = $ g ['uid ' ];
200
+ }
201
+
202
+ // remove duplicate group IDs. This is faster than using array_unique.
203
+ $ primgroups = array_flip (array_flip ($ primgroups ));
204
+ $ secgroups = array_flip (array_flip ($ secgroups ));
205
+
206
+ if (is_array ($ perms ))
207
+ $ permclause = 'AND perm IN ({3c}) ' ;
208
+ else if ($ perms )
209
+ $ permclause = 'AND perm = {3} ' ;
210
+ else
211
+ $ permclause = '' ;
212
+
213
+ // retrieve all the permissions related to those users and groups
214
+ $ res = Query ("
215
+ SELECT *, 1 ord FROM {permissions} WHERE applyto=0 AND id IN ({1c}) {$ permclause }
216
+ UNION SELECT *, 2 ord FROM {permissions} WHERE applyto=0 AND id IN ({2c}) {$ permclause }
217
+ UNION SELECT *, 3 ord FROM {permissions} WHERE applyto=1 AND id {$ userclause } {$ permclause }
218
+ ORDER BY ord " ,
219
+ $ users , $ primgroups , $ secgroups , $ perms );
220
+
221
+ $ permdata = array ();
222
+ $ permord = array ();
223
+
224
+ // compile all the resulting permission lists for all the requested users
225
+ while ($ p = Fetch ($ res ))
226
+ {
227
+ if ($ p ['value ' ] == 0 ) continue ;
228
+
229
+ $ k = $ p ['perm ' ];
230
+ if ($ p ['arg ' ]) $ k .= '_ ' .$ p ['arg ' ];
231
+
232
+ if ($ p ['applyto ' ] == 0 ) // group perm -- apply it to all the matching users
233
+ {
234
+ foreach ($ groupusers [$ p ['id ' ]] as $ uid )
235
+ {
236
+ if ($ p ['ord ' ] > $ permord [$ uid ][$ k ] || $ permdata [$ uid ][$ k ] != -1 )
237
+ $ permdata [$ uid ][$ k ] = $ p ['value ' ];
238
+
239
+ $ permord [$ uid ][$ k ] = $ p ['ord ' ];
240
+ }
241
+ }
242
+ else // user perm
243
+ {
244
+ $ uid = $ p ['id ' ];
245
+
246
+ if ($ p ['ord ' ] > $ permord [$ uid ][$ k ] || $ permdata [$ uid ][$ k ] != -1 )
247
+ $ permdata [$ uid ][$ k ] = $ p ['value ' ];
248
+
249
+ $ permord [$ uid ][$ k ] = $ p ['ord ' ];
250
+ }
251
+ }
252
+
253
+ unset($ permord );
254
+ return $ permdata ;
255
+ }
256
+
175
257
176
258
LoadGroups ();
177
259
$ loguser ['powerlevel ' ] = -1 ; // safety
0 commit comments