You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

82 lines
2.5 KiB

  1. # -*- coding: utf-8 -*-
  2. import sys
  3. from ldap3 import BASE, Reader, SUBTREE, ObjectDef
  4. __all__ = ('BaseQuery',)
  5. class BaseQuery(object):
  6. def __init__(self, obj):
  7. self.obj = obj
  8. self.query = []
  9. self.base_dn = obj.base_dn
  10. self.sub_tree = obj.sub_tree
  11. self.object_def = ObjectDef(obj.object_classes)
  12. self.operational_attributes = obj.operational_attributes
  13. self.components_in_and = True
  14. def add_abstract_attr_def(self):
  15. for name, attr in self.obj._fields.items():
  16. attr_def = attr.get_abstract_attr_def(name)
  17. self.object_def.add_attribute(attr_def)
  18. def __iter__(self):
  19. for entry in self.get_reader_result():
  20. module = sys.modules.get(self.obj.__module__)
  21. new_cls = getattr(module, self.obj.__name__)
  22. ldapentry = new_cls(dn=entry.entry_dn,
  23. changetype='modify',
  24. **entry.entry_attributes_as_dict)
  25. yield ldapentry
  26. def get_reader_result(self):
  27. query = ','.join(self.query)
  28. ldapc = current_app.extensions.get('ldap_conn')
  29. self.add_abstract_attr_def()
  30. reader = Reader(connection=ldapc.connection,
  31. object_def=self.object_def,
  32. query=query,
  33. base=self.base_dn,
  34. components_in_and=self.components_in_and,
  35. sub_tree=self.sub_tree,
  36. get_operational_attributes=self.operational_attributes,
  37. controls=None)
  38. reader.search()
  39. return reader.entries
  40. def get(self, ldap_dn):
  41. '''Return an LDAP entry by DN
  42. Args:
  43. ldap_dn (str): LDAP DN
  44. '''
  45. self.base_dn = ldap_dn
  46. self.sub_tree = BASE
  47. return self.first()
  48. def filter(self, *query_filter):
  49. '''Set the query filter to perform the query with
  50. Args:
  51. *query_filter: Simplified Query Language filter
  52. '''
  53. for query in query_filter:
  54. self.query.append(query)
  55. return self
  56. def first(self):
  57. '''Execute the query and return the first result
  58. If there are no entries, first returns ``None``
  59. '''
  60. for entry in iter(self):
  61. return entry
  62. return None
  63. def all(self, components_in_and=True):
  64. '''Return all of the results of a query in a list'''
  65. self.components_in_and = components_in_and
  66. return [obj for obj in iter(self)]