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.
Files changed (58) hide show
  1. otdf_python/autoconfigure_utils.py +0 -2
  2. otdf_python/collection_store.py +0 -1
  3. otdf_python/ecdh.py +0 -6
  4. otdf_python/kas_client.py +18 -0
  5. otdf_python/kas_connect_rpc_client.py +59 -19
  6. otdf_python/nanotdf.py +0 -8
  7. otdf_python/nanotdf_ecdsa_struct.py +0 -2
  8. otdf_python/nanotdf_type.py +1 -1
  9. otdf_python/sdk.py +2 -16
  10. otdf_python/sdk_builder.py +2 -6
  11. {otdf_python-0.4.1.dist-info → otdf_python-0.4.2.dist-info}/METADATA +3 -2
  12. {otdf_python-0.4.1.dist-info → otdf_python-0.4.2.dist-info}/RECORD +43 -34
  13. otdf_python_proto/__init__.py +2 -6
  14. otdf_python_proto/authorization/__init__.py +10 -0
  15. otdf_python_proto/authorization/authorization_connect.py +250 -0
  16. otdf_python_proto/authorization/v2/authorization_connect.py +315 -0
  17. otdf_python_proto/entityresolution/__init__.py +10 -0
  18. otdf_python_proto/entityresolution/entity_resolution_connect.py +185 -0
  19. otdf_python_proto/entityresolution/v2/entity_resolution_connect.py +185 -0
  20. otdf_python_proto/kas/__init__.py +2 -2
  21. otdf_python_proto/kas/kas_connect.py +259 -0
  22. otdf_python_proto/policy/actions/__init__.py +11 -0
  23. otdf_python_proto/policy/actions/actions_connect.py +380 -0
  24. otdf_python_proto/policy/attributes/__init__.py +11 -0
  25. otdf_python_proto/policy/attributes/attributes_connect.py +1310 -0
  26. otdf_python_proto/policy/kasregistry/__init__.py +11 -0
  27. otdf_python_proto/policy/kasregistry/key_access_server_registry_connect.py +912 -0
  28. otdf_python_proto/policy/keymanagement/__init__.py +11 -0
  29. otdf_python_proto/policy/keymanagement/key_management_connect.py +380 -0
  30. otdf_python_proto/policy/namespaces/__init__.py +11 -0
  31. otdf_python_proto/policy/namespaces/namespaces_connect.py +648 -0
  32. otdf_python_proto/policy/registeredresources/__init__.py +11 -0
  33. otdf_python_proto/policy/registeredresources/registered_resources_connect.py +770 -0
  34. otdf_python_proto/policy/resourcemapping/__init__.py +11 -0
  35. otdf_python_proto/policy/resourcemapping/resource_mapping_connect.py +790 -0
  36. otdf_python_proto/policy/subjectmapping/__init__.py +11 -0
  37. otdf_python_proto/policy/subjectmapping/subject_mapping_connect.py +851 -0
  38. otdf_python_proto/policy/unsafe/__init__.py +11 -0
  39. otdf_python_proto/policy/unsafe/unsafe_connect.py +705 -0
  40. otdf_python_proto/wellknownconfiguration/__init__.py +10 -0
  41. otdf_python_proto/wellknownconfiguration/wellknown_configuration_connect.py +124 -0
  42. otdf_python_proto/authorization/authorization_pb2_connect.py +0 -191
  43. otdf_python_proto/authorization/v2/authorization_pb2_connect.py +0 -233
  44. otdf_python_proto/entityresolution/entity_resolution_pb2_connect.py +0 -149
  45. otdf_python_proto/entityresolution/v2/entity_resolution_pb2_connect.py +0 -149
  46. otdf_python_proto/kas/kas_pb2_connect.py +0 -192
  47. otdf_python_proto/policy/actions/actions_pb2_connect.py +0 -275
  48. otdf_python_proto/policy/attributes/attributes_pb2_connect.py +0 -863
  49. otdf_python_proto/policy/kasregistry/key_access_server_registry_pb2_connect.py +0 -611
  50. otdf_python_proto/policy/keymanagement/key_management_pb2_connect.py +0 -275
  51. otdf_python_proto/policy/namespaces/namespaces_pb2_connect.py +0 -443
  52. otdf_python_proto/policy/registeredresources/registered_resources_pb2_connect.py +0 -527
  53. otdf_python_proto/policy/resourcemapping/resource_mapping_pb2_connect.py +0 -527
  54. otdf_python_proto/policy/subjectmapping/subject_mapping_pb2_connect.py +0 -569
  55. otdf_python_proto/policy/unsafe/unsafe_pb2_connect.py +0 -485
  56. otdf_python_proto/wellknownconfiguration/wellknown_configuration_pb2_connect.py +0 -107
  57. {otdf_python-0.4.1.dist-info → otdf_python-0.4.2.dist-info}/WHEEL +0 -0
  58. {otdf_python-0.4.1.dist-info → otdf_python-0.4.2.dist-info}/licenses/LICENSE +0 -0
