pangea-sdk 3.8.0b4__py3-none-any.whl → 3.9.0__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.
pangea/services/authz.py CHANGED
@@ -20,10 +20,10 @@ class ItemOrder(str, enum.Enum):
20
20
 
21
21
 
22
22
  class TupleOrderBy(str, enum.Enum):
23
- RESOURCE_NAMESPACE = "resource_namespace"
23
+ RESOURCE_TYPE = "resource_type"
24
24
  RESOURCE_ID = "resource_id"
25
25
  RELATION = "relation"
26
- SUBJECT_NAMESPACE = "subject_namespace"
26
+ SUBJECT_TYPE = "subject_type"
27
27
  SUBJECT_ID = "subject_id"
28
28
  SUBJECT_ACTION = "subject_action"
29
29
 
@@ -35,12 +35,12 @@ class TupleOrderBy(str, enum.Enum):
35
35
 
36
36
 
37
37
  class Resource(PangeaResponseResult):
38
- namespace: str
38
+ type: str
39
39
  id: Optional[str] = None
40
40
 
41
41
 
42
42
  class Subject(PangeaResponseResult):
43
- namespace: str
43
+ type: str
44
44
  id: Optional[str] = None
45
45
  action: Optional[str] = None
46
46
 
@@ -60,18 +60,18 @@ class TupleCreateResult(PangeaResponseResult):
60
60
 
61
61
 
62
62
  class TupleListFilter(APIRequestModel):
63
- resource_namespace: Optional[str] = None
64
- resource_namespace__contains: Optional[List[str]] = None
65
- resource_namespace__in: Optional[List[str]] = None
63
+ resource_type: Optional[str] = None
64
+ resource_type__contains: Optional[List[str]] = None
65
+ resource_type__in: Optional[List[str]] = None
66
66
  resource_id: Optional[str] = None
67
67
  resource_id__contains: Optional[List[str]] = None
68
68
  resource_id__in: Optional[List[str]] = None
69
69
  relation: Optional[str] = None
70
70
  relation__contains: Optional[List[str]] = None
71
71
  relation__in: Optional[List[str]] = None
72
- subject_namespace: Optional[str] = None
73
- subject_namespace__contains: Optional[List[str]] = None
74
- subject_namespace__in: Optional[List[str]] = None
72
+ subject_type: Optional[str] = None
73
+ subject_type__contains: Optional[List[str]] = None
74
+ subject_type__in: Optional[List[str]] = None
75
75
  subject_id: Optional[str] = None
76
76
  subject_id__contains: Optional[List[str]] = None
77
77
  subject_id__in: Optional[List[str]] = None
@@ -111,7 +111,7 @@ class CheckRequest(APIRequestModel):
111
111
 
112
112
 
113
113
  class DebugPath(APIResponseModel):
114
- namespace: str
114
+ type: str
115
115
  id: str
116
116
  action: Optional[str]
117
117
 
@@ -129,7 +129,7 @@ class CheckResult(PangeaResponseResult):
129
129
 
130
130
 
131
131
  class ListResourcesRequest(APIRequestModel):
132
- namespace: str
132
+ type: str
133
133
  action: str
134
134
  subject: Subject
135
135
 
@@ -148,12 +148,11 @@ class ListSubjectsResult(PangeaResponseResult):
148
148
 
149
149
 
150
150
  class AuthZ(ServiceBase):
151
- """AuthZ service client. (Beta)
151
+ """AuthZ service client.
152
152
 
153
153
  Provides methods to interact with the Pangea AuthZ Service.
154
154
  Documentation for the AuthZ Service API can be found at
155
- <https://pangea.cloud/docs/api/authz>. Note that this service is in Beta and
156
- is subject to change.
155
+ <https://pangea.cloud/docs/api/authz>.
157
156
 
158
157
  Examples:
159
158
  import os
@@ -174,11 +173,10 @@ class AuthZ(ServiceBase):
174
173
  super().__init__(token, config, logger_name, config_id=config_id)
175
174
 
176
175
  def tuple_create(self, tuples: List[Tuple]) -> PangeaResponse[TupleCreateResult]:
177
- """Create tuples. (Beta)
176
+ """Create tuples.
178
177
 
179
178
  Create tuples in the AuthZ Service. The request will fail if there is no schema
180
179
  or the tuples do not validate against the schema.
181
- How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
182
180
 
183
181
  Args:
184
182
  tuples (List[Tuple]): List of tuples to be created.
