application_secret.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import typing
  2. from .user import user
  3. from .user import user_builder
  4. from .user_loader import user_loader
  5. from .secret import secret
  6. from .secret import secret_builder
  7. from .secret_coder import secret_coder
  8. from .secret_loader import secret_loader
  9. from .application_part import application_part
  10. from .apikey import bad_apikey_exception
  11. from .validators import name_validator
  12. from .validators import domain_validator
  13. class secret_response:
  14. def __init__(self, target: secret | secret_builder) -> None:
  15. if isinstance(target, secret):
  16. self.__target = target
  17. return
  18. self.__target = target.result
  19. @property
  20. def response(self) -> dict:
  21. return {
  22. "name": self.target.name,
  23. "domain": self.target.domain,
  24. "coded" : self.target.coded
  25. }
  26. @property
  27. def target(self) -> secret:
  28. return self.__target
  29. @property
  30. def builder(self) -> secret_builder:
  31. return secret_builder(self.__target)
  32. class secret_collection_response:
  33. def __init__(self, target: typing.Iterable[secret] | None = None) -> None:
  34. self.__collection = []
  35. if target is None:
  36. return
  37. if type(target) is list:
  38. self.__collection = target.copy()
  39. return
  40. for count in target:
  41. self.__collection.append(count)
  42. @property
  43. def response(self) -> dict:
  44. return [ count.response for count in self.collection ]
  45. @property
  46. def collection(self) -> list:
  47. return self.__collection.copy()
  48. def append(self, target: secret | secret_builder) -> object:
  49. if isinstance(target, secret_builder):
  50. target = target.result
  51. self.__collection.append(target)
  52. return self
  53. class application_secret(application_part):
  54. def get(self, apikey: str, name: str) -> dict:
  55. with self.__secret_database(apikey) as loader:
  56. target = loader.load_by_name(name)
  57. if target is None:
  58. return self.__not_found_response()
  59. return secret_response(target).response
  60. def create(self, apikey: str, name: str, domain: str, coded: str) -> dict:
  61. validation = self._validation("name", name_validator(name))
  62. validation = validation or self._validation(
  63. "domain",
  64. domain_validator(domain)
  65. )
  66. if validation is not None:
  67. return validation
  68. if not secret_coder.validate(coded):
  69. return self._fail_response(cause = "Invalid coded secret")
  70. with self.__secret_database(apikey) as loader:
  71. builder = secret_builder()
  72. builder.name = name
  73. builder.domain = domain
  74. builder.coded = coded
  75. builder.owner = loader.owner
  76. loader.append(builder.result)
  77. return self._success_response()
  78. @property
  79. def __not_found_response(self) -> dict:
  80. return self._fail_response(cause = "Secret not found.")
  81. @property
  82. def __user_database(self) -> user_loader:
  83. return user_loader(self._connector)
  84. def __secret_database(self, apikey: str) -> secret_loader:
  85. with self.__user_database as loader:
  86. target = loader.get_by_apikey(apikey)
  87. if target is None:
  88. raise bad_apikey_exception()
  89. return secret_loader(self._connector, target)