8 from gkeys.config import GKEY
12 default_server = 'ldap://ldap1.gentoo.org'
13 # add uid to the results so you don't have to
14 # separate it out of the results tuple[0] value
15 default_fields = ['uid', 'cn', 'mail', 'gentooStatus', 'gpgkey', 'gpgfingerprint']
16 default_criteria = 'ou=devs,dc=gentoo,dc=org'
18 # establish a ldap fields to GKEY._fields map
23 'longkeyid': 'gpgkey',
24 # map the uid to keyring, since we want
25 # dev keyrings to be separate from each other
27 'fingerprint': 'gpgfingerprint'
29 # Sanity check they are in sync
30 if not sorted(gkey2ldap_map) == sorted(GKEY._fields):
31 raise "Search.py out of sync with GKEY class"
34 # Now for some search field defaults
37 STATUS = '(gentooStatus=%s)'
38 GPGKEY = '(gpgkey=%s)'
40 GPGFINGERPRINT = '(gpgfingerprint=%s)'
48 'fingerprint': GPGFINGERPRINT,
52 class LdapSearch(object):
53 '''Class to perform searches on the configured ldap server
56 def __init__(self, server=None, fields=None, criteria=None):
57 self.server = server or default_server
58 self.fields = fields or default_fields
59 self.criteria = criteria or default_criteria
60 logger.debug('LdapSearch: __init__; server...: %s' % self.server)
61 logger.debug('LdapSearch: __init__; fields...: %s' % self.fields)
62 logger.debug('LdapSearch: __init__; criteria.: %s' % self.criteria)
63 self.ldap_connection = None
66 def connect(self, server=None,):
67 '''Creates our ldap server connection
72 logger.debug('LdapSearch: connect; new server: %s' % self.server)
74 self.ldap_connection = ldap.initialize(self.server)
75 self.ldap_connection.set_option(ldap.OPT_X_TLS_DEMAND, True)
76 self.ldap_connection.start_tls_s()
77 self.ldap_connection.simple_bind_s()
78 except Exception as e:
79 logger.error('LdapSearch: connect; failed to connect to server: %s' % self.server)
80 logger.error("Exception was: %s" % str(e))
82 logger.debug('LdapSearch: connect; connection: %s' % self.ldap_connection)
87 def search(self, target, search_field=UID, fields=None, criteria=None):
88 '''Perform the ldap search
91 logger.debug('LdapSearch: search; invalid target: "%s"' % target)
96 logger.debug('LdapSearch: search; new fields: %s' % str(fields))
98 criteria = self.criteria
100 logger.debug('LdapSearch: search; new criteria: %s' % criteria)
101 results = self.ldap_connection.search_s(criteria,
102 ldap.SCOPE_ONELEVEL, search_field % target, fields)
103 #logger.debug('LdapSearch: search; result = %s' % str(results))
107 def result2dict(self, results, key='uid'):
109 for entry in results:
111 key_value = info[key][0]
112 _dict[key_value] = info