# -*- encoding: utf-8 -*- from bonsai import LDAPEntry from multidict import MultiDict from phi.async_ldap import mixins class User(mixins.Singleton, mixins.Entry, mixins.Member): object_class = [ "inetOrgPerson", "simpleSecurityObject", "organizationalPerson", "person", "top", ] _instances = dict() # type: ignore id_tag = "uid" ou = "Hackers" ldap_attributes = ["uid", "ou", "cn", "sn", "mail", "userPassword"] class Hackers(mixins.Singleton, mixins.Entry, mixins.OrganizationalUnit): _instances = dict() # type: ignore ou = "Hackers" child_class = User class Service(mixins.Singleton, mixins.Entry, mixins.Member): object_class = ["simpleSecurityObject", "account", "top"] _instances = dict() # type: ignore id_tag = "uid" ou = "Robots" ldap_attributes = ["uid", "ou", "userPassword"] class Robots(mixins.Singleton, mixins.Entry, mixins.OrganizationalUnit): _instances = dict() # type: ignore ou = "Robots" child_class = Service class Group(mixins.Singleton, mixins.Entry, mixins.Member): object_class = ["groupOfNames", "top"] _instances = dict() # type: ignore id_tag = "cn" ou = "Congregations" ldap_attributes = ["cn", "ou", "member"] memeber_classes = {"Hackers": User, "Robots": Service} async def add_member(self, member): self._entry["member"].append(get_dn(member)) await self.modify() async def remove_member(self, member): self._entry["member"] = [get_dn(m) for m in self.get_members() if member != m] await self.modify() def get_members(self): for member in self._entry.get("member", []): dn = MultiDict(e.split("=") for e in member.split(",")) yield self.memeber_classes.get(dn["ou"])(self.client, dn["uid"]) class Congregations(mixins.Singleton, mixins.Entry, mixins.OrganizationalUnit): _instances = dict() # type: ignore ou = "Congregations" child_class = Group def get_dn(obj): if isinstance(obj, mixins.Entry): return obj.dn elif isinstance(obj, LDAPEntry): return obj["dn"] elif isinstance(obj, str): return obj else: raise ValueError(f"Unacceptable input: {obj}")