Encryptors 2.54__tar.gz → 2.56__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 (97) hide show
  1. {encryptors-2.54 → encryptors-2.56}/PKG-INFO +1 -1
  2. {encryptors-2.54 → encryptors-2.56}/setup.py +1 -1
  3. {encryptors-2.54 → encryptors-2.56}/src/Encryptors.egg-info/PKG-INFO +1 -1
  4. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Decorators/SecureResolver.py +24 -5
  5. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Graphql/_Helpers/_AuditHelper.py +12 -12
  6. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Helpers/AuditDispatcher.py +16 -20
  7. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Services/JwtAuthTokenService.py +0 -3
  8. {encryptors-2.54 → encryptors-2.56}/README.md +0 -0
  9. {encryptors-2.54 → encryptors-2.56}/setup.cfg +0 -0
  10. {encryptors-2.54 → encryptors-2.56}/src/Encryptors.egg-info/SOURCES.txt +0 -0
  11. {encryptors-2.54 → encryptors-2.56}/src/Encryptors.egg-info/dependency_links.txt +0 -0
  12. {encryptors-2.54 → encryptors-2.56}/src/Encryptors.egg-info/entry_points.txt +0 -0
  13. {encryptors-2.54 → encryptors-2.56}/src/Encryptors.egg-info/requires.txt +0 -0
  14. {encryptors-2.54 → encryptors-2.56}/src/Encryptors.egg-info/top_level.txt +0 -0
  15. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Cache/Redis.py +0 -0
  16. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Cache/__init__.py +0 -0
  17. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Cli/__init__.py +0 -0
  18. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Constants/Constant.py +0 -0
  19. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Constants/Message.py +0 -0
  20. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Constants/__init__.py +0 -0
  21. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Database/BaseRepository.py +0 -0
  22. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Database/Connection.py +0 -0
  23. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Database/__init__.py +0 -0
  24. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Decorators/Grpc.py +0 -0
  25. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Decorators/Retry.py +0 -0
  26. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Decorators/__init__.py +0 -0
  27. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Encryptor/Aes.py +0 -0
  28. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Encryptor/Argon2.py +0 -0
  29. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Encryptor/Bcrypt.py +0 -0
  30. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Encryptor/Jwt.py +0 -0
  31. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Encryptor/Rsa.py +0 -0
  32. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Encryptor/Sha512.py +0 -0
  33. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Encryptor/__init__.py +0 -0
  34. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Enums/FileType.py +0 -0
  35. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Enums/GrahpqlOperation.py +0 -0
  36. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Enums/Profile.py +0 -0
  37. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Enums/StatusCode.py +0 -0
  38. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Enums/__init__.py +0 -0
  39. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Exception/ControlledException.py +0 -0
  40. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Exception/__init__.py +0 -0
  41. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Graphql/Extensions/AuditExtension.py +0 -0
  42. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Graphql/Extensions/__init__.py +0 -0
  43. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Graphql/Models/__init__.py +0 -0
  44. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Graphql/_Exceptions/__init__.py +0 -0
  45. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Graphql/_Helpers/_ExtractAuthToken.py +0 -0
  46. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Graphql/_Helpers/_TenantPolicy.py +0 -0
  47. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Graphql/_Helpers/_TokenService.py +0 -0
  48. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Graphql/_Helpers/__init__.py +0 -0
  49. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Graphql/__init__.py +0 -0
  50. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Helpers/AzureClassifier.py +0 -0
  51. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Helpers/GrpcConnection.py +0 -0
  52. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Helpers/JwtTokenHelper.py +0 -0
  53. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Helpers/Resilience.py +0 -0
  54. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Helpers/ResponseDecryptor.py +0 -0
  55. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Helpers/_AuthTokenProcessor.py +0 -0
  56. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Helpers/__init__.py +0 -0
  57. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Http/APIClient.py +0 -0
  58. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Http/_Helpers.py +0 -0
  59. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Http/__init__.py +0 -0
  60. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Messaging/AzureServiceBus.py +0 -0
  61. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Messaging/Kafka.py +0 -0
  62. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Messaging/RabbitMQ.py +0 -0
  63. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Messaging/__init__.py +0 -0
  64. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Models/ApiResponse.py +0 -0
  65. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Models/AuditConfig.py +0 -0
  66. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Models/Notification.py +0 -0
  67. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Models/Response.py +0 -0
  68. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Models/Token.py +0 -0
  69. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Models/TokenClaims.py +0 -0
  70. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Models/_Audit.py +0 -0
  71. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Models/__init__.py +0 -0
  72. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Rest/Context/RequestContext.py +0 -0
  73. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Rest/Context/__init__.py +0 -0
  74. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Rest/Middlewares/RequestContextMiddleware.py +0 -0
  75. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Rest/Middlewares/__init__.py +0 -0
  76. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Rest/__init__.py +0 -0
  77. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Secrets/AzureKeyVaultProvider.py +0 -0
  78. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Secrets/__init__.py +0 -0
  79. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Services/WebsocketClient.py +0 -0
  80. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Services/__init__.py +0 -0
  81. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Storage/AzureBlobStorage.py +0 -0
  82. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Storage/S3Storage.py +0 -0
  83. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Storage/__init__.py +0 -0
  84. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Utils/CaseConverter.py +0 -0
  85. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Utils/CodeGenerator.py +0 -0
  86. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Utils/DataNormalizer.py +0 -0
  87. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Utils/DataUtils.py +0 -0
  88. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Utils/DateUtils.py +0 -0
  89. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Utils/FileMetaData.py +0 -0
  90. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Utils/HashValidator.py +0 -0
  91. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Utils/Mapper.py +0 -0
  92. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Utils/PasswordGenerator.py +0 -0
  93. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Utils/QueryGenerator.py +0 -0
  94. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Utils/RsaUtils.py +0 -0
  95. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Utils/TextProcessor.py +0 -0
  96. {encryptors-2.54 → encryptors-2.56}/src/Osdental/Utils/__init__.py +0 -0
  97. {encryptors-2.54 → encryptors-2.56}/src/Osdental/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: Encryptors
