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/__init__.py +1 -2
- pangea/asyncio/request.py +14 -19
- pangea/asyncio/services/__init__.py +0 -2
- pangea/asyncio/services/audit.py +160 -14
- pangea/asyncio/services/authn.py +118 -79
- pangea/asyncio/services/authz.py +35 -50
- pangea/asyncio/services/intel.py +4 -4
- pangea/asyncio/services/redact.py +56 -2
- pangea/asyncio/services/vault.py +115 -4
- pangea/request.py +24 -21
- pangea/response.py +27 -28
- pangea/services/__init__.py +0 -2
- pangea/services/audit/audit.py +161 -16
- pangea/services/audit/models.py +53 -5
- pangea/services/authn/authn.py +77 -36
- pangea/services/authn/models.py +79 -0
- pangea/services/authz.py +47 -54
- pangea/services/base.py +23 -6
- pangea/services/file_scan.py +1 -0
- pangea/services/intel.py +2 -2
- pangea/services/redact.py +122 -2
- pangea/services/vault/models/common.py +115 -0
- pangea/services/vault/vault.py +117 -6
- pangea/utils.py +19 -91
- {pangea_sdk-3.8.0b4.dist-info → pangea_sdk-3.9.0.dist-info}/METADATA +6 -15
- pangea_sdk-3.9.0.dist-info/RECORD +46 -0
- pangea/asyncio/__init__.py +0 -1
- pangea/asyncio/file_uploader.py +0 -39
- pangea/asyncio/services/sanitize.py +0 -185
- pangea/asyncio/services/share.py +0 -573
- pangea/file_uploader.py +0 -35
- pangea/services/sanitize.py +0 -275
- pangea/services/share/file_format.py +0 -170
- pangea/services/share/share.py +0 -877
- pangea_sdk-3.8.0b4.dist-info/RECORD +0 -54
- {pangea_sdk-3.8.0b4.dist-info → pangea_sdk-3.9.0.dist-info}/WHEEL +0 -0
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
|
-
|
23
|
+
RESOURCE_TYPE = "resource_type"
|
24
24
|
RESOURCE_ID = "resource_id"
|
25
25
|
RELATION = "relation"
|
26
|
-
|
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
|
-
|
38
|
+
type: str
|
39
39
|
id: Optional[str] = None
|
40
40
|
|
41
41
|
|
42
42
|
class Subject(PangeaResponseResult):
|
43
|
-
|
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
|
-
|
64
|
-
|
65
|
-
|
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
|
-
|
73
|
-
|
74
|
-
|
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
|
-
|
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
|
-
|
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.
|
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>.
|
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.
|
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#/
|
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(
|
196
|
+
resource=Resource(type="file", id="file_1"),
|
199
197
|
relation="owner",
|
200
|
-
subject=Subject(
|
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("
|
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.
|
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#/
|
234
|
+
[API Documentation](https://pangea.cloud/docs/api/authz#/v1/tuple/list).
|
238
235
|
|
239
236
|
Examples:
|
240
|
-
authz.tuple_list(TupleListFilter(
|
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("
|
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.
|
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#/
|
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(
|
264
|
+
resource=Resource(type="file", id="file_1"),
|
269
265
|
relation="owner",
|
270
|
-
subject=Subject(
|
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("
|
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.
|
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#/
|
300
|
+
[API Documentation](https://pangea.cloud/docs/api/authz#/v1/check).
|
306
301
|
|
307
302
|
Examples:
|
308
303
|
response = authz.check(
|
309
|
-
resource=Resource(
|
304
|
+
resource=Resource(type="file", id="file_1"),
|
310
305
|
action="update",
|
311
|
-
subject=Subject(
|
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("
|
312
|
+
return self.request.post("v1/check", CheckResult, data=input_data.dict(exclude_none=True))
|
318
313
|
|
319
|
-
def list_resources(self,
|
320
|
-
"""List resources.
|
314
|
+
def list_resources(self, type: str, action: str, subject: Subject) -> PangeaResponse[ListResourcesResult]:
|
315
|
+
"""List resources.
|
321
316
|
|
322
|
-
Given a
|
323
|
-
|
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
|
-
|
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#/
|
331
|
+
[API Documentation](https://pangea.cloud/docs/api/authz#/v1/list-resources).
|
338
332
|
|
339
333
|
Examples:
|
340
334
|
authz.list_resources(
|
341
|
-
|
335
|
+
type="file",
|
342
336
|
action="update",
|
343
|
-
subject=Subject(
|
337
|
+
subject=Subject(type="user", id="user_1"),
|
344
338
|
)
|
345
339
|
"""
|
346
340
|
|
347
|
-
input_data = ListResourcesRequest(
|
348
|
-
return self.request.post("
|
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.
|
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#/
|
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(
|
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("
|
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,
|
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:
|
59
|
-
) -> PangeaResponse:
|
75
|
+
result_class: Type[TResult] = PangeaResponseResult, # type: ignore[assignment]
|
76
|
+
) -> PangeaResponse[TResult]:
|
60
77
|
"""
|
61
78
|
Poll result
|
62
79
|
|
pangea/services/file_scan.py
CHANGED
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[
|
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[
|
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__(
|
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(
|
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))
|