Encryptors 2.64__tar.gz → 2.66__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. {encryptors-2.64 → encryptors-2.66}/PKG-INFO +1 -1
  2. {encryptors-2.64 → encryptors-2.66}/setup.py +1 -1
  3. {encryptors-2.64 → encryptors-2.66}/src/Encryptors.egg-info/PKG-INFO +1 -1
  4. {encryptors-2.64 → encryptors-2.66}/src/Encryptors.egg-info/SOURCES.txt +2 -2
  5. encryptors-2.66/src/Osdental/Enums/CipherType.py +6 -0
  6. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Exception/ControlledException.py +5 -19
  7. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Helpers/AuditHelper.py +12 -3
  8. encryptors-2.64/src/Osdental/Helpers/ResponseDecryptor.py → encryptors-2.66/src/Osdental/Helpers/CipherHelper.py +15 -11
  9. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Models/AuditContext.py +4 -4
  10. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Models/Response.py +3 -2
  11. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Models/Token.py +0 -2
  12. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Models/TokenClaims.py +1 -0
  13. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Services/JwtAuthTokenService.py +4 -2
  14. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Services/__init__.py +7 -0
  15. encryptors-2.64/src/Osdental/Enums/ErrorSource.py +0 -5
  16. {encryptors-2.64 → encryptors-2.66}/README.md +0 -0
  17. {encryptors-2.64 → encryptors-2.66}/setup.cfg +0 -0
  18. {encryptors-2.64 → encryptors-2.66}/src/Encryptors.egg-info/dependency_links.txt +0 -0
  19. {encryptors-2.64 → encryptors-2.66}/src/Encryptors.egg-info/entry_points.txt +0 -0
  20. {encryptors-2.64 → encryptors-2.66}/src/Encryptors.egg-info/requires.txt +0 -0
  21. {encryptors-2.64 → encryptors-2.66}/src/Encryptors.egg-info/top_level.txt +0 -0
  22. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Cache/Redis.py +0 -0
  23. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Cache/__init__.py +0 -0
  24. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Cli/__init__.py +0 -0
  25. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Constants/Constant.py +0 -0
  26. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Constants/Message.py +0 -0
  27. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Constants/__init__.py +0 -0
  28. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Context/__init__.py +0 -0
  29. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Database/BaseRepository.py +0 -0
  30. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Database/Connection.py +0 -0
  31. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Database/__init__.py +0 -0
  32. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Decorators/Grpc.py +0 -0
  33. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Decorators/Retry.py +0 -0
  34. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Decorators/SecureResolver.py +0 -0
  35. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Decorators/__init__.py +0 -0
  36. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Encryptor/Aes.py +0 -0
  37. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Encryptor/Argon2.py +0 -0
  38. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Encryptor/Bcrypt.py +0 -0
  39. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Encryptor/Jwt.py +0 -0
  40. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Encryptor/Rsa.py +0 -0
  41. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Encryptor/Sha512.py +0 -0
  42. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Encryptor/__init__.py +0 -0
  43. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Enums/AuditType.py +0 -0
  44. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Enums/FileType.py +0 -0
  45. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Enums/GrahpqlOperation.py +0 -0
  46. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Enums/Profile.py +0 -0
  47. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Enums/ResultType.py +0 -0
  48. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Enums/StatusCode.py +0 -0
  49. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Enums/__init__.py +0 -0
  50. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Exception/__init__.py +0 -0
  51. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Helpers/AuditQueue.py +0 -0
  52. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Helpers/AuthTokenProcessor.py +0 -0
  53. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Helpers/AzureClassifier.py +0 -0
  54. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Helpers/GrpcConnection.py +0 -0
  55. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Helpers/JwtTokenHelper.py +0 -0
  56. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Helpers/Resilience.py +0 -0
  57. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Helpers/__init__.py +0 -0
  58. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Http/APIClient.py +0 -0
  59. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Http/__init__.py +0 -0
  60. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Messaging/AzureServiceBus.py +0 -0
  61. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Messaging/Kafka.py +0 -0
  62. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Messaging/RabbitMQ.py +0 -0
  63. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Messaging/__init__.py +0 -0
  64. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Models/ApiResponse.py +0 -0
  65. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Models/Graphql.py +0 -0
  66. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Models/Notification.py +0 -0
  67. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Models/__init__.py +0 -0
  68. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Secrets/AzureKeyVaultProvider.py +0 -0
  69. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Secrets/__init__.py +0 -0
  70. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Services/ServiceBusAuditEmitter.py +0 -0
  71. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Services/WebsocketClient.py +0 -0
  72. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Storage/AzureBlobStorage.py +0 -0
  73. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Storage/S3Storage.py +0 -0
  74. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Storage/__init__.py +0 -0
  75. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Utils/CaseConverter.py +0 -0
  76. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Utils/CodeGenerator.py +0 -0
  77. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Utils/DataNormalizer.py +0 -0
  78. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Utils/DataUtils.py +0 -0
  79. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Utils/DateUtils.py +0 -0
  80. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Utils/FileMetaData.py +0 -0
  81. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Utils/HashValidator.py +0 -0
  82. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Utils/Mapper.py +0 -0
  83. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Utils/PasswordGenerator.py +0 -0
  84. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Utils/QueryGenerator.py +0 -0
  85. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Utils/RsaUtils.py +0 -0
  86. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Utils/TextProcessor.py +0 -0
  87. {encryptors-2.64 → encryptors-2.66}/src/Osdental/Utils/__init__.py +0 -0
  88. {encryptors-2.64 → encryptors-2.66}/src/Osdental/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: Encryptors
