@@ -137,6 +137,7 @@ def get_options(caller_config):
137
137
builder .set_string_value ('user_given_name_format' , six .text_type ('{givenName}' ))
138
138
builder .set_string_value ('user_surname_format' , six .text_type ('{sn}' ))
139
139
builder .set_string_value ('user_country_code_format' , six .text_type ('{c}' ))
140
+ builder .set_string_value ('dynamic_group_member_attribute' , None )
140
141
builder .set_string_value ('user_identity_type' , None )
141
142
builder .set_int_value ('search_page_size' , 200 )
142
143
builder .set_string_value ('logger_name' , LDAPDirectoryConnector .name )
@@ -302,6 +303,9 @@ def iter_group_member_dns(self, group_dn, member_attribute, searched_dns=None):
302
303
pass
303
304
304
305
def iter_users (self , base_dn , users_filter , extended_attributes ):
306
+ options = self .options
307
+ dynamic_group_member_attribute = options ['dynamic_group_member_attribute' ]
308
+
305
309
user_attribute_names = []
306
310
user_attribute_names .extend (self .user_given_name_formatter .get_attribute_names ())
307
311
user_attribute_names .extend (self .user_surname_formatter .get_attribute_names ())
@@ -310,7 +314,8 @@ def iter_users(self, base_dn, users_filter, extended_attributes):
310
314
user_attribute_names .extend (self .user_email_formatter .get_attribute_names ())
311
315
user_attribute_names .extend (self .user_username_formatter .get_attribute_names ())
312
316
user_attribute_names .extend (self .user_domain_formatter .get_attribute_names ())
313
- user_attribute_names .append (six .text_type ('memberOf' ))
317
+ if dynamic_group_member_attribute is not None :
318
+ user_attribute_names .append (six .text_type (dynamic_group_member_attribute ))
314
319
315
320
extended_attributes = [six .text_type (attr ) for attr in extended_attributes ]
316
321
extended_attributes = list (set (extended_attributes ) - set (user_attribute_names ))
@@ -389,7 +394,7 @@ def iter_users(self, base_dn, users_filter, extended_attributes):
389
394
if c_value is not None :
390
395
user ['country' ] = c_value .upper ()
391
396
392
- user ['member_groups' ] = self .get_member_groups (record ) if self .additional_group_filters else []
397
+ user ['member_groups' ] = self .get_member_groups (record , dynamic_group_member_attribute ) if self .additional_group_filters else []
393
398
394
399
if extended_attributes is not None :
395
400
for extended_attribute in extended_attributes :
@@ -403,15 +408,15 @@ def iter_users(self, base_dn, users_filter, extended_attributes):
403
408
404
409
yield (dn , user )
405
410
406
- def get_member_groups (self , user ):
411
+ def get_member_groups (self , user , dynamic_group_member_attribute ):
407
412
"""
408
413
Get a list of member group common names for user
409
414
Assumes groups are contained in attribute memberOf
410
415
:param user:
411
416
:return:
412
417
"""
413
418
group_names = []
414
- groups = LDAPValueFormatter .get_attribute_value (user , 'memberOf' )
419
+ groups = LDAPValueFormatter .get_attribute_value (user , dynamic_group_member_attribute )
415
420
416
421
if not groups :
417
422
return group_names
@@ -512,6 +517,10 @@ def is_dn_within_base_dn_scope(base_dn, dn):
512
517
:param dn: str
513
518
:return: bool
514
519
"""
520
+ # return true if base_dn is empty string such as global scope and no need to check user_dn is part of base_dn
521
+ if (not (base_dn and base_dn .strip ())):
522
+ return True
523
+
515
524
split_base_dn = ldap3 .utils .dn .parse_dn (base_dn .lower ())
516
525
split_dn = ldap3 .utils .dn .parse_dn (dn .lower ())
517
526
if split_base_dn == split_dn [- len (split_base_dn ):]:
0 commit comments