@@ -39,13 +39,14 @@ def connector_initialize(options):
3939 connector = LDAPDirectoryConnector (options )
4040 return connector
4141
42- def connector_load_users_and_groups (state , groups ):
42+ def connector_load_users_and_groups (state , groups , extended_attributes ):
4343 '''
4444 :type state: LDAPDirectoryConnector
4545 :type groups: list(str)
46+ :type extended_attributes: list(str)
4647 :rtype (bool, iterable(dict))
4748 '''
48- return state .load_users_and_groups (groups )
49+ return state .load_users_and_groups (groups , extended_attributes )
4950
5051class LDAPDirectoryConnector (object ):
5152 name = 'ldap'
@@ -103,9 +104,10 @@ def __init__(self, caller_options):
103104 self .connection = connection
104105 logger .info ('Connected' )
105106
106- def load_users_and_groups (self , groups ):
107+ def load_users_and_groups (self , groups , extended_attributes ):
107108 '''
108109 :type groups: list(str)
110+ :type extended_attributes: list(str)
109111 :rtype (bool, iterable(dict))
110112 '''
111113 options = self .options
@@ -125,12 +127,12 @@ def load_users_and_groups(self, groups):
125127
126128 self .user_by_dn = user_by_dn = {}
127129 self .user_by_uid = user_by_uid = {}
128- for user_dn , user in self .iter_users (users_filter ):
130+ for user_dn , user in self .iter_users (users_filter , extended_attributes ):
129131 uid = user .get ('uid' )
130132 if (uid != None ):
131133 user_by_uid [uid ] = user
132134 user_by_dn [user_dn ] = user
133-
135+
134136 self .logger .info ('Total users loaded: %d' , len (user_by_dn ))
135137
136138 for group in groups :
@@ -250,15 +252,18 @@ def iter_ldap_group_members(self, group):
250252 for attribute_value in attribute_values :
251253 yield (attribute , attribute_value )
252254
253- def iter_users (self , users_filter ):
255+ def iter_users (self , users_filter , extended_attributes ):
254256 options = self .options
255257 base_dn = options ['base_dn' ]
256-
257- user_attribute_names = ["givenName" , "sn" , "c" , "uid" ]
258+
259+ user_attribute_names = ["givenName" , "sn" , "c" , "uid" ]
258260 user_attribute_names .extend (self .user_email_formatter .get_attribute_names ())
259261 user_attribute_names .extend (self .user_username_formatter .get_attribute_names ())
260262 user_attribute_names .extend (self .user_domain_formatter .get_attribute_names ())
261263
264+ extended_attributes = list (set (extended_attributes ) - set (user_attribute_names ))
265+ user_attribute_names .extend (extended_attributes )
266+
262267 result_iter = self .iter_search_result (base_dn , ldap .SCOPE_SUBTREE , users_filter , user_attribute_names )
263268 for dn , record in result_iter :
264269 if (dn == None ):
@@ -269,35 +274,53 @@ def iter_users(self, users_filter):
269274 if (last_attribute_name != None ):
270275 self .logger .warn ('No email attribute: %s for dn: %s' , last_attribute_name , dn )
271276 continue
277+
278+ source_attributes = {}
272279
273280 user = user_sync .connector .helper .create_blank_user ()
281+ source_attributes ['email' ] = email
274282 user ['email' ] = email
275-
283+
276284 username , last_attribute_name = self .user_username_formatter .generate_value (record )
285+ source_attributes ['username' ] = username
277286 if (username == None and last_attribute_name != None ):
278287 self .logger .info ('No username attribute: %s for dn: %s' , last_attribute_name , dn )
279288 user ['username' ] = username if username != None else email
280-
289+
281290 domain , last_attribute_name = self .user_domain_formatter .generate_value (record )
291+ source_attributes ['domain' ] = domain
282292 if (domain != None ):
283293 user ['domain' ] = domain
284294 elif (last_attribute_name != None ):
285295 self .logger .info ('No domain attribute: %s for dn: %s' , last_attribute_name , dn )
286296
287297 given_name_value = LDAPValueFormatter .get_attribute_value (record , 'givenName' )
288- if (given_name_value != None ):
298+ source_attributes ['givenName' ] = given_name_value
299+ if (given_name_value != None ):
289300 user ['firstname' ] = given_name_value
290301 sn_value = LDAPValueFormatter .get_attribute_value (record , 'sn' )
302+ source_attributes ['sn' ] = sn_value
291303 if sn_value != None :
292304 user ['lastname' ] = sn_value
293305 c_value = LDAPValueFormatter .get_attribute_value (record , 'c' )
306+ source_attributes ['c' ] = c_value
294307 if c_value != None :
295308 user ['country' ] = c_value
296-
309+
297310 uid = LDAPValueFormatter .get_attribute_value (record , 'uid' )
311+ source_attributes ['uid' ] = uid
298312 if (uid != None ):
299313 user ['uid' ] = uid
300-
314+
315+ if extended_attributes is not None :
316+ for extended_attribute in extended_attributes :
317+ extended_attribute_value = LDAPValueFormatter .get_attribute_value (record , extended_attribute )
318+ source_attributes [extended_attribute ] = extended_attribute_value
319+
320+ # [TODO morr 2017-02-26]: Could be omitted if no hook; worth considering?
321+ # [TODO morr 2017-02-28]: Is the copy necessary? Could just assign I think
322+ user ['source_attributes' ] = source_attributes .copy ()
323+
301324 yield (dn , user )
302325
303326 def iter_search_result (self , base_dn , scope , filter_string , attributes ):
0 commit comments