3
- Version: 2.64
3
+ Version: 2.66
4
4
  Summary: End-to-end algorithm library
5
5
  Author: OSDental LLC
6
6
  Author-email: support@osdental.ai
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
2
2
  # ANDERSON REVISAR EL CACHE LOCAL DEL KEYVAULT PARA VALIDAR SI FUNCIONA
3
3
  setup(
4
4
  name="Encryptors",
5
- version="2.64",
5
+ version="2.66",
6
6
  author="OSDental LLC",
7
7
  author_email="support@osdental.ai",
8
8
  description="End-to-end algorithm library",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: Encryptors
3
- Version: 2.64
3
+ Version: 2.66
4
4
  Summary: End-to-end algorithm library
5
5
  Author: OSDental LLC
6
6
  Author-email: support@osdental.ai
@@ -29,7 +29,7 @@ src/Osdental/Encryptor/Rsa.py
29
29
  src/Osdental/Encryptor/Sha512.py
30
30
  src/Osdental/Encryptor/__init__.py
31
31
  src/Osdental/Enums/AuditType.py
32
- src/Osdental/Enums/ErrorSource.py
32
+ src/Osdental/Enums/CipherType.py
33
33
  src/Osdental/Enums/FileType.py
34
34
  src/Osdental/Enums/GrahpqlOperation.py
35
35
  src/Osdental/Enums/Profile.py
@@ -42,10 +42,10 @@ src/Osdental/Helpers/AuditHelper.py
42
42
  src/Osdental/Helpers/AuditQueue.py
43
43
  src/Osdental/Helpers/AuthTokenProcessor.py
44
44
  src/Osdental/Helpers/AzureClassifier.py
45
+ src/Osdental/Helpers/CipherHelper.py
45
46
  src/Osdental/Helpers/GrpcConnection.py
46
47
  src/Osdental/Helpers/JwtTokenHelper.py
47
48
  src/Osdental/Helpers/Resilience.py
48
- src/Osdental/Helpers/ResponseDecryptor.py
49
49
  src/Osdental/Helpers/__init__.py
50
50
  src/Osdental/Http/APIClient.py
51
51
  src/Osdental/Http/__init__.py
@@ -0,0 +1,6 @@
1
+ from enum import StrEnum
2
+
3
+ class CipherType(StrEnum):
4
+ AES = "AES"
5
+ RSA = "RSA"
6
+ PLAIN = "PLAIN"
@@ -1,7 +1,7 @@
1
1
  from typing import Any
2
2
  from Osdental.Enums.StatusCode import StatusCode
3
3
  from Osdental.Constants.Message import Message
4
- from Osdental.Enums.ErrorSource import ErrorSource
4
+
5
5
 
6
6
  class OSDException(Exception):
7
7
  """ Base class for all custom exceptions. """
@@ -9,29 +9,19 @@ class OSDException(Exception):
9
9
  self,
10
10
  message: str = Message.UNEXPECTED_ERROR_MSG,
11
11
  error: str = None,
12
- status_code: Any = StatusCode.INTERNAL_SERVER_ERROR,
13
- source: ErrorSource = ErrorSource.INTERNAL,
14
- raw_status_code: Any = None,
12
+ status_code: Any = StatusCode.INTERNAL_SERVER_ERROR
15
13
  ):
