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.
Files changed (61) hide show
  1. otdf_python/autoconfigure_utils.py +0 -2
  2. otdf_python/cli.py +50 -21
  3. otdf_python/collection_store.py +0 -1
  4. otdf_python/ecdh.py +0 -6
  5. otdf_python/kas_allowlist.py +182 -0
  6. otdf_python/kas_client.py +44 -2
  7. otdf_python/kas_connect_rpc_client.py +59 -19
  8. otdf_python/nanotdf.py +4 -14
  9. otdf_python/nanotdf_ecdsa_struct.py +0 -2
  10. otdf_python/nanotdf_type.py +1 -1
  11. otdf_python/sdk.py +31 -15
  12. otdf_python/sdk_builder.py +88 -8
  13. otdf_python/tdf.py +2 -2
  14. {otdf_python-0.4.1.dist-info → otdf_python-0.4.3.dist-info}/METADATA +3 -2
  15. {otdf_python-0.4.1.dist-info → otdf_python-0.4.3.dist-info}/RECORD +46 -36
  16. otdf_python_proto/__init__.py +2 -6
  17. otdf_python_proto/authorization/__init__.py +10 -0
  18. otdf_python_proto/authorization/authorization_connect.py +250 -0
  19. otdf_python_proto/authorization/v2/authorization_connect.py +315 -0
  20. otdf_python_proto/entityresolution/__init__.py +10 -0
  21. otdf_python_proto/entityresolution/entity_resolution_connect.py +185 -0
  22. otdf_python_proto/entityresolution/v2/entity_resolution_connect.py +185 -0
  23. otdf_python_proto/kas/__init__.py +2 -2
  24. otdf_python_proto/kas/kas_connect.py +259 -0
  25. otdf_python_proto/policy/actions/__init__.py +11 -0
  26. otdf_python_proto/policy/actions/actions_connect.py +380 -0
  27. otdf_python_proto/policy/attributes/__init__.py +11 -0
  28. otdf_python_proto/policy/attributes/attributes_connect.py +1310 -0
  29. otdf_python_proto/policy/kasregistry/__init__.py +11 -0
  30. otdf_python_proto/policy/kasregistry/key_access_server_registry_connect.py +912 -0
  31. otdf_python_proto/policy/keymanagement/__init__.py +11 -0
  32. otdf_python_proto/policy/keymanagement/key_management_connect.py +380 -0
  33. otdf_python_proto/policy/namespaces/__init__.py +11 -0
  34. otdf_python_proto/policy/namespaces/namespaces_connect.py +648 -0
  35. otdf_python_proto/policy/registeredresources/__init__.py +11 -0
  36. otdf_python_proto/policy/registeredresources/registered_resources_connect.py +770 -0
  37. otdf_python_proto/policy/resourcemapping/__init__.py +11 -0
  38. otdf_python_proto/policy/resourcemapping/resource_mapping_connect.py +790 -0
  39. otdf_python_proto/policy/subjectmapping/__init__.py +11 -0
  40. otdf_python_proto/policy/subjectmapping/subject_mapping_connect.py +851 -0
  41. otdf_python_proto/policy/unsafe/__init__.py +11 -0
  42. otdf_python_proto/policy/unsafe/unsafe_connect.py +705 -0
  43. otdf_python_proto/wellknownconfiguration/__init__.py +10 -0
  44. otdf_python_proto/wellknownconfiguration/wellknown_configuration_connect.py +124 -0
  45. otdf_python_proto/authorization/authorization_pb2_connect.py +0 -191
  46. otdf_python_proto/authorization/v2/authorization_pb2_connect.py +0 -233
  47. otdf_python_proto/entityresolution/entity_resolution_pb2_connect.py +0 -149
  48. otdf_python_proto/entityresolution/v2/entity_resolution_pb2_connect.py +0 -149
  49. otdf_python_proto/kas/kas_pb2_connect.py +0 -192
  50. otdf_python_proto/policy/actions/actions_pb2_connect.py +0 -275
  51. otdf_python_proto/policy/attributes/attributes_pb2_connect.py +0 -863
  52. otdf_python_proto/policy/kasregistry/key_access_server_registry_pb2_connect.py +0 -611
  53. otdf_python_proto/policy/keymanagement/key_management_pb2_connect.py +0 -275
  54. otdf_python_proto/policy/namespaces/namespaces_pb2_connect.py +0 -443
  55. otdf_python_proto/policy/registeredresources/registered_resources_pb2_connect.py +0 -527
  56. otdf_python_proto/policy/resourcemapping/resource_mapping_pb2_connect.py +0 -527
  57. otdf_python_proto/policy/subjectmapping/subject_mapping_pb2_connect.py +0 -569
  58. otdf_python_proto/policy/unsafe/unsafe_pb2_connect.py +0 -485
  59. otdf_python_proto/wellknownconfiguration/wellknown_configuration_pb2_connect.py +0 -107
  60. {otdf_python-0.4.1.dist-info → otdf_python-0.4.3.dist-info}/WHEEL +0 -0
  61. {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
- pass
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
- pass
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."""
@@ -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 if obj.data_attributes else None,
187
- "dissem": obj.dissem if obj.dissem else None,
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.1
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[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
9
- otdf_python/cli.py,sha256=HKIzuIXIW2sBwW3jy9sGq8WVFlxlKrdKac9MjJig88Y,19940
10
- otdf_python/collection_store.py,sha256=elUkxIZ3SxR7Ny6pAoaYRYwkF0lzF_A21WKPpQCCGvE,1442
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=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_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=-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
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=bo6ACCds5ELppIcnKOvasP8Swl1Y7hiLNVuIEu9S7Eg,14074
39
- otdf_python/sdk_builder.py,sha256=cmeBcgE76jCG7aN4qbn3dYuVdNF6kbJi9xY7jnuD26k,14581
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=PtVBY_vAPIGz1I4gUlHPLPxa1gCCsd2nlRm0SrbaoJA,20840
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=2MVQMcsELGYF8NyXU8OFFQdXM1_WTKpdA9MUqiMazE8,931
50
- otdf_python_proto/authorization/__init__.py,sha256=hDpCNPxPswsfkcrCiv3Y78nqAQ_FxE9uDrYqeIqKipg,42
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/authorization_pb2_connect.py,sha256=PrbEg9mUSMA6Bwh5pCtwkIHEQ-phcd1vW0uIizBwqis,10162
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=YAlVbWPddWxz9U5ldGLwFxs1VvvM9x7c8_JalKwXa4U,45
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/entity_resolution_pb2_connect.py,sha256=7NFAV7cx27R8b__2eM0MAiwPaT8E3TEmm-QrhauW3nE,7972
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/entityresolution/v2/entity_resolution_pb2_connect.py,sha256=mnj_IuaBr_AjAGtvIc4QZzcHgG2UuYFnbA7cEH-f8RQ,8178
70
- otdf_python_proto/kas/__init__.py,sha256=8gcnDu9Hr7l0iJa3tVUjZruOjnewelau1Vt124Ln1n4,226
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/actions/actions_pb2_connect.py,sha256=u6M1o9T8lWtkLSp2sMG7mQwxNPMixK2VxZ3IVVyfAAM,14472
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/attributes/attributes_pb2_connect.py,sha256=M57-dw9vfiDJuwmCxLHlZhBxrXXPULbyyiopykh_xkU,56796
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/kasregistry/key_access_server_registry_pb2_connect.py,sha256=R2hkmB9X_Utg3C5fIWSGcTYZB9X3dJVy8gGaxkq6RFE,40328
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/keymanagement/key_management_pb2_connect.py,sha256=_ghDKFEFCaofp2j4U9mQ8RgizFHAN2XSJQsSHRBH_Zg,16662
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/namespaces/namespaces_pb2_connect.py,sha256=mXn8N0hmguejlkbL-IwwSYl-nXGdrfGPLQ0XMEKCXLM,27828
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/registeredresources/registered_resources_pb2_connect.py,sha256=KI17dRxTVL71j_qHlwEs1MZPVtayt-Ay5xwZgfmizq0,38350
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/resourcemapping/resource_mapping_pb2_connect.py,sha256=wuqKoDgpdGr0mo_JQ_MO2vshdXLDKVs1x_-9Ou4SchU,36062
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/subjectmapping/subject_mapping_pb2_connect.py,sha256=tn9Ib6TPWoYKQ7B-RKL2cliSPAC6DYLatXO6Ao2Ys7I,38548
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/policy/unsafe/unsafe_pb2_connect.py,sha256=OqKigFTTVPKQkL4TOMLqnEUKBc2zUp8qSSOk2TKP6U8,29839
130
- otdf_python_proto/wellknownconfiguration/__init__.py,sha256=X3GeZJ1mG_N1MViryjkqUU099f2qzR6bnoDQXGWhKpc,51
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
- 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,,
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,,
@@ -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
+ ]