pyceo/ceod/model/UWLDAPService.py

43 lines
1.5 KiB
Python

from typing import Union, List
import ldap
from zope import component
from zope.interface import implementer
from .UWLDAPRecord import UWLDAPRecord
from .utils import dn_to_uid, bytes_to_strings
from ceo_common.interfaces import IUWLDAPService, IConfig
@implementer(IUWLDAPService)
class UWLDAPService:
def __init__(self):
cfg = component.getUtility(IConfig)
self.uwldap_server_url = cfg.get('uwldap_server_url')
self.uwldap_base = cfg.get('uwldap_base')
def get_user(self, username: str) -> Union[UWLDAPRecord, None]:
conn = ldap.initialize(self.uwldap_server_url)
results = conn.search_s(self.uwldap_base, ldap.SCOPE_SUBTREE, f'uid={username}')
if not results:
return None
_, data = results[0] # discard the dn
return UWLDAPRecord.deserialize_from_ldap(data)
def get_programs_for_users(self, usernames: List[str]) -> List[Union[str, None]]:
filter_str = '(|' + ''.join([f'(uid={uid})' for uid in usernames]) + ')'
programs = [None] * len(usernames)
user_indices = {uid: i for i, uid in enumerate(usernames)}
conn = ldap.initialize(self.uwldap_server_url)
records = conn.search_s(
self.uwldap_base, ldap.SCOPE_SUBTREE, filter_str, attrlist=['ou'])
for dn, data in records:
uid = dn_to_uid(dn)
idx = user_indices[uid]
data = bytes_to_strings(data)
program = data.get('ou', [None])[0]
if program:
programs[idx] = program
return programs