16
14
  super().__init__(error)
17
15
  self.message = message
18
16
  self.error = error
19
17
  self.status_code = status_code
20
- self.source = source
21
- self.raw_status_code = raw_status_code
18
+
22
19
 
23
20
  def __str__(self):
24
21
  error_detail = self.error if self.error else "None"
25
- return f"[{self.source} | {self.status_code}] {self.message} | {error_detail}]"
22
+ return f"[{self.status_code}] {self.message} | {error_detail}]"
26
23
 
27
- @property
28
- def is_external(self) -> bool:
29
- return self.source == ErrorSource.EXTERNAL
30
-
31
- @property
32
- def audit_status_code(self) -> Any:
33
- """El que va a la auditoría: real si existe, propio si no."""
34
- return self.raw_status_code if self.raw_status_code is not None else self.status_code
24
+
35
25
 
36
26
  class UnauthorizedException(OSDException):
37
27
  def __init__(
@@ -134,13 +124,9 @@ class HttpClientException(OSDException):
134
124
  message: str = Message.UNEXPECTED_ERROR_MSG,
135
125
  error: str = None,
136
126
  status_code: str = StatusCode.INTERNAL_SERVER_ERROR,
137
- source: ErrorSource = ErrorSource.EXTERNAL,
138
- raw_status_code: Any = None,
139
127
  ):
140
128
  super().__init__(
141
129
  message=message,
142
130
  error=error,
143
131
  status_code=status_code,
144
- source=source,
145
- raw_status_code=raw_status_code
146
132
  )
@@ -9,6 +9,7 @@ from Osdental.Exception.ControlledException import OSDException
9
9
  from Osdental.Enums.StatusCode import StatusCode
10
10
  from Osdental.Enums.AuditType import AuditType
11
11
  from Osdental.Enums.ResultType import ResultType
12
+ from Osdental.Helpers.CipherHelper import decryptor_data
12
13
 
