LDAPObject.get uses LDAPObject.filter

This commit is contained in:
Éloi Rivard 2020-11-03 09:54:12 +01:00
parent 85dde6ba79
commit 5d9f15486a

View file

@ -196,35 +196,24 @@ class LDAPObject:
@classmethod @classmethod
def get(cls, dn=None, filter=None, conn=None): def get(cls, dn=None, filter=None, conn=None):
conn = conn or cls.ldap()
if dn is None:
dn = f"{cls.base},{cls.root_dn}"
elif "=" not in dn:
dn = f"{cls.id}={dn},{cls.base},{cls.root_dn}"
try: try:
result = conn.search_s(dn, ldap.SCOPE_SUBTREE, filter) return cls.filter(dn, filter, conn)[0]
except ldap.LDAPError: except (IndexError, ldap.NO_SUCH_OBJECT):
result = None
if not result:
return None return None
o = cls(
**{k: [elt.decode("utf-8") for elt in v] for k, v in result[0][1].items()}
)
o.update_ldap_attributes()
return o
@classmethod @classmethod
def filter(cls, base=None, conn=None, **kwargs): def filter(cls, base=None, filter=None, conn=None, **kwargs):
conn = conn or cls.ldap() conn = conn or cls.ldap()
if base is None:
base = f"{cls.base},{cls.root_dn}"
elif "=" not in base:
base = f"{cls.id}={base},{cls.base},{cls.root_dn}"
class_filter = ( class_filter = (
"".join([f"(objectClass={oc})" for oc in cls.object_class]) "".join([f"(objectClass={oc})" for oc in cls.object_class])
if hasattr(cls, "object_class") if hasattr(cls, "object_class")
else None else ""
) )
arg_filter = "" arg_filter = ""
for k, v in kwargs.items(): for k, v in kwargs.items():
@ -234,7 +223,9 @@ class LDAPObject:
arg_filter += f"({k}={v[0]})" arg_filter += f"({k}={v[0]})"
else: else:
arg_filter += "(|" + "".join([f"({k}={_v})" for _v in v]) + ")" arg_filter += "(|" + "".join([f"({k}={_v})" for _v in v]) + ")"
ldapfilter = f"(&{class_filter}{arg_filter})" if class_filter else arg_filter
filter = filter or ""
ldapfilter = f"(&{class_filter}{arg_filter}{filter})"
base = base or f"{cls.base},{cls.root_dn}" base = base or f"{cls.base},{cls.root_dn}"
result = conn.search_s(base, ldap.SCOPE_SUBTREE, ldapfilter or None) result = conn.search_s(base, ldap.SCOPE_SUBTREE, ldapfilter or None)