htpasswd

from pathlib import Path

from passlib.apache import HtpasswdFile


class AuthManager:
    def __init__(self, filename=None):
        self.filename = filename or "htpasswd"
        self._database = None

    def _open_database(self):
        filename = Path(self.filename).expanduser()
        self._database = HtpasswdFile(filename, autosave=True, new=not filename.exists())
        return self._database

    @property
    def database(self):
        return self._database if self._database else self._open_database()

    def list(self):
        return self.database.users()

    def exists(self, username):
        return username in self.list()

    def add(self, username, password):
        if self.exists(username):
            raise ValueError("User already exists")
        self.database.set_password(username, password)

    def update(self, username, password):
        if not self.exists(username):
            raise ValueError("User does not exist")
        self.database.set_password(username, password)

    def remove(self, username):
        if not self.exists(username):
            raise ValueError("User does not exist")
        self.database.delete(username)

    def check(self, username, password):
        self._open_database()
        if self.database.check_password(username, password):
            return username
        else:
            return None