otdf-python 0.4.1__py3-none-any.whl → 0.4.2__py3-none-any.whl
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.
- otdf_python/autoconfigure_utils.py +0 -2
- otdf_python/collection_store.py +0 -1
- otdf_python/ecdh.py +0 -6
- otdf_python/kas_client.py +18 -0
- otdf_python/kas_connect_rpc_client.py +59 -19
- otdf_python/nanotdf.py +0 -8
- otdf_python/nanotdf_ecdsa_struct.py +0 -2
- otdf_python/nanotdf_type.py +1 -1
- otdf_python/sdk.py +2 -16
- otdf_python/sdk_builder.py +2 -6
- {otdf_python-0.4.1.dist-info → otdf_python-0.4.2.dist-info}/METADATA +3 -2
- {otdf_python-0.4.1.dist-info → otdf_python-0.4.2.dist-info}/RECORD +43 -34
- otdf_python_proto/__init__.py +2 -6
- otdf_python_proto/authorization/__init__.py +10 -0
- otdf_python_proto/authorization/authorization_connect.py +250 -0
- otdf_python_proto/authorization/v2/authorization_connect.py +315 -0
- otdf_python_proto/entityresolution/__init__.py +10 -0
- otdf_python_proto/entityresolution/entity_resolution_connect.py +185 -0
- otdf_python_proto/entityresolution/v2/entity_resolution_connect.py +185 -0
- otdf_python_proto/kas/__init__.py +2 -2
- otdf_python_proto/kas/kas_connect.py +259 -0
- otdf_python_proto/policy/actions/__init__.py +11 -0
- otdf_python_proto/policy/actions/actions_connect.py +380 -0
- otdf_python_proto/policy/attributes/__init__.py +11 -0
- otdf_python_proto/policy/attributes/attributes_connect.py +1310 -0
- otdf_python_proto/policy/kasregistry/__init__.py +11 -0
- otdf_python_proto/policy/kasregistry/key_access_server_registry_connect.py +912 -0
- otdf_python_proto/policy/keymanagement/__init__.py +11 -0
- otdf_python_proto/policy/keymanagement/key_management_connect.py +380 -0
- otdf_python_proto/policy/namespaces/__init__.py +11 -0
- otdf_python_proto/policy/namespaces/namespaces_connect.py +648 -0
- otdf_python_proto/policy/registeredresources/__init__.py +11 -0
- otdf_python_proto/policy/registeredresources/registered_resources_connect.py +770 -0
- otdf_python_proto/policy/resourcemapping/__init__.py +11 -0
- otdf_python_proto/policy/resourcemapping/resource_mapping_connect.py +790 -0
- otdf_python_proto/policy/subjectmapping/__init__.py +11 -0
- otdf_python_proto/policy/subjectmapping/subject_mapping_connect.py +851 -0
- otdf_python_proto/policy/unsafe/__init__.py +11 -0
- otdf_python_proto/policy/unsafe/unsafe_connect.py +705 -0
- otdf_python_proto/wellknownconfiguration/__init__.py +10 -0
- otdf_python_proto/wellknownconfiguration/wellknown_configuration_connect.py +124 -0
- otdf_python_proto/authorization/authorization_pb2_connect.py +0 -191
- otdf_python_proto/authorization/v2/authorization_pb2_connect.py +0 -233
- otdf_python_proto/entityresolution/entity_resolution_pb2_connect.py +0 -149
- otdf_python_proto/entityresolution/v2/entity_resolution_pb2_connect.py +0 -149
- otdf_python_proto/kas/kas_pb2_connect.py +0 -192
- otdf_python_proto/policy/actions/actions_pb2_connect.py +0 -275
- otdf_python_proto/policy/attributes/attributes_pb2_connect.py +0 -863
- otdf_python_proto/policy/kasregistry/key_access_server_registry_pb2_connect.py +0 -611
- otdf_python_proto/policy/keymanagement/key_management_pb2_connect.py +0 -275
- otdf_python_proto/policy/namespaces/namespaces_pb2_connect.py +0 -443
- otdf_python_proto/policy/registeredresources/registered_resources_pb2_connect.py +0 -527
- otdf_python_proto/policy/resourcemapping/resource_mapping_pb2_connect.py +0 -527
- otdf_python_proto/policy/subjectmapping/subject_mapping_pb2_connect.py +0 -569
- otdf_python_proto/policy/unsafe/unsafe_pb2_connect.py +0 -485
- otdf_python_proto/wellknownconfiguration/wellknown_configuration_pb2_connect.py +0 -107
- {otdf_python-0.4.1.dist-info → otdf_python-0.4.2.dist-info}/WHEEL +0 -0
- {otdf_python-0.4.1.dist-info → otdf_python-0.4.2.dist-info}/licenses/LICENSE +0 -0
otdf_python/collection_store.py
CHANGED
otdf_python/ecdh.py
CHANGED
|
@@ -35,20 +35,14 @@ NANOTDF_HKDF_SALT = bytes.fromhex(
|
|
|
35
35
|
class ECDHError(Exception):
|
|
36
36
|
"""Base exception for ECDH operations."""
|
|
37
37
|
|
|
38
|
-
pass
|
|
39
|
-
|
|
40
38
|
|
|
41
39
|
class UnsupportedCurveError(ECDHError):
|
|
42
40
|
"""Raised when an unsupported curve is specified."""
|
|
43
41
|
|
|
44
|
-
pass
|
|
45
|
-
|
|
46
42
|
|
|
47
43
|
class InvalidKeyError(ECDHError):
|
|
48
44
|
"""Raised when a key is invalid or malformed."""
|
|
49
45
|
|
|
50
|
-
pass
|
|
51
|
-
|
|
52
46
|
|
|
53
47
|
def get_curve(curve_name: str) -> ec.EllipticCurve:
|
|
54
48
|
"""Get the cryptography curve object for a given curve name.
|
otdf_python/kas_client.py
CHANGED
|
@@ -65,6 +65,24 @@ class KASClient:
|
|
|
65
65
|
self._dpop_public_key
|
|
66
66
|
)
|
|
67
67
|
|
|
68
|
+
def __enter__(self):
|
|
69
|
+
"""Enter context manager."""
|
|
70
|
+
return self
|
|
71
|
+
|
|
72
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
73
|
+
"""Exit context manager and clean up resources."""
|
|
74
|
+
self.close()
|
|
75
|
+
|
|
76
|
+
def close(self):
|
|
77
|
+
"""Close the KAS client and release resources.
|
|
78
|
+
|
|
79
|
+
This method should be called when the client is no longer needed
|
|
80
|
+
to properly clean up resources. It's also called automatically
|
|
81
|
+
when using the client as a context manager.
|
|
82
|
+
"""
|
|
83
|
+
if self.connect_rpc_client:
|
|
84
|
+
self.connect_rpc_client.close()
|
|
85
|
+
|
|
68
86
|
def _normalize_kas_url(self, url: str) -> str:
|
|
69
87
|
"""Normalize KAS URLs based on client security settings.
|
|
70
88
|
|
|
@@ -4,9 +4,9 @@ This class encapsulates all interactions with otdf_python_proto.
|
|
|
4
4
|
|
|
5
5
|
import logging
|
|
6
6
|
|
|
7
|
-
import
|
|
7
|
+
import httpx
|
|
8
8
|
from otdf_python_proto.kas import kas_pb2
|
|
9
|
-
from otdf_python_proto.kas.
|
|
9
|
+
from otdf_python_proto.kas.kas_connect import AccessServiceClientSync
|
|
10
10
|
|
|
11
11
|
from otdf_python.auth_headers import AuthHeaders
|
|
12
12
|
|
|
@@ -26,21 +26,56 @@ class KASConnectRPCClient:
|
|
|
26
26
|
"""
|
|
27
27
|
self.use_plaintext = use_plaintext
|
|
28
28
|
self.verify_ssl = verify_ssl
|
|
29
|
+
self._http_client = None
|
|
30
|
+
|
|
31
|
+
def __enter__(self):
|
|
32
|
+
"""Enter context manager and create HTTP client."""
|
|
33
|
+
self._http_client = self._create_http_client()
|
|
34
|
+
return self
|
|
35
|
+
|
|
36
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
37
|
+
"""Exit context manager and close HTTP client."""
|
|
38
|
+
self.close()
|
|
39
|
+
|
|
40
|
+
def close(self):
|
|
41
|
+
"""Close HTTP client and release resources.
|
|
42
|
+
|
|
43
|
+
This method should be called when the client is no longer needed
|
|
44
|
+
to properly clean up resources. It's also called automatically
|
|
45
|
+
when using the client as a context manager.
|
|
46
|
+
"""
|
|
47
|
+
if self._http_client is not None:
|
|
48
|
+
self._http_client.close()
|
|
49
|
+
self._http_client = None
|
|
29
50
|
|
|
30
51
|
def _create_http_client(self):
|
|
31
52
|
"""Create HTTP client with SSL verification configuration.
|
|
32
53
|
|
|
33
54
|
Returns:
|
|
34
|
-
|
|
55
|
+
httpx.Client configured for SSL verification settings
|
|
35
56
|
|
|
36
57
|
"""
|
|
37
58
|
if self.verify_ssl:
|
|
38
59
|
logging.info("Using SSL verification enabled HTTP client")
|
|
39
|
-
return
|
|
60
|
+
return httpx.Client()
|
|
40
61
|
else:
|
|
41
62
|
logging.info("Using SSL verification disabled HTTP client")
|
|
42
|
-
|
|
43
|
-
|
|
63
|
+
return httpx.Client(verify=False)
|
|
64
|
+
|
|
65
|
+
def _get_http_client(self):
|
|
66
|
+
"""Get HTTP client, creating one if needed for backward compatibility.
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
httpx.Client instance
|
|
70
|
+
|
|
71
|
+
"""
|
|
72
|
+
if self._http_client is None:
|
|
73
|
+
logging.warning(
|
|
74
|
+
"KASConnectRPCClient is being used without a context manager. "
|
|
75
|
+
"Consider using 'with KASConnectRPCClient(...) as client:' to ensure proper resource cleanup."
|
|
76
|
+
)
|
|
77
|
+
self._http_client = self._create_http_client()
|
|
78
|
+
return self._http_client
|
|
44
79
|
|
|
45
80
|
def _prepare_connect_rpc_url(self, kas_url):
|
|
46
81
|
"""Prepare the base URL for Connect RPC client.
|
|
@@ -93,8 +128,6 @@ class KASConnectRPCClient:
|
|
|
93
128
|
f"kas_url={kas_info.url}"
|
|
94
129
|
)
|
|
95
130
|
|
|
96
|
-
http_client = self._create_http_client()
|
|
97
|
-
|
|
98
131
|
try:
|
|
99
132
|
connect_rpc_base_url = self._prepare_connect_rpc_url(normalized_kas_url)
|
|
100
133
|
|
|
@@ -103,9 +136,13 @@ class KASConnectRPCClient:
|
|
|
103
136
|
f"for public key retrieval"
|
|
104
137
|
)
|
|
105
138
|
|
|
106
|
-
#
|
|
107
|
-
|
|
108
|
-
|
|
139
|
+
# Get or create HTTP client
|
|
140
|
+
http_client = self._get_http_client()
|
|
141
|
+
|
|
142
|
+
# Create Connect RPC client with configured HTTP client
|
|
143
|
+
client = AccessServiceClientSync(
|
|
144
|
+
address=connect_rpc_base_url, session=http_client
|
|
145
|
+
)
|
|
109
146
|
|
|
110
147
|
# Create public key request
|
|
111
148
|
algorithm = getattr(kas_info, "algorithm", "") or ""
|
|
@@ -116,10 +153,10 @@ class KASConnectRPCClient:
|
|
|
116
153
|
)
|
|
117
154
|
|
|
118
155
|
# Prepare headers with authentication if available
|
|
119
|
-
|
|
156
|
+
headers = self._prepare_auth_headers(access_token)
|
|
120
157
|
|
|
121
158
|
# Make the public key call with authentication headers
|
|
122
|
-
response = client.public_key(request,
|
|
159
|
+
response = client.public_key(request, headers=headers)
|
|
123
160
|
|
|
124
161
|
# Update kas_info with response
|
|
125
162
|
kas_info.public_key = response.public_key
|
|
@@ -158,8 +195,6 @@ class KASConnectRPCClient:
|
|
|
158
195
|
f"kas_url={key_access.url}"
|
|
159
196
|
)
|
|
160
197
|
|
|
161
|
-
http_client = self._create_http_client()
|
|
162
|
-
|
|
163
198
|
try:
|
|
164
199
|
kas_service_url = self._prepare_connect_rpc_url(normalized_kas_url)
|
|
165
200
|
|
|
@@ -167,8 +202,13 @@ class KASConnectRPCClient:
|
|
|
167
202
|
f"Creating Connect RPC client for base URL: {kas_service_url}, for unwrap"
|
|
168
203
|
)
|
|
169
204
|
|
|
170
|
-
#
|
|
171
|
-
|
|
205
|
+
# Get or create HTTP client
|
|
206
|
+
http_client = self._get_http_client()
|
|
207
|
+
|
|
208
|
+
# Create Connect RPC client with configured HTTP client
|
|
209
|
+
client = AccessServiceClientSync(
|
|
210
|
+
address=kas_service_url, session=http_client
|
|
211
|
+
)
|
|
172
212
|
|
|
173
213
|
# Create rewrap request
|
|
174
214
|
request = kas_pb2.RewrapRequest(
|
|
@@ -179,10 +219,10 @@ class KASConnectRPCClient:
|
|
|
179
219
|
logging.info(f"Connect RPC signed token: {signed_token}")
|
|
180
220
|
|
|
181
221
|
# Prepare headers with authentication if available
|
|
182
|
-
|
|
222
|
+
headers = self._prepare_auth_headers(access_token)
|
|
183
223
|
|
|
184
224
|
# Make the rewrap call with authentication headers
|
|
185
|
-
response = client.rewrap(request,
|
|
225
|
+
response = client.rewrap(request, headers=headers)
|
|
186
226
|
|
|
187
227
|
# Extract the entity wrapped key from v2 response structure
|
|
188
228
|
# The v2 response has responses[] array with results[] for each policy
|
otdf_python/nanotdf.py
CHANGED
|
@@ -28,26 +28,18 @@ from .asym_crypto import AsymDecryption
|
|
|
28
28
|
class NanoTDFException(SDKException):
|
|
29
29
|
"""Base exception for NanoTDF operations."""
|
|
30
30
|
|
|
31
|
-
pass
|
|
32
|
-
|
|
33
31
|
|
|
34
32
|
class NanoTDFMaxSizeLimit(NanoTDFException):
|
|
35
33
|
"""Exception for NanoTDF size limit exceeded."""
|
|
36
34
|
|
|
37
|
-
pass
|
|
38
|
-
|
|
39
35
|
|
|
40
36
|
class UnsupportedNanoTDFFeature(NanoTDFException):
|
|
41
37
|
"""Exception for unsupported NanoTDF features."""
|
|
42
38
|
|
|
43
|
-
pass
|
|
44
|
-
|
|
45
39
|
|
|
46
40
|
class InvalidNanoTDFConfig(NanoTDFException):
|
|
47
41
|
"""Exception for invalid NanoTDF configuration."""
|
|
48
42
|
|
|
49
|
-
pass
|
|
50
|
-
|
|
51
43
|
|
|
52
44
|
class NanoTDF:
|
|
53
45
|
"""NanoTDF reader and writer for compact TDF format."""
|
otdf_python/nanotdf_type.py
CHANGED
otdf_python/sdk.py
CHANGED
|
@@ -134,7 +134,8 @@ class KAS(AbstractContextManager):
|
|
|
134
134
|
|
|
135
135
|
def close(self):
|
|
136
136
|
"""Close resources associated with KAS interface."""
|
|
137
|
-
|
|
137
|
+
if self._kas_client:
|
|
138
|
+
self._kas_client.close()
|
|
138
139
|
|
|
139
140
|
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
140
141
|
self.close()
|
|
@@ -219,7 +220,6 @@ class SDK(AbstractContextManager):
|
|
|
219
220
|
|
|
220
221
|
def close(self):
|
|
221
222
|
"""Close resources associated with the services."""
|
|
222
|
-
pass
|
|
223
223
|
|
|
224
224
|
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
225
225
|
self.close()
|
|
@@ -377,23 +377,15 @@ class SDK(AbstractContextManager):
|
|
|
377
377
|
class SplitKeyException(SDKException):
|
|
378
378
|
"""Throw when SDK encounters error related to split key operations."""
|
|
379
379
|
|
|
380
|
-
pass
|
|
381
|
-
|
|
382
380
|
class DataSizeNotSupported(SDKException):
|
|
383
381
|
"""Throw when user attempts to create TDF larger than maximum size."""
|
|
384
382
|
|
|
385
|
-
pass
|
|
386
|
-
|
|
387
383
|
class KasInfoMissing(SDKException):
|
|
388
384
|
"""Throw during TDF creation when no KAS information is present."""
|
|
389
385
|
|
|
390
|
-
pass
|
|
391
|
-
|
|
392
386
|
class KasPublicKeyMissing(SDKException):
|
|
393
387
|
"""Throw during encryption when SDK cannot retrieve public key for KAS."""
|
|
394
388
|
|
|
395
|
-
pass
|
|
396
|
-
|
|
397
389
|
class TamperException(SDKException):
|
|
398
390
|
"""Base class for exceptions related to signature mismatches."""
|
|
399
391
|
|
|
@@ -407,18 +399,12 @@ class SDK(AbstractContextManager):
|
|
|
407
399
|
class SegmentSignatureMismatch(TamperException):
|
|
408
400
|
"""Throw when segment signature does not match expected value."""
|
|
409
401
|
|
|
410
|
-
pass
|
|
411
|
-
|
|
412
402
|
class KasBadRequestException(SDKException):
|
|
413
403
|
"""Throw when KAS returns bad request response."""
|
|
414
404
|
|
|
415
|
-
pass
|
|
416
|
-
|
|
417
405
|
class KasAllowlistException(SDKException):
|
|
418
406
|
"""Throw when KAS allowlist check fails."""
|
|
419
407
|
|
|
420
|
-
pass
|
|
421
|
-
|
|
422
408
|
class AssertionException(SDKException):
|
|
423
409
|
"""Throw when an assertion validation fails."""
|
|
424
410
|
|
otdf_python/sdk_builder.py
CHANGED
|
@@ -120,9 +120,7 @@ class SDKBuilder:
|
|
|
120
120
|
|
|
121
121
|
"""
|
|
122
122
|
# Normalize the endpoint URL
|
|
123
|
-
if endpoint and not (
|
|
124
|
-
endpoint.startswith("http://") or endpoint.startswith("https://")
|
|
125
|
-
):
|
|
123
|
+
if endpoint and not (endpoint.startswith(("http://", "https://"))):
|
|
126
124
|
if self.use_plaintext:
|
|
127
125
|
endpoint = f"http://{endpoint}"
|
|
128
126
|
else:
|
|
@@ -143,9 +141,7 @@ class SDKBuilder:
|
|
|
143
141
|
|
|
144
142
|
"""
|
|
145
143
|
# Normalize the issuer URL
|
|
146
|
-
if issuer and not (
|
|
147
|
-
issuer.startswith("http://") or issuer.startswith("https://")
|
|
148
|
-
):
|
|
144
|
+
if issuer and not (issuer.startswith(("http://", "https://"))):
|
|
149
145
|
issuer = f"https://{issuer}"
|
|
150
146
|
|
|
151
147
|
self.issuer_endpoint = issuer
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: otdf-python
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.2
|
|
4
4
|
Summary: Unofficial OpenTDF SDK for Python
|
|
5
5
|
Project-URL: Homepage, https://github.com/b-long/opentdf-python-sdk
|
|
6
6
|
Project-URL: Repository, https://github.com/b-long/opentdf-python-sdk
|
|
@@ -22,13 +22,14 @@ Classifier: Topic :: Security :: Cryptography
|
|
|
22
22
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
23
23
|
Classifier: Typing :: Typed
|
|
24
24
|
Requires-Python: >=3.10
|
|
25
|
-
Requires-Dist: connect-python
|
|
25
|
+
Requires-Dist: connect-python<0.7,>=0.6.0
|
|
26
26
|
Requires-Dist: cryptography>=45.0.4
|
|
27
27
|
Requires-Dist: grpcio-status>=1.74.0
|
|
28
28
|
Requires-Dist: grpcio-tools>=1.74.0
|
|
29
29
|
Requires-Dist: grpcio>=1.74.0
|
|
30
30
|
Requires-Dist: httpx>=0.28.1
|
|
31
31
|
Requires-Dist: protobuf>=6.31.1
|
|
32
|
+
Requires-Dist: protoc-gen-connect-python<0.7,>=0.6.0
|
|
32
33
|
Requires-Dist: protoc-gen-openapiv2>=0.0.1
|
|
33
34
|
Requires-Dist: pyjwt>=2.10.1
|
|
34
35
|
Requires-Dist: typing-extensions>=4.14.1
|
|
@@ -5,9 +5,9 @@ otdf_python/aesgcm.py,sha256=jQgVSEeKM6MJuH2tvlClXIzvg11a5O_GEY9Sh56CrxE,1947
|
|
|
5
5
|
otdf_python/assertion_config.py,sha256=rw0SIB3xG-nAeb5r_liuxLphU4tcj-zlq8rVvXncX-Y,2317
|
|
6
6
|
otdf_python/asym_crypto.py,sha256=EYkMNhZJP5khH0IvICTOG2bMg_TMvd6wXDu5zW0jpj4,7234
|
|
7
7
|
otdf_python/auth_headers.py,sha256=uOLflFunBCw59nwk23rdiFQWOFrS19HugQXuQPGv3xE,986
|
|
8
|
-
otdf_python/autoconfigure_utils.py,sha256=
|
|
8
|
+
otdf_python/autoconfigure_utils.py,sha256=W5aJ0tC7HWfGb_1Mva_oxgduUzSpPoyDeaq0rPwgPAs,3689
|
|
9
9
|
otdf_python/cli.py,sha256=HKIzuIXIW2sBwW3jy9sGq8WVFlxlKrdKac9MjJig88Y,19940
|
|
10
|
-
otdf_python/collection_store.py,sha256=
|
|
10
|
+
otdf_python/collection_store.py,sha256=sYL6VMFDBfHfCCLk14iybeC_qoUlpJFB0wOMt1bdwpY,1429
|
|
11
11
|
otdf_python/collection_store_impl.py,sha256=3RqO3rvDCosajKpuls5DiO2_SWYsNQul9_9L7n-lQ68,758
|
|
12
12
|
otdf_python/config.py,sha256=l1Ykg1gFUrFZTnd6bwMI6oi_clR5uCZ_Y1qH7QKtW90,2523
|
|
13
13
|
otdf_python/connect_client.py,sha256=TpHpcU2t19pSqWn30cqzfM48nDG590BfNTlDPgUu054,45
|
|
@@ -16,27 +16,27 @@ otdf_python/crypto_utils.py,sha256=x0cEltQDVW8bxJ9L555KQKJU4_dI5Uw2h7j9oQGNT38,2
|
|
|
16
16
|
otdf_python/dpop.py,sha256=-76xjKz9Alf529StB_jQWhr-gCAOBkpssaSYQw2EH1A,2295
|
|
17
17
|
otdf_python/ecc_constants.py,sha256=rCVZCWZ9zhyq2sqnUGFadiZ1CwXXe5T9olDtFYCJCIs,5846
|
|
18
18
|
otdf_python/ecc_mode.py,sha256=aEAISAZpXcS72gXRUlYgH8n8EJP7zIpOeSVPxUJdAG8,3163
|
|
19
|
-
otdf_python/ecdh.py,sha256=
|
|
19
|
+
otdf_python/ecdh.py,sha256=fwxE80qFSIkfJeUz3GNhEndRKkZrBN06FE1gnvwUHHI,10201
|
|
20
20
|
otdf_python/eckeypair.py,sha256=qcPKv0OS1lYxRICj9dhAW_eMz32anFBtpI8EJfXxpX0,2470
|
|
21
21
|
otdf_python/header.py,sha256=peG14kE_KAUCW4fY82sqcWF5zTAVAnJfFXCHtC8Z0iQ,7189
|
|
22
22
|
otdf_python/invalid_zip_exception.py,sha256=M_bAiXEjJdxPfA178YH-uHGRwMrNBKzjQzlQ54aDP2w,292
|
|
23
|
-
otdf_python/kas_client.py,sha256=
|
|
24
|
-
otdf_python/kas_connect_rpc_client.py,sha256=
|
|
23
|
+
otdf_python/kas_client.py,sha256=6q61WHUPAaDdLET0EkFbIpGMy9hHFCJoA3gs4xbd9FE,26542
|
|
24
|
+
otdf_python/kas_connect_rpc_client.py,sha256=cB3cBomCClmu-InUpw8R35cLyJQ8X0PoEsFvYSH0RUM,8950
|
|
25
25
|
otdf_python/kas_info.py,sha256=V-5om8k4RKbhE0h1CS1Rxb18TYcHKvq_hEPP6ah8K_o,738
|
|
26
26
|
otdf_python/kas_key_cache.py,sha256=6hfzRAg9o_IfRErWSe-_gGTG9kRyYENMizMY1Shkmfk,1548
|
|
27
27
|
otdf_python/key_type.py,sha256=2gQlXOj35J3ISCcWjU3sGYUxmlZR47BMq6Xr2yoKA8k,928
|
|
28
28
|
otdf_python/key_type_constants.py,sha256=MV2Dsea3A6nnnYztoD0N1QxhrbQXZfaXaqCr2rI6sqo,954
|
|
29
29
|
otdf_python/manifest.py,sha256=aglGw9EdtZZIxmwqy82sV5wum_mKkjzew4brSgxmJjc,7047
|
|
30
|
-
otdf_python/nanotdf.py,sha256
|
|
31
|
-
otdf_python/nanotdf_ecdsa_struct.py,sha256=
|
|
32
|
-
otdf_python/nanotdf_type.py,sha256=
|
|
30
|
+
otdf_python/nanotdf.py,sha256=lJgO7Go6qhdvQ8TTvglMBkxn0fg2VTDkPNgcfOhJabY,34033
|
|
31
|
+
otdf_python/nanotdf_ecdsa_struct.py,sha256=jTQKFAicTfMfN9CxJZYQcnEYGmtfAQoDOhz8ta-pGAQ,4066
|
|
32
|
+
otdf_python/nanotdf_type.py,sha256=3MQzT6lJ3WJKMICFyyYZXX2_cFYcZ5G4m1uif-l9Nxo,1112
|
|
33
33
|
otdf_python/policy_binding_serializer.py,sha256=oOcGBYOISPTzHRtk8JszwLTraY_F2OoevOf0a53jGHA,1271
|
|
34
34
|
otdf_python/policy_info.py,sha256=aq74dZg9PhTZ6cMkZyFsu3D754C5YijFMiuoYEL-1bY,2076
|
|
35
35
|
otdf_python/policy_object.py,sha256=LikIsahPkKr-iYA0lhgQitCbh8CsmxUBYyBs6VYfmxY,512
|
|
36
36
|
otdf_python/policy_stub.py,sha256=RfU_fICqsAOnTXOHpKhtKC0RJ3KoWhDxO0XecZWM548,159
|
|
37
37
|
otdf_python/resource_locator.py,sha256=bjK935XcfNq-PyqidHNq8eIiPeZEStYdQvmQ9B9GY20,6290
|
|
38
|
-
otdf_python/sdk.py,sha256=
|
|
39
|
-
otdf_python/sdk_builder.py,sha256=
|
|
38
|
+
otdf_python/sdk.py,sha256=4aIdIDhx2dMPRMfp9U8gzpwiqSeBf7SrEewb2BjB6PM,14012
|
|
39
|
+
otdf_python/sdk_builder.py,sha256=ltnFZD7ClVVwhGwu6ew4WNiNj0NB3n2Xn_MTEcbIMxo,14497
|
|
40
40
|
otdf_python/sdk_exceptions.py,sha256=2GElGyM5LKN8Uh_lAiT6Ho4oNRWYRQsMNOK5s2jiv28,687
|
|
41
41
|
otdf_python/symmetric_and_payload_config.py,sha256=iPHeZSeY9BjsQ-wkvdm6-FIR7773EgGiaIvSG-ICOHw,1158
|
|
42
42
|
otdf_python/tdf.py,sha256=PtVBY_vAPIGz1I4gUlHPLPxa1gCCsd2nlRm0SrbaoJA,20840
|
|
@@ -46,31 +46,31 @@ otdf_python/token_source.py,sha256=YHbP7deSSXo1CvzVGJX7DkOuBgqwfP_Ockm8CE-MN0o,1
|
|
|
46
46
|
otdf_python/version.py,sha256=uDKJKsSQoaEH-JlqAwiXDxceLRX9hkG4I3NVLEfDCHA,2025
|
|
47
47
|
otdf_python/zip_reader.py,sha256=qrHv-ecs09tz99ZKdOMiWaciYf2XsQOUTiXy1JHjuEY,1705
|
|
48
48
|
otdf_python/zip_writer.py,sha256=5-KChgEXCf4TKAAML-R8cqpAiap85ur1l2lJCCac6BE,2405
|
|
49
|
-
otdf_python_proto/__init__.py,sha256=
|
|
50
|
-
otdf_python_proto/authorization/__init__.py,sha256=
|
|
49
|
+
otdf_python_proto/__init__.py,sha256=nZXR7jFOxpw52PahIE5PzTm5xEmH01xphIq5PTH_Qhc,925
|
|
50
|
+
otdf_python_proto/authorization/__init__.py,sha256=PQ8pNK86JNhOg7rcvbOQzAx5nm0hdjQqj-xIwDD4izY,237
|
|
51
|
+
otdf_python_proto/authorization/authorization_connect.py,sha256=Z4Xnz39cc9Dp74HBWc4uM-3aKRdSD0fcBoz2OCNbppw,12287
|
|
51
52
|
otdf_python_proto/authorization/authorization_pb2.py,sha256=VxRCF1popd01Po0uC-H3Uz85Z6y39ICuzwjFuRWkDoE,9085
|
|
52
53
|
otdf_python_proto/authorization/authorization_pb2.pyi,sha256=43mV-jbbgxjvzuKkJE-tcLg4JrqtqoQwB5WT9k4j3Ew,8927
|
|
53
|
-
otdf_python_proto/authorization/
|
|
54
|
+
otdf_python_proto/authorization/v2/authorization_connect.py,sha256=K5yRvu3JfA9ljtbTsXJ3KMx9GAUypLpqiI8IPPgiIZs,16310
|
|
54
55
|
otdf_python_proto/authorization/v2/authorization_pb2.py,sha256=pz5GE1cBmcyWHCG3ba46_We-ywY7dx2oxZwHgvtJJtA,12998
|
|
55
56
|
otdf_python_proto/authorization/v2/authorization_pb2.pyi,sha256=0azk9XIOxBU5u0b8_PnHnfaGM13tQPBgN4i42oRSI2Q,7497
|
|
56
|
-
otdf_python_proto/authorization/v2/authorization_pb2_connect.py,sha256=UdsbFiFW2_yDIKsUlhgM4mUWzZaZ8J8rfxqVwWFjMYY,13129
|
|
57
57
|
otdf_python_proto/common/__init__.py,sha256=cJlVANj7I0xoLUerst-2su60AFtywyrFHPOIKIzS65Q,35
|
|
58
58
|
otdf_python_proto/common/common_pb2.py,sha256=F2Ap8Lf-LJGnk_-BsrAfoidYtkkTsc24OvZgikBigDs,3599
|
|
59
59
|
otdf_python_proto/common/common_pb2.pyi,sha256=iitFFATcqvxfhdgAGlPFmYeyHeLSyBKKzvSNgm8kioM,2860
|
|
60
60
|
otdf_python_proto/entity/__init__.py,sha256=Q5bx_n1hD8DQR8f78iflJzw90RJZLeIj--Q6YaHqJ_4,35
|
|
61
61
|
otdf_python_proto/entity/entity_pb2.py,sha256=LpdkNpqn-L808SfYI6JWATfmud_9oYRpHbnX02qXQB8,3178
|
|
62
62
|
otdf_python_proto/entity/entity_pb2.pyi,sha256=vkQau-BYeQvGV_Sr0YqqPDgiLuecErOey_Dn0zpHTN4,2423
|
|
63
|
-
otdf_python_proto/entityresolution/__init__.py,sha256=
|
|
63
|
+
otdf_python_proto/entityresolution/__init__.py,sha256=ehWfHEQ42uXht7gxRIr4jlwGq-OcYZUDLqwyhDo9-oI,228
|
|
64
|
+
otdf_python_proto/entityresolution/entity_resolution_connect.py,sha256=XniXuD9UVp44ZNt8DE7DEp4Y75sYjLYFvpikzN8uavU,9547
|
|
64
65
|
otdf_python_proto/entityresolution/entity_resolution_pb2.py,sha256=XrPNnZ7GvHE0w0iHharpSte30l_DjhDlNE__mJigWTg,5032
|
|
65
66
|
otdf_python_proto/entityresolution/entity_resolution_pb2.pyi,sha256=Yn8snkOsfkYPb4CngTMJcTe75RdOJUT_Yo4rk-mMTaM,3001
|
|
66
|
-
otdf_python_proto/entityresolution/
|
|
67
|
+
otdf_python_proto/entityresolution/v2/entity_resolution_connect.py,sha256=VCu9jytqWuF__a08LX5iIo_kFbJEbXfkYsuAu_xoaik,9948
|
|
67
68
|
otdf_python_proto/entityresolution/v2/entity_resolution_pb2.py,sha256=G_CHQ76xCYAV6hfY1-tbncOCu7FqtdLH2FzOwO0vlvM,4680
|
|
68
69
|
otdf_python_proto/entityresolution/v2/entity_resolution_pb2.pyi,sha256=wRcDT1bcKvyjMgPi8-MrQYLUDEaWjy2MY0YbsxF3Gjo,2942
|
|
69
|
-
otdf_python_proto/
|
|
70
|
-
otdf_python_proto/kas/
|
|
70
|
+
otdf_python_proto/kas/__init__.py,sha256=k72BA06RTfm0yGAL-H6dDkQFBUiZJXT3RHnIQIRpwhs,220
|
|
71
|
+
otdf_python_proto/kas/kas_connect.py,sha256=aBPlxHUcB_XAPgLi4ElXyrefdnrrrYKFb_PbDw9Yg_w,10860
|
|
71
72
|
otdf_python_proto/kas/kas_pb2.py,sha256=FuWeaQYjICzKFmovm1sqdAPCcDn-tariNUs4CHHNUV8,11431
|
|
72
73
|
otdf_python_proto/kas/kas_pb2.pyi,sha256=w-S-AoFOZn3jn39iLyLFW4Sw4bKxr0GA8OSVF-SnR-s,8594
|
|
73
|
-
otdf_python_proto/kas/kas_pb2_connect.py,sha256=kFOs0mwynx-lutAqNp5m3HvEQyVCCAjHtj4JcJ8Q-Yo,8664
|
|
74
74
|
otdf_python_proto/legacy_grpc/__init__.py,sha256=zpWWFl-aIfDdJqBnMFk6lDSzsKfZ4pjkp2LYxGE1S9c,40
|
|
75
75
|
otdf_python_proto/legacy_grpc/authorization/authorization_pb2_grpc.py,sha256=Xn_jbL7EyOKolHp_0wxOqN3Eqm0eWjb4meB6X8xJPM0,6922
|
|
76
76
|
otdf_python_proto/legacy_grpc/authorization/v2/authorization_pb2_grpc.py,sha256=i6SlVNT3uRfKr11hIZGGwPmmCZag-28kUzJjj8h_Zy0,9109
|
|
@@ -100,38 +100,47 @@ otdf_python_proto/policy/objects_pb2.py,sha256=4izyxIYyD_9q6Bj3hff5cfjgvYIGW6ewZ
|
|
|
100
100
|
otdf_python_proto/policy/objects_pb2.pyi,sha256=nuK89_2Z1R6I1xE0EokL2lUdEIEuzVFne0IqykpC7uI,24523
|
|
101
101
|
otdf_python_proto/policy/selectors_pb2.py,sha256=uqgIS0DtfOYDqzJ6WNq9D9aLa-RnTpN9a5o7YGMF7xM,5301
|
|
102
102
|
otdf_python_proto/policy/selectors_pb2.pyi,sha256=FdC8ZLkgBBspwdjA1JlaeSgPo3R2qUIDws-9vNRXAUs,5162
|
|
103
|
+
otdf_python_proto/policy/actions/__init__.py,sha256=GPRrOk6_i6Jgj9PrWX8tCdqYoVKdJJp7ucu1XtY3iFU,208
|
|
104
|
+
otdf_python_proto/policy/actions/actions_connect.py,sha256=jdmPjw8LdyaEACeHVsU075FUqV39vmGs8tIxF151Uj8,18087
|
|
103
105
|
otdf_python_proto/policy/actions/actions_pb2.py,sha256=QRcrBnuu1iDWjVQLl0dWHCwuOwnLguzn4w9f2201xjM,8858
|
|
104
106
|
otdf_python_proto/policy/actions/actions_pb2.pyi,sha256=ZBgv2xtG4PW7vXUJkzbfvMPaKUmztVw6_FG5iN0Ph-I,4298
|
|
105
|
-
otdf_python_proto/policy/
|
|
107
|
+
otdf_python_proto/policy/attributes/__init__.py,sha256=3lHYfbXDGAuuhfSwb1YJfVJJWPvTtcoshyhLOi_hIr0,226
|
|
108
|
+
otdf_python_proto/policy/attributes/attributes_connect.py,sha256=r-_r5pqiFr_CCQ05UnzbEcYld2KOY4nY5q0s2cYxnp4,72451
|
|
106
109
|
otdf_python_proto/policy/attributes/attributes_pb2.py,sha256=wnK1qsuOVOePneFfDGtBDxiyvP9S8XA48mMTexybYBE,33029
|
|
107
110
|
otdf_python_proto/policy/attributes/attributes_pb2.pyi,sha256=lpxvoxiRhSn1LEupx1fOcBc6pOdWcrTXAx_boHvGFZY,16259
|
|
108
|
-
otdf_python_proto/policy/
|
|
111
|
+
otdf_python_proto/policy/kasregistry/__init__.py,sha256=zj_8G65KIhOSiOeMkyMEZFomWYkfD9E5aWASgwV4n3M,295
|
|
112
|
+
otdf_python_proto/policy/kasregistry/key_access_server_registry_connect.py,sha256=L5r5ZAMnM8gfEdPXZiQ61MrCxtlzvpaxjJGZj5MsEQk,52727
|
|
109
113
|
otdf_python_proto/policy/kasregistry/key_access_server_registry_pb2.py,sha256=5RRqC6MsfBM9TEmPedRZYKMjdVWptMXXTUolUU4FPXI,45921
|
|
110
114
|
otdf_python_proto/policy/kasregistry/key_access_server_registry_pb2.pyi,sha256=hpIgoFXZtY6HsjfHPi_Ybxm0CddK_AYy8YTlfdzR1Jk,24030
|
|
111
|
-
otdf_python_proto/policy/
|
|
115
|
+
otdf_python_proto/policy/keymanagement/__init__.py,sha256=baBSBdjBbaErAIjjn0GxUPfYYRq7R4MfsrvpK02uews,245
|
|
116
|
+
otdf_python_proto/policy/keymanagement/key_management_connect.py,sha256=-e1fc4S3-xJ_Tdy9T0JMMTXIFhMeN7qx0sls-gMUjeM,20883
|
|
112
117
|
otdf_python_proto/policy/keymanagement/key_management_pb2.py,sha256=MVAJKkR_B2nqN9jqWg7JLWByKFFfoi4unj1hbToByCE,8129
|
|
113
118
|
otdf_python_proto/policy/keymanagement/key_management_pb2.pyi,sha256=9HoPHqEKIO8jhx9TpkwFJWSHiInpkq04LiNPUCYeDU4,4381
|
|
114
|
-
otdf_python_proto/policy/
|
|
119
|
+
otdf_python_proto/policy/namespaces/__init__.py,sha256=JIdic8yq55x9BrQzaJtgEp3J7AcnOZ1c0eiTXd2iDpw,222
|
|
120
|
+
otdf_python_proto/policy/namespaces/namespaces_connect.py,sha256=gJmN8r8bCDX9KTyEJc7X5RnvgxPiANfRvTTFNom06wk,35163
|
|
115
121
|
otdf_python_proto/policy/namespaces/namespaces_pb2.py,sha256=NTdUbii-WF0VNiVvM29ZmAni7W4dgmNkOGq2ytP31pk,15222
|
|
116
122
|
otdf_python_proto/policy/namespaces/namespaces_pb2.pyi,sha256=plOpaSBszfi7p71XKZvTg1e1nJUhvoz1wrcYDX9cByQ,7148
|
|
117
|
-
otdf_python_proto/policy/
|
|
123
|
+
otdf_python_proto/policy/registeredresources/__init__.py,sha256=U6A5CRMFUhwjxOdxaRpgfIBx9bJZ7KcnBNKPQouSaeI,281
|
|
124
|
+
otdf_python_proto/policy/registeredresources/registered_resources_connect.py,sha256=FVJPkbH7vO_oUiJRW6qW2nkJhmomO_9YQ1yDCEYYhQ8,48569
|
|
118
125
|
otdf_python_proto/policy/registeredresources/registered_resources_pb2.py,sha256=5pb4vm0SEOG-U8FORKa9Z1Fe2tbgcWEEJworZE_LS00,23112
|
|
119
126
|
otdf_python_proto/policy/registeredresources/registered_resources_pb2.pyi,sha256=MsFkcXQbdvu7JQGeS-HYFHB7V3yWtpAPEmhoARjDvMI,10132
|
|
120
|
-
otdf_python_proto/policy/
|
|
127
|
+
otdf_python_proto/policy/resourcemapping/__init__.py,sha256=9_It9dJRLAOIf1y9n3LxEQa7-WI51B_E3OfhKBNuFw4,257
|
|
128
|
+
otdf_python_proto/policy/resourcemapping/resource_mapping_connect.py,sha256=RdhIMj6FLUxFNsCL2edVJRRJPefEe9enkWpsU2Y9djo,46405
|
|
121
129
|
otdf_python_proto/policy/resourcemapping/resource_mapping_pb2.py,sha256=vnMJu2jEr3NHH5aUx5hquQAyHlUwtgh2lL9YdXil2bs,21745
|
|
122
130
|
otdf_python_proto/policy/resourcemapping/resource_mapping_pb2.pyi,sha256=B4I6nj1bHNI8VZImfuBeXJ6S_-tovN0DbwfncTujUw4,10380
|
|
123
|
-
otdf_python_proto/policy/
|
|
131
|
+
otdf_python_proto/policy/subjectmapping/__init__.py,sha256=Cyaic3XmuOOqIWOVO31JJvafc-YQMoLCcohzoeZU6Yc,251
|
|
132
|
+
otdf_python_proto/policy/subjectmapping/subject_mapping_connect.py,sha256=lMcaLSAs_N6245as4-Wdp746LyjKwldeDdD_QQiwr_Q,49436
|
|
124
133
|
otdf_python_proto/policy/subjectmapping/subject_mapping_pb2.py,sha256=iNZp_sHDLXtSUdMNayWHJyZl0050Ag5v-naq0r2FmUM,18093
|
|
125
134
|
otdf_python_proto/policy/subjectmapping/subject_mapping_pb2.pyi,sha256=kPkRm8xw3KiEu9LiUmKCbouHVryeEFWyk19Eo6L6rus,10903
|
|
126
|
-
otdf_python_proto/policy/
|
|
135
|
+
otdf_python_proto/policy/unsafe/__init__.py,sha256=1TYTtYZyHxNQ2HaMCONHJ1U9dZDp3ZoZv19wZ78NhBI,202
|
|
136
|
+
otdf_python_proto/policy/unsafe/unsafe_connect.py,sha256=f-WA7NClXBfxs9wkdSVKUf7LwvK5WfDGkNsqboZ2k2g,37202
|
|
127
137
|
otdf_python_proto/policy/unsafe/unsafe_pb2.py,sha256=j8J3FGM6nL6VDJvZUdrq6MAQ0GvHCDRH1q3-Djw5NfE,14936
|
|
128
138
|
otdf_python_proto/policy/unsafe/unsafe_pb2.pyi,sha256=Pu72GtZTZWdD_L9SqqyeV8SQu9VXdVEEAGECrzHFmWs,5879
|
|
129
|
-
otdf_python_proto/
|
|
130
|
-
otdf_python_proto/wellknownconfiguration/
|
|
139
|
+
otdf_python_proto/wellknownconfiguration/__init__.py,sha256=xK8XUrwCL9elWuMTx6vVgWdWdcACugoF0b5OYsFclj4,240
|
|
140
|
+
otdf_python_proto/wellknownconfiguration/wellknown_configuration_connect.py,sha256=fVQfo4OsTK8e63ytmiGyMe1AxgirktNqI_O3rQ6o6Nc,6342
|
|
131
141
|
otdf_python_proto/wellknownconfiguration/wellknown_configuration_pb2.py,sha256=g9xSm9TxX0IPMqiFCaridJvI2TrL8PrXVFPgu8tX9VM,3863
|
|
132
142
|
otdf_python_proto/wellknownconfiguration/wellknown_configuration_pb2.pyi,sha256=Zw4vROvTgomnFqsalJrYda632ojXH0FVXSzTXxerybw,1490
|
|
133
|
-
|
|
134
|
-
otdf_python-0.4.
|
|
135
|
-
otdf_python-0.4.
|
|
136
|
-
otdf_python-0.4.
|
|
137
|
-
otdf_python-0.4.1.dist-info/RECORD,,
|
|
143
|
+
otdf_python-0.4.2.dist-info/METADATA,sha256=bbTfB1zZ1j7iv1lUmw01ZzHIGpfBhSlI78l8bN2UuXE,5175
|
|
144
|
+
otdf_python-0.4.2.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
145
|
+
otdf_python-0.4.2.dist-info/licenses/LICENSE,sha256=DPrPHdI6tfZcqk9kzQ37vh1Ftk7LJYdMrUtwKl7L3Pw,1074
|
|
146
|
+
otdf_python-0.4.2.dist-info/RECORD,,
|
otdf_python_proto/__init__.py
CHANGED
|
@@ -13,25 +13,21 @@ except metadata.PackageNotFoundError:
|
|
|
13
13
|
__version__ = "0.0.0"
|
|
14
14
|
|
|
15
15
|
# Import submodules to make them available
|
|
16
|
-
|
|
16
|
+
# Note: authorization, entityresolution, wellknownconfiguration and policy subdirectories
|
|
17
|
+
# are imported lazily to avoid import errors from generated protobuf files
|
|
17
18
|
from . import common
|
|
18
19
|
from . import entity
|
|
19
|
-
from . import entityresolution
|
|
20
20
|
from . import kas
|
|
21
21
|
from . import legacy_grpc
|
|
22
22
|
from . import logger
|
|
23
23
|
from . import policy
|
|
24
|
-
from . import wellknownconfiguration
|
|
25
24
|
|
|
26
25
|
# Export main module categories
|
|
27
26
|
__all__ = [
|
|
28
|
-
"authorization",
|
|
29
27
|
"common",
|
|
30
28
|
"entity",
|
|
31
|
-
"entityresolution",
|
|
32
29
|
"kas",
|
|
33
30
|
"legacy_grpc",
|
|
34
31
|
"logger",
|
|
35
32
|
"policy",
|
|
36
|
-
"wellknownconfiguration",
|
|
37
33
|
]
|