3
- Version: 2.54
3
+ Version: 2.56
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.54",
5
+ version="2.56",
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.54
3
+ Version: 2.56
4
4
  Summary: End-to-end algorithm library
5
5
  Author: OSDental LLC
6
6
  Author-email: support@osdental.ai
@@ -1,6 +1,6 @@
1
1
  import logging
2
2
  from functools import wraps
3
- from typing import Callable
3
+ from typing import Callable, Dict, Any
4
4
  from graphql import GraphQLResolveInfo
5
5
  from Osdental.Models.Response import Response
6
6
  from Osdental.Graphql.Models import BaseGraphQLContext
@@ -15,12 +15,20 @@ from Osdental.Helpers._AuthTokenProcessor import (
15
15
  extract_bearer_token, build_auth_token, decrypt_and_parse_payload
16
16
  )
17
17
  from Osdental.Enums.StatusCode import StatusCode
18
+ from Osdental.Helpers.AuditDispatcher import AuditDispatcher
18
19
 
19
20
 
20
21
  logger = logging.getLogger(__name__)
21
22
 
22
23
 
23
- def __test(dispatcher, request, request_payload, result, decrypted_key):
24
+ def __test(
25
+ dispatcher: AuditDispatcher,
26
+ request,
27
+ request_payload: Dict[str, Any],
28
+ result: Response,
29
+ decrypted_key: str
30
+ ) -> None:
31
+
24
32
  dispatcher.dispatch(
25
33
  request=request,
26
34
  request_payload=request_payload,
@@ -40,14 +48,16 @@ def resolver(public: bool = False, action=None):
40
48
  async def wrapper(obj, info: GraphQLResolveInfo, **kwargs):
41
49
  try:
42
50
  context: BaseGraphQLContext = info.context
51
+ container = context.container
43
52
  request = context.request
53
+ headers = request.headers
54
+ settings = container.settings
55
+
44
56
  token: type[AuthToken] | None = None
45
57
 
46
58
  # ── 1. AUTENTICACIÓN ──────────────────────────────
47
59
  if not public:
48
60
 
49
- headers = request.headers
50
- container = context.container
51
61
  token_service: IAuthTokenService = container.auth_token_service
52
62
  user_token = extract_bearer_token(headers)
53
63
 
@@ -93,9 +103,13 @@ def resolver(public: bool = False, action=None):
93
103
  if not isinstance(result, Response):
94
104
  raise TypeError("Resolver must return a Response instance")
95
105
 
96
- dispatcher = request.app.state.audit_dispatcher
106
+
97
107
 
98
108
  request_payload = {
109
+ "env": settings.environment,
110
+ "ms_name": settings.microservice_name,
111
+ "ms_version": settings.microservice_version,
112
+ "is_auditable": settings.is_auditable,
99
113
  "operation_type": info.operation.operation.value,
100
114
  "operation_name": body.get("operationName", "UnknownOperation"),
101
115
  "query": body.get("query"),
@@ -110,6 +124,11 @@ def resolver(public: bool = False, action=None):
110
124
  if isinstance(result, Response):
111
125
  decrypted_key = result.key if not token else token.aes_key_auth
112
126
 
127
+ dispatcher = AuditDispatcher(
128
+ messaging=container.az_sb_audit,
129
+ storage=container.az_blob_storage
130
+ )
131
+
113
132
  __test(
114
133
  dispatcher=dispatcher,
115
134
  request_payload=request_payload,
@@ -1,14 +1,14 @@
1
1
  import json
2
2
  from typing import Dict, Literal, Any, Optional
3
- from Osdental.Models._Audit import Audit
4
3
 
5
4
  class AuditHelper:
6
5
 
7
6
  @staticmethod
8
- async def build_request_payload(audit: Audit) -> Dict[str, Any]:
9
- request = audit.request
10
- audit_config = audit.audit_config
11
- payload = audit.payload
7
+ async def build_request_payload(
8
+ request,
9
+ payload: Dict[str, Any],
10
+ audit_type
11
+ ) -> Dict[str, Any]:
12
12
 
13
13
  default_value = "*"
14
14
 
@@ -30,19 +30,19 @@ class AuditHelper:
30
30
 
31
31
  return {
32
32
  "idMessageLog": request.headers.get("Idmessagelog"),
33
- "environment": audit_config.environment,
33
+ "environment": payload.get("env"),
34
34
  "header": json.dumps(headers),
35
35
  "microServiceUrl": str(request.url),
36
- "microServiceName": audit_config.microservice_name,
37
- "microServiceVersion": audit_config.microservice_version,
38
- "serviceName": audit.operation_name,
36
+ "microServiceName": payload.get("ms_name"),
37
+ "microServiceVersion": payload.get("ms_version"),
38
+ "serviceName": payload.get("operation_name"),
39
39
  "machineNameUser": request.headers.get("Machinenameuser", default_value),
40
40
  "ipUser": user_ip or default_value,
41
- "userName": audit.full_name,
41
+ "userName": payload.get("user"),
42
42
  "localitation": default_value,
43
43
  "httpMethod": request.method,
44
44
  "messageIn": json.dumps(payload) if payload else default_value,
45
- "auditLog": audit.audit_type
45
+ "auditLog": audit_type,
46
46
  }
47
47
 
48
48
  @staticmethod
@@ -64,4 +64,4 @@ class AuditHelper:
64
64
  "httpResponseCode": status_code,
65
65
  "messageOut": result,
66
66
  "errorProducer": error
67
- }
67
+ }
@@ -2,12 +2,10 @@ import logging
2
2
  import asyncio
3
3
  from typing import Dict, Any, Optional
4
4
  from fastapi import Request
5
- from Osdental.Models.AuditConfig import AuditConfig
6
5
  from Osdental.Messaging import IMessageQueue
7
6
  from Osdental.Graphql._Helpers._AuditHelper import AuditHelper
8
7
  from Osdental.Storage import IStorageService
9
8
  from Osdental.Helpers.ResponseDecryptor import decryptor_data, VALID_TYPES
10
- from Osdental.Models._Audit import Audit
11
9
  from Osdental.Models.Response import Response
12
10
  from Osdental.Models.ApiResponse import ApiResponse
13
11
  from Osdental.Constants.Constant import Constant
@@ -21,19 +19,14 @@ class AuditDispatcher:
21
19
  self,
22
20
  messaging: IMessageQueue,
23
21
  storage: IStorageService,
24
- audit_config: AuditConfig,
25
22
  max_queue_size: int = 5000
26
23
  ):
