| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- import typing
- import sqlmodel
- import sqlalchemy.engine.base
- from .user import user
- from .secret import secret
- class secret_loader(sqlmodel.Session):
- def __init__(
- self,
- connection: sqlalchemy.engine.base.Engine,
- owner: user
- ) -> None:
- """
- This create new loader. It require connection to the database, and
- user, which own secrets to work on.
-
- Parameters:
- connection (sqlalchemy.engine.base.Engine): Connection to database
- owner (user): User which own secrets to work on
- """
- super().__init__(connection)
- if not owner.in_database:
- raise Exception("User to build loaded for not exists.")
- self.__owner = owner
- @property
- def owner(self) -> user:
- """ This return owner of secrets which work on. """
- return self.__owner
- def append(self, target: secret) -> bool:
- """
- This append new secret to database. Secret must have same owner, as
- set in loader. When owner is not set, user from loader would be used.
- When user is not correct, that mean is other in secret and in loader,
- TypeError would be raised. When secret name is already in use, then
- it return False. When item is already in database, Exception would be
- raised. When secret is not ready, that mean
- Parameters:
- target (secret): New secret to insert in database
- Returns:
- (bool): True when append successfull, False when failed
- """
-
- if target.owner is None:
- target.owner = self.owner
- elif target.owner != self.owner.id:
- raise TypeError("Owner of secret is other than in loader.")
-
- if target.in_database:
- raise Exception("Secret is already in database. Use update.")
- if not target.ready:
- raise Exception("Secret is not ready to append.")
- if self.load_by_name(target.name) is not None:
- return False
- self.add(target)
- self.commit()
- self.refresh(target)
- return True
- @property
- def __select(self) -> sqlmodel.sql.expression.Select:
- """ It create new selecr query with set owner statement. """
- return sqlmodel.select(secret).where(secret.owner == self.owner.id)
- def search_for_domain(self, target: str) -> typing.Iterable[secret]:
- """
- This search in secret database for secrets by domain. It return
- iterator which items is in secret type.
- Parameters:
- target (str): Domain name to search
- Returns:
- (Iterable[secret]): Iterator with found secrets
- """
- target = "%" + target + "%"
- query = self.__select.where(secret.domain.like(target))
- result = self.exec(query)
- for item in result:
- yield item
- def search_for_name(self, target: str) -> typing.Iterable[secret]:
- """
- This search in secrets database for secrets which have names like
- given. It returns iterator with found result.
- Parameters:
- target (str): Name to search in database
-
- Returns:
- (Iterable[secret]): Found secrets
- """
- target = "%" + target.upper() + "%"
- query = self.__select.where(secret.name.like(target))
- result = self.exec(query)
- for item in result:
- yield item
- def name_in_use(self, target: str) -> bool:
- """
- This check that name is already in use.
- Parameters:
- target (str): Name to check
- Returns:
- (bool): True when name is user, False when not
- """
- return self.load_by_name(target) is not None
- def load_by_name(self, target: str) -> secret | None:
- """
- It load single secret by name. When secret not exists, return None.
- Parameters:
- target (str): Name of the secret
- Returns:
- (secret | None): Loaded secret or None when not exists
- """
- target = target.upper()
- query = self.__select.where(secret.name == target)
- result = self.exec(query)
- return result.first()
- def drop(self, target: secret) -> bool:
- """
- This remove secret from database. When secret not exists in database
- return False. Whem all went good, return True.
- Parameters:
- target (secret): Secret to drop
- Returns:
- (bool): True when remove successfull, False when not
- """
- if not target.in_database:
- return False
- self.delete(target)
- self.commit()
- return True
- def clear(self) -> None:
- """
- This drop all secrets of the user. It is useable before user remove.
- """
- query = self.__select
- result = self.exec(query)
- for item in result:
- self.delete(item)
- self.commit()
- def update(self, target: secret) -> bool:
- """
- This update secret in the database. When secret not exists in
- database. When owner is not set propertly, raise TypeError. When
- target is not in database, or secret is not ready, raise Exception.
- When name is already in use by other secret, it return False.
- Parameters:
- target (secret): Secret to update
- Returns:
- (bool): True when updated, False when name is in use
- """
- if target.owner is None:
- target.owner = self.owner
- elif target.owner != self.owner.id:
- raise TypeError("Owner of the secret is other than in loader.")
- if not target.in_database:
- raise Exception("Target is not in database. Use append.")
- if not target.ready:
- return Exception("Target is not ready to update.")
- check = self.load_by_name(target.name)
- if check is not None and check.id != target.id:
- return False
- self.add(target)
- self.commit()
- self.refresh(target)
- return True
|