Encryptors 2.73__tar.gz → 2.75__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 (91) hide show
  1. {encryptors-2.73 → encryptors-2.75}/PKG-INFO +1 -1
  2. {encryptors-2.73 → encryptors-2.75}/setup.py +2 -2
  3. {encryptors-2.73 → encryptors-2.75}/src/Encryptors.egg-info/PKG-INFO +1 -1
  4. {encryptors-2.73 → encryptors-2.75}/src/Encryptors.egg-info/SOURCES.txt +1 -1
  5. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Decorators/SecureResolver.py +16 -6
  6. encryptors-2.75/src/Osdental/Services/GrpcConnection.py +60 -0
  7. encryptors-2.75/src/Osdental/Services/ServiceBusAuditEmitter.py +33 -0
  8. encryptors-2.73/src/Osdental/Helpers/GrpcConnection.py +0 -24
  9. encryptors-2.73/src/Osdental/Services/ServiceBusAuditEmitter.py +0 -22
  10. {encryptors-2.73 → encryptors-2.75}/README.md +0 -0
  11. {encryptors-2.73 → encryptors-2.75}/setup.cfg +0 -0
  12. {encryptors-2.73 → encryptors-2.75}/src/Encryptors.egg-info/dependency_links.txt +0 -0
  13. {encryptors-2.73 → encryptors-2.75}/src/Encryptors.egg-info/entry_points.txt +0 -0
  14. {encryptors-2.73 → encryptors-2.75}/src/Encryptors.egg-info/requires.txt +0 -0
  15. {encryptors-2.73 → encryptors-2.75}/src/Encryptors.egg-info/top_level.txt +0 -0
  16. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Cache/Redis.py +0 -0
  17. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Cache/__init__.py +0 -0
  18. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Cli/__init__.py +0 -0
  19. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Constants/Constant.py +0 -0
  20. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Constants/Message.py +0 -0
  21. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Constants/__init__.py +0 -0
  22. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Context/__init__.py +0 -0
  23. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Database/BaseRepository.py +0 -0
  24. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Database/Connection.py +0 -0
  25. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Database/__init__.py +0 -0
  26. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Decorators/Grpc.py +0 -0
  27. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Decorators/Retry.py +0 -0
  28. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Decorators/__init__.py +0 -0
  29. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Encryptor/Aes.py +0 -0
  30. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Encryptor/Argon2.py +0 -0
  31. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Encryptor/Bcrypt.py +0 -0
  32. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Encryptor/Jwt.py +0 -0
  33. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Encryptor/Rsa.py +0 -0
  34. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Encryptor/Sha512.py +0 -0
  35. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Encryptor/__init__.py +0 -0
  36. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Enums/AuditType.py +0 -0
  37. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Enums/CipherType.py +0 -0
  38. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Enums/FileType.py +0 -0
  39. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Enums/GrahpqlOperation.py +0 -0
  40. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Enums/GrpcStatusCode.py +0 -0
  41. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Enums/Profile.py +0 -0
  42. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Enums/ResultType.py +0 -0
  43. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Enums/Secret.py +0 -0
  44. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Enums/StatusCode.py +0 -0
  45. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Enums/__init__.py +0 -0
  46. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Exception/ControlledException.py +0 -0
  47. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Exception/__init__.py +0 -0
  48. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Helpers/AuditHelper.py +0 -0
  49. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Helpers/AuditQueue.py +0 -0
  50. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Helpers/AuthTokenProcessor.py +0 -0
  51. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Helpers/AzureClassifier.py +0 -0
  52. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Helpers/CipherHelper.py +0 -0
  53. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Helpers/JwtTokenHelper.py +0 -0
  54. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Helpers/Resilience.py +0 -0
  55. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Helpers/__init__.py +0 -0
  56. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Http/APIClient.py +0 -0
  57. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Http/__init__.py +0 -0
  58. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Messaging/AzureServiceBus.py +0 -0
  59. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Messaging/Kafka.py +0 -0
  60. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Messaging/RabbitMQ.py +0 -0
  61. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Messaging/__init__.py +0 -0
  62. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Models/ApiResponse.py +0 -0
  63. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Models/AuditContext.py +0 -0
  64. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Models/Graphql.py +0 -0
  65. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Models/Notification.py +0 -0
  66. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Models/Response.py +0 -0
  67. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Models/Token.py +0 -0
  68. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Models/TokenClaims.py +0 -0
  69. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Models/__init__.py +0 -0
  70. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Secrets/AzureKeyVaultProvider.py +0 -0
  71. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Secrets/__init__.py +0 -0
  72. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Services/JwtAuthTokenService.py +0 -0
  73. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Services/WebsocketClient.py +0 -0
  74. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Services/__init__.py +0 -0
  75. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Storage/AzureBlobStorage.py +0 -0
  76. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Storage/S3Storage.py +0 -0
  77. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Storage/__init__.py +0 -0
  78. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Utils/CaseConverter.py +0 -0
  79. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Utils/CodeGenerator.py +0 -0
  80. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Utils/DataNormalizer.py +0 -0
  81. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Utils/DataUtils.py +0 -0
  82. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Utils/DateUtils.py +0 -0
  83. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Utils/FileMetaData.py +0 -0
  84. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Utils/HashValidator.py +0 -0
  85. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Utils/Mapper.py +0 -0
  86. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Utils/PasswordGenerator.py +0 -0
  87. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Utils/QueryGenerator.py +0 -0
  88. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Utils/RsaUtils.py +0 -0
  89. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Utils/TextProcessor.py +0 -0
  90. {encryptors-2.73 → encryptors-2.75}/src/Osdental/Utils/__init__.py +0 -0
  91. {encryptors-2.73 → encryptors-2.75}/src/Osdental/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: Encryptors