27
24
  self._messaging = messaging
28
25
  self._storage = storage
29
- self._audit_config = audit_config
26
+
30
27
  self._queue = asyncio.Queue(maxsize=max_queue_size)
31
28
  self._worker_task = None
32
29
 
33
- # Se llama en startup
34
- def start(self):
35
- self._worker_task = asyncio.create_task(self._worker())
36
-
37
30
  # Se llama en shutdown
38
31
  async def stop(self):
39
32
  # Esperar a que la cola se vacíe
@@ -56,6 +49,9 @@ class AuditDispatcher:
56
49
  audit_type: str = None
57
50
  ):
58
51
  try:
52
+ if self._worker_task is None:
53
+ self._worker_task = asyncio.create_task(self._worker())
54
+
59
55
  payload = {
60
56
  "request": request,
61
57
  "request_payload": request_payload,
@@ -87,31 +83,30 @@ class AuditDispatcher:
87
83
 
88
84
  # Logica
89
85
  async def _process(self, payload: Dict[str, Any]) -> None:
90
- if not self._audit_config.is_auditable:
91
- logger.info("Auditing is disabled. Skipping audit processing.")
92
- return
93
-
86
+
94
87
  import json
95
-
88
+
96
89
  request = payload["request"]
97
90
  request_payload = payload["request_payload"]
98
91
  result: Response | ApiResponse = payload["result"]
99
92
  audit_type = payload["audit_type"]
93
+
94
+ print(request_payload)
95
+
96
+ if not request_payload.get("is_auditable"):
97
+ logger.info("Auditing is disabled. Skipping audit processing.")
98
+ return
100
99
 
101
100
  operation_name = request_payload.get("operation_name")
102
101
  if operation_name == 'UnknownOperation':
103
102
  logger.info("Skipping audit: no data in GraphQL response")
104
103
  return
105
104
 
106
- audit = Audit(
107
- audit_type=audit_type,
105
+ request_audit_payload = await AuditHelper.build_request_payload(
108
106
  request=request,
109
- audit_config=self._audit_config,
110
- operation_name=operation_name,
111
- full_name=request_payload.get("user", "Joe Doe"),
112
- payload=request_payload.get("variables")
107
+ payload=request_payload,
108
+ audit_type=audit_type
113
109
  )
114
- request_audit_payload = await AuditHelper.build_request_payload(audit=audit)
115
110
 
116
111
  status_code = result.status
117
112
  message = result.message
@@ -168,6 +163,7 @@ class AuditDispatcher:
168
163
  data = json.dumps(audit_message)
169
164
  blob_name = f"audits/{message_log_id}.text"
170
165
  success = await self._storage.upload(blob_name, data)
166
+
171
167
  if not success:
172
168
  logger.error("Failed to upload audit log to storage. Skipping message dispatch.")
173
169
  return
@@ -79,7 +79,6 @@ class JwtAuthTokenService(IAuthTokenService):
79
79
  claims = self._jwt.validate_token(
80
80
  token=token,
81
81
  options=TokenValidationOptions(
82
- validate_expiration=True,
83
82
  validate_issuer=False,
84
83
  validate_audience=False,
85
84
  )
@@ -103,7 +102,6 @@ class JwtAuthTokenService(IAuthTokenService):
103
102
  claims = self._jwt.validate_token(
104
103
  token=token,
105
104
  options=TokenValidationOptions(
106
- validate_expiration=True,
107
105
  validate_issuer=False,
108
106
  validate_audience=False,
109
107
  )
@@ -127,7 +125,6 @@ class JwtAuthTokenService(IAuthTokenService):
127
125
  options=TokenValidationOptions(
128
126
  issuer=self._issuer,
129
127
  audience=self._audience,
130
- validate_expiration=True,
131
128
  validate_issuer=True,
132
129
  validate_audience=True,
133
130
  )
File without changes
File without changes