otdf-python 0.4.1__py3-none-any.whl → 0.4.3__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/cli.py +50 -21
- otdf_python/collection_store.py +0 -1
- otdf_python/ecdh.py +0 -6
- otdf_python/kas_allowlist.py +182 -0
- otdf_python/kas_client.py +44 -2
- otdf_python/kas_connect_rpc_client.py +59 -19
- otdf_python/nanotdf.py +4 -14
- otdf_python/nanotdf_ecdsa_struct.py +0 -2
- otdf_python/nanotdf_type.py +1 -1
- otdf_python/sdk.py +31 -15
- otdf_python/sdk_builder.py +88 -8
- otdf_python/tdf.py +2 -2
- {otdf_python-0.4.1.dist-info → otdf_python-0.4.3.dist-info}/METADATA +3 -2
- {otdf_python-0.4.1.dist-info → otdf_python-0.4.3.dist-info}/RECORD +46 -36
- 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.3.dist-info}/WHEEL +0 -0
- {otdf_python-0.4.1.dist-info → otdf_python-0.4.3.dist-info}/licenses/LICENSE +0 -0
otdf_python/sdk.py
CHANGED
|
@@ -37,6 +37,7 @@ class KAS(AbstractContextManager):
|
|
|
37
37
|
token_source=None,
|
|
38
38
|
sdk_ssl_verify=True,
|
|
39
39
|
use_plaintext=False,
|
|
40
|
+
kas_allowlist=None,
|
|
40
41
|
):
|
|
41
42
|
"""Initialize the KAS client.
|
|
42
43
|
|
|
@@ -45,6 +46,7 @@ class KAS(AbstractContextManager):
|
|
|
45
46
|
token_source: Function that returns an authentication token
|
|
46
47
|
sdk_ssl_verify: Whether to verify SSL certificates
|
|
47
48
|
use_plaintext: Whether to use plaintext HTTP connections instead of HTTPS
|
|
49
|
+
kas_allowlist: Optional KASAllowlist for URL validation
|
|
48
50
|
|
|
49
51
|
"""
|
|
50
52
|
from .kas_client import KASClient
|
|
@@ -54,6 +56,7 @@ class KAS(AbstractContextManager):
|
|
|
54
56
|
token_source=token_source,
|
|
55
57
|
verify_ssl=sdk_ssl_verify,
|
|
56
58
|
use_plaintext=use_plaintext,
|
|
59
|
+
kas_allowlist=kas_allowlist,
|
|
57
60
|
)
|
|
58
61
|
# Store the parameters for potential use
|
|
59
62
|
self._sdk_ssl_verify = sdk_ssl_verify
|
|
@@ -134,7 +137,8 @@ class KAS(AbstractContextManager):
|
|
|
134
137
|
|
|
135
138
|
def close(self):
|
|
136
139
|
"""Close resources associated with KAS interface."""
|
|
137
|
-
|
|
140
|
+
if self._kas_client:
|
|
141
|
+
self._kas_client.close()
|
|
138
142
|
|
|
139
143
|
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
140
144
|
self.close()
|
|
@@ -219,7 +223,6 @@ class SDK(AbstractContextManager):
|
|
|
219
223
|
|
|
220
224
|
def close(self):
|
|
221
225
|
"""Close resources associated with the services."""
|
|
222
|
-
pass
|
|
223
226
|
|
|
224
227
|
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
225
228
|
self.close()
|
|
@@ -377,23 +380,15 @@ class SDK(AbstractContextManager):
|
|
|
377
380
|
class SplitKeyException(SDKException):
|
|
378
381
|
"""Throw when SDK encounters error related to split key operations."""
|
|
379
382
|
|
|
380
|
-
pass
|
|
381
|
-
|
|
382
383
|
class DataSizeNotSupported(SDKException):
|
|
383
384
|
"""Throw when user attempts to create TDF larger than maximum size."""
|
|
384
385
|
|
|
385
|
-
pass
|
|
386
|
-
|
|
387
386
|
class KasInfoMissing(SDKException):
|
|
388
387
|
"""Throw during TDF creation when no KAS information is present."""
|
|
389
388
|
|
|
390
|
-
pass
|
|
391
|
-
|
|
392
389
|
class KasPublicKeyMissing(SDKException):
|
|
393
390
|
"""Throw during encryption when SDK cannot retrieve public key for KAS."""
|
|
394
391
|
|
|
395
|
-
pass
|
|
396
|
-
|
|
397
392
|
class TamperException(SDKException):
|
|
398
393
|
"""Base class for exceptions related to signature mismatches."""
|
|
399
394
|
|
|
@@ -407,17 +402,38 @@ class SDK(AbstractContextManager):
|
|
|
407
402
|
class SegmentSignatureMismatch(TamperException):
|
|
408
403
|
"""Throw when segment signature does not match expected value."""
|
|
409
404
|
|
|
410
|
-
pass
|
|
411
|
-
|
|
412
405
|
class KasBadRequestException(SDKException):
|
|
413
406
|
"""Throw when KAS returns bad request response."""
|
|
414
407
|
|
|
415
|
-
pass
|
|
416
|
-
|
|
417
408
|
class KasAllowlistException(SDKException):
|
|
418
409
|
"""Throw when KAS allowlist check fails."""
|
|
419
410
|
|
|
420
|
-
|
|
411
|
+
def __init__(
|
|
412
|
+
self,
|
|
413
|
+
url: str,
|
|
414
|
+
allowed_origins: set[str] | None = None,
|
|
415
|
+
message: str | None = None,
|
|
416
|
+
):
|
|
417
|
+
"""Initialize exception.
|
|
418
|
+
|
|
419
|
+
Args:
|
|
420
|
+
url: The KAS URL that was rejected
|
|
421
|
+
allowed_origins: Set of allowed origin URLs
|
|
422
|
+
message: Optional custom message (auto-generated if not provided)
|
|
423
|
+
|
|
424
|
+
"""
|
|
425
|
+
self.url = url
|
|
426
|
+
self.allowed_origins = allowed_origins or set()
|
|
427
|
+
if message is None:
|
|
428
|
+
origins_str = (
|
|
429
|
+
", ".join(sorted(self.allowed_origins))
|
|
430
|
+
if self.allowed_origins
|
|
431
|
+
else "none"
|
|
432
|
+
)
|
|
433
|
+
message = (
|
|
434
|
+
f"KAS URL not in allowlist: {url}. Allowed origins: {origins_str}"
|
|
435
|
+
)
|
|
436
|
+
super().__init__(message)
|
|
421
437
|
|
|
422
438
|
class AssertionException(SDKException):
|
|
423
439
|
"""Throw when an assertion validation fails."""
|
otdf_python/sdk_builder.py
CHANGED
|
@@ -10,6 +10,7 @@ from pathlib import Path
|
|
|
10
10
|
|
|
11
11
|
import httpx
|
|
12
12
|
|
|
13
|
+
from otdf_python.kas_allowlist import KASAllowlist
|
|
13
14
|
from otdf_python.sdk import KAS, SDK
|
|
14
15
|
from otdf_python.sdk_exceptions import AutoConfigureException
|
|
15
16
|
|
|
@@ -47,6 +48,8 @@ class SDKBuilder:
|
|
|
47
48
|
self.ssl_context: ssl.SSLContext | None = None
|
|
48
49
|
self.auth_token: str | None = None
|
|
49
50
|
self.cert_paths: list[str] = []
|
|
51
|
+
self._kas_allowlist_urls: list[str] | None = None
|
|
52
|
+
self._ignore_kas_allowlist: bool = False
|
|
50
53
|
|
|
51
54
|
@staticmethod
|
|
52
55
|
def new_builder() -> "SDKBuilder":
|
|
@@ -120,9 +123,7 @@ class SDKBuilder:
|
|
|
120
123
|
|
|
121
124
|
"""
|
|
122
125
|
# Normalize the endpoint URL
|
|
123
|
-
if endpoint and not (
|
|
124
|
-
endpoint.startswith("http://") or endpoint.startswith("https://")
|
|
125
|
-
):
|
|
126
|
+
if endpoint and not (endpoint.startswith(("http://", "https://"))):
|
|
126
127
|
if self.use_plaintext:
|
|
127
128
|
endpoint = f"http://{endpoint}"
|
|
128
129
|
else:
|
|
@@ -143,9 +144,7 @@ class SDKBuilder:
|
|
|
143
144
|
|
|
144
145
|
"""
|
|
145
146
|
# Normalize the issuer URL
|
|
146
|
-
if issuer and not (
|
|
147
|
-
issuer.startswith("http://") or issuer.startswith("https://")
|
|
148
|
-
):
|
|
147
|
+
if issuer and not (issuer.startswith(("http://", "https://"))):
|
|
149
148
|
issuer = f"https://{issuer}"
|
|
150
149
|
|
|
151
150
|
self.issuer_endpoint = issuer
|
|
@@ -205,6 +204,54 @@ class SDKBuilder:
|
|
|
205
204
|
self.auth_token = token
|
|
206
205
|
return self
|
|
207
206
|
|
|
207
|
+
def with_kas_allowlist(self, urls: list[str]) -> "SDKBuilder":
|
|
208
|
+
"""Set the KAS allowlist to restrict which KAS servers the SDK will contact.
|
|
209
|
+
|
|
210
|
+
This provides protection against SSRF attacks where malicious TDF files
|
|
211
|
+
could contain attacker-controlled KAS URLs to steal OIDC credentials.
|
|
212
|
+
|
|
213
|
+
By default (if no allowlist is set), only the platform's KAS endpoint
|
|
214
|
+
is allowed.
|
|
215
|
+
|
|
216
|
+
Args:
|
|
217
|
+
urls: List of trusted KAS URLs. Each URL is normalized to its
|
|
218
|
+
origin (scheme://host:port) for comparison.
|
|
219
|
+
|
|
220
|
+
Returns:
|
|
221
|
+
self: The builder instance for chaining
|
|
222
|
+
|
|
223
|
+
Example:
|
|
224
|
+
builder.with_kas_allowlist([
|
|
225
|
+
"https://kas.example.com",
|
|
226
|
+
"https://kas2.example.com:8443"
|
|
227
|
+
])
|
|
228
|
+
|
|
229
|
+
"""
|
|
230
|
+
self._kas_allowlist_urls = urls
|
|
231
|
+
return self
|
|
232
|
+
|
|
233
|
+
def with_ignore_kas_allowlist(self, ignore: bool = True) -> "SDKBuilder":
|
|
234
|
+
"""Configure whether to skip KAS allowlist validation.
|
|
235
|
+
|
|
236
|
+
WARNING: This is insecure and should only be used for testing or
|
|
237
|
+
development. When enabled, the SDK will contact any KAS URL found
|
|
238
|
+
in TDF files, potentially leaking credentials to malicious servers.
|
|
239
|
+
|
|
240
|
+
Args:
|
|
241
|
+
ignore: Whether to ignore the KAS allowlist (default: True)
|
|
242
|
+
|
|
243
|
+
Returns:
|
|
244
|
+
self: The builder instance for chaining
|
|
245
|
+
|
|
246
|
+
"""
|
|
247
|
+
self._ignore_kas_allowlist = ignore
|
|
248
|
+
if ignore:
|
|
249
|
+
logger.warning(
|
|
250
|
+
"KAS allowlist validation is disabled. This is insecure and "
|
|
251
|
+
"should only be used for testing."
|
|
252
|
+
)
|
|
253
|
+
return self
|
|
254
|
+
|
|
208
255
|
def _discover_token_endpoint_from_platform(self) -> None:
|
|
209
256
|
"""Discover token endpoint using OpenTDF platform configuration.
|
|
210
257
|
|
|
@@ -360,6 +407,34 @@ class SDKBuilder:
|
|
|
360
407
|
f"Error during token acquisition: {e!s}"
|
|
361
408
|
) from e
|
|
362
409
|
|
|
410
|
+
def _create_kas_allowlist(self) -> KASAllowlist | None:
|
|
411
|
+
"""Create the KAS allowlist based on builder configuration.
|
|
412
|
+
|
|
413
|
+
Returns:
|
|
414
|
+
KASAllowlist configured based on builder settings, or None if
|
|
415
|
+
allowlist validation is disabled.
|
|
416
|
+
|
|
417
|
+
"""
|
|
418
|
+
# If ignoring allowlist, return an allow-all instance
|
|
419
|
+
if self._ignore_kas_allowlist:
|
|
420
|
+
return KASAllowlist(allow_all=True)
|
|
421
|
+
|
|
422
|
+
# If explicit allowlist provided, use it
|
|
423
|
+
if self._kas_allowlist_urls:
|
|
424
|
+
allowlist = KASAllowlist(self._kas_allowlist_urls)
|
|
425
|
+
# Also add the platform URL for convenience
|
|
426
|
+
if self.platform_endpoint:
|
|
427
|
+
allowlist.add(self.platform_endpoint)
|
|
428
|
+
allowlist.add(self.platform_endpoint.rstrip("/") + "/kas")
|
|
429
|
+
return allowlist
|
|
430
|
+
|
|
431
|
+
# Default: create allowlist from platform URL only
|
|
432
|
+
if self.platform_endpoint:
|
|
433
|
+
return KASAllowlist.from_platform_url(self.platform_endpoint)
|
|
434
|
+
|
|
435
|
+
# No platform endpoint set yet - return None and let SDK handle it
|
|
436
|
+
return None
|
|
437
|
+
|
|
363
438
|
def _create_services(self) -> SDK.Services:
|
|
364
439
|
"""Create service client instances.
|
|
365
440
|
|
|
@@ -375,11 +450,15 @@ class SDKBuilder:
|
|
|
375
450
|
|
|
376
451
|
ssl_verify = not self.insecure_skip_verify
|
|
377
452
|
|
|
453
|
+
# Create the KAS allowlist
|
|
454
|
+
kas_allowlist = self._create_kas_allowlist()
|
|
455
|
+
|
|
378
456
|
class ServicesImpl(SDK.Services):
|
|
379
|
-
def __init__(self, builder_instance):
|
|
457
|
+
def __init__(self, builder_instance, allowlist: KASAllowlist | None):
|
|
380
458
|
self.closed = False
|
|
381
459
|
self._ssl_verify = ssl_verify
|
|
382
460
|
self._builder = builder_instance
|
|
461
|
+
self._kas_allowlist = allowlist
|
|
383
462
|
|
|
384
463
|
def kas(self) -> KAS:
|
|
385
464
|
"""Return the KAS interface with SSL verification settings."""
|
|
@@ -398,6 +477,7 @@ class SDKBuilder:
|
|
|
398
477
|
token_source=token_source,
|
|
399
478
|
sdk_ssl_verify=self._ssl_verify,
|
|
400
479
|
use_plaintext=self._builder.use_plaintext,
|
|
480
|
+
kas_allowlist=self._kas_allowlist,
|
|
401
481
|
)
|
|
402
482
|
return kas_impl
|
|
403
483
|
|
|
@@ -407,7 +487,7 @@ class SDKBuilder:
|
|
|
407
487
|
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
408
488
|
self.close()
|
|
409
489
|
|
|
410
|
-
return ServicesImpl(self)
|
|
490
|
+
return ServicesImpl(self, kas_allowlist)
|
|
411
491
|
|
|
412
492
|
def build(self) -> SDK:
|
|
413
493
|
"""Build and return an SDK instance with configured properties.
|
otdf_python/tdf.py
CHANGED
|
@@ -183,8 +183,8 @@ class TDF:
|
|
|
183
183
|
if isinstance(obj, PolicyBody):
|
|
184
184
|
# Convert data_attributes to dataAttributes and use null instead of empty array
|
|
185
185
|
result = {
|
|
186
|
-
"dataAttributes": obj.data_attributes
|
|
187
|
-
"dissem": obj.dissem
|
|
186
|
+
"dataAttributes": obj.data_attributes or None,
|
|
187
|
+
"dissem": obj.dissem or None,
|
|
188
188
|
}
|
|
189
189
|
return result
|
|
190
190
|
elif isinstance(obj, AttributeObject):
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: otdf-python
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.3
|
|
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=
|
|
9
|
-
otdf_python/cli.py,sha256=
|
|
10
|
-
otdf_python/collection_store.py,sha256=
|
|
8
|
+
otdf_python/autoconfigure_utils.py,sha256=W5aJ0tC7HWfGb_1Mva_oxgduUzSpPoyDeaq0rPwgPAs,3689
|
|
9
|
+
otdf_python/cli.py,sha256=icooiGgRh8H1IlP-_iO7paLB60IXUSaSacODABeqrS4,21165
|
|
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,61 +16,62 @@ 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/
|
|
24
|
-
otdf_python/
|
|
23
|
+
otdf_python/kas_allowlist.py,sha256=0yX3J9J1od_ew0sp3pX6kfav39pTz7aBBpMnVkE5T7s,5884
|
|
24
|
+
otdf_python/kas_client.py,sha256=N5mQubRUrnJCtSxTiiyjf7DEfsg2wVZ02xufuZBH_b0,27532
|
|
25
|
+
otdf_python/kas_connect_rpc_client.py,sha256=cB3cBomCClmu-InUpw8R35cLyJQ8X0PoEsFvYSH0RUM,8950
|
|
25
26
|
otdf_python/kas_info.py,sha256=V-5om8k4RKbhE0h1CS1Rxb18TYcHKvq_hEPP6ah8K_o,738
|
|
26
27
|
otdf_python/kas_key_cache.py,sha256=6hfzRAg9o_IfRErWSe-_gGTG9kRyYENMizMY1Shkmfk,1548
|
|
27
28
|
otdf_python/key_type.py,sha256=2gQlXOj35J3ISCcWjU3sGYUxmlZR47BMq6Xr2yoKA8k,928
|
|
28
29
|
otdf_python/key_type_constants.py,sha256=MV2Dsea3A6nnnYztoD0N1QxhrbQXZfaXaqCr2rI6sqo,954
|
|
29
30
|
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=
|
|
31
|
+
otdf_python/nanotdf.py,sha256=y1mLktlZ-mRCup2vzGY4ZbFeNEhWpCYLOZYjzTSPEtc,33921
|
|
32
|
+
otdf_python/nanotdf_ecdsa_struct.py,sha256=jTQKFAicTfMfN9CxJZYQcnEYGmtfAQoDOhz8ta-pGAQ,4066
|
|
33
|
+
otdf_python/nanotdf_type.py,sha256=3MQzT6lJ3WJKMICFyyYZXX2_cFYcZ5G4m1uif-l9Nxo,1112
|
|
33
34
|
otdf_python/policy_binding_serializer.py,sha256=oOcGBYOISPTzHRtk8JszwLTraY_F2OoevOf0a53jGHA,1271
|
|
34
35
|
otdf_python/policy_info.py,sha256=aq74dZg9PhTZ6cMkZyFsu3D754C5YijFMiuoYEL-1bY,2076
|
|
35
36
|
otdf_python/policy_object.py,sha256=LikIsahPkKr-iYA0lhgQitCbh8CsmxUBYyBs6VYfmxY,512
|
|
36
37
|
otdf_python/policy_stub.py,sha256=RfU_fICqsAOnTXOHpKhtKC0RJ3KoWhDxO0XecZWM548,159
|
|
37
38
|
otdf_python/resource_locator.py,sha256=bjK935XcfNq-PyqidHNq8eIiPeZEStYdQvmQ9B9GY20,6290
|
|
38
|
-
otdf_python/sdk.py,sha256
|
|
39
|
-
otdf_python/sdk_builder.py,sha256=
|
|
39
|
+
otdf_python/sdk.py,sha256=-3Zuyfvf8ZM6iqxFpFDRAxCSfe35r6-TIuOOGUbPNPM,15058
|
|
40
|
+
otdf_python/sdk_builder.py,sha256=xTPoBjB3eGwoWjfSgiPmiNnEZJ8g-LUQVZDmo7BM9cY,17649
|
|
40
41
|
otdf_python/sdk_exceptions.py,sha256=2GElGyM5LKN8Uh_lAiT6Ho4oNRWYRQsMNOK5s2jiv28,687
|
|
41
42
|
otdf_python/symmetric_and_payload_config.py,sha256=iPHeZSeY9BjsQ-wkvdm6-FIR7773EgGiaIvSG-ICOHw,1158
|
|
42
|
-
otdf_python/tdf.py,sha256=
|
|
43
|
+
otdf_python/tdf.py,sha256=lqaSSGfd-nzlmjpYoXa6ZLihZIJA170dwodKt_iRko8,20799
|
|
43
44
|
otdf_python/tdf_reader.py,sha256=WMetzX4CIKJ15f4J_zyFGtObQO6bQ33KC_ykIonH9ik,5228
|
|
44
45
|
otdf_python/tdf_writer.py,sha256=FLm1P26J4p6WPyKsjOb7QLYJqDIMDsBONqBW_JuFxyw,798
|
|
45
46
|
otdf_python/token_source.py,sha256=YHbP7deSSXo1CvzVGJX7DkOuBgqwfP_Ockm8CE-MN0o,1011
|
|
46
47
|
otdf_python/version.py,sha256=uDKJKsSQoaEH-JlqAwiXDxceLRX9hkG4I3NVLEfDCHA,2025
|
|
47
48
|
otdf_python/zip_reader.py,sha256=qrHv-ecs09tz99ZKdOMiWaciYf2XsQOUTiXy1JHjuEY,1705
|
|
48
49
|
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=
|
|
50
|
+
otdf_python_proto/__init__.py,sha256=nZXR7jFOxpw52PahIE5PzTm5xEmH01xphIq5PTH_Qhc,925
|
|
51
|
+
otdf_python_proto/authorization/__init__.py,sha256=PQ8pNK86JNhOg7rcvbOQzAx5nm0hdjQqj-xIwDD4izY,237
|
|
52
|
+
otdf_python_proto/authorization/authorization_connect.py,sha256=Z4Xnz39cc9Dp74HBWc4uM-3aKRdSD0fcBoz2OCNbppw,12287
|
|
51
53
|
otdf_python_proto/authorization/authorization_pb2.py,sha256=VxRCF1popd01Po0uC-H3Uz85Z6y39ICuzwjFuRWkDoE,9085
|
|
52
54
|
otdf_python_proto/authorization/authorization_pb2.pyi,sha256=43mV-jbbgxjvzuKkJE-tcLg4JrqtqoQwB5WT9k4j3Ew,8927
|
|
53
|
-
otdf_python_proto/authorization/
|
|
55
|
+
otdf_python_proto/authorization/v2/authorization_connect.py,sha256=K5yRvu3JfA9ljtbTsXJ3KMx9GAUypLpqiI8IPPgiIZs,16310
|
|
54
56
|
otdf_python_proto/authorization/v2/authorization_pb2.py,sha256=pz5GE1cBmcyWHCG3ba46_We-ywY7dx2oxZwHgvtJJtA,12998
|
|
55
57
|
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
58
|
otdf_python_proto/common/__init__.py,sha256=cJlVANj7I0xoLUerst-2su60AFtywyrFHPOIKIzS65Q,35
|
|
58
59
|
otdf_python_proto/common/common_pb2.py,sha256=F2Ap8Lf-LJGnk_-BsrAfoidYtkkTsc24OvZgikBigDs,3599
|
|
59
60
|
otdf_python_proto/common/common_pb2.pyi,sha256=iitFFATcqvxfhdgAGlPFmYeyHeLSyBKKzvSNgm8kioM,2860
|
|
60
61
|
otdf_python_proto/entity/__init__.py,sha256=Q5bx_n1hD8DQR8f78iflJzw90RJZLeIj--Q6YaHqJ_4,35
|
|
61
62
|
otdf_python_proto/entity/entity_pb2.py,sha256=LpdkNpqn-L808SfYI6JWATfmud_9oYRpHbnX02qXQB8,3178
|
|
62
63
|
otdf_python_proto/entity/entity_pb2.pyi,sha256=vkQau-BYeQvGV_Sr0YqqPDgiLuecErOey_Dn0zpHTN4,2423
|
|
63
|
-
otdf_python_proto/entityresolution/__init__.py,sha256=
|
|
64
|
+
otdf_python_proto/entityresolution/__init__.py,sha256=ehWfHEQ42uXht7gxRIr4jlwGq-OcYZUDLqwyhDo9-oI,228
|
|
65
|
+
otdf_python_proto/entityresolution/entity_resolution_connect.py,sha256=XniXuD9UVp44ZNt8DE7DEp4Y75sYjLYFvpikzN8uavU,9547
|
|
64
66
|
otdf_python_proto/entityresolution/entity_resolution_pb2.py,sha256=XrPNnZ7GvHE0w0iHharpSte30l_DjhDlNE__mJigWTg,5032
|
|
65
67
|
otdf_python_proto/entityresolution/entity_resolution_pb2.pyi,sha256=Yn8snkOsfkYPb4CngTMJcTe75RdOJUT_Yo4rk-mMTaM,3001
|
|
66
|
-
otdf_python_proto/entityresolution/
|
|
68
|
+
otdf_python_proto/entityresolution/v2/entity_resolution_connect.py,sha256=VCu9jytqWuF__a08LX5iIo_kFbJEbXfkYsuAu_xoaik,9948
|
|
67
69
|
otdf_python_proto/entityresolution/v2/entity_resolution_pb2.py,sha256=G_CHQ76xCYAV6hfY1-tbncOCu7FqtdLH2FzOwO0vlvM,4680
|
|
68
70
|
otdf_python_proto/entityresolution/v2/entity_resolution_pb2.pyi,sha256=wRcDT1bcKvyjMgPi8-MrQYLUDEaWjy2MY0YbsxF3Gjo,2942
|
|
69
|
-
otdf_python_proto/
|
|
70
|
-
otdf_python_proto/kas/
|
|
71
|
+
otdf_python_proto/kas/__init__.py,sha256=k72BA06RTfm0yGAL-H6dDkQFBUiZJXT3RHnIQIRpwhs,220
|
|
72
|
+
otdf_python_proto/kas/kas_connect.py,sha256=aBPlxHUcB_XAPgLi4ElXyrefdnrrrYKFb_PbDw9Yg_w,10860
|
|
71
73
|
otdf_python_proto/kas/kas_pb2.py,sha256=FuWeaQYjICzKFmovm1sqdAPCcDn-tariNUs4CHHNUV8,11431
|
|
72
74
|
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
75
|
otdf_python_proto/legacy_grpc/__init__.py,sha256=zpWWFl-aIfDdJqBnMFk6lDSzsKfZ4pjkp2LYxGE1S9c,40
|
|
75
76
|
otdf_python_proto/legacy_grpc/authorization/authorization_pb2_grpc.py,sha256=Xn_jbL7EyOKolHp_0wxOqN3Eqm0eWjb4meB6X8xJPM0,6922
|
|
76
77
|
otdf_python_proto/legacy_grpc/authorization/v2/authorization_pb2_grpc.py,sha256=i6SlVNT3uRfKr11hIZGGwPmmCZag-28kUzJjj8h_Zy0,9109
|
|
@@ -100,38 +101,47 @@ otdf_python_proto/policy/objects_pb2.py,sha256=4izyxIYyD_9q6Bj3hff5cfjgvYIGW6ewZ
|
|
|
100
101
|
otdf_python_proto/policy/objects_pb2.pyi,sha256=nuK89_2Z1R6I1xE0EokL2lUdEIEuzVFne0IqykpC7uI,24523
|
|
101
102
|
otdf_python_proto/policy/selectors_pb2.py,sha256=uqgIS0DtfOYDqzJ6WNq9D9aLa-RnTpN9a5o7YGMF7xM,5301
|
|
102
103
|
otdf_python_proto/policy/selectors_pb2.pyi,sha256=FdC8ZLkgBBspwdjA1JlaeSgPo3R2qUIDws-9vNRXAUs,5162
|
|
104
|
+
otdf_python_proto/policy/actions/__init__.py,sha256=GPRrOk6_i6Jgj9PrWX8tCdqYoVKdJJp7ucu1XtY3iFU,208
|
|
105
|
+
otdf_python_proto/policy/actions/actions_connect.py,sha256=jdmPjw8LdyaEACeHVsU075FUqV39vmGs8tIxF151Uj8,18087
|
|
103
106
|
otdf_python_proto/policy/actions/actions_pb2.py,sha256=QRcrBnuu1iDWjVQLl0dWHCwuOwnLguzn4w9f2201xjM,8858
|
|
104
107
|
otdf_python_proto/policy/actions/actions_pb2.pyi,sha256=ZBgv2xtG4PW7vXUJkzbfvMPaKUmztVw6_FG5iN0Ph-I,4298
|
|
105
|
-
otdf_python_proto/policy/
|
|
108
|
+
otdf_python_proto/policy/attributes/__init__.py,sha256=3lHYfbXDGAuuhfSwb1YJfVJJWPvTtcoshyhLOi_hIr0,226
|
|
109
|
+
otdf_python_proto/policy/attributes/attributes_connect.py,sha256=r-_r5pqiFr_CCQ05UnzbEcYld2KOY4nY5q0s2cYxnp4,72451
|
|
106
110
|
otdf_python_proto/policy/attributes/attributes_pb2.py,sha256=wnK1qsuOVOePneFfDGtBDxiyvP9S8XA48mMTexybYBE,33029
|
|
107
111
|
otdf_python_proto/policy/attributes/attributes_pb2.pyi,sha256=lpxvoxiRhSn1LEupx1fOcBc6pOdWcrTXAx_boHvGFZY,16259
|
|
108
|
-
otdf_python_proto/policy/
|
|
112
|
+
otdf_python_proto/policy/kasregistry/__init__.py,sha256=zj_8G65KIhOSiOeMkyMEZFomWYkfD9E5aWASgwV4n3M,295
|
|
113
|
+
otdf_python_proto/policy/kasregistry/key_access_server_registry_connect.py,sha256=L5r5ZAMnM8gfEdPXZiQ61MrCxtlzvpaxjJGZj5MsEQk,52727
|
|
109
114
|
otdf_python_proto/policy/kasregistry/key_access_server_registry_pb2.py,sha256=5RRqC6MsfBM9TEmPedRZYKMjdVWptMXXTUolUU4FPXI,45921
|
|
110
115
|
otdf_python_proto/policy/kasregistry/key_access_server_registry_pb2.pyi,sha256=hpIgoFXZtY6HsjfHPi_Ybxm0CddK_AYy8YTlfdzR1Jk,24030
|
|
111
|
-
otdf_python_proto/policy/
|
|
116
|
+
otdf_python_proto/policy/keymanagement/__init__.py,sha256=baBSBdjBbaErAIjjn0GxUPfYYRq7R4MfsrvpK02uews,245
|
|
117
|
+
otdf_python_proto/policy/keymanagement/key_management_connect.py,sha256=-e1fc4S3-xJ_Tdy9T0JMMTXIFhMeN7qx0sls-gMUjeM,20883
|
|
112
118
|
otdf_python_proto/policy/keymanagement/key_management_pb2.py,sha256=MVAJKkR_B2nqN9jqWg7JLWByKFFfoi4unj1hbToByCE,8129
|
|
113
119
|
otdf_python_proto/policy/keymanagement/key_management_pb2.pyi,sha256=9HoPHqEKIO8jhx9TpkwFJWSHiInpkq04LiNPUCYeDU4,4381
|
|
114
|
-
otdf_python_proto/policy/
|
|
120
|
+
otdf_python_proto/policy/namespaces/__init__.py,sha256=JIdic8yq55x9BrQzaJtgEp3J7AcnOZ1c0eiTXd2iDpw,222
|
|
121
|
+
otdf_python_proto/policy/namespaces/namespaces_connect.py,sha256=gJmN8r8bCDX9KTyEJc7X5RnvgxPiANfRvTTFNom06wk,35163
|
|
115
122
|
otdf_python_proto/policy/namespaces/namespaces_pb2.py,sha256=NTdUbii-WF0VNiVvM29ZmAni7W4dgmNkOGq2ytP31pk,15222
|
|
116
123
|
otdf_python_proto/policy/namespaces/namespaces_pb2.pyi,sha256=plOpaSBszfi7p71XKZvTg1e1nJUhvoz1wrcYDX9cByQ,7148
|
|
117
|
-
otdf_python_proto/policy/
|
|
124
|
+
otdf_python_proto/policy/registeredresources/__init__.py,sha256=U6A5CRMFUhwjxOdxaRpgfIBx9bJZ7KcnBNKPQouSaeI,281
|
|
125
|
+
otdf_python_proto/policy/registeredresources/registered_resources_connect.py,sha256=FVJPkbH7vO_oUiJRW6qW2nkJhmomO_9YQ1yDCEYYhQ8,48569
|
|
118
126
|
otdf_python_proto/policy/registeredresources/registered_resources_pb2.py,sha256=5pb4vm0SEOG-U8FORKa9Z1Fe2tbgcWEEJworZE_LS00,23112
|
|
119
127
|
otdf_python_proto/policy/registeredresources/registered_resources_pb2.pyi,sha256=MsFkcXQbdvu7JQGeS-HYFHB7V3yWtpAPEmhoARjDvMI,10132
|
|
120
|
-
otdf_python_proto/policy/
|
|
128
|
+
otdf_python_proto/policy/resourcemapping/__init__.py,sha256=9_It9dJRLAOIf1y9n3LxEQa7-WI51B_E3OfhKBNuFw4,257
|
|
129
|
+
otdf_python_proto/policy/resourcemapping/resource_mapping_connect.py,sha256=RdhIMj6FLUxFNsCL2edVJRRJPefEe9enkWpsU2Y9djo,46405
|
|
121
130
|
otdf_python_proto/policy/resourcemapping/resource_mapping_pb2.py,sha256=vnMJu2jEr3NHH5aUx5hquQAyHlUwtgh2lL9YdXil2bs,21745
|
|
122
131
|
otdf_python_proto/policy/resourcemapping/resource_mapping_pb2.pyi,sha256=B4I6nj1bHNI8VZImfuBeXJ6S_-tovN0DbwfncTujUw4,10380
|
|
123
|
-
otdf_python_proto/policy/
|
|
132
|
+
otdf_python_proto/policy/subjectmapping/__init__.py,sha256=Cyaic3XmuOOqIWOVO31JJvafc-YQMoLCcohzoeZU6Yc,251
|
|
133
|
+
otdf_python_proto/policy/subjectmapping/subject_mapping_connect.py,sha256=lMcaLSAs_N6245as4-Wdp746LyjKwldeDdD_QQiwr_Q,49436
|
|
124
134
|
otdf_python_proto/policy/subjectmapping/subject_mapping_pb2.py,sha256=iNZp_sHDLXtSUdMNayWHJyZl0050Ag5v-naq0r2FmUM,18093
|
|
125
135
|
otdf_python_proto/policy/subjectmapping/subject_mapping_pb2.pyi,sha256=kPkRm8xw3KiEu9LiUmKCbouHVryeEFWyk19Eo6L6rus,10903
|
|
126
|
-
otdf_python_proto/policy/
|
|
136
|
+
otdf_python_proto/policy/unsafe/__init__.py,sha256=1TYTtYZyHxNQ2HaMCONHJ1U9dZDp3ZoZv19wZ78NhBI,202
|
|
137
|
+
otdf_python_proto/policy/unsafe/unsafe_connect.py,sha256=f-WA7NClXBfxs9wkdSVKUf7LwvK5WfDGkNsqboZ2k2g,37202
|
|
127
138
|
otdf_python_proto/policy/unsafe/unsafe_pb2.py,sha256=j8J3FGM6nL6VDJvZUdrq6MAQ0GvHCDRH1q3-Djw5NfE,14936
|
|
128
139
|
otdf_python_proto/policy/unsafe/unsafe_pb2.pyi,sha256=Pu72GtZTZWdD_L9SqqyeV8SQu9VXdVEEAGECrzHFmWs,5879
|
|
129
|
-
otdf_python_proto/
|
|
130
|
-
otdf_python_proto/wellknownconfiguration/
|
|
140
|
+
otdf_python_proto/wellknownconfiguration/__init__.py,sha256=xK8XUrwCL9elWuMTx6vVgWdWdcACugoF0b5OYsFclj4,240
|
|
141
|
+
otdf_python_proto/wellknownconfiguration/wellknown_configuration_connect.py,sha256=fVQfo4OsTK8e63ytmiGyMe1AxgirktNqI_O3rQ6o6Nc,6342
|
|
131
142
|
otdf_python_proto/wellknownconfiguration/wellknown_configuration_pb2.py,sha256=g9xSm9TxX0IPMqiFCaridJvI2TrL8PrXVFPgu8tX9VM,3863
|
|
132
143
|
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,,
|
|
144
|
+
otdf_python-0.4.3.dist-info/METADATA,sha256=OCF50LC7pWodNWzwurJp5yWLBleo01O7g3p6QhRo5Ug,5175
|
|
145
|
+
otdf_python-0.4.3.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
146
|
+
otdf_python-0.4.3.dist-info/licenses/LICENSE,sha256=DPrPHdI6tfZcqk9kzQ37vh1Ftk7LJYdMrUtwKl7L3Pw,1074
|
|
147
|
+
otdf_python-0.4.3.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
|
]
|