@@ -189,22 +187,22 @@ class AuthZ(ServiceBase):
189
187
  Returns:
190
188
  Pangea Response with empty result.
191
189
  Available response fields can be found in our
192
- [API Documentation](https://pangea.cloud/docs/api/authz#/v1beta/tuple/create).
190
+ [API Documentation](https://pangea.cloud/docs/api/authz#/v1/tuple/create).
193
191
 
194
192
  Examples:
195
193
  response = authz.tuple_create(
196
194
  tuples=[
197
195
  Tuple(
198
- resource=Resource(namespace="file", id="file_1"),
196
+ resource=Resource(type="file", id="file_1"),
199
197
  relation="owner",
200
- subject=Subject(namespace="user", id="user_1"),
198
+ subject=Subject(type="user", id="user_1"),
201
199
  )
202
200
  ]
203
201
  )
204
202
  """
205
203
 
206
204
  input_data = TupleCreateRequest(tuples=tuples)
207
- return self.request.post("v1beta/tuple/create", TupleCreateResult, data=input_data.dict(exclude_none=True))
205
+ return self.request.post("v1/tuple/create", TupleCreateResult, data=input_data.dict(exclude_none=True))
208
206
 
209
207
  def tuple_list(
210
208
  self,
@@ -214,12 +212,11 @@ class AuthZ(ServiceBase):
214
212
  order: Optional[ItemOrder] = None,
215
213
  order_by: Optional[TupleOrderBy] = None,
216
214
  ) -> PangeaResponse[TupleListResult]:
217
- """List tuples. (Beta)
215
+ """List tuples.
218
216
 
219
217
  Return a paginated list of filtered tuples. The filter is given in terms
220
218
  of a tuple. Fill out the fields that you want to filter. If the filter
221
219
  is empty it will return all the tuples.
222
- How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
223
220
 
224
221
  Args:
225
222
  filter (TupleListFilter): The filter for listing tuples.
@@ -234,21 +231,20 @@ class AuthZ(ServiceBase):
234
231
  Returns:
235
232
  Pangea Response with a list of tuples and the last token.
236
233
  Available response fields can be found in our
237
- [API Documentation](https://pangea.cloud/docs/api/authz#/v1beta/tuple/list).
234
+ [API Documentation](https://pangea.cloud/docs/api/authz#/v1/tuple/list).
238
235
 
239
236
  Examples:
240
- authz.tuple_list(TupleListFilter(subject_namespace="user", subject_id="user_1"))
237
+ authz.tuple_list(TupleListFilter(subject_type="user", subject_id="user_1"))
241
238
  """
242
239
  input_data = TupleListRequest(
243
240
  filter=filter.dict(exclude_none=True), size=size, last=last, order=order, order_by=order_by
244
241
  )
245
- return self.request.post("v1beta/tuple/list", TupleListResult, data=input_data.dict(exclude_none=True))
242
+ return self.request.post("v1/tuple/list", TupleListResult, data=input_data.dict(exclude_none=True))
246
243
 
247
244
  def tuple_delete(self, tuples: List[Tuple]) -> PangeaResponse[TupleDeleteResult]:
248
- """Delete tuples. (Beta)
245
+ """Delete tuples.
249
246
 
250
247
  Delete tuples in the AuthZ Service.
251
- How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
252
248
 
253
249
  Args:
254
250
  tuples (List[Tuple]): List of tuples to be deleted.
@@ -259,22 +255,22 @@ class AuthZ(ServiceBase):
259
255
  Returns:
260
256
  Pangea Response with empty result.
261
257
  Available response fields can be found in our
262
- [API Documentation](https://pangea.cloud/docs/api/authz#/v1beta/tuple/delete).
258
+ [API Documentation](https://pangea.cloud/docs/api/authz#/v1/tuple/delete).
263
259
 
264
260
  Examples:
265
261
  response = authz.tuple_delete(
266
262
  tuples=[
267
263
  Tuple(
268
- resource=Resource(namespace="file", id="file_1"),
264
+ resource=Resource(type="file", id="file_1"),
269
265
  relation="owner",
270
- subject=Subject(namespace="user", id="user_1"),
266
+ subject=Subject(type="user", id="user_1"),
271
267
  )
272
268
  ]
273
269
  )
274
270
  """
275
271
 
276
272
  input_data = TupleDeleteRequest(tuples=tuples)
277
- return self.request.post("v1beta/tuple/delete", TupleDeleteResult, data=input_data.dict(exclude_none=True))
273
+ return self.request.post("v1/tuple/delete", TupleDeleteResult, data=input_data.dict(exclude_none=True))
278
274
 
279
275
  def check(
280
276
  self,
@@ -284,10 +280,9 @@ class AuthZ(ServiceBase):
284
280
  debug: Optional[bool] = None,
285
281
  attributes: Optional[Dict[str, Union[int, str]]] = None,
286
282
  ) -> PangeaResponse[CheckResult]:
287
- """Perform a check request. (Beta)
283
+ """Perform a check request.
288
284
 
289
285
  Check if a subject has permission to perform an action on the resource.
290
- How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
291
286
 
292
287
  Args:
293
288
  resource (Resource): The resource to check.
@@ -302,29 +297,28 @@ class AuthZ(ServiceBase):
302
297
  Returns:
303
298
  Pangea Response with the result of the check.
304
299
  Available response fields can be found in our
305
- [API Documentation](https://pangea.cloud/docs/api/authz#/v1beta/check).
300
+ [API Documentation](https://pangea.cloud/docs/api/authz#/v1/check).
306
301
 
307
302
  Examples:
308
303
  response = authz.check(
309
- resource=Resource(namespace="file", id="file_1"),
304
+ resource=Resource(type="file", id="file_1"),
310
305
  action="update",
311
- subject=Subject(namespace="user", id="user_1"),
306
+ subject=Subject(type="user", id="user_1"),
312
307
  debug=True,
313
308
  )
314
309
  """
315
310
 
316
311
  input_data = CheckRequest(resource=resource, action=action, subject=subject, debug=debug, attributes=attributes)
317
- return self.request.post("v1beta/check", CheckResult, data=input_data.dict(exclude_none=True))
312
+ return self.request.post("v1/check", CheckResult, data=input_data.dict(exclude_none=True))
318
313
 
319
- def list_resources(self, namespace: str, action: str, subject: Subject) -> PangeaResponse[ListResourcesResult]:
320
- """List resources. (Beta)
314
+ def list_resources(self, type: str, action: str, subject: Subject) -> PangeaResponse[ListResourcesResult]:
315
+ """List resources.
321
316
 
322
- Given a namespace, action, and subject, list all the resources in the
323
- namespace that the subject has access to the action with.
324
- How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
317
+ Given a type, action, and subject, list all the resources in the
318
+ type that the subject has access to the action with.
325
319
 
326
320
  Args:
327
- namespace (str): The namespace to filter resources.
321
+ type (str): The type to filter resources.
328
322
  action (str): The action to filter resources.
329
323
  subject (Subject): The subject to filter resources.
330
324
 
@@ -334,25 +328,24 @@ class AuthZ(ServiceBase):
334
328
  Returns:
335
329
  Pangea Response with a list of resource IDs.
336
330
  Available response fields can be found in our
337
- [API Documentation](https://pangea.cloud/docs/api/authz#/v1beta/list-resources).
331
+ [API Documentation](https://pangea.cloud/docs/api/authz#/v1/list-resources).
338
332
 
339
333
  Examples:
340
334
  authz.list_resources(
341
- namespace="file",
335
+ type="file",
342
336
  action="update",
343
- subject=Subject(namespace="user", id="user_1"),
337
+ subject=Subject(type="user", id="user_1"),
344
338
  )
345
339
  """
346
340
 
347
- input_data = ListResourcesRequest(namespace=namespace, action=action, subject=subject)
348
- return self.request.post("v1beta/list-resources", ListResourcesResult, data=input_data.dict(exclude_none=True))
341
+ input_data = ListResourcesRequest(type=type, action=action, subject=subject)
342
+ return self.request.post("v1/list-resources", ListResourcesResult, data=input_data.dict(exclude_none=True))
349
343
 
350
344
  def list_subjects(self, resource: Resource, action: str) -> PangeaResponse[ListSubjectsResult]:
351
- """List subjects. (Beta)
345
+ """List subjects.
352
346
 
353
347
  Given a resource and an action, return the list of subjects who have
354
348
  access to the action for the given resource.
355
- How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
356
349
 
357
350
  Args:
358
351
  resource (Resource): The resource to filter subjects.
@@ -364,14 +357,14 @@ class AuthZ(ServiceBase):
364
357
  Returns:
365
358
  Pangea Response with a list of subjects.
366
359
  Available response fields can be found in our
367
- [API Documentation](https://pangea.cloud/docs/api/authz#/v1beta/list-subjects).
360
+ [API Documentation](https://pangea.cloud/docs/api/authz#/v1/list-subjects).
368
361
 
369
362
  Examples:
370
363
  response = authz.list_subjects(
371
- resource=Resource(namespace="file", id="file_1"),
364
+ resource=Resource(type="file", id="file_1"),
372
365
  action="update",
373
366
  )
374
367
  """
375
368
 
376
369
  input_data = ListSubjectsRequest(resource=resource, action=action)
377
- return self.request.post("v1beta/list-subjects", ListSubjectsResult, data=input_data.dict(exclude_none=True))
370
+ return self.request.post("v1/list-subjects", ListSubjectsResult, data=input_data.dict(exclude_none=True))
pangea/services/base.py CHANGED
@@ -1,23 +1,40 @@
1
1
  # Copyright 2022 Pangea Cyber Corporation
2
2
  # Author: Pangea Cyber Corporation
3
+ from __future__ import annotations
3
4
 
4
5
  import copy
5
6
  import logging
6
7
  from typing import Dict, Optional, Type, Union
7
8
 
9
+ from typing_extensions import TypeVar
10
+
8
11
  from pangea.asyncio.request import PangeaRequestAsync
9
12
  from pangea.config import PangeaConfig
10
13
  from pangea.exceptions import AcceptedRequestException
11
14
  from pangea.request import PangeaRequest
12
15
  from pangea.response import AttachedFile, PangeaResponse, PangeaResponseResult
13
16
 
17
+ TResult = TypeVar("TResult", bound=PangeaResponseResult, default=PangeaResponseResult)
18
+
14
19
 
15
20
  class ServiceBase(object):
16
21
  service_name: str = "base"
17
22
 
18
23
  def __init__(
19
- self, token, config: Optional[PangeaConfig] = None, logger_name: str = "pangea", config_id: Optional[str] = None
20
- ):
24
+ self,
25
+ token: str,
26
+ config: PangeaConfig | None = None,
27
+ logger_name: str = "pangea",
28
+ config_id: str | None = None,
29
+ ) -> None:
30
+ """
31
+ Initializes a new Pangea service client.
32
+
33
+ Args:
34
+ token: Pangea API token.
35
+ config: Configuration.
36
+ logger_name: Logger name.
37
+ """
21
38
  if not token:
22
39
  raise Exception("No token provided")
23
40
 
@@ -30,11 +47,11 @@ class ServiceBase(object):
30
47
  self.request.set_extra_headers(extra_headers)
31
48
 
32
49
  @property
33
- def token(self):
50
+ def token(self) -> str:
34
51
  return self._token
35
52
 
36
53
  @token.setter
37
- def token(self, value):
54
+ def token(self, value: str) -> None:
38
55
  self._token = value
39
56
 
40
57
  @property
@@ -55,8 +72,8 @@ class ServiceBase(object):
55
72
  exception: Optional[AcceptedRequestException] = None,
56
73
  response: Optional[PangeaResponse] = None,
57
74
  request_id: Optional[str] = None,
58
- result_class: Union[Type[PangeaResponseResult], Type[Dict]] = dict,
59
- ) -> PangeaResponse:
75
+ result_class: Type[TResult] = PangeaResponseResult, # type: ignore[assignment]
76
+ ) -> PangeaResponse[TResult]:
60
77
  """
61
78
  Poll result
62
79
 
@@ -71,6 +71,7 @@ class FileScan(ServiceBase):
71
71
  """
72
72
 
73
73
  service_name = "file-scan"
74
+ version = "v1"
74
75
 
75
76
  def file_scan(
76
77
  self,
pangea/services/intel.py CHANGED
@@ -839,7 +839,7 @@ class IpIntel(ServiceBase):
839
839
 
840
840
  def reputation_bulk(
841
841
  self, ips: List[str], verbose: Optional[bool] = None, raw: Optional[bool] = None, provider: Optional[str] = None
842
- ) -> PangeaResponse[IPReputationResult]:
842
+ ) -> PangeaResponse[IPReputationBulkResult]:
843
843
  """
844
844
  Reputation V2
845
845
 
@@ -1195,7 +1195,7 @@ class UrlIntel(ServiceBase):
1195
1195
  verbose: Optional[bool] = None,
1196
1196
  raw: Optional[bool] = None,
1197
1197
  provider: Optional[str] = None,
1198
- ) -> PangeaResponse[URLReputationResult]:
1198
+ ) -> PangeaResponse[URLReputationBulkResult]:
1199
1199
  """
1200
1200
  Reputation V2
1201
1201
 
pangea/services/redact.py CHANGED
@@ -1,9 +1,11 @@
1
1
  # Copyright 2022 Pangea Cyber Corporation
2
2
  # Author: Pangea Cyber Corporation
3
+ from __future__ import annotations
3
4
 
4
5
  import enum
5
6
  from typing import Dict, List, Optional, Union
6
7
 
8
+ from pangea.config import PangeaConfig
7
9
  from pangea.response import APIRequestModel, APIResponseModel, PangeaResponse, PangeaResponseResult
8
10
  from pangea.services.base import ServiceBase
9
11
 
@@ -15,6 +17,44 @@ class RedactFormat(str, enum.Enum):
15
17
  """JSON format."""
16
18
 
17
19
 
20
+ class RedactType(str, enum.Enum):
21
+ MASK = "mask"
22
+ PARTIAL_MASKING = "partial_masking"
23
+ REPLACEMENT = "replacement"
24
+ DETECT_ONLY = "detect_only"
25
+ HASH = "hash"
26
+ FPE = "fpe"
27
+
28
+
29
+ class FPEAlphabet(str, enum.Enum):
30
+ NUMERIC = "numeric"
31
+ ALPHANUMERICLOWER = "alphanumericlower"
32
+ ALPHANUMERIC = "alphanumeric"
33
+
34
+
35
+ class MaskingType(str, enum.Enum):
36
+ MASK = "mask"
37
+ UNMASK = "unmask"
38
+
39
+
40
+ class PartialMasking(APIRequestModel):
41
+ masking_type: Optional[MaskingType] = None
42
+ unmasked_from_left: Optional[int] = None
43
+ unmasked_from_right: Optional[int] = None
44
+ masked_from_left: Optional[int] = None
45
+ masked_from_right: Optional[int] = None
46
+ chars_to_ignore: Optional[List[str]] = None
47
+ masking_char: Optional[List[str]] = None
48
+
49
+
50
+ class RedactionMethodOverrides(APIRequestModel):
51
+ redaction_type: RedactType
52
+ hash: Optional[Dict] = None
53
+ fpe_alphabet: Optional[FPEAlphabet] = None
54
+ partial_masking: Optional[PartialMasking] = None
55
+ redaction_value: Optional[str] = None
56
+
57
+
18
58
  class RedactRequest(APIRequestModel):
19
59
  """
20
60
  Input class to make a redact request
@@ -25,6 +65,7 @@ class RedactRequest(APIRequestModel):
25
65
  rules: Optional[List[str]] = None
26
66
  rulesets: Optional[List[str]] = None
27
67
  return_result: Optional[bool] = None
68
+ redaction_method_overrides: Optional[RedactionMethodOverrides] = None
28
69
 
29
70
 
30
71
  class RecognizerResult(APIResponseModel):
@@ -92,6 +133,7 @@ class StructuredRequest(APIRequestModel):
92
133
  rules: Optional[List[str]] = None
93
134
  rulesets: Optional[List[str]] = None
94
135
  return_result: Optional[bool] = None
136
+ redaction_method_overrides: Optional[RedactionMethodOverrides] = None
95
137
 
96
138
 
97
139
  class StructuredResult(PangeaResponseResult):
@@ -105,6 +147,32 @@ class StructuredResult(PangeaResponseResult):
105
147
  report: Optional[DebugReport] = None
106
148
 
107
149
 
150
+ class UnredactRequest(APIRequestModel):
151
+ """
152
+ Class input to unredact data request
153
+
154
+ Arguments:
155
+ redacted_data: Data to unredact
156
+ fpe_context (base64): FPE context used to decrypt and unredact data
157
+
158
+ """
159
+
160
+ redacted_data: RedactedData
161
+ fpe_context: str
162
+
163
+
164
+ RedactedData = Union[str, Dict]
165
+
166
+
167
+ class UnredactResult(PangeaResponseResult):
168
+ """
169
+ Result class after an unredact request
170
+
171
+ """
172
+
173
+ data: RedactedData
174
+
175
+
108
176
  class Redact(ServiceBase):
109
177
  """Redact service client.
110
178
 
@@ -132,7 +200,24 @@ class Redact(ServiceBase):
132
200
 
133
201
  service_name = "redact"
134
202
 
135
- def __init__(self, token, config=None, logger_name="pangea", config_id: Optional[str] = None):
203
+ def __init__(
204
+ self, token: str, config: PangeaConfig | None = None, logger_name: str = "pangea", config_id: str | None = None
205
+ ) -> None:
206
+ """
207
+ Redact client
208
+
209
+ Initializes a new Redact client.
210
+
211
+ Args:
212
+ token: Pangea API token.
213
+ config: Configuration.
214
+ logger_name: Logger name.
215
+ config_id: Configuration ID.
216
+
217
+ Examples:
218
+ config = PangeaConfig(domain="pangea_domain")
219
+ redact = Redact(token="pangea_token", config=config)
220
+ """
136
221
  super().__init__(token, config, logger_name, config_id=config_id)
137
222
 
138
223
  def redact(
@@ -142,6 +227,7 @@ class Redact(ServiceBase):
142
227
  rules: Optional[List[str]] = None,
143
228
  rulesets: Optional[List[str]] = None,
144
229
  return_result: Optional[bool] = None,
230
+ redaction_method_overrides: Optional[RedactionMethodOverrides] = None,
145
231
  ) -> PangeaResponse[RedactResult]:
146
232
  """
147
233
  Redact
@@ -157,6 +243,7 @@ class Redact(ServiceBase):
157
243
  rules (list[str], optional): An array of redact rule short names
158
244
  rulesets (list[str], optional): An array of redact rulesets short names
159
245
  return_result(bool, optional): Setting this value to false will omit the redacted result only returning count
246
+ redaction_method_overrides: A set of redaction method overrides for any enabled rule. These methods override the config declared methods
160
247
 
161
248
  Raises:
162
249
  PangeaAPIException: If an API Error happens
@@ -170,7 +257,14 @@ class Redact(ServiceBase):
170
257
  response = redact.redact(text="Jenny Jenny... 555-867-5309")
171
258
  """
172
259
 
173
- input = RedactRequest(text=text, debug=debug, rules=rules, rulesets=rulesets, return_result=return_result)
260
+ input = RedactRequest(
261
+ text=text,
262
+ debug=debug,
263
+ rules=rules,
264
+ rulesets=rulesets,
265
+ return_result=return_result,
266
+ redaction_method_overrides=redaction_method_overrides,
267
+ )
174
268
  return self.request.post("v1/redact", RedactResult, data=input.dict(exclude_none=True))
175
269
 
176
270
  def redact_structured(
@@ -182,6 +276,7 @@ class Redact(ServiceBase):
182
276
  rules: Optional[List[str]] = None,
183
277
  rulesets: Optional[List[str]] = None,
184
278
  return_result: Optional[bool] = None,
279
+ redaction_method_overrides: Optional[RedactionMethodOverrides] = None,
185
280
  ) -> PangeaResponse[StructuredResult]:
186
281
  """
187
282
  Redact structured
@@ -201,6 +296,7 @@ class Redact(ServiceBase):
201
296
  rules (list[str], optional): An array of redact rule short names
202
297
  rulesets (list[str], optional): An array of redact rulesets short names
203
298
  return_result(bool, optional): Setting this value to false will omit the redacted result only returning count
299
+ redaction_method_overrides: A set of redaction method overrides for any enabled rule. These methods override the config declared methods
204
300
 
205
301
  Raises:
206
302
  PangeaAPIException: If an API Error happens
@@ -227,5 +323,29 @@ class Redact(ServiceBase):
227
323
  rules=rules,
228
324
  rulesets=rulesets,
229
325
  return_result=return_result,
326
+ redaction_method_overrides=redaction_method_overrides,
230
327
  )
231
328
  return self.request.post("v1/redact_structured", StructuredResult, data=input.dict(exclude_none=True))
329
+
330
+ def unredact(self, redacted_data: RedactedData, fpe_context: str) -> PangeaResponse[UnredactResult]:
331
+ """
332
+ Unredact
333
+
334
+ Decrypt or unredact fpe redactions
335
+
336
+ OperationId: redact_post_v1_unredact
337
+
338
+ Args:
339
+ redacted_data: Data to unredact
340
+ fpe_context (base64): FPE context used to decrypt and unredact data
341
+
342
+ Raises:
343
+ PangeaAPIException: If an API Error happens
344
+
345
+ Returns:
346
+ Pangea Response with redacted data in the response.result field,
347
+ available response fields can be found in our
348
+ [API Documentation](https://pangea.cloud/docs/api/redact#unredact)
349
+ """
350
+ input = UnredactRequest(redacted_data=redacted_data, fpe_context=fpe_context)
351
+ return self.request.post("v1/unredact", UnredactResult, data=input.dict(exclude_none=True))