from dataclasses import dataclass from typing import Tuple, List, Optional @dataclass class Password: password: Optional[str] login: Optional[str] = None #------------------------------------------------------------------------------- class PasswordManager( object ): """ An abstract password manager. Instanciate concrete instances via the Manager() function """ def get( self, identifier: str ) -> Password: """ Gets a password from the manager. This function is overriden by the concrete PasswordManager instances. Args: identifier: which password to get Returns: None if the password is not found, the password otherwise """ return Password( None ) from .plaintext import PlainTextPasswordManager from .gnupass import GNUPassPasswordManager #------------------------------------------------------------------------------- def verify( config: dict, path: str = "" ) -> Tuple[bool, List[str]]: """ Verifies that the configuration is correct Args: config: dict with password manager configuration path: path to the "config" dict in the main configuration file Returns: bool: true if the config is correct List[str]: list of errors if the config is not correct """ if "manager" not in config: return (False, [f'Missing "{path}.manager" value']) manager = config["manager"] for cls in PasswordManager.__subclasses__(): if manager == cls.name(): return cls.verify(config, path) return (False, [f'Unknown password manager "{manager}"']) #------------------------------------------------------------------------------- def Manager( config: dict ) -> PasswordManager: """ Instanciates a PasswordManager instance from a given configuration """ if "manager" not in config: raise ValueError manager = config["manager"] for cls in PasswordManager.__subclasses__(): if manager == cls.name(): return cls(config) raise ValueError