secret.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. import sqlmodel
  2. import hashlib
  3. import Crypto
  4. from .user import user
  5. from .builder import builder
  6. from .secret_coder import secret_coder
  7. class secret(sqlmodel.SQLModel, table = True):
  8. """
  9. This class represents secret in the database.
  10. """
  11. id: int = sqlmodel.Field(default = None, primary_key = True)
  12. name: str = sqlmodel.Field(default = None, index = True)
  13. domain: str = sqlmodel.Field(default = None, index = True)
  14. coded: str = sqlmodel.Field(default = None, index = False)
  15. owner: int = sqlmodel.Field(
  16. default = None,
  17. foreign_key = "user.id",
  18. index = True
  19. )
  20. @property
  21. def in_database(self) -> bool:
  22. """ True when secret exists in database. """
  23. return self.id is not None
  24. @property
  25. def ready(self) -> bool:
  26. """ True when all fields are filled. """
  27. if self.name is None or self.domain is None:
  28. return False
  29. if self.coded is None or self.owner is None:
  30. return False
  31. return True
  32. def __str__(self) -> str:
  33. """
  34. This cast user to string, very usefull for debug.
  35. Returns:
  36. (str): User dump as string
  37. """
  38. result = ""
  39. result = result + "Secret "
  40. if self.id is not None:
  41. result = result + "(" + str(self.id) + ")"
  42. result = result + "\n"
  43. result = result + "Name: " + self.name + "\n"
  44. result = result + "Domain: " + self.domain + "\n"
  45. result = result + "Owner ID: " + str(self.owner) + "\n"
  46. result = result + "Coded: " + self.coded + "\n"
  47. return result
  48. class secret_builder(builder, target_type = secret):
  49. """
  50. This class is responsible for creating new secrets for the user.
  51. """
  52. @property
  53. def owner(self) -> int | None:
  54. """ This return ID of the secret owner, or None if not set. """
  55. return self._target.owner
  56. @owner.setter
  57. def owner(self, target: user):
  58. """ This set new owner of the secret. """
  59. if not target.in_database:
  60. raise TypeError("Target user for secret is not registered.")
  61. self._target.owner = target.id
  62. @property
  63. def name(self) -> str | None:
  64. """ This return name of the secret or None if not set. """
  65. return self._target.name
  66. @property
  67. def domain(self) -> str | None:
  68. """ This return domain of the secret or None if not set. """
  69. return self._target.domain
  70. @name.setter
  71. def name(self, target: str) -> None:
  72. """ This set name of the secret. """
  73. self._target.name = target.upper()
  74. @domain.setter
  75. def domain(self, target: str) -> None:
  76. """ This set domain of the secret. """
  77. self._target.domain = target
  78. @property
  79. def coded(self) -> str | None:
  80. """ This return coded secret or None. """
  81. return self._target.coded
  82. @coded.setter
  83. def coded(self, target: str) -> None:
  84. """
  85. This set new coded secret. It also check it format, and when detect
  86. that format is not correct, raise TypeError.
  87. Parameters:
  88. target (str): Target secret to set
  89. """
  90. if not secret_coder.validate(target):
  91. raise TypeError("Coded secret is not in correct format.")
  92. self._target.coded = target