+ data = dict()
+ for name, value in result[0][1].iteritems():
+ if isinstance(value, list) and len(value) == 1:
+ value = value[0]
+ data[name] = value
+ return data
+
+ def _get_user_groups(self, conn, base, username):
+ # TODO: fixme to support RFC2307bis schemas
+ results = conn.search_s(base, ldap.SCOPE_SUBTREE,
+ filterstr='memberuid=%s' % username)
+ if results is None or results == []:
+ self.debug('No groups for %s' % username)
+ return []
+ groups = []
+ for r in results:
+ if 'cn' in r[1]:
+ groups.append(r[1]['cn'][0])
+ return groups
+
+ def get_user_data_from_conn(self, conn, dn, base, username):
+ reply = dict()
+ try:
+ ldapattrs = self._get_user_data(conn, dn)
+ self.debug('LDAP attrs for %s: %s' % (dn, ldapattrs))
+ userattrs, extras = self.mapper.map_attributes(ldapattrs)
+ groups = self._get_user_groups(conn, base, username)
+ reply = userattrs
+ reply['_groups'] = groups
+ reply['_extras'] = {'ldap': extras}
+ except Exception, e: # pylint: disable=broad-except
+ self.error('Error fetching/mapping LDAP user data: %s' % e)
+
+ return reply