5f2ffbdcf5000b5ff0761be1cb1ad307bb13332a
[gentoo-keys.git] / gkeyldap / search.py
1 #
2 #-*- coding:utf-8 -*-
3
4
5 try:
6     import ldap
7 except ImportError:
8     import sys
9     # py3.2
10     if sys.hexversion >= 0x30200f0:
11         print('To run "ldap-seeds" in python 3, it requires a python3 '
12             'compatible version of dev-python/python-ldap be installed')
13         print('Currently only dev-python/python-ldap-9999 has that capability')
14         raise
15
16
17 from gkeys import log
18 from gkeys.config import GKEY
19
20 logger = log.logger
21
22 default_server = 'ldap://ldap1.gentoo.org'
23 # add uid to the results so you don't have to
24 # separate it out of the results tuple[0] value
25 default_fields = ['uid', 'cn', 'mail', 'gentooStatus', 'gpgkey', 'gpgfingerprint']
26 default_criteria = 'ou=devs,dc=gentoo,dc=org'
27
28 # establish a ldap fields to GKEY._fields map
29 gkey2ldap_map = {
30     'nick': 'uid',
31     'name': 'cn',
32     'keyid': 'gpgkey',
33     'longkeyid': 'gpgkey',
34     # map the uid to keydir, since we want
35     # dev keydir to be separate from each other
36     'keydir': 'uid',
37     'fingerprint': 'gpgfingerprint'
38 }
39
40
41 # Now for some search field defaults
42 UID = '(uid=%s)'
43 CN = '(cn=%s)'
44 STATUS = '(gentooStatus=%s)'
45 GPGKEY = '(gpgkey=%s)'
46 MAIL = '(mail=%s)'
47 GPGFINGERPRINT = '(gpgfingerprint=%s)'
48
49 gkey2SEARCH = {
50     'nick': UID,
51     'name': CN,
52     'status': STATUS,
53     'keyid': GPGKEY,
54     'mail': MAIL,
55     'fingerprint': GPGFINGERPRINT,
56 }
57
58
59 class LdapSearch(object):
60     '''Class to perform searches on the configured LDAP server
61     '''
62
63     def __init__(self, server=None, fields=None, criteria=None):
64         self.server = server or default_server
65         self.fields = fields or default_fields
66         self.criteria = criteria or default_criteria
67         logger.debug('LdapSearch: __init__; server...: %s' % self.server)
68         logger.debug('LdapSearch: __init__; fields...: %s' % self.fields)
69         logger.debug('LdapSearch: __init__; criteria.: %s' % self.criteria)
70         self.ldap_connection = None
71
72
73     def connect(self, server=None,):
74         '''Creates our LDAP server connection
75         '''
76
77         if server:
78             self.server = server
79             logger.debug('LdapSearch: connect; new server: %s' % self.server)
80         try:
81             self.ldap_connection = ldap.initialize(self.server)
82             self.ldap_connection.set_option(ldap.OPT_X_TLS_DEMAND, True)
83             self.ldap_connection.start_tls_s()
84             self.ldap_connection.simple_bind_s()
85         except Exception as e:
86             logger.error('LdapSearch: connect; failed to connect to server: %s' % self.server)
87             logger.error("Exception was: %s" % str(e))
88             return False
89         logger.debug('LdapSearch: connect; connection: %s' % self.ldap_connection)
90         return True
91
92
93     def search(self, target, search_field=UID, fields=None, criteria=None):
94         '''Perform the LDAP search
95         '''
96         if not target:
97             logger.debug('LdapSearch: search; invalid target: "%s"' % target)
98             return {}
99         if not fields:
100             fields = self.fields
101         else:
102             logger.debug('LdapSearch: search; new fields: %s' % str(fields))
103         if not criteria:
104             criteria = self.criteria
105         else:
106             logger.debug('LdapSearch: search; new criteria: %s' % criteria)
107         results = self.ldap_connection.search_s(criteria,
108             ldap.SCOPE_ONELEVEL, search_field % target, fields)
109         #logger.debug('LdapSearch: search; result = %s' % str(results))
110         return results
111
112
113     def result2dict(self, results, key='uid'):
114         _dict = {}
115         for entry in results:
116             info = entry[1]
117             key_value = info[key][0]
118             _dict[key_value] = info
119         return _dict