otdf-python 0.4.0__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/__init__.py +1 -2
- otdf_python/__main__.py +1 -2
- otdf_python/address_normalizer.py +8 -10
- otdf_python/aesgcm.py +8 -0
- otdf_python/assertion_config.py +21 -0
- otdf_python/asym_crypto.py +18 -22
- otdf_python/auth_headers.py +7 -6
- otdf_python/autoconfigure_utils.py +21 -7
- otdf_python/cli.py +5 -5
- otdf_python/collection_store.py +13 -1
- otdf_python/collection_store_impl.py +5 -0
- otdf_python/config.py +13 -0
- otdf_python/connect_client.py +1 -0
- otdf_python/constants.py +2 -0
- otdf_python/crypto_utils.py +4 -0
- otdf_python/dpop.py +3 -5
- otdf_python/ecc_constants.py +12 -14
- otdf_python/ecc_mode.py +7 -2
- otdf_python/ecdh.py +24 -31
- otdf_python/eckeypair.py +5 -0
- otdf_python/header.py +5 -0
- otdf_python/invalid_zip_exception.py +6 -2
- otdf_python/kas_client.py +66 -55
- otdf_python/kas_connect_rpc_client.py +75 -38
- otdf_python/kas_info.py +4 -3
- otdf_python/kas_key_cache.py +10 -9
- otdf_python/key_type.py +4 -0
- otdf_python/key_type_constants.py +4 -11
- otdf_python/manifest.py +24 -0
- otdf_python/nanotdf.py +30 -28
- otdf_python/nanotdf_ecdsa_struct.py +5 -11
- otdf_python/nanotdf_type.py +13 -1
- otdf_python/policy_binding_serializer.py +6 -4
- otdf_python/policy_info.py +6 -0
- otdf_python/policy_object.py +8 -0
- otdf_python/policy_stub.py +2 -0
- otdf_python/resource_locator.py +22 -13
- otdf_python/sdk.py +51 -73
- otdf_python/sdk_builder.py +60 -47
- otdf_python/sdk_exceptions.py +11 -1
- otdf_python/symmetric_and_payload_config.py +6 -0
- otdf_python/tdf.py +47 -10
- otdf_python/tdf_reader.py +10 -13
- otdf_python/tdf_writer.py +5 -0
- otdf_python/token_source.py +4 -3
- otdf_python/version.py +5 -0
- otdf_python/zip_reader.py +10 -2
- otdf_python/zip_writer.py +11 -0
- {otdf_python-0.4.0.dist-info → otdf_python-0.4.2.dist-info}/METADATA +3 -2
- {otdf_python-0.4.0.dist-info → otdf_python-0.4.2.dist-info}/RECORD +81 -72
- {otdf_python-0.4.0.dist-info → otdf_python-0.4.2.dist-info}/WHEEL +1 -1
- 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.0.dist-info → otdf_python-0.4.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,10 +1,16 @@
|
|
|
1
|
+
"""Symmetric encryption and payload configuration."""
|
|
2
|
+
|
|
3
|
+
|
|
1
4
|
class SymmetricAndPayloadConfig:
|
|
5
|
+
"""Symmetric and payload configuration."""
|
|
6
|
+
|
|
2
7
|
def __init__(
|
|
3
8
|
self,
|
|
4
9
|
cipher_type: int = 0,
|
|
5
10
|
signature_ecc_mode: int = 0,
|
|
6
11
|
has_signature: bool = True,
|
|
7
12
|
):
|
|
13
|
+
"""Initialize symmetric and payload configuration."""
|
|
8
14
|
self.cipher_type = cipher_type
|
|
9
15
|
self.signature_ecc_mode = signature_ecc_mode
|
|
10
16
|
self.has_signature = has_signature
|
otdf_python/tdf.py
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
"""TDF reader and writer functionality for OpenTDF platform."""
|
|
2
|
+
|
|
1
3
|
import base64
|
|
2
4
|
import hashlib
|
|
3
5
|
import hmac
|
|
@@ -31,17 +33,23 @@ from otdf_python.tdf_writer import TDFWriter
|
|
|
31
33
|
|
|
32
34
|
@dataclass
|
|
33
35
|
class TDFReader:
|
|
36
|
+
"""Container for TDF payload and manifest after reading."""
|
|
37
|
+
|
|
34
38
|
payload: bytes
|
|
35
39
|
manifest: Manifest
|
|
36
40
|
|
|
37
41
|
|
|
38
42
|
@dataclass
|
|
39
43
|
class TDFReaderConfig:
|
|
44
|
+
"""Configuration for TDF reader operations."""
|
|
45
|
+
|
|
40
46
|
kas_private_key: str | None = None
|
|
41
47
|
attributes: list[str] | None = None
|
|
42
48
|
|
|
43
49
|
|
|
44
50
|
class TDF:
|
|
51
|
+
"""TDF reader and writer for handling TDF encryption and decryption."""
|
|
52
|
+
|
|
45
53
|
MAX_TDF_INPUT_SIZE = 68719476736
|
|
46
54
|
GCM_KEY_SIZE = 32
|
|
47
55
|
GCM_IV_SIZE = 12
|
|
@@ -53,6 +61,13 @@ class TDF:
|
|
|
53
61
|
GLOBAL_KEY_SALT = b"TDF-Session-Key"
|
|
54
62
|
|
|
55
63
|
def __init__(self, services=None, maximum_size: int | None = None):
|
|
64
|
+
"""Initialize TDF reader/writer.
|
|
65
|
+
|
|
66
|
+
Args:
|
|
67
|
+
services: SDK services for KAS operations
|
|
68
|
+
maximum_size: Maximum size allowed for TDF operations
|
|
69
|
+
|
|
70
|
+
"""
|
|
56
71
|
self.services = services
|
|
57
72
|
self.maximum_size = maximum_size or self.MAX_TDF_INPUT_SIZE
|
|
58
73
|
|
|
@@ -74,7 +89,7 @@ class TDF:
|
|
|
74
89
|
except Exception as e:
|
|
75
90
|
raise ValueError(
|
|
76
91
|
f"Failed to fetch public key for KAS {kas.url}: {e}"
|
|
77
|
-
)
|
|
92
|
+
) from e
|
|
78
93
|
else:
|
|
79
94
|
raise ValueError(
|
|
80
95
|
"Each KAS info must have a public_key, or SDK services must be available to fetch it"
|
|
@@ -162,7 +177,7 @@ class TDF:
|
|
|
162
177
|
return _json.dumps(policy, default=self._serialize_policy_object)
|
|
163
178
|
|
|
164
179
|
def _serialize_policy_object(self, obj):
|
|
165
|
-
"""
|
|
180
|
+
"""Serialize policy object to compatible JSON format."""
|
|
166
181
|
from otdf_python.policy_object import AttributeObject, PolicyBody
|
|
167
182
|
|
|
168
183
|
if isinstance(obj, PolicyBody):
|
|
@@ -185,9 +200,7 @@ class TDF:
|
|
|
185
200
|
return obj.__dict__
|
|
186
201
|
|
|
187
202
|
def _unwrap_key(self, key_access_objs, private_key_pem):
|
|
188
|
-
"""
|
|
189
|
-
Unwraps the key locally using a provided private key (used for testing)
|
|
190
|
-
"""
|
|
203
|
+
"""Unwrap the key locally using provided private key (used for testing)."""
|
|
191
204
|
from .asym_crypto import AsymDecryption
|
|
192
205
|
|
|
193
206
|
key = None
|
|
@@ -204,9 +217,7 @@ class TDF:
|
|
|
204
217
|
return key
|
|
205
218
|
|
|
206
219
|
def _unwrap_key_with_kas(self, key_access_objs, policy_b64) -> bytes:
|
|
207
|
-
"""
|
|
208
|
-
Unwraps the key using the KAS service (production method)
|
|
209
|
-
"""
|
|
220
|
+
"""Unwrap the key using the KAS service (production method)."""
|
|
210
221
|
# Get KAS client from services
|
|
211
222
|
if not self.services:
|
|
212
223
|
raise ValueError("SDK services required for KAS operations")
|
|
@@ -281,6 +292,17 @@ class TDF:
|
|
|
281
292
|
config: TDFConfig,
|
|
282
293
|
output_stream: io.BytesIO | None = None,
|
|
283
294
|
):
|
|
295
|
+
"""Create a TDF with the provided payload and configuration.
|
|
296
|
+
|
|
297
|
+
Args:
|
|
298
|
+
payload: The payload data as bytes or BinaryIO
|
|
299
|
+
config: TDFConfig for encryption settings
|
|
300
|
+
output_stream: Optional output stream, creates new BytesIO if not provided
|
|
301
|
+
|
|
302
|
+
Returns:
|
|
303
|
+
Tuple of (manifest, size, output_stream)
|
|
304
|
+
|
|
305
|
+
"""
|
|
284
306
|
if output_stream is None:
|
|
285
307
|
output_stream = io.BytesIO()
|
|
286
308
|
writer = TDFWriter(output_stream)
|
|
@@ -380,6 +402,16 @@ class TDF:
|
|
|
380
402
|
def load_tdf(
|
|
381
403
|
self, tdf_data: bytes | io.BytesIO, config: TDFReaderConfig
|
|
382
404
|
) -> TDFReader:
|
|
405
|
+
"""Load and decrypt a TDF from the provided data.
|
|
406
|
+
|
|
407
|
+
Args:
|
|
408
|
+
tdf_data: The TDF data as bytes or BytesIO
|
|
409
|
+
config: TDFReaderConfig with optional private key for local unwrapping
|
|
410
|
+
|
|
411
|
+
Returns:
|
|
412
|
+
TDFReader containing payload and manifest
|
|
413
|
+
|
|
414
|
+
"""
|
|
383
415
|
# Extract manifest, unwrap payload key using KAS client
|
|
384
416
|
# Handle both bytes and BinaryIO input
|
|
385
417
|
tdf_bytes_io = io.BytesIO(tdf_data) if isinstance(tdf_data, bytes) else tdf_data
|
|
@@ -423,8 +455,13 @@ class TDF:
|
|
|
423
455
|
def read_payload(
|
|
424
456
|
self, tdf_bytes: bytes, config: dict, output_stream: BinaryIO
|
|
425
457
|
) -> None:
|
|
426
|
-
"""
|
|
427
|
-
|
|
458
|
+
"""Read and verify TDF segments, decrypt if needed, and write the payload.
|
|
459
|
+
|
|
460
|
+
Args:
|
|
461
|
+
tdf_bytes: The TDF data as bytes
|
|
462
|
+
config: Configuration dictionary for reading
|
|
463
|
+
output_stream: The output stream to write the payload to
|
|
464
|
+
|
|
428
465
|
"""
|
|
429
466
|
import base64
|
|
430
467
|
import zipfile
|
otdf_python/tdf_reader.py
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
"""
|
|
2
|
-
TDFReader is responsible for reading and processing Trusted Data Format (TDF) files.
|
|
3
|
-
"""
|
|
1
|
+
"""TDFReader is responsible for reading and processing Trusted Data Format (TDF) files."""
|
|
4
2
|
|
|
5
3
|
from .manifest import Manifest
|
|
6
4
|
from .policy_object import PolicyObject
|
|
@@ -13,15 +11,13 @@ TDF_PAYLOAD_FILE_NAME = "0.payload"
|
|
|
13
11
|
|
|
14
12
|
|
|
15
13
|
class TDFReader:
|
|
16
|
-
"""
|
|
17
|
-
TDFReader is responsible for reading and processing Trusted Data Format (TDF) files.
|
|
14
|
+
"""TDFReader is responsible for reading and processing Trusted Data Format (TDF) files.
|
|
18
15
|
The class initializes with a TDF file channel, extracts the manifest and payload entries,
|
|
19
16
|
and provides methods to retrieve the manifest content, read payload bytes, and read policy objects.
|
|
20
17
|
"""
|
|
21
18
|
|
|
22
19
|
def __init__(self, tdf):
|
|
23
|
-
"""
|
|
24
|
-
Initialize a TDFReader with a TDF file channel.
|
|
20
|
+
"""Initialize a TDFReader with a TDF file channel.
|
|
25
21
|
|
|
26
22
|
Args:
|
|
27
23
|
tdf: A file-like object containing the TDF data
|
|
@@ -29,6 +25,7 @@ class TDFReader:
|
|
|
29
25
|
Raises:
|
|
30
26
|
SDKException: If there's an error reading the TDF
|
|
31
27
|
ValueError: If the TDF doesn't contain a manifest or payload
|
|
28
|
+
|
|
32
29
|
"""
|
|
33
30
|
try:
|
|
34
31
|
self._zip_reader = ZipReader(tdf)
|
|
@@ -48,14 +45,14 @@ class TDFReader:
|
|
|
48
45
|
raise SDKException("Error initializing TDFReader") from e
|
|
49
46
|
|
|
50
47
|
def manifest(self) -> str:
|
|
51
|
-
"""
|
|
52
|
-
Get the manifest content as a string.
|
|
48
|
+
"""Get the manifest content as a string.
|
|
53
49
|
|
|
54
50
|
Returns:
|
|
55
51
|
The manifest content as a UTF-8 encoded string
|
|
56
52
|
|
|
57
53
|
Raises:
|
|
58
54
|
SDKException: If there's an error retrieving the manifest
|
|
55
|
+
|
|
59
56
|
"""
|
|
60
57
|
try:
|
|
61
58
|
manifest_data = self._zip_reader.read(self._manifest_name)
|
|
@@ -64,8 +61,7 @@ class TDFReader:
|
|
|
64
61
|
raise SDKException("Error retrieving manifest from zip file") from e
|
|
65
62
|
|
|
66
63
|
def read_payload_bytes(self, buf: bytearray) -> int:
|
|
67
|
-
"""
|
|
68
|
-
Read bytes from the payload into a buffer.
|
|
64
|
+
"""Read bytes from the payload into a buffer.
|
|
69
65
|
|
|
70
66
|
Args:
|
|
71
67
|
buf: A bytearray buffer to read into
|
|
@@ -75,6 +71,7 @@ class TDFReader:
|
|
|
75
71
|
|
|
76
72
|
Raises:
|
|
77
73
|
SDKException: If there's an error reading from the payload
|
|
74
|
+
|
|
78
75
|
"""
|
|
79
76
|
try:
|
|
80
77
|
# Read the entire payload
|
|
@@ -89,14 +86,14 @@ class TDFReader:
|
|
|
89
86
|
raise SDKException("Error reading from payload in TDF") from e
|
|
90
87
|
|
|
91
88
|
def read_policy_object(self) -> PolicyObject:
|
|
92
|
-
"""
|
|
93
|
-
Read the policy object from the manifest.
|
|
89
|
+
"""Read the policy object from the manifest.
|
|
94
90
|
|
|
95
91
|
Returns:
|
|
96
92
|
The PolicyObject
|
|
97
93
|
|
|
98
94
|
Raises:
|
|
99
95
|
SDKException: If there's an error reading the policy object
|
|
96
|
+
|
|
100
97
|
"""
|
|
101
98
|
try:
|
|
102
99
|
manifest_text = self.manifest()
|
otdf_python/tdf_writer.py
CHANGED
|
@@ -1,13 +1,18 @@
|
|
|
1
|
+
"""TDF writer for creating encrypted TDF files."""
|
|
2
|
+
|
|
1
3
|
import io
|
|
2
4
|
|
|
3
5
|
from otdf_python.zip_writer import ZipWriter
|
|
4
6
|
|
|
5
7
|
|
|
6
8
|
class TDFWriter:
|
|
9
|
+
"""TDF file writer for creating encrypted TDF packages."""
|
|
10
|
+
|
|
7
11
|
TDF_PAYLOAD_FILE_NAME = "0.payload"
|
|
8
12
|
TDF_MANIFEST_FILE_NAME = "0.manifest.json"
|
|
9
13
|
|
|
10
14
|
def __init__(self, out_stream: io.BytesIO | None = None):
|
|
15
|
+
"""Initialize TDF writer."""
|
|
11
16
|
self._zip_writer = ZipWriter(out_stream)
|
|
12
17
|
|
|
13
18
|
def append_manifest(self, manifest: str):
|
otdf_python/token_source.py
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
"""
|
|
2
|
-
TokenSource: Handles OAuth2 token acquisition and caching.
|
|
3
|
-
"""
|
|
1
|
+
"""TokenSource: Handles OAuth2 token acquisition and caching."""
|
|
4
2
|
|
|
5
3
|
import time
|
|
6
4
|
|
|
@@ -8,7 +6,10 @@ import httpx
|
|
|
8
6
|
|
|
9
7
|
|
|
10
8
|
class TokenSource:
|
|
9
|
+
"""OAuth2 token source for authentication."""
|
|
10
|
+
|
|
11
11
|
def __init__(self, token_url, client_id, client_secret):
|
|
12
|
+
"""Initialize token source."""
|
|
12
13
|
self.token_url = token_url
|
|
13
14
|
self.client_id = client_id
|
|
14
15
|
self.client_secret = client_secret
|
otdf_python/version.py
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
|
+
"""SDK version information."""
|
|
2
|
+
|
|
1
3
|
import re
|
|
2
4
|
from functools import total_ordering
|
|
3
5
|
|
|
4
6
|
|
|
5
7
|
@total_ordering
|
|
6
8
|
class Version:
|
|
9
|
+
"""Semantic version representation."""
|
|
10
|
+
|
|
7
11
|
SEMVER_PATTERN = re.compile(
|
|
8
12
|
r"^(?P<major>0|[1-9]\d*)\.(?P<minor>0|[1-9]\d*)\.(?P<patch>0|[1-9]\d*)(?P<prereleaseAndMetadata>\D.*)?$"
|
|
9
13
|
)
|
|
@@ -15,6 +19,7 @@ class Version:
|
|
|
15
19
|
patch=None,
|
|
16
20
|
prerelease_and_metadata: str | None = None,
|
|
17
21
|
):
|
|
22
|
+
"""Initialize semantic version."""
|
|
18
23
|
if minor is None and patch is None:
|
|
19
24
|
# Parse from string
|
|
20
25
|
m = self.SEMVER_PATTERN.match(semver_or_major)
|
otdf_python/zip_reader.py
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
"""ZIP file reader for TDF operations."""
|
|
2
|
+
|
|
1
3
|
import io
|
|
2
4
|
import zipfile
|
|
3
5
|
|
|
@@ -5,8 +7,13 @@ from otdf_python.invalid_zip_exception import InvalidZipException
|
|
|
5
7
|
|
|
6
8
|
|
|
7
9
|
class ZipReader:
|
|
10
|
+
"""ZIP file reader for reading TDF packages."""
|
|
11
|
+
|
|
8
12
|
class Entry:
|
|
13
|
+
"""ZIP file entry with data access."""
|
|
14
|
+
|
|
9
15
|
def __init__(self, zipfile_obj, zipinfo):
|
|
16
|
+
"""Initialize ZIP entry."""
|
|
10
17
|
self._zipfile = zipfile_obj
|
|
11
18
|
self._zipinfo = zipinfo
|
|
12
19
|
|
|
@@ -17,9 +24,10 @@ class ZipReader:
|
|
|
17
24
|
try:
|
|
18
25
|
return self._zipfile.read(self._zipinfo)
|
|
19
26
|
except Exception as e:
|
|
20
|
-
raise InvalidZipException(f"Error reading entry data: {e}")
|
|
27
|
+
raise InvalidZipException(f"Error reading entry data: {e}") from e
|
|
21
28
|
|
|
22
29
|
def __init__(self, in_stream: io.BytesIO | bytes | None = None):
|
|
30
|
+
"""Initialize ZIP reader."""
|
|
23
31
|
try:
|
|
24
32
|
if isinstance(in_stream, bytes):
|
|
25
33
|
in_stream = io.BytesIO(in_stream)
|
|
@@ -29,7 +37,7 @@ class ZipReader:
|
|
|
29
37
|
self.Entry(self.zipfile, zi) for zi in self.zipfile.infolist()
|
|
30
38
|
]
|
|
31
39
|
except zipfile.BadZipFile as e:
|
|
32
|
-
raise InvalidZipException(f"Invalid ZIP file: {e}")
|
|
40
|
+
raise InvalidZipException(f"Invalid ZIP file: {e}") from e
|
|
33
41
|
|
|
34
42
|
def get_entries(self) -> list:
|
|
35
43
|
return self.entries
|
otdf_python/zip_writer.py
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
|
+
"""ZIP file writer for TDF operations."""
|
|
2
|
+
|
|
1
3
|
import io
|
|
2
4
|
import zipfile
|
|
3
5
|
import zlib
|
|
4
6
|
|
|
5
7
|
|
|
6
8
|
class FileInfo:
|
|
9
|
+
"""ZIP file metadata information."""
|
|
10
|
+
|
|
7
11
|
def __init__(self, name: str, crc: int, size: int, offset: int):
|
|
12
|
+
"""Initialize file info."""
|
|
8
13
|
self.name = name
|
|
9
14
|
self.crc = crc
|
|
10
15
|
self.size = size
|
|
@@ -12,7 +17,10 @@ class FileInfo:
|
|
|
12
17
|
|
|
13
18
|
|
|
14
19
|
class ZipWriter:
|
|
20
|
+
"""ZIP file writer for creating TDF packages."""
|
|
21
|
+
|
|
15
22
|
def __init__(self, out_stream: io.BytesIO | None = None):
|
|
23
|
+
"""Initialize ZIP writer."""
|
|
16
24
|
self.out_stream = out_stream or io.BytesIO()
|
|
17
25
|
self.zipfile = zipfile.ZipFile(
|
|
18
26
|
self.out_stream, mode="w", compression=zipfile.ZIP_STORED
|
|
@@ -45,7 +53,10 @@ class ZipWriter:
|
|
|
45
53
|
|
|
46
54
|
|
|
47
55
|
class _TrackingWriter(io.RawIOBase):
|
|
56
|
+
"""Internal ZIP stream writer with offset tracking."""
|
|
57
|
+
|
|
48
58
|
def __init__(self, zip_writer: ZipWriter, name: str, offset: int):
|
|
59
|
+
"""Initialize tracking writer."""
|
|
49
60
|
self._zip_writer = zip_writer
|
|
50
61
|
self._name = name
|
|
51
62
|
self._offset = offset
|
|
@@ -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
|
|
@@ -1,76 +1,76 @@
|
|
|
1
|
-
otdf_python/__init__.py,sha256=
|
|
2
|
-
otdf_python/__main__.py,sha256=
|
|
3
|
-
otdf_python/address_normalizer.py,sha256=
|
|
4
|
-
otdf_python/aesgcm.py,sha256=
|
|
5
|
-
otdf_python/assertion_config.py,sha256=
|
|
6
|
-
otdf_python/asym_crypto.py,sha256=
|
|
7
|
-
otdf_python/auth_headers.py,sha256=
|
|
8
|
-
otdf_python/autoconfigure_utils.py,sha256=
|
|
9
|
-
otdf_python/cli.py,sha256=
|
|
10
|
-
otdf_python/collection_store.py,sha256=
|
|
11
|
-
otdf_python/collection_store_impl.py,sha256=
|
|
12
|
-
otdf_python/config.py,sha256=
|
|
13
|
-
otdf_python/connect_client.py,sha256=
|
|
14
|
-
otdf_python/constants.py,sha256=
|
|
15
|
-
otdf_python/crypto_utils.py,sha256=
|
|
16
|
-
otdf_python/dpop.py,sha256
|
|
17
|
-
otdf_python/ecc_constants.py,sha256=
|
|
18
|
-
otdf_python/ecc_mode.py,sha256=
|
|
19
|
-
otdf_python/ecdh.py,sha256=
|
|
20
|
-
otdf_python/eckeypair.py,sha256=
|
|
21
|
-
otdf_python/header.py,sha256=
|
|
22
|
-
otdf_python/invalid_zip_exception.py,sha256=
|
|
23
|
-
otdf_python/kas_client.py,sha256=
|
|
24
|
-
otdf_python/kas_connect_rpc_client.py,sha256=
|
|
25
|
-
otdf_python/kas_info.py,sha256=
|
|
26
|
-
otdf_python/kas_key_cache.py,sha256=
|
|
27
|
-
otdf_python/key_type.py,sha256=
|
|
28
|
-
otdf_python/key_type_constants.py,sha256=
|
|
29
|
-
otdf_python/manifest.py,sha256=
|
|
30
|
-
otdf_python/nanotdf.py,sha256=
|
|
31
|
-
otdf_python/nanotdf_ecdsa_struct.py,sha256=
|
|
32
|
-
otdf_python/nanotdf_type.py,sha256=
|
|
33
|
-
otdf_python/policy_binding_serializer.py,sha256=
|
|
34
|
-
otdf_python/policy_info.py,sha256=
|
|
35
|
-
otdf_python/policy_object.py,sha256=
|
|
36
|
-
otdf_python/policy_stub.py,sha256=
|
|
37
|
-
otdf_python/resource_locator.py,sha256=
|
|
38
|
-
otdf_python/sdk.py,sha256=
|
|
39
|
-
otdf_python/sdk_builder.py,sha256=
|
|
40
|
-
otdf_python/sdk_exceptions.py,sha256=
|
|
41
|
-
otdf_python/symmetric_and_payload_config.py,sha256=
|
|
42
|
-
otdf_python/tdf.py,sha256=
|
|
43
|
-
otdf_python/tdf_reader.py,sha256=
|
|
44
|
-
otdf_python/tdf_writer.py,sha256=
|
|
45
|
-
otdf_python/token_source.py,sha256=
|
|
46
|
-
otdf_python/version.py,sha256
|
|
47
|
-
otdf_python/zip_reader.py,sha256=
|
|
48
|
-
otdf_python/zip_writer.py,sha256=
|
|
49
|
-
otdf_python_proto/__init__.py,sha256=
|
|
50
|
-
otdf_python_proto/authorization/__init__.py,sha256=
|
|
1
|
+
otdf_python/__init__.py,sha256=q93tKt2r5-_244iKPeJf4ja1ftlmOmdRQnXWAZsxISI,542
|
|
2
|
+
otdf_python/__main__.py,sha256=VuImcvrzCHTYOwQ-yS9HQwKmF2O6lORf1psmOkdZIh0,275
|
|
3
|
+
otdf_python/address_normalizer.py,sha256=7gigfxFIFnDILi8BGQipuLl-Cr71pwi5vE72hbpLdmI,2850
|
|
4
|
+
otdf_python/aesgcm.py,sha256=jQgVSEeKM6MJuH2tvlClXIzvg11a5O_GEY9Sh56CrxE,1947
|
|
5
|
+
otdf_python/assertion_config.py,sha256=rw0SIB3xG-nAeb5r_liuxLphU4tcj-zlq8rVvXncX-Y,2317
|
|
6
|
+
otdf_python/asym_crypto.py,sha256=EYkMNhZJP5khH0IvICTOG2bMg_TMvd6wXDu5zW0jpj4,7234
|
|
7
|
+
otdf_python/auth_headers.py,sha256=uOLflFunBCw59nwk23rdiFQWOFrS19HugQXuQPGv3xE,986
|
|
8
|
+
otdf_python/autoconfigure_utils.py,sha256=W5aJ0tC7HWfGb_1Mva_oxgduUzSpPoyDeaq0rPwgPAs,3689
|
|
9
|
+
otdf_python/cli.py,sha256=HKIzuIXIW2sBwW3jy9sGq8WVFlxlKrdKac9MjJig88Y,19940
|
|
10
|
+
otdf_python/collection_store.py,sha256=sYL6VMFDBfHfCCLk14iybeC_qoUlpJFB0wOMt1bdwpY,1429
|
|
11
|
+
otdf_python/collection_store_impl.py,sha256=3RqO3rvDCosajKpuls5DiO2_SWYsNQul9_9L7n-lQ68,758
|
|
12
|
+
otdf_python/config.py,sha256=l1Ykg1gFUrFZTnd6bwMI6oi_clR5uCZ_Y1qH7QKtW90,2523
|
|
13
|
+
otdf_python/connect_client.py,sha256=TpHpcU2t19pSqWn30cqzfM48nDG590BfNTlDPgUu054,45
|
|
14
|
+
otdf_python/constants.py,sha256=ArVgY9OF2fkVM7dg0-9N3xs0xmKy0DWDUlVcO0_n9PQ,102
|
|
15
|
+
otdf_python/crypto_utils.py,sha256=x0cEltQDVW8bxJ9L555KQKJU4_dI5Uw2h7j9oQGNT38,2933
|
|
16
|
+
otdf_python/dpop.py,sha256=-76xjKz9Alf529StB_jQWhr-gCAOBkpssaSYQw2EH1A,2295
|
|
17
|
+
otdf_python/ecc_constants.py,sha256=rCVZCWZ9zhyq2sqnUGFadiZ1CwXXe5T9olDtFYCJCIs,5846
|
|
18
|
+
otdf_python/ecc_mode.py,sha256=aEAISAZpXcS72gXRUlYgH8n8EJP7zIpOeSVPxUJdAG8,3163
|
|
19
|
+
otdf_python/ecdh.py,sha256=fwxE80qFSIkfJeUz3GNhEndRKkZrBN06FE1gnvwUHHI,10201
|
|
20
|
+
otdf_python/eckeypair.py,sha256=qcPKv0OS1lYxRICj9dhAW_eMz32anFBtpI8EJfXxpX0,2470
|
|
21
|
+
otdf_python/header.py,sha256=peG14kE_KAUCW4fY82sqcWF5zTAVAnJfFXCHtC8Z0iQ,7189
|
|
22
|
+
otdf_python/invalid_zip_exception.py,sha256=M_bAiXEjJdxPfA178YH-uHGRwMrNBKzjQzlQ54aDP2w,292
|
|
23
|
+
otdf_python/kas_client.py,sha256=6q61WHUPAaDdLET0EkFbIpGMy9hHFCJoA3gs4xbd9FE,26542
|
|
24
|
+
otdf_python/kas_connect_rpc_client.py,sha256=cB3cBomCClmu-InUpw8R35cLyJQ8X0PoEsFvYSH0RUM,8950
|
|
25
|
+
otdf_python/kas_info.py,sha256=V-5om8k4RKbhE0h1CS1Rxb18TYcHKvq_hEPP6ah8K_o,738
|
|
26
|
+
otdf_python/kas_key_cache.py,sha256=6hfzRAg9o_IfRErWSe-_gGTG9kRyYENMizMY1Shkmfk,1548
|
|
27
|
+
otdf_python/key_type.py,sha256=2gQlXOj35J3ISCcWjU3sGYUxmlZR47BMq6Xr2yoKA8k,928
|
|
28
|
+
otdf_python/key_type_constants.py,sha256=MV2Dsea3A6nnnYztoD0N1QxhrbQXZfaXaqCr2rI6sqo,954
|
|
29
|
+
otdf_python/manifest.py,sha256=aglGw9EdtZZIxmwqy82sV5wum_mKkjzew4brSgxmJjc,7047
|
|
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
|
+
otdf_python/policy_binding_serializer.py,sha256=oOcGBYOISPTzHRtk8JszwLTraY_F2OoevOf0a53jGHA,1271
|
|
34
|
+
otdf_python/policy_info.py,sha256=aq74dZg9PhTZ6cMkZyFsu3D754C5YijFMiuoYEL-1bY,2076
|
|
35
|
+
otdf_python/policy_object.py,sha256=LikIsahPkKr-iYA0lhgQitCbh8CsmxUBYyBs6VYfmxY,512
|
|
36
|
+
otdf_python/policy_stub.py,sha256=RfU_fICqsAOnTXOHpKhtKC0RJ3KoWhDxO0XecZWM548,159
|
|
37
|
+
otdf_python/resource_locator.py,sha256=bjK935XcfNq-PyqidHNq8eIiPeZEStYdQvmQ9B9GY20,6290
|
|
38
|
+
otdf_python/sdk.py,sha256=4aIdIDhx2dMPRMfp9U8gzpwiqSeBf7SrEewb2BjB6PM,14012
|
|
39
|
+
otdf_python/sdk_builder.py,sha256=ltnFZD7ClVVwhGwu6ew4WNiNj0NB3n2Xn_MTEcbIMxo,14497
|
|
40
|
+
otdf_python/sdk_exceptions.py,sha256=2GElGyM5LKN8Uh_lAiT6Ho4oNRWYRQsMNOK5s2jiv28,687
|
|
41
|
+
otdf_python/symmetric_and_payload_config.py,sha256=iPHeZSeY9BjsQ-wkvdm6-FIR7773EgGiaIvSG-ICOHw,1158
|
|
42
|
+
otdf_python/tdf.py,sha256=PtVBY_vAPIGz1I4gUlHPLPxa1gCCsd2nlRm0SrbaoJA,20840
|
|
43
|
+
otdf_python/tdf_reader.py,sha256=WMetzX4CIKJ15f4J_zyFGtObQO6bQ33KC_ykIonH9ik,5228
|
|
44
|
+
otdf_python/tdf_writer.py,sha256=FLm1P26J4p6WPyKsjOb7QLYJqDIMDsBONqBW_JuFxyw,798
|
|
45
|
+
otdf_python/token_source.py,sha256=YHbP7deSSXo1CvzVGJX7DkOuBgqwfP_Ockm8CE-MN0o,1011
|
|
46
|
+
otdf_python/version.py,sha256=uDKJKsSQoaEH-JlqAwiXDxceLRX9hkG4I3NVLEfDCHA,2025
|
|
47
|
+
otdf_python/zip_reader.py,sha256=qrHv-ecs09tz99ZKdOMiWaciYf2XsQOUTiXy1JHjuEY,1705
|
|
48
|
+
otdf_python/zip_writer.py,sha256=5-KChgEXCf4TKAAML-R8cqpAiap85ur1l2lJCCac6BE,2405
|
|
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.0.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
|
]
|