py.lib

Yohn Y. 2023-01-28 Parent:84b54a8a6d4c

43:6f8bea109183 Go to Latest

py.lib/db/ldap.py

. Наведение порядка в коде логирования

History
awgur@13 1 # coding: utf-8
awgur@13 2
awgur@13 3 from ldap3 import Server, Connection, SIMPLE, SUBTREE
awgur@13 4
awgur@34 5 LDAP_PAGE = 1000
awgur@34 6
awgur@13 7
awgur@13 8 class LdapError(Exception): pass
awgur@13 9
awgur@34 10
awgur@34 11 class LdapRes:
awgur@34 12 def __init__(self, dn, attrib):
awgur@34 13 self.dn = dn
awgur@34 14 self.attr = attrib
awgur@34 15
awgur@34 16 def __getitem__(self, item):
awgur@34 17 return self.attr[item]
awgur@34 18
awgur@34 19 def __iter__(self):
awgur@34 20 return iter(self.attr)
awgur@34 21
awgur@34 22 def __repr__(self):
awgur@34 23 return '<LdapRes: dn: %s>' % self.dn
awgur@34 24
awgur@34 25 @classmethod
awgur@34 26 def fromLdapQuery(cls, q):
awgur@34 27 if not isinstance(q, dict):
awgur@34 28 raise LdapError('LdapRes: Parsing Error, not ldap response item')
awgur@34 29 if not (('dn' in q) and ('attributes' in q)):
awgur@34 30 raise LdapError('LdapRes: Parsing Error, format mismatch')
awgur@34 31
awgur@34 32 return cls(q['dn'], q['attributes'])
awgur@34 33
awgur@13 34
awgur@34 35 class Ldap:
awgur@34 36 def __init__(self, host, user, passwd, timeout=60, queryTimeout=300, **kwa):
awgur@34 37 if 'baseDN' in kwa:
awgur@34 38 self._baseDN = kwa['baseDN']
awgur@34 39 del kwa['baseDN']
awgur@34 40 else:
awgur@34 41 self._baseDN = None
awgur@34 42 ldapSrv = Server(host, connect_timeout=timeout, **kwa)
awgur@34 43 self._conn = self._makeConnFabric(ldapSrv, authentication=SIMPLE,
awgur@34 44 user=user, password=passwd,
awgur@34 45 check_names=True, lazy=True,
awgur@34 46 auto_referrals=False, raise_exceptions=True, auto_range=True
awgur@34 47 )
awgur@34 48 self.queryTimeout = queryTimeout
awgur@13 49
awgur@34 50 def __call__(self, filter, attrib, queryTimeout=None, baseDN=None):
awgur@34 51 if baseDN is None:
awgur@34 52 if self._baseDN is None:
awgur@34 53 raise LdapError('No base dn on query execution')
awgur@34 54 baseDN = self._baseDN
awgur@34 55 if queryTimeout is None:
awgur@34 56 queryTimeout = self.queryTimeout
awgur@34 57 try:
awgur@34 58 conn = self._conn()
awgur@34 59 with conn:
awgur@34 60 conn.open()
awgur@34 61 conn.bind()
awgur@34 62
awgur@34 63 res = conn.extend.standard.paged_search(baseDN,
awgur@34 64 filter, attributes=attrib, paged_size=LDAP_PAGE,
awgur@34 65 generator=False,
awgur@34 66 search_scope=SUBTREE, time_limit=queryTimeout
awgur@34 67 )
awgur@34 68
awgur@34 69 for i in res:
awgur@34 70 if i['type'] == 'searchResEntry':
awgur@34 71 yield LdapRes.fromLdapQuery(i)
awgur@34 72
awgur@34 73 except Exception as e:
awgur@34 74 raise LdapError("Error on get data (%s): %s" % (type(e), str(e)), *e.args[1:])
awgur@34 75
awgur@34 76 def getList(self, *a, **kwa):
awgur@34 77 return [i for i in self(*a, **kwa)]
awgur@34 78
awgur@34 79 @staticmethod
awgur@34 80 def _makeConnFabric(*a, **kwa):
awgur@34 81 def _func():
awgur@34 82 return Connection(*a, **kwa)
awgur@34 83
awgur@34 84 return _func