13
14
  def build_request_payload(
14
15
  request: Request,
@@ -77,16 +78,25 @@ def _build_final_payload(
77
78
 
78
79
  def _build_success_payload(ctx: Optional[AuditContext], result: Response) -> Dict[str, Any]:
79
80
  base = _base_payload(ctx)
81
+
82
+ key = result.key if result.key else ctx.decrypted_key
83
+
84
+ result = decryptor_data(
85
+ key=key,
86
+ data=result.data,
87
+ encryption_type=result.encryption_type,
88
+ )
89
+
80
90
  return base | _build_final_payload(
81
91
  type_=ResultType.RESPONSE,
82
92
  status_code=result.status,
83
- result=result.data
93
+ result=result
84
94
  )
85
95
 
86
96
  def _build_error_payload(ctx: Optional[AuditContext], exc: OSDException) -> Dict[str, Any]:
87
97
  base = _base_payload(ctx)
88
98
  return base | _build_final_payload(
89
- status_code=exc.audit_status_code,
99
+ status_code=exc.status_code,
90
100
  error=exc.error or exc.message
91
101
  )
92
102
 
@@ -157,7 +167,6 @@ def _build_success_graphql_payload(ctx: Optional[AuditContext], result: Dict[str
157
167
  result=result
158
168
  )
159
169
 
160
-
161
170
  def _build_error_graphql_payload(ctx: Optional[AuditContext], errors: List[Dict[str, Any]]) -> Dict[str, Any]:
162
171
  base = _base_payload(ctx, AuditType.EXTERNAL)
163
172
  return base | _build_final_payload(
@@ -2,35 +2,39 @@ import logging
2
2
  from typing import Dict, Any
3
3
  from Osdental.Encryptor.Aes import AES
4
4
  from Osdental.Encryptor.Rsa import RSAEncryptor
5
+ from Osdental.Enums.CipherType import CipherType
5
6
 
6
7
  logger = logging.getLogger(__name__)
7
8
 
8
9
 
9
- VALID_TYPES = {"RSA", "AES"}
10
-
11
- def encryptor_data(encryption_type: str, key: str, data: Dict[str, Any] | str) -> Any:
10
+ def encryptor_data(key: str, data: Dict[str, Any] | str, encryption_type: CipherType = CipherType.AES) -> Any:
12
11
  match encryption_type:
13
12
 
14
- case "AES":
13
+ case CipherType.AES:
15
14
  return AES.encrypt(key, data)
16
15
 
17
- case "RSA":
16
+ case CipherType.RSA:
18
17
  return RSAEncryptor.encrypt(data, key)
19
18
 
19
+ case CipherType.PLAIN:
20
+ return data
21
+
20
22
  case _:
21
23
  logger.warning(f"Encryption type '{encryption_type}' not supported.")
22
- return data
24
+
23
25
 
24
- def decryptor_data(encryption_type: str, key: str, data: Dict[str, Any] | str) -> Any:
26
+ def decryptor_data(key: str, data: Dict[str, Any] | str, encryption_type: CipherType = CipherType.AES) -> Any:
25
27
 
26
28
  match encryption_type:
27
29
 
28
- case "AES":
30
+ case CipherType.AES:
29
31
  return AES.decrypt(key, data)
30
32
 
31
- case "RSA":
33
+ case CipherType.RSA:
32
34
  return RSAEncryptor.decrypt(data, key)
33
35
 
36
+ case CipherType.PLAIN:
37
+ return data
38
+
34
39
  case _:
35
- logger.warning(f"Encryption type '{encryption_type}' not supported.")
36
- return data
40
+ logger.warning(f"Encryption type '{encryption_type}' not supported.")
@@ -1,7 +1,7 @@
1
1
  from dataclasses import dataclass
2
2
  from typing import Optional, Dict, Any
3
3
  from fastapi import Request
4
-
4
+ from Osdental.Models.Token import AuthToken
5
5
 
6
6
  @dataclass
7
7
  class AuditContext:
@@ -30,8 +30,8 @@ class AuditContext:
30
30
  settings,
31
31
  body: Dict,
32
32
  operation_type: str,
33
- token=None,
34
- decrypted_payload=None,
33
+ token: AuthToken = None,
34
+ decrypted_payload = None,
35
35
  ) -> "AuditContext":
36
36
 
37
37
  user_ip = request.headers.get("X-Forwarded-For")
@@ -51,7 +51,7 @@ class AuditContext:
51
51
  operation_name=body.get("operationName", "UnknownOperation"),
52
52
  query=body.get("query"),
53
53
  variables=decrypted_payload,
54
- user=token.user_full_name if token else "Public",
54
+ user=token.id_user if token else "00000000-0000-0000-0000-000000000000",
55
55
  message_log_id=request.headers.get("Idmessagelog"),
56
56
  decrypted_key=token.aes_key_auth if token else None,
57
57
  user_ip=user_ip,
@@ -1,7 +1,8 @@
1
1
  from dataclasses import dataclass, field, asdict
2
- from typing import Optional, Any, Literal
2
+ from typing import Optional, Any
3
3
  from Osdental.Enums.StatusCode import StatusCode
4
4
  from Osdental.Constants.Message import Message
5
+ from Osdental.Enums.CipherType import CipherType
5
6
 
6
7
  @dataclass
7
8
  class Response:
@@ -9,7 +10,7 @@ class Response:
9
10
  message: str = field(default=Message.PROCESS_SUCCESS_MSG)
10
11
  data: Optional[Any] = None
11
12
  error: Optional[str] = None
12
- encryption_type: Literal["AES", "RSA", "NORMAL"] = "AES"
13
+ encryption_type: CipherType = CipherType.AES
13
14
  key: Optional[str] = None
14
15
 
15
16
  def send(self):
@@ -14,7 +14,5 @@ class AuthToken:
14
14
  user_full_name: str
15
15
  abbreviation: str
16
16
  aes_key_auth: str
17
- aes_key_user: Optional[str] = None
18
- access_token: Optional[str] = None
19
17
  base_id_external_enterprise: Optional[str] = None
20
18
  mk_id_external_enterprise: Optional[str] = None
@@ -37,6 +37,7 @@ class UserTokenClaims(BaseClaims):
37
37
  user_full_name: str
38
38
  abbreviation: str
39
39
  aes_key_auth: str
40
+ exp: Optional[int] = 0
40
41
 
41
42
 
42
43
  @dataclass(frozen=True, slots=True)
@@ -1,7 +1,7 @@
1
1
  import asyncio
2
2
 
3
3
  from Osdental.Models.TokenClaims import (
4
- AccessTokenClaims, UserTokenClaims,
4
+ BaseClaims, AccessTokenClaims, UserTokenClaims,
5
5
  ActionTokenClaims, TokenValidationOptions
6
6
  )
7
7
 
@@ -52,7 +52,7 @@ class JwtAuthTokenService(IAuthTokenService):
52
52
 
53
53
  async def generate_token(
54
54
  self,
55
- claims: AccessTokenClaims | UserTokenClaims | ActionTokenClaims,
55
+ claims: BaseClaims,
56
56
  expiration_minutes: int,
57
57
  ) -> str:
58
58
 
@@ -140,6 +140,7 @@ class JwtAuthTokenService(IAuthTokenService):
140
140
  user_full_name=claims["user_full_name"],
141
141
  abbreviation=claims["abbreviation"],
142
142
  aes_key_auth=claims["aes_key_auth"],
143
+ exp=claims["exp"],
143
144
  )
144
145
 
145
146
 
@@ -165,4 +166,5 @@ class JwtAuthTokenService(IAuthTokenService):
165
166
  user_full_name=claims["user_full_name"],
166
167
  abbreviation=claims["abbreviation"],
167
168
  aes_key_auth=claims["aes_key_auth"],
169
+ exp=claims["exp"],
168
170
  )
@@ -47,6 +47,13 @@ class IAuthTokenService(ABC):
47
47
  ) -> ActionTokenClaims:
48
48
  pass
49
49
 
50
+ @abstractmethod
51
+ async def validate_token_for_refresh(
52
+ self,
53
+ token: str,
54
+ ) -> UserTokenClaims:
55
+ pass
56
+
50
57
 
51
58
  class IAuditEmitter(Protocol):
52
59
  async def process(self, payload: Dict[str, Any]) -> None:
@@ -1,5 +0,0 @@
1
- from enum import Enum
2
-
3
- class ErrorSource(str, Enum):
4
- INTERNAL = "internal"
5
- EXTERNAL = "external"
File without changes
File without changes