@@ -298,7 +298,7 @@ public function check_csrf_token($token) {
298298* @throws UserNotFoundException if the user is not found in LDAP
299299*/
300300public function get_details_from_ldap () {
301- global $ config ;
301+ global $ config, $ group_dir ;
302302$ attributes = array ();
303303$ attributes [] = 'dn ' ;
304304$ attributes [] = $ config ['ldap ' ]['user_id ' ];
@@ -327,8 +327,35 @@ public function get_details_from_ldap() {
327327$ this ->admin = 0 ;
328328$ group_member = $ ldapuser [strtolower ($ config ['ldap ' ]['group_member_value ' ])];
329329$ ldapgroups = $ this ->ldap ->search ($ config ['ldap ' ]['dn_group ' ], LDAP ::escape ($ config ['ldap ' ]['group_member ' ]).'= ' .LDAP ::escape ($ group_member ), array ('cn ' ));
330+ $ memberships = array ();
330331foreach ($ ldapgroups as $ ldapgroup ) {
331- if ($ ldapgroup ['cn ' ] == $ config ['ldap ' ]['admin_group_cn ' ]) $ this ->admin = 1 ;
332+ $ memberships [$ ldapgroup ['cn ' ]] = true ;
333+ }
334+ if (isset ($ config ['ldap ' ]['sync_groups ' ]) && is_array ($ config ['ldap ' ]['sync_groups ' ])) {
335+ $ syncgroups = $ config ['ldap ' ]['sync_groups ' ];
336+ } else {
337+ $ syncgroups = array ();
338+ }
339+ $ syncgroups [] = $ config ['ldap ' ]['admin_group_cn ' ];
340+ foreach ($ syncgroups as $ syncgroup ) {
341+ try {
342+ $ group = $ group_dir ->get_group_by_name ($ syncgroup );
343+ } catch (GroupNotFoundException $ e ) {
344+ $ group = new Group ;
345+ $ group ->name = $ syncgroup ;
346+ $ group ->system = 1 ;
347+ $ group_dir ->add_group ($ group );
348+ }
349+ if (isset ($ memberships [$ syncgroup ])) {
350+ if ($ syncgroup == $ config ['ldap ' ]['admin_group_cn ' ]) $ this ->admin = 1 ;
351+ if (!$ this ->member_of ($ group )) {
352+ $ group ->add_member ($ this );
353+ }
354+ } else {
355+ if ($ this ->member_of ($ group )) {
356+ $ group ->delete_member ($ this );
357+ }
358+ }
332359}
333360} else {
334361throw new UserNotFoundException ('User does not exist. ' );
0 commit comments