apikey_factory.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import os
  2. import functools
  3. from .apikey import apikey
  4. from .apikey_validator import apikey_validator
  5. from .apikey_exceptions import apikey_syntax_error
  6. class apikey_factory:
  7. def __init__(self, prefix: str = "key") -> None:
  8. self.__size = 256
  9. self.__prefix = prefix
  10. def set_size(self, size: int) -> object:
  11. self.__size = size
  12. return self
  13. def set_prefix(self, prefix: str) -> object:
  14. self.__prefix = prefix
  15. return self
  16. @property
  17. def prefix_separator(self) -> str:
  18. return "_"
  19. @property
  20. def prefix(self) -> str:
  21. return self.__prefix
  22. @property
  23. def size(self) -> int:
  24. return self.__size
  25. @functools.lru_cache
  26. def __get_random_token_size(self, token_size: int) -> int:
  27. random_size = token_size / 2 + token_size % 2
  28. random_size = int(random_size)
  29. return random_size
  30. @functools.lru_cache
  31. def __get_token_size(self, full_size: int, prefix_size: int) -> int:
  32. return full_size - prefix_size - len(self.prefix_separator)
  33. def __get_random(self) -> str:
  34. token_size = self.__get_token_size(self.size, len(self.prefix))
  35. random_size = self.__get_random_token_size(token_size)
  36. return os.urandom(random_size).hex()[0:token_size]
  37. def __get_new_token(self) -> str:
  38. return self.prefix + self.prefix_separator + self.__get_random()
  39. def generate(self) -> apikey:
  40. return apikey(
  41. self.__get_new_token(),
  42. self.size,
  43. self.prefix,
  44. self.prefix_separator
  45. )
  46. def load(self, token: str) -> apikey:
  47. if not self.get_validator().validate(token):
  48. raise apikey_syntax_error()
  49. return apikey(
  50. token,
  51. self.size,
  52. self.prefix,
  53. self.prefix_separator
  54. )
  55. def get_validator(self) -> apikey_validator:
  56. return self.__get_validator_cache(
  57. self.size,
  58. self.prefix,
  59. self.prefix_separator
  60. )
  61. @functools.lru_cache
  62. def __get_validator_cache(
  63. self,
  64. size: int,
  65. prefix: str,
  66. prefix_separator: str
  67. ) -> apikey_validator:
  68. return apikey_validator(
  69. size,
  70. prefix,
  71. prefix_separator
  72. )