3
- Version: 2.73
3
+ Version: 2.75
4
4
  Summary: End-to-end algorithm library
5
5
  Author: OSDental LLC
6
6
  Author-email: support@osdental.ai
@@ -1,8 +1,8 @@
1
1
  from setuptools import setup, find_packages
2
- # ANDERSON REVISAR EL CACHE LOCAL DEL KEYVAULT PARA VALIDAR SI FUNCIONA
2
+
3
3
  setup(
4
4
  name="Encryptors",
5
- version="2.73",
5
+ version="2.75",
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.73
3
+ Version: 2.75
4
4
  Summary: End-to-end algorithm library
5
5
  Author: OSDental LLC
6
6
  Author-email: support@osdental.ai
@@ -45,7 +45,6 @@ src/Osdental/Helpers/AuditQueue.py
45
45
  src/Osdental/Helpers/AuthTokenProcessor.py
46
46
  src/Osdental/Helpers/AzureClassifier.py
47
47
  src/Osdental/Helpers/CipherHelper.py
48
- src/Osdental/Helpers/GrpcConnection.py
49
48
  src/Osdental/Helpers/JwtTokenHelper.py
50
49
  src/Osdental/Helpers/Resilience.py
51
50
  src/Osdental/Helpers/__init__.py
@@ -65,6 +64,7 @@ src/Osdental/Models/TokenClaims.py
65
64
  src/Osdental/Models/__init__.py
66
65
  src/Osdental/Secrets/AzureKeyVaultProvider.py
67
66
  src/Osdental/Secrets/__init__.py
67
+ src/Osdental/Services/GrpcConnection.py
68
68
  src/Osdental/Services/JwtAuthTokenService.py
69
69
  src/Osdental/Services/ServiceBusAuditEmitter.py
70
70
  src/Osdental/Services/WebsocketClient.py
@@ -1,4 +1,5 @@
1
1
  import logging
2
+ import asyncio
2
3
  from functools import wraps
3
4
  from typing import Callable
4
5
  from graphql import GraphQLResolveInfo
@@ -124,8 +125,11 @@ def resolver(public: bool = False, action=None):
124
125
  raise TypeError("Resolver must return a Response instance")
125
126
 
126
127
  # ── 7. AUDITAR ÉXITO ──────────────────────
127
- await container.audit_emitter.emit(
128
- _build_success_payload(audit_ctx, result)
128
+ _ = asyncio.create_task(
129
+ container.audit_emitter.emit(
130
+ _build_success_payload(audit_ctx, result),
131
+ settings.is_auditable,
132
+ )
129
133
  )
130
134
 
131
135
  return result
@@ -133,8 +137,11 @@ def resolver(public: bool = False, action=None):
133
137
  except OSDException as e:
134
138
  logger.warning(f"Business error: {str(e)}")
135
139
  if audit_ctx:
136
- await container.audit_emitter.emit(
137
- _build_error_payload(audit_ctx, e)
140
+ _ = asyncio.create_task(
141
+ container.audit_emitter.emit(
142
+ _build_error_payload(audit_ctx, e),
143
+ settings.is_auditable,
144
+ )
138
145
  )
139
146
  return Response(
140
147
  status=e.status_code,
@@ -144,8 +151,11 @@ def resolver(public: bool = False, action=None):
144
151
  except Exception as e:
145
152
  logger.exception(f"Unexpected error: {str(e)}")
146
153
  if audit_ctx:
147
- await container.audit_emitter.emit(
148
- _build_unexpected_payload(audit_ctx, e)
154
+ _ = asyncio.create_task(
155
+ container.audit_emitter.emit(
156
+ _build_unexpected_payload(audit_ctx, e),
157
+ settings.is_auditable,
158
+ )
149
159
  )
150
160
  return Response(
151
161
  status=StatusCode.INTERNAL_SERVER_ERROR,
@@ -0,0 +1,60 @@
1
+ import asyncio
2
+ import grpc
3
+ from typing import Optional
4
+
5
+ class GrpcConnection:
6
+
7
+ DEFAULT_OPTIONS = (
8
+ ("grpc.keepalive_time_ms", 30000),
9
+ ("grpc.keepalive_timeout_ms", 10000),
10
+ ("grpc.keepalive_permit_without_calls", True),
11
+ ("grpc.http2.max_pings_without_data", 0),
12
+ )
13
+
14
+ def __init__(
15
+ self,
16
+ host: str,
17
+ secure: bool = True,
18
+ options=None,
19
+ ):
20
+ self.options = options or self.DEFAULT_OPTIONS
21
+ self.host = host
22
+ self.secure = secure
23
+ self._channel: Optional[grpc.aio.Channel] = None
24
+ self._lock = asyncio.Lock()
25
+
26
+ async def connect(self):
27
+
28
+ if self._channel:
29
+ return self._channel
30
+
31
+ async with self._lock:
32
+
33
+ if self._channel:
34
+ return self._channel
35
+
36
+ if self.secure:
37
+ creds = grpc.ssl_channel_credentials()
38
+
39
+ self._channel = grpc.aio.secure_channel(
40
+ self.host,
41
+ creds,
42
+ options=self.options,
43
+ )
44
+
45
+ else:
46
+
47
+ self._channel = grpc.aio.insecure_channel(
48
+ self.host,
49
+ options=self.options,
50
+ )
51
+
52
+ await self._channel.channel_ready()
53
+
54
+ return self._channel
55
+
56
+ async def close(self) -> None:
57
+
58
+ if self._channel is not None:
59
+ await self._channel.close()
60
+ self._channel = None
@@ -0,0 +1,33 @@
1
+ import logging
2
+ import json
3
+ from typing import Dict, Any
4
+ from Osdental.Messaging import IMessageQueue
5
+ from Osdental.Storage import IStorageService
6
+
7
+ logger = logging.getLogger(__name__)
8
+
9
+ class ServiceBusAuditEmitter:
10
+
11
+ def __init__(self, messaging: IMessageQueue, storage: IStorageService):
12
+ self._messaging = messaging
13
+ self._storage = storage
14
+
15
+
16
+ async def process(self, payload: Dict[str, Any], is_auditable: bool = False) -> None:
17
+ if not is_auditable:
18
+ logger.info("Skipping audit: no data in GraphQL response")
19
+ return
20
+
21
+ message_log_id = payload.get("idMessageLog")
22
+ data = json.dumps(payload)
23
+ blob_name = f"audits/{message_log_id}.text"
24
+ if not message_log_id:
25
+ logger.info("No Idmessagelog header found. Skipping audit storage.")
26
+ return
27
+
28
+ url = await self._storage.upload(blob_name, data)
29
+ if not url:
30
+ logger.warning("Skipping audit: The audit file could not be stored in blob storage.")
31
+ return
32
+
33
+ await self._messaging.send_message(blob_name)
@@ -1,24 +0,0 @@
1
- import grpc
2
- from typing import Optional
3
-
4
- class GrpcConnection:
5
-
6
- def __init__(self, host: str, secure: bool = True):
7
- self.host = host
8
- self.secure = secure
9
- self._channel: Optional[grpc.aio.Channel] = None
10
-
11
- def connect(self):
12
- if not self._channel:
13
- if self.secure:
14
- creds = grpc.ssl_channel_credentials()
15
- self._channel = grpc.aio.secure_channel(self.host, creds)
16
- else:
17
- self._channel = grpc.aio.insecure_channel(self.host)
18
-
19
- return self._channel
20
-
21
- async def close(self) -> None:
22
- if self._channel is not None:
23
- await self._channel.close()
24
- self._channel = None
@@ -1,22 +0,0 @@
1
- import json
2
- from typing import Dict, Any
3
- from Osdental.Messaging import IMessageQueue
4
- from Osdental.Storage import IStorageService
5
-
6
- class ServiceBusAuditEmitter:
7
-
8
- def __init__(self, messaging: IMessageQueue, storage: IStorageService):
9
- self._messaging = messaging
10
- self._storage = storage
11
-
12
-
13
- async def process(self, payload: Dict[str, Any]) -> None:
14
- message_log_id = payload.get("idMessageLog")
15
- data = json.dumps(payload)
16
- blob_name = f"audits/{message_log_id}.text"
17
- print(data)
18
- # url = await self._storage.upload(blob_name, data)
19
- # if not url:
20
- # return
21
-
22
- # await self._messaging.send_message(blob_name)
File without changes
File without changes