81 lines
2.2 KiB
Python
81 lines
2.2 KiB
Python
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)
|