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.
- {encryptors-2.54 → encryptors-2.56}/PKG-INFO +1 -1
- {encryptors-2.54 → encryptors-2.56}/setup.py +1 -1
- {encryptors-2.54 → encryptors-2.56}/src/Encryptors.egg-info/PKG-INFO +1 -1
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Decorators/SecureResolver.py +24 -5
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Graphql/_Helpers/_AuditHelper.py +12 -12
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Helpers/AuditDispatcher.py +16 -20
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Services/JwtAuthTokenService.py +0 -3
- {encryptors-2.54 → encryptors-2.56}/README.md +0 -0
- {encryptors-2.54 → encryptors-2.56}/setup.cfg +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Encryptors.egg-info/SOURCES.txt +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Encryptors.egg-info/dependency_links.txt +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Encryptors.egg-info/entry_points.txt +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Encryptors.egg-info/requires.txt +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Encryptors.egg-info/top_level.txt +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Cache/Redis.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Cache/__init__.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Cli/__init__.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Constants/Constant.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Constants/Message.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Constants/__init__.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Database/BaseRepository.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Database/Connection.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Database/__init__.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Decorators/Grpc.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Decorators/Retry.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Decorators/__init__.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Encryptor/Aes.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Encryptor/Argon2.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Encryptor/Bcrypt.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Encryptor/Jwt.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Encryptor/Rsa.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Encryptor/Sha512.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Encryptor/__init__.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Enums/FileType.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Enums/GrahpqlOperation.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Enums/Profile.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Enums/StatusCode.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Enums/__init__.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Exception/ControlledException.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Exception/__init__.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Graphql/Extensions/AuditExtension.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Graphql/Extensions/__init__.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Graphql/Models/__init__.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Graphql/_Exceptions/__init__.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Graphql/_Helpers/_ExtractAuthToken.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Graphql/_Helpers/_TenantPolicy.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Graphql/_Helpers/_TokenService.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Graphql/_Helpers/__init__.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Graphql/__init__.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Helpers/AzureClassifier.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Helpers/GrpcConnection.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Helpers/JwtTokenHelper.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Helpers/Resilience.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Helpers/ResponseDecryptor.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Helpers/_AuthTokenProcessor.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Helpers/__init__.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Http/APIClient.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Http/_Helpers.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Http/__init__.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Messaging/AzureServiceBus.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Messaging/Kafka.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Messaging/RabbitMQ.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Messaging/__init__.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Models/ApiResponse.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Models/AuditConfig.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Models/Notification.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Models/Response.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Models/Token.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Models/TokenClaims.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Models/_Audit.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Models/__init__.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Rest/Context/RequestContext.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Rest/Context/__init__.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Rest/Middlewares/RequestContextMiddleware.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Rest/Middlewares/__init__.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Rest/__init__.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Secrets/AzureKeyVaultProvider.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Secrets/__init__.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Services/WebsocketClient.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Services/__init__.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Storage/AzureBlobStorage.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Storage/S3Storage.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Storage/__init__.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Utils/CaseConverter.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Utils/CodeGenerator.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Utils/DataNormalizer.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Utils/DataUtils.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Utils/DateUtils.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Utils/FileMetaData.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Utils/HashValidator.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Utils/Mapper.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Utils/PasswordGenerator.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Utils/QueryGenerator.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Utils/RsaUtils.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Utils/TextProcessor.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/Utils/__init__.py +0 -0
- {encryptors-2.54 → encryptors-2.56}/src/Osdental/__init__.py +0 -0
|
@@ -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.
|
|
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
|
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(
|
|
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
|
-
|
|
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(
|
|
9
|
-
request
|
|
10
|
-
|
|
11
|
-
|
|
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":
|
|
33
|
+
"environment": payload.get("env"),
|
|
34
34
|
"header": json.dumps(headers),
|
|
35
35
|
"microServiceUrl": str(request.url),
|
|
36
|
-
"microServiceName":
|
|
37
|
-
"microServiceVersion":
|
|
38
|
-
"serviceName":
|
|
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":
|
|
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":
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
107
|
-
audit_type=audit_type,
|
|
105
|
+
request_audit_payload = await AuditHelper.build_request_payload(
|
|
108
106
|
request=request,
|
|
109
|
-
|
|
110
|
-
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{encryptors-2.54 → encryptors-2.56}/src/Osdental/Rest/Middlewares/RequestContextMiddleware.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|