@@ -39,8 +39,6 @@ class KeySplitStep:
39
39
  class AutoConfigureException(Exception):
40
40
  """Exception for auto-configuration errors."""
41
41
 
42
- pass
43
-
44
42
 
45
43
  class AttributeNameFQN:
46
44
  """Fully qualified attribute name."""
@@ -28,7 +28,6 @@ class NoOpCollectionStore(CollectionStore):
28
28
 
29
29
  def store(self, header, key: CollectionKey):
30
30
  """Discard key operation (no-op)."""
31
- pass
32
31
 
33
32
  def get_key(self, header) -> CollectionKey:
34
33
  return self.NO_PRIVATE_KEY
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 urllib3
7
+ import httpx
8
8
  from otdf_python_proto.kas import kas_pb2
9
- from otdf_python_proto.kas.kas_pb2_connect import AccessServiceClient
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
- urllib3.PoolManager configured for SSL verification settings
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 urllib3.PoolManager()
60
+ return httpx.Client()
40
61
  else:
41
62
  logging.info("Using SSL verification disabled HTTP client")
42
- urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
43
- return urllib3.PoolManager(cert_reqs="CERT_NONE")
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
- # Create Connect RPC client with configured HTTP client using Connect protocol
107
- # Note: gRPC protocol is not supported with urllib3, use default Connect protocol
108
- client = AccessServiceClient(connect_rpc_base_url, http_client=http_client)
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
- extra_headers = self._prepare_auth_headers(access_token)
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, extra_headers=extra_headers)
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
- # Note: gRPC protocol is not supported with urllib3, use default Connect protocol
171
- client = AccessServiceClient(kas_service_url, http_client=http_client)
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
- extra_headers = self._prepare_auth_headers(access_token)
222
+ headers = self._prepare_auth_headers(access_token)
183
223
 
184
224
  # Make the rewrap call with authentication headers
