from dataclasses import dataclass, field, asdict from ldap3 import Server, Connection, ALL import json from pathlib import Path import csv from typing import Optional @dataclass class User: lastname: str firstname: str username: str password: str = field(repr=False) title: str admin: bool write: bool department: list costcenter: list class Auth: def __init__(self) -> None: with open(Path(__file__).parent.parent.joinpath('config', 'users.csv'), 'r') as frh: csv_reader = csv.DictReader(frh, delimiter=';') self.users = dict([(row['username'].lower(), self.parse_users_csv(row)) for row in csv_reader]) def parse_users_csv(self, row: dict) -> User: row['admin'] = (row['admin'] == 'True') row['write'] = (row['write'] == 'True') row['department'] = json.loads(row['department']) row['costcenter'] = json.loads(row['costcenter']) return User(**row) def get_user(self, username, password) -> Optional[dict]: username = username.lower() if username not in self.users: return None if self.users[username].password != password and not self.connect_ldap(username, password): return None res = asdict(self.users[username]) del(res['password']) return res def connect_ldap(self, username, password) -> bool: server = Server('ahr.local:389', get_info=ALL, use_ssl=False, connect_timeout=5) user = username.lower() + '@ahr.local' conn = Connection(server, user=user, password=password) try: return bool(conn.bind()) except Exception: return False if __name__ == '__main__': print(Auth().get_user('TKP', 'G9zHjA__'))