py.lib
2022-08-14
Parent:cab7fedf8432
py.lib/db/ldap.py
+ Возможность обработки параметров конфигурации перед добавлением в класс конфигурации . Переформатирование части кода по PEP
| 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 |