from typing import Iterator import sqlmodel from sqlalchemy.future import Engine from . import models def get_master_pass( engine: Engine, user_id: int, ) -> tuple[bytes, bytes] | None: """Gets master pass. Returns tuple of salt and password or None if it wasn't found""" statement = sqlmodel.select(models.MasterPass).where( models.MasterPass.user_id == user_id, ) with sqlmodel.Session(engine) as session: result = session.exec(statement).first() if result is None: return return (result.salt, result.password_hash) def get_accounts( engine: Engine, user_id: int, *, to_sort: bool = False, ) -> list[str]: """Gets list of account names""" statement = sqlmodel.select(models.Account.name).where( models.Account.user_id == user_id, ) if to_sort: statement = statement.order_by(models.Account.name) with sqlmodel.Session(engine) as session: result = session.exec(statement).fetchall() return result def get_all_accounts( engine: Engine, user_id: int ) -> Iterator[tuple[str, bytes, bytes, bytes]]: """Returns an iterator of tuples, where values represent account's name, salt, encrypted login and encrypted password""" statement = ( sqlmodel.select(models.Account) .where( models.Account.user_id == user_id, ) .order_by(models.Account.name) ) with sqlmodel.Session(engine) as session: result = session.exec(statement).fetchall() yield from ( ( account.name, account.salt, account.enc_login, account.enc_password, ) for account in result ) def get_account_info( engine: Engine, user_id: int, name: str ) -> tuple[bytes, bytes, bytes]: """Gets account info. Returns tuple of salt, login and password or None if it wasn't found""" statement = sqlmodel.select(models.Account).where( models.Account.user_id == user_id, models.Account.name == name, ) with sqlmodel.Session(engine) as session: result = session.exec(statement).first() if result is None: return return (result.salt, result.enc_login, result.enc_password)