53 lines
2.2 KiB
Python
53 lines
2.2 KiB
Python
import logging
|
|
|
|
from pykeepass import PyKeePass
|
|
from config import KeePassConfig
|
|
import getpass
|
|
from dataclasses import dataclass
|
|
|
|
@dataclass
|
|
class KeePassEntry:
|
|
def __init__(self, name: str, password: str):
|
|
self._name = name
|
|
self._password = password
|
|
|
|
@property
|
|
def password(self) -> str:
|
|
return self._password
|
|
|
|
@property
|
|
def name(self) -> str:
|
|
return self._name
|
|
|
|
|
|
|
|
class KeePass:
|
|
def __init__(self, config: KeePassConfig, logger: logging.Logger):
|
|
self._logger: logging.Logger = logger
|
|
self._kee_pass_config: KeePassConfig = config
|
|
self._password: str = getpass.getpass(f'KeePass password for {config.path}: ')
|
|
self._logger.info(f'Initializing connection to keepass file {config.path}')
|
|
self._kee_pass: PyKeePass = PyKeePass(config.path, password=self._password)
|
|
self._logger.info(f'Successfully connected to keepass')
|
|
|
|
def get_db_credentials(self) -> KeePassEntry:
|
|
self._logger.info(f'Searching for database credentials on credential: {self._kee_pass_config.db_credentials_name}')
|
|
group = None
|
|
if self._kee_pass_config.db_credentials_group.strip() is not None and self._kee_pass_config.db_credentials_group.strip() != "":
|
|
self._logger.info(f'Searching in group {self._kee_pass_config.db_credentials_group}')
|
|
group = self._kee_pass.find_groups(name=self._kee_pass_config.db_credentials_group)[0]
|
|
else:
|
|
self._logger.info('Searching in root')
|
|
|
|
group = self._kee_pass.find_entries(title=self._kee_pass_config.db_credentials_name, group=group)
|
|
|
|
if group is None:
|
|
self._logger.critical(f'Group {self._kee_pass_config.db_credentials_group} not found')
|
|
raise Exception(f'Group {self._kee_pass_config.db_credentials_group} not found')
|
|
|
|
if len(group) != 1:
|
|
self._logger.critical(f'Could not find password, found {len(group)} entries')
|
|
raise Exception(f'Could not find password, found {len(group)} entries')
|
|
|
|
self._logger.info(f'Found credentials for database for username {group[0].username}')
|
|
return KeePassEntry(group[0].username, group[0].password) |