@@ -137,6 +137,7 @@ def get_options(caller_config):
137137 builder .set_string_value ('user_given_name_format' , six .text_type ('{givenName}' ))
138138 builder .set_string_value ('user_surname_format' , six .text_type ('{sn}' ))
139139 builder .set_string_value ('user_country_code_format' , six .text_type ('{c}' ))
140+ builder .set_string_value ('dynamic_group_member_attribute' , None )
140141 builder .set_string_value ('user_identity_type' , None )
141142 builder .set_int_value ('search_page_size' , 200 )
142143 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):
302303 pass
303304
304305 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+
305309 user_attribute_names = []
306310 user_attribute_names .extend (self .user_given_name_formatter .get_attribute_names ())
307311 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):
310314 user_attribute_names .extend (self .user_email_formatter .get_attribute_names ())
311315 user_attribute_names .extend (self .user_username_formatter .get_attribute_names ())
312316 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 ))
314319
315320 extended_attributes = [six .text_type (attr ) for attr in extended_attributes ]
316321 extended_attributes = list (set (extended_attributes ) - set (user_attribute_names ))
@@ -389,7 +394,7 @@ def iter_users(self, base_dn, users_filter, extended_attributes):
389394 if c_value is not None :
390395 user ['country' ] = c_value .upper ()
391396
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 []
393398
394399 if extended_attributes is not None :
395400 for extended_attribute in extended_attributes :
@@ -403,15 +408,15 @@ def iter_users(self, base_dn, users_filter, extended_attributes):
403408
404409 yield (dn , user )
405410
406- def get_member_groups (self , user ):
411+ def get_member_groups (self , user , dynamic_group_member_attribute ):
407412 """
408413 Get a list of member group common names for user
409414 Assumes groups are contained in attribute memberOf
410415 :param user:
411416 :return:
412417 """
413418 group_names = []
414- groups = LDAPValueFormatter .get_attribute_value (user , 'memberOf' )
419+ groups = LDAPValueFormatter .get_attribute_value (user , dynamic_group_member_attribute )
415420
416421 if not groups :
417422 return group_names
@@ -512,6 +517,10 @@ def is_dn_within_base_dn_scope(base_dn, dn):
512517 :param dn: str
513518 :return: bool
514519 """
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+
515524 split_base_dn = ldap3 .utils .dn .parse_dn (base_dn .lower ())
516525 split_dn = ldap3 .utils .dn .parse_dn (dn .lower ())
517526 if split_base_dn == split_dn [- len (split_base_dn ):]:
0 commit comments