185
- response = client.rewrap(request, extra_headers=extra_headers)
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."""
@@ -6,8 +6,6 @@ from dataclasses import dataclass, field
6
6
  class IncorrectNanoTDFECDSASignatureSize(Exception):
7
7
  """Exception raised when the signature size is incorrect."""
8
8
 
9
- pass
10
-
11
9
 
12
10
  @dataclass
13
11
  class NanoTDFECDSAStruct:
@@ -8,7 +8,7 @@ class ECCurve(Enum):
8
8
 
9
9
  SECP256R1 = "secp256r1"
10
10
  SECP384R1 = "secp384r1"
11
- SECP521R1 = "secp384r1"
11
+ SECP521R1 = "secp521r1"
12
12
  SECP256K1 = "secp256k1"
13
13
 
14
14
  def __str__(self):
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
- pass
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
 
@@ -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.1
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[compiler]<0.5,>=0.4.2
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=ShmqQrz_Fx8NrJwcSU1LhNOvIaYRlVo5F5jOikoGR98,3699
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=elUkxIZ3SxR7Ny6pAoaYRYwkF0lzF_A21WKPpQCCGvE,1442
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=ut_WC2DMSOqlzyoIq8nWD8L51BGLiqzQPZB7FnrN2h8,10231
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=dC0A23-dWU0S7vy2-VVp55RYFX9xdX0Seerd3M-CBek,25961
24
- otdf_python/kas_connect_rpc_client.py,sha256=2orgU6HPqAykELc0YR7K8XkCEBZ9japZm4W-Eb8_jCg,7817
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=-tgt-78V7XOm8pPGgBIf1kHRn_Ctm9dudf3UZsT1AsU,34073
31
- otdf_python/nanotdf_ecdsa_struct.py,sha256=HI7Ca15opfRvQkk7Ja-Xw5Jkrs8Ml5OJsw4zsh2T5fc,4076
32
- otdf_python/nanotdf_type.py,sha256=pJXcDTc0nqOYAcFU06iy2w_rCbRKmSdsrbOaBbS6C_Q,1112
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=bo6ACCds5ELppIcnKOvasP8Swl1Y7hiLNVuIEu9S7Eg,14074
39
- otdf_python/sdk_builder.py,sha256=cmeBcgE76jCG7aN4qbn3dYuVdNF6kbJi9xY7jnuD26k,14581
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=2MVQMcsELGYF8NyXU8OFFQdXM1_WTKpdA9MUqiMazE8,931
50
- otdf_python_proto/authorization/__init__.py,sha256=hDpCNPxPswsfkcrCiv3Y78nqAQ_FxE9uDrYqeIqKipg,42
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/authorization_pb2_connect.py,sha256=PrbEg9mUSMA6Bwh5pCtwkIHEQ-phcd1vW0uIizBwqis,10162
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=YAlVbWPddWxz9U5ldGLwFxs1VvvM9x7c8_JalKwXa4U,45
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/entity_resolution_pb2_connect.py,sha256=7NFAV7cx27R8b__2eM0MAiwPaT8E3TEmm-QrhauW3nE,7972
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/entityresolution/v2/entity_resolution_pb2_connect.py,sha256=mnj_IuaBr_AjAGtvIc4QZzcHgG2UuYFnbA7cEH-f8RQ,8178
70
- otdf_python_proto/kas/__init__.py,sha256=8gcnDu9Hr7l0iJa3tVUjZruOjnewelau1Vt124Ln1n4,226
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/actions/actions_pb2_connect.py,sha256=u6M1o9T8lWtkLSp2sMG7mQwxNPMixK2VxZ3IVVyfAAM,14472
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/attributes/attributes_pb2_connect.py,sha256=M57-dw9vfiDJuwmCxLHlZhBxrXXPULbyyiopykh_xkU,56796
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/kasregistry/key_access_server_registry_pb2_connect.py,sha256=R2hkmB9X_Utg3C5fIWSGcTYZB9X3dJVy8gGaxkq6RFE,40328
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/keymanagement/key_management_pb2_connect.py,sha256=_ghDKFEFCaofp2j4U9mQ8RgizFHAN2XSJQsSHRBH_Zg,16662
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/namespaces/namespaces_pb2_connect.py,sha256=mXn8N0hmguejlkbL-IwwSYl-nXGdrfGPLQ0XMEKCXLM,27828
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/registeredresources/registered_resources_pb2_connect.py,sha256=KI17dRxTVL71j_qHlwEs1MZPVtayt-Ay5xwZgfmizq0,38350
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/resourcemapping/resource_mapping_pb2_connect.py,sha256=wuqKoDgpdGr0mo_JQ_MO2vshdXLDKVs1x_-9Ou4SchU,36062
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/subjectmapping/subject_mapping_pb2_connect.py,sha256=tn9Ib6TPWoYKQ7B-RKL2cliSPAC6DYLatXO6Ao2Ys7I,38548
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/policy/unsafe/unsafe_pb2_connect.py,sha256=OqKigFTTVPKQkL4TOMLqnEUKBc2zUp8qSSOk2TKP6U8,29839
130
- otdf_python_proto/wellknownconfiguration/__init__.py,sha256=X3GeZJ1mG_N1MViryjkqUU099f2qzR6bnoDQXGWhKpc,51
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
- otdf_python_proto/wellknownconfiguration/wellknown_configuration_pb2_connect.py,sha256=i9rGG2mgQZfk6xGCp1ywu4QqKWSiwpuLoNKGUwl43t8,5346
134
- otdf_python-0.4.1.dist-info/METADATA,sha256=uYTDX1sh7JDcDDoO0iwjs7srIxPVmOTTUyjSSP5UDcc,5132
135
- otdf_python-0.4.1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
136
- otdf_python-0.4.1.dist-info/licenses/LICENSE,sha256=DPrPHdI6tfZcqk9kzQ37vh1Ftk7LJYdMrUtwKl7L3Pw,1074
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,,
@@ -13,25 +13,21 @@ except metadata.PackageNotFoundError:
13
13
  __version__ = "0.0.0"
14
14
 
15
15
  # Import submodules to make them available
16
- from . import authorization
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
  ]
@@ -1 +1,11 @@
1
1
  """authorization protobuf definitions."""
2
+
3
+ from .authorization_connect import (
4
+ AuthorizationServiceClient,
5
+ AuthorizationServiceClientSync,
6
+ )
7
+
8
+ __all__ = [
9
+ "AuthorizationServiceClient",
10
+ "AuthorizationServiceClientSync",
11
+ ]