|
@@ -3,6 +3,7 @@ import hashlib
|
|
|
import Crypto
|
|
import Crypto
|
|
|
|
|
|
|
|
from .user import user
|
|
from .user import user
|
|
|
|
|
+from .builder import builder
|
|
|
from .secret_crypto import secret_crypto
|
|
from .secret_crypto import secret_crypto
|
|
|
|
|
|
|
|
class secret(sqlmodel.SQLModel, table = True):
|
|
class secret(sqlmodel.SQLModel, table = True):
|
|
@@ -17,83 +18,91 @@ class secret(sqlmodel.SQLModel, table = True):
|
|
|
nonce: bytes | None = sqlmodel.Field(default = None)
|
|
nonce: bytes | None = sqlmodel.Field(default = None)
|
|
|
owner: int | None = sqlmodel.Field(default = None, foreign_key = "user.id")
|
|
owner: int | None = sqlmodel.Field(default = None, foreign_key = "user.id")
|
|
|
|
|
|
|
|
-class secret_builder:
|
|
|
|
|
- """
|
|
|
|
|
- This class is responsible for creating new secrets for the user.
|
|
|
|
|
- """
|
|
|
|
|
-
|
|
|
|
|
- def __init__(self) -> None:
|
|
|
|
|
- """
|
|
|
|
|
- This function create new clean builder.
|
|
|
|
|
- """
|
|
|
|
|
-
|
|
|
|
|
- self.clean()
|
|
|
|
|
-
|
|
|
|
|
- def clean(self) -> None:
|
|
|
|
|
- """
|
|
|
|
|
- This function clean builder, and prepare it to build new secret.
|
|
|
|
|
- """
|
|
|
|
|
|
|
+ @property
|
|
|
|
|
+ def in_database(self) -> bool:
|
|
|
|
|
+ """ True when secret exists in database. """
|
|
|
|
|
|
|
|
- self.__target = secret()
|
|
|
|
|
|
|
+ return self.id is not None
|
|
|
|
|
|
|
|
@property
|
|
@property
|
|
|
def ready(self) -> bool:
|
|
def ready(self) -> bool:
|
|
|
- """ True when secret is ready, false when not. """
|
|
|
|
|
|
|
+ """ True when all fields are filled. """
|
|
|
|
|
|
|
|
- if self.__target.name is None or self.__target.domain is None:
|
|
|
|
|
|
|
+ if self.name is None or self.domain is None:
|
|
|
return False
|
|
return False
|
|
|
|
|
|
|
|
- if self.__target.crypted is None or self.__target.nonce is None:
|
|
|
|
|
|
|
+ if self.crypted is None or self.nonce is None:
|
|
|
return False
|
|
return False
|
|
|
|
|
|
|
|
- if self.__target.owner is None:
|
|
|
|
|
|
|
+ if self.owner is None:
|
|
|
return False
|
|
return False
|
|
|
|
|
|
|
|
return True
|
|
return True
|
|
|
|
|
|
|
|
|
|
+ def __str__(self) -> str:
|
|
|
|
|
+ """
|
|
|
|
|
+ This cast user to string, very usefull for debug.
|
|
|
|
|
+
|
|
|
|
|
+ Returns:
|
|
|
|
|
+ (str): User dump as string
|
|
|
|
|
+ """
|
|
|
|
|
+
|
|
|
|
|
+ result = ""
|
|
|
|
|
+ result = result + "Secret "
|
|
|
|
|
+
|
|
|
|
|
+ if self.id is not None:
|
|
|
|
|
+ result = result + "(" + str(self.id) + ")"
|
|
|
|
|
+
|
|
|
|
|
+ result = result + "\n"
|
|
|
|
|
+
|
|
|
|
|
+ result = result + "Name: " + self.name + "\n"
|
|
|
|
|
+ result = result + "Domain: " + self.domain + "\n"
|
|
|
|
|
+ result = result + "Owner ID: " + str(self.owner) + "\n"
|
|
|
|
|
+ result = result + "Crypted: " + self.crypted.hex() + "\n"
|
|
|
|
|
+ result = result + "Nonce: " + self.nonce.hex() + "\n"
|
|
|
|
|
+
|
|
|
|
|
+ return result
|
|
|
|
|
+
|
|
|
|
|
+class secret_builder(builder, target_type = secret):
|
|
|
|
|
+ """
|
|
|
|
|
+ This class is responsible for creating new secrets for the user.
|
|
|
|
|
+ """
|
|
|
|
|
+
|
|
|
@property
|
|
@property
|
|
|
def owner(self) -> int | None:
|
|
def owner(self) -> int | None:
|
|
|
""" This return ID of the secret owner, or None if not set. """
|
|
""" This return ID of the secret owner, or None if not set. """
|
|
|
- return self.__target.owner
|
|
|
|
|
|
|
+
|
|
|
|
|
+ return self._target.owner
|
|
|
|
|
|
|
|
@owner.setter
|
|
@owner.setter
|
|
|
def owner(self, target: user):
|
|
def owner(self, target: user):
|
|
|
""" This set new owner of the secret. """
|
|
""" This set new owner of the secret. """
|
|
|
|
|
|
|
|
- self.__target.owner = user.id
|
|
|
|
|
-
|
|
|
|
|
- @property
|
|
|
|
|
- def result(self) -> secret:
|
|
|
|
|
- """ This return ready secret if it is ready, or raise Exception. """
|
|
|
|
|
-
|
|
|
|
|
- if not self.ready:
|
|
|
|
|
- raise TypeError("Secret is not ready to load.")
|
|
|
|
|
-
|
|
|
|
|
- return self.__target
|
|
|
|
|
|
|
+ self._target.owner = user.id
|
|
|
|
|
|
|
|
@property
|
|
@property
|
|
|
def name(self) -> str | None:
|
|
def name(self) -> str | None:
|
|
|
""" This return name of the secret or None if not set. """
|
|
""" This return name of the secret or None if not set. """
|
|
|
|
|
|
|
|
- return self.__target.name
|
|
|
|
|
|
|
+ return self._target.name
|
|
|
|
|
|
|
|
@property
|
|
@property
|
|
|
def domain(self) -> str | None:
|
|
def domain(self) -> str | None:
|
|
|
""" This return domain of the secret or None if not set. """
|
|
""" This return domain of the secret or None if not set. """
|
|
|
|
|
|
|
|
- return self.__target.domain
|
|
|
|
|
|
|
+ return self._target.domain
|
|
|
|
|
|
|
|
@name.setter
|
|
@name.setter
|
|
|
def name(self, target: str) -> None:
|
|
def name(self, target: str) -> None:
|
|
|
""" This set name of the secret. """
|
|
""" This set name of the secret. """
|
|
|
|
|
|
|
|
- self.__target.name = target
|
|
|
|
|
|
|
+ self._target.name = target.upper()
|
|
|
|
|
|
|
|
@domain.setter
|
|
@domain.setter
|
|
|
def domain(self, target: str) -> None:
|
|
def domain(self, target: str) -> None:
|
|
|
""" This set domain of the secret. """
|
|
""" This set domain of the secret. """
|
|
|
|
|
|
|
|
- self.__target.domain = target
|
|
|
|
|
|
|
+ self._target.domain = target
|
|
|
|
|
|
|
|
def crypt(self, key: str, target: str) -> None:
|
|
def crypt(self, key: str, target: str) -> None:
|
|
|
"""
|
|
"""
|
|
@@ -109,10 +118,10 @@ class secret_builder:
|
|
|
|
|
|
|
|
crypter = secret_crypto(key)
|
|
crypter = secret_crypto(key)
|
|
|
|
|
|
|
|
- if self.__target.nonce is not None:
|
|
|
|
|
|
|
+ if self._target.nonce is not None:
|
|
|
crypter.set_iv(self.__target.nonce)
|
|
crypter.set_iv(self.__target.nonce)
|
|
|
|
|
|
|
|
crypted, nonce = crypter.crypted(target)
|
|
crypted, nonce = crypter.crypted(target)
|
|
|
|
|
|
|
|
- self.__target.crypted = crypted
|
|
|
|
|
- self.__target.nonce = nonce
|
|
|
|
|
|
|
+ self._target.crypted = crypted
|
|
|
|
|
+ self._target.nonce = nonce
|