pangea-sdk 3.8.0b2__py3-none-any.whl → 3.8.0b3__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 -1
- pangea/asyncio/services/__init__.py +2 -1
- pangea/asyncio/services/authz.py +267 -0
- pangea/asyncio/services/sanitize.py +4 -4
- pangea/asyncio/services/share.py +26 -26
- pangea/services/__init__.py +2 -1
- pangea/services/authz.py +377 -0
- pangea/services/sanitize.py +4 -4
- pangea/services/share/share.py +26 -26
- {pangea_sdk-3.8.0b2.dist-info → pangea_sdk-3.8.0b3.dist-info}/METADATA +28 -3
- {pangea_sdk-3.8.0b2.dist-info → pangea_sdk-3.8.0b3.dist-info}/RECORD +12 -10
- {pangea_sdk-3.8.0b2.dist-info → pangea_sdk-3.8.0b3.dist-info}/WHEEL +0 -0
pangea/__init__.py
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
from .audit import AuditAsync
|
2
2
|
from .authn import AuthNAsync
|
3
|
+
from .authz import AuthZAsync
|
3
4
|
from .embargo import EmbargoAsync
|
4
5
|
from .file_scan import FileScanAsync
|
5
6
|
from .intel import DomainIntelAsync, FileIntelAsync, IpIntelAsync, UrlIntelAsync, UserIntelAsync
|
6
7
|
from .redact import RedactAsync
|
7
|
-
from .share import ShareAsync
|
8
8
|
from .sanitize import SanitizeAsync
|
9
|
+
from .share import ShareAsync
|
9
10
|
from .vault import VaultAsync
|
@@ -0,0 +1,267 @@
|
|
1
|
+
# Copyright 2022 Pangea Cyber Corporation
|
2
|
+
# Author: Pangea Cyber Corporation
|
3
|
+
|
4
|
+
from typing import Dict, List, Optional, Union
|
5
|
+
|
6
|
+
from pangea.asyncio.services.base import ServiceBaseAsync
|
7
|
+
from pangea.response import PangeaResponse
|
8
|
+
from pangea.services.authz import (
|
9
|
+
CheckRequest,
|
10
|
+
CheckResult,
|
11
|
+
ItemOrder,
|
12
|
+
ListResourcesRequest,
|
13
|
+
ListResourcesResult,
|
14
|
+
ListSubjectsRequest,
|
15
|
+
ListSubjectsResult,
|
16
|
+
Resource,
|
17
|
+
Subject,
|
18
|
+
Tuple,
|
19
|
+
TupleCreateRequest,
|
20
|
+
TupleCreateResult,
|
21
|
+
TupleDeleteRequest,
|
22
|
+
TupleDeleteResult,
|
23
|
+
TupleListFilter,
|
24
|
+
TupleListRequest,
|
25
|
+
TupleListResult,
|
26
|
+
TupleOrderBy,
|
27
|
+
)
|
28
|
+
|
29
|
+
|
30
|
+
class AuthZAsync(ServiceBaseAsync):
|
31
|
+
"""AuthZ service client. (Beta)
|
32
|
+
|
33
|
+
Provides methods to interact with the Pangea AuthZ Service.
|
34
|
+
Documentation for the AuthZ Service API can be found at
|
35
|
+
<https://pangea.cloud/docs/api/authz>. Note that this service is in Beta and
|
36
|
+
is subject to change.
|
37
|
+
|
38
|
+
Examples:
|
39
|
+
import os
|
40
|
+
from pangea.config import PangeaConfig
|
41
|
+
from pangea.services import AuthZ
|
42
|
+
|
43
|
+
PANGEA_TOKEN = os.getenv("PANGEA_AUTHZ_TOKEN")
|
44
|
+
|
45
|
+
authz_config = PangeaConfig(domain="aws.us.pangea.cloud")
|
46
|
+
|
47
|
+
# Setup Pangea AuthZ service client
|
48
|
+
authz = AuthZAsync(token=PANGEA_TOKEN, config=authz_config)
|
49
|
+
"""
|
50
|
+
|
51
|
+
service_name = "authz"
|
52
|
+
|
53
|
+
def __init__(self, token: str, config=None, logger_name="pangea", config_id: Optional[str] = None):
|
54
|
+
super().__init__(token, config, logger_name, config_id=config_id)
|
55
|
+
|
56
|
+
async def tuple_create(self, tuples: List[Tuple]) -> PangeaResponse[TupleCreateResult]:
|
57
|
+
"""Create tuples. (Beta)
|
58
|
+
|
59
|
+
Create tuples in the AuthZ Service. The request will fail if there is no schema
|
60
|
+
or the tuples do not validate against the schema.
|
61
|
+
How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
|
62
|
+
|
63
|
+
Args:
|
64
|
+
tuples (List[Tuple]): List of tuples to be created.
|
65
|
+
|
66
|
+
Raises:
|
67
|
+
PangeaAPIException: If an API Error happens.
|
68
|
+
|
69
|
+
Returns:
|
70
|
+
Pangea Response with empty result.
|
71
|
+
Available response fields can be found in our
|
72
|
+
[API Documentation](https://pangea.cloud/docs/api/authz#/v1beta/tuple/create).
|
73
|
+
|
74
|
+
Examples:
|
75
|
+
await authz.tuple_create(
|
76
|
+
tuples=[
|
77
|
+
Tuple(
|
78
|
+
resource=Resource(namespace="file", id="file_1"),
|
79
|
+
relation="owner",
|
80
|
+
subject=Subject(namespace="user", id="user_1"),
|
81
|
+
)
|
82
|
+
]
|
83
|
+
)
|
84
|
+
"""
|
85
|
+
|
86
|
+
input_data = TupleCreateRequest(tuples=tuples)
|
87
|
+
return await self.request.post(
|
88
|
+
"v1beta/tuple/create", TupleCreateResult, data=input_data.dict(exclude_none=True)
|
89
|
+
)
|
90
|
+
|
91
|
+
async def tuple_list(
|
92
|
+
self,
|
93
|
+
filter: TupleListFilter,
|
94
|
+
size: Optional[int] = None,
|
95
|
+
last: Optional[str] = None,
|
96
|
+
order: Optional[ItemOrder] = None,
|
97
|
+
order_by: Optional[TupleOrderBy] = None,
|
98
|
+
) -> PangeaResponse[TupleListResult]:
|
99
|
+
"""List tuples. (Beta)
|
100
|
+
|
101
|
+
Return a paginated list of filtered tuples. The filter is given in terms
|
102
|
+
of a tuple. Fill out the fields that you want to filter. If the filter
|
103
|
+
is empty it will return all the tuples.
|
104
|
+
How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
|
105
|
+
|
106
|
+
Args:
|
107
|
+
filter (TupleListFilter): The filter for listing tuples.
|
108
|
+
size (Optional[int]): The size of the result set. Default is None.
|
109
|
+
last (Optional[str]): The last token from a previous response. Default is None.
|
110
|
+
order (Optional[ItemOrder]): Order results asc(ending) or desc(ending).
|
111
|
+
order_by (Optional[TupleOrderBy]): Which field to order results by.
|
112
|
+
|
113
|
+
Raises:
|
114
|
+
PangeaAPIException: If an API Error happens.
|
115
|
+
|
116
|
+
Returns:
|
117
|
+
Pangea Response with a list of tuples and the last token.
|
118
|
+
Available response fields can be found in our
|
119
|
+
[API Documentation](https://pangea.cloud/docs/api/authz#/v1beta/tuple/list).
|
120
|
+
|
121
|
+
Examples:
|
122
|
+
await authz.tuple_list(TupleListFilter(subject_namespace="user", subject_id="user_1"))
|
123
|
+
"""
|
124
|
+
input_data = TupleListRequest(
|
125
|
+
filter=filter.dict(exclude_none=True), size=size, last=last, order=order, order_by=order_by
|
126
|
+
)
|
127
|
+
return await self.request.post("v1beta/tuple/list", TupleListResult, data=input_data.dict(exclude_none=True))
|
128
|
+
|
129
|
+
async def tuple_delete(self, tuples: List[Tuple]) -> PangeaResponse[TupleDeleteResult]:
|
130
|
+
"""Delete tuples. (Beta)
|
131
|
+
|
132
|
+
Delete tuples in the AuthZ Service.
|
133
|
+
How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
|
134
|
+
|
135
|
+
Args:
|
136
|
+
tuples (List[Tuple]): List of tuples to be deleted.
|
137
|
+
|
138
|
+
Raises:
|
139
|
+
PangeaAPIException: If an API Error happens.
|
140
|
+
|
141
|
+
Returns:
|
142
|
+
Pangea Response with empty result.
|
143
|
+
Available response fields can be found in our
|
144
|
+
[API Documentation](https://pangea.cloud/docs/api/authz#/v1beta/tuple/delete).
|
145
|
+
|
146
|
+
Examples:
|
147
|
+
await authz.tuple_delete(
|
148
|
+
tuples=[
|
149
|
+
Tuple(
|
150
|
+
resource=Resource(namespace="file", id="file_1"),
|
151
|
+
relation="owner",
|
152
|
+
subject=Subject(namespace="user", id="user_1"),
|
153
|
+
)
|
154
|
+
]
|
155
|
+
)
|
156
|
+
"""
|
157
|
+
|
158
|
+
input_data = TupleDeleteRequest(tuples=tuples)
|
159
|
+
return await self.request.post(
|
160
|
+
"v1beta/tuple/delete", TupleDeleteResult, data=input_data.dict(exclude_none=True)
|
161
|
+
)
|
162
|
+
|
163
|
+
async def check(
|
164
|
+
self,
|
165
|
+
resource: Resource,
|
166
|
+
action: str,
|
167
|
+
subject: Subject,
|
168
|
+
debug: Optional[bool] = None,
|
169
|
+
attributes: Optional[Dict[str, Union[int, str]]] = None,
|
170
|
+
) -> PangeaResponse[CheckResult]:
|
171
|
+
"""Perform a check request. (Beta)
|
172
|
+
|
173
|
+
Check if a subject has permission to perform an action on the resource.
|
174
|
+
How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
|
175
|
+
|
176
|
+
Args:
|
177
|
+
resource (Resource): The resource to check.
|
178
|
+
action (str): The action to check.
|
179
|
+
subject (Subject): The subject to check.
|
180
|
+
debug (Optional[bool]): Setting this value to True will provide a detailed analysis of the check.
|
181
|
+
attributes (Optional[Dict[str, Union[int, str]]]): Additional attributes for the check.
|
182
|
+
|
183
|
+
Raises:
|
184
|
+
PangeaAPIException: If an API Error happens.
|
185
|
+
|
186
|
+
Returns:
|
187
|
+
Pangea Response with the result of the check.
|
188
|
+
Available response fields can be found in our
|
189
|
+
[API Documentation](https://pangea.cloud/docs/api/authz#/v1beta/check).
|
190
|
+
|
191
|
+
Examples:
|
192
|
+
await authz.check(
|
193
|
+
resource=Resource(namespace="file", id="file_1"),
|
194
|
+
action="update",
|
195
|
+
subject=Subject(namespace="user", id="user_1"),
|
196
|
+
debug=True,
|
197
|
+
)
|
198
|
+
"""
|
199
|
+
|
200
|
+
input_data = CheckRequest(resource=resource, action=action, subject=subject, debug=debug, attributes=attributes)
|
201
|
+
return await self.request.post("v1beta/check", CheckResult, data=input_data.dict(exclude_none=True))
|
202
|
+
|
203
|
+
async def list_resources(
|
204
|
+
self, namespace: str, action: str, subject: Subject
|
205
|
+
) -> PangeaResponse[ListResourcesResult]:
|
206
|
+
"""List resources. (Beta)
|
207
|
+
|
208
|
+
Given a namespace, action, and subject, list all the resources in the
|
209
|
+
namespace that the subject has access to the action with.
|
210
|
+
How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
|
211
|
+
|
212
|
+
Args:
|
213
|
+
namespace (str): The namespace to filter resources.
|
214
|
+
action (str): The action to filter resources.
|
215
|
+
subject (Subject): The subject to filter resources.
|
216
|
+
|
217
|
+
Raises:
|
218
|
+
PangeaAPIException: If an API Error happens.
|
219
|
+
|
220
|
+
Returns:
|
221
|
+
Pangea Response with a list of resource IDs.
|
222
|
+
Available response fields can be found in our
|
223
|
+
[API Documentation](https://pangea.cloud/docs/api/authz#/v1beta/list-resources).
|
224
|
+
|
225
|
+
Examples:
|
226
|
+
await authz.list_resources(
|
227
|
+
namespace="file",
|
228
|
+
action="update",
|
229
|
+
subject=Subject(namespace="user", id="user_1"),
|
230
|
+
)
|
231
|
+
"""
|
232
|
+
|
233
|
+
input_data = ListResourcesRequest(namespace=namespace, action=action, subject=subject)
|
234
|
+
return await self.request.post(
|
235
|
+
"v1beta/list-resources", ListResourcesResult, data=input_data.dict(exclude_none=True)
|
236
|
+
)
|
237
|
+
|
238
|
+
async def list_subjects(self, resource: Resource, action: str) -> PangeaResponse[ListSubjectsResult]:
|
239
|
+
"""List subjects. (Beta)
|
240
|
+
|
241
|
+
Given a resource and an action, return the list of subjects who have
|
242
|
+
access to the action for the given resource.
|
243
|
+
How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
|
244
|
+
|
245
|
+
Args:
|
246
|
+
resource (Resource): The resource to filter subjects.
|
247
|
+
action (str): The action to filter subjects.
|
248
|
+
|
249
|
+
Raises:
|
250
|
+
PangeaAPIException: If an API Error happens.
|
251
|
+
|
252
|
+
Returns:
|
253
|
+
Pangea Response with a list of subjects.
|
254
|
+
Available response fields can be found in our
|
255
|
+
[API Documentation](https://pangea.cloud/docs/api/authz#/v1beta/list-subjects).
|
256
|
+
|
257
|
+
Examples:
|
258
|
+
await authz.list_subjects(
|
259
|
+
resource=Resource(namespace="file", id="file_1"),
|
260
|
+
action="update",
|
261
|
+
)
|
262
|
+
"""
|
263
|
+
|
264
|
+
input_data = ListSubjectsRequest(resource=resource, action=action)
|
265
|
+
return await self.request.post(
|
266
|
+
"v1beta/list-subjects", ListSubjectsResult, data=input_data.dict(exclude_none=True)
|
267
|
+
)
|
@@ -44,10 +44,10 @@ class SanitizeAsync(ServiceBaseAsync):
|
|
44
44
|
sync_call: bool = True,
|
45
45
|
) -> PangeaResponse[m.SanitizeResult]:
|
46
46
|
"""
|
47
|
-
Sanitize
|
47
|
+
Sanitize (Beta)
|
48
48
|
|
49
49
|
Apply file sanitization actions according to specified rules.
|
50
|
-
[
|
50
|
+
How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
|
51
51
|
|
52
52
|
OperationId: sanitize_post_v1beta_sanitize
|
53
53
|
|
@@ -129,11 +129,11 @@ class SanitizeAsync(ServiceBaseAsync):
|
|
129
129
|
uploaded_file_name: Optional[str] = None,
|
130
130
|
) -> PangeaResponse[m.SanitizeResult]:
|
131
131
|
"""
|
132
|
-
Sanitize via presigned URL
|
132
|
+
Sanitize via presigned URL (Beta)
|
133
133
|
|
134
134
|
Apply file sanitization actions according to specified rules via a
|
135
135
|
[presigned URL](https://pangea.cloud/docs/api/presigned-urls).
|
136
|
-
[
|
136
|
+
How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
|
137
137
|
|
138
138
|
OperationId: sanitize_post_v1beta_sanitize 2
|
139
139
|
|
pangea/asyncio/services/share.py
CHANGED
@@ -19,11 +19,11 @@ class ShareAsync(ServiceBaseAsync):
|
|
19
19
|
self, id: Optional[str] = None, path: Optional[str] = None, force: Optional[bool] = None
|
20
20
|
) -> PangeaResponse[m.DeleteResult]:
|
21
21
|
"""
|
22
|
-
Delete
|
22
|
+
Delete (Beta)
|
23
23
|
|
24
24
|
Delete object by ID or path. If both are supplied, the path must match
|
25
25
|
that of the object represented by the ID.
|
26
|
-
[
|
26
|
+
How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
|
27
27
|
|
28
28
|
OperationId: share_post_v1beta_delete
|
29
29
|
|
@@ -51,10 +51,10 @@ class ShareAsync(ServiceBaseAsync):
|
|
51
51
|
tags: Optional[m.Tags] = None,
|
52
52
|
) -> PangeaResponse[m.FolderCreateResult]:
|
53
53
|
"""
|
54
|
-
Create a folder
|
54
|
+
Create a folder (Beta)
|
55
55
|
|
56
56
|
Create a folder, either by name or path and parent_id.
|
57
|
-
[
|
57
|
+
How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
|
58
58
|
|
59
59
|
OperationId: share_post_v1beta_folder_create
|
60
60
|
|
@@ -87,11 +87,11 @@ class ShareAsync(ServiceBaseAsync):
|
|
87
87
|
self, id: Optional[str] = None, path: Optional[str] = None, transfer_method: Optional[TransferMethod] = None
|
88
88
|
) -> PangeaResponse[m.GetResult]:
|
89
89
|
"""
|
90
|
-
Get an object
|
90
|
+
Get an object (Beta)
|
91
91
|
|
92
92
|
Get object. If both ID and Path are supplied, the call will fail if the
|
93
93
|
target object doesn't match both properties.
|
94
|
-
[
|
94
|
+
How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
|
95
95
|
|
96
96
|
OperationId: share_post_v1beta_get
|
97
97
|
|
@@ -124,10 +124,10 @@ class ShareAsync(ServiceBaseAsync):
|
|
124
124
|
transfer_method: Optional[TransferMethod] = None,
|
125
125
|
) -> PangeaResponse[m.GetArchiveResult]:
|
126
126
|
"""
|
127
|
-
Get archive
|
127
|
+
Get archive (Beta)
|
128
128
|
|
129
129
|
Get an archive file of multiple objects.
|
130
|
-
[
|
130
|
+
How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
|
131
131
|
|
132
132
|
OperationId: share_post_v1beta_get_archive
|
133
133
|
|
@@ -164,10 +164,10 @@ class ShareAsync(ServiceBaseAsync):
|
|
164
164
|
size: Optional[int] = None,
|
165
165
|
) -> PangeaResponse[m.ListResult]:
|
166
166
|
"""
|
167
|
-
List
|
167
|
+
List (Beta)
|
168
168
|
|
169
169
|
List or filter/search records.
|
170
|
-
[
|
170
|
+
How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
|
171
171
|
|
172
172
|
OperationId: share_post_v1beta_list
|
173
173
|
|
@@ -207,10 +207,10 @@ class ShareAsync(ServiceBaseAsync):
|
|
207
207
|
size: Optional[int] = None,
|
208
208
|
) -> PangeaResponse[m.PutResult]:
|
209
209
|
"""
|
210
|
-
Upload a file
|
210
|
+
Upload a file (Beta)
|
211
211
|
|
212
212
|
Upload a file.
|
213
|
-
[
|
213
|
+
How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
|
214
214
|
|
215
215
|
OperationId: share_post_v1beta_put
|
216
216
|
|
@@ -293,10 +293,10 @@ class ShareAsync(ServiceBaseAsync):
|
|
293
293
|
size: Optional[int] = None,
|
294
294
|
) -> PangeaResponse[m.PutResult]:
|
295
295
|
"""
|
296
|
-
Request upload URL
|
296
|
+
Request upload URL (Beta)
|
297
297
|
|
298
298
|
Request an upload URL.
|
299
|
-
[
|
299
|
+
How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
|
300
300
|
|
301
301
|
OperationId: share_post_v1beta_put 2
|
302
302
|
|
@@ -369,10 +369,10 @@ class ShareAsync(ServiceBaseAsync):
|
|
369
369
|
updated_at: Optional[str] = None,
|
370
370
|
) -> PangeaResponse[m.UpdateResult]:
|
371
371
|
"""
|
372
|
-
Update a file
|
372
|
+
Update a file (Beta)
|
373
373
|
|
374
374
|
Update a file.
|
375
|
-
[
|
375
|
+
How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
|
376
376
|
|
377
377
|
OperationId: share_post_v1beta_update
|
378
378
|
|
@@ -418,10 +418,10 @@ class ShareAsync(ServiceBaseAsync):
|
|
418
418
|
|
419
419
|
async def share_link_create(self, links: List[m.ShareLinkCreateItem]) -> PangeaResponse[m.ShareLinkCreateResult]:
|
420
420
|
"""
|
421
|
-
Create share links
|
421
|
+
Create share links (Beta)
|
422
422
|
|
423
423
|
Create a share link.
|
424
|
-
[
|
424
|
+
How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
|
425
425
|
|
426
426
|
OperationId: share_post_v1beta_share_link_create
|
427
427
|
|
@@ -455,10 +455,10 @@ class ShareAsync(ServiceBaseAsync):
|
|
455
455
|
|
456
456
|
async def share_link_get(self, id: str) -> PangeaResponse[m.ShareLinkGetResult]:
|
457
457
|
"""
|
458
|
-
Get share link
|
458
|
+
Get share link (Beta)
|
459
459
|
|
460
460
|
Get a share link.
|
461
|
-
[
|
461
|
+
How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
|
462
462
|
|
463
463
|
OperationId: share_post_v1beta_share_link_get
|
464
464
|
|
@@ -488,10 +488,10 @@ class ShareAsync(ServiceBaseAsync):
|
|
488
488
|
size: Optional[int] = None,
|
489
489
|
) -> PangeaResponse[m.ShareLinkListResult]:
|
490
490
|
"""
|
491
|
-
List share links
|
491
|
+
List share links (Beta)
|
492
492
|
|
493
493
|
Look up share links by filter options.
|
494
|
-
[
|
494
|
+
How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
|
495
495
|
|
496
496
|
OperationId: share_post_v1beta_share_link_list
|
497
497
|
|
@@ -516,10 +516,10 @@ class ShareAsync(ServiceBaseAsync):
|
|
516
516
|
|
517
517
|
async def share_link_delete(self, ids: List[str]) -> PangeaResponse[m.ShareLinkDeleteResult]:
|
518
518
|
"""
|
519
|
-
Delete share links
|
519
|
+
Delete share links (Beta)
|
520
520
|
|
521
521
|
Delete share links.
|
522
|
-
[
|
522
|
+
How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
|
523
523
|
|
524
524
|
OperationId: share_post_v1beta_share_link_delete
|
525
525
|
|
@@ -544,13 +544,13 @@ class ShareAsync(ServiceBaseAsync):
|
|
544
544
|
self, links: List[m.ShareLinkSendItem], sender_email: str, sender_name: Optional[str] = None
|
545
545
|
) -> PangeaResponse[m.ShareLinkSendResult]:
|
546
546
|
"""
|
547
|
-
Send share links
|
547
|
+
Send share links (Beta)
|
548
548
|
|
549
549
|
Send a secure share-link notification to a set of email addresses. The
|
550
550
|
notification email will contain an Open button that the recipient can
|
551
551
|
use to follow the secured share-link to authenticate and then access the
|
552
552
|
shared content.
|
553
|
-
[
|
553
|
+
How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
|
554
554
|
|
555
555
|
OperationId: share_post_v1beta_share_link_send
|
556
556
|
|
pangea/services/__init__.py
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
from .audit.audit import Audit
|
2
2
|
from .authn.authn import AuthN
|
3
|
+
from .authz import AuthZ
|
3
4
|
from .embargo import Embargo
|
4
5
|
from .file_scan import FileScan
|
5
6
|
from .intel import DomainIntel, FileIntel, IpIntel, UrlIntel, UserIntel
|
6
7
|
from .redact import Redact
|
7
|
-
from .share.share import Share
|
8
8
|
from .sanitize import Sanitize
|
9
|
+
from .share.share import Share
|
9
10
|
from .vault.vault import Vault
|
pangea/services/authz.py
ADDED
@@ -0,0 +1,377 @@
|
|
1
|
+
# Copyright 2022 Pangea Cyber Corporation
|
2
|
+
# Author: Pangea Cyber Corporation
|
3
|
+
|
4
|
+
import enum
|
5
|
+
from typing import Any, Dict, List, Optional, Union
|
6
|
+
|
7
|
+
from pangea.response import APIRequestModel, APIResponseModel, PangeaResponse, PangeaResponseResult
|
8
|
+
from pangea.services.base import ServiceBase
|
9
|
+
|
10
|
+
|
11
|
+
class ItemOrder(str, enum.Enum):
|
12
|
+
ASC = "asc"
|
13
|
+
DESC = "desc"
|
14
|
+
|
15
|
+
def __str__(self):
|
16
|
+
return str(self.value)
|
17
|
+
|
18
|
+
def __repr__(self):
|
19
|
+
return str(self.value)
|
20
|
+
|
21
|
+
|
22
|
+
class TupleOrderBy(str, enum.Enum):
|
23
|
+
RESOURCE_NAMESPACE = "resource_namespace"
|
24
|
+
RESOURCE_ID = "resource_id"
|
25
|
+
RELATION = "relation"
|
26
|
+
SUBJECT_NAMESPACE = "subject_namespace"
|
27
|
+
SUBJECT_ID = "subject_id"
|
28
|
+
SUBJECT_ACTION = "subject_action"
|
29
|
+
|
30
|
+
def __str__(self):
|
31
|
+
return str(self.value)
|
32
|
+
|
33
|
+
def __repr__(self):
|
34
|
+
return str(self.value)
|
35
|
+
|
36
|
+
|
37
|
+
class Resource(PangeaResponseResult):
|
38
|
+
namespace: str
|
39
|
+
id: Optional[str] = None
|
40
|
+
|
41
|
+
|
42
|
+
class Subject(PangeaResponseResult):
|
43
|
+
namespace: str
|
44
|
+
id: Optional[str] = None
|
45
|
+
action: Optional[str] = None
|
46
|
+
|
47
|
+
|
48
|
+
class Tuple(PangeaResponseResult):
|
49
|
+
resource: Resource
|
50
|
+
relation: str
|
51
|
+
subject: Subject
|
52
|
+
|
53
|
+
|
54
|
+
class TupleCreateRequest(APIRequestModel):
|
55
|
+
tuples: List[Tuple]
|
56
|
+
|
57
|
+
|
58
|
+
class TupleCreateResult(PangeaResponseResult):
|
59
|
+
pass
|
60
|
+
|
61
|
+
|
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
|
66
|
+
resource_id: Optional[str] = None
|
67
|
+
resource_id__contains: Optional[List[str]] = None
|
68
|
+
resource_id__in: Optional[List[str]] = None
|
69
|
+
relation: Optional[str] = None
|
70
|
+
relation__contains: Optional[List[str]] = None
|
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
|
75
|
+
subject_id: Optional[str] = None
|
76
|
+
subject_id__contains: Optional[List[str]] = None
|
77
|
+
subject_id__in: Optional[List[str]] = None
|
78
|
+
subject_action: Optional[str] = None
|
79
|
+
subject_action__contains: Optional[List[str]] = None
|
80
|
+
subject_action__in: Optional[List[str]] = None
|
81
|
+
|
82
|
+
|
83
|
+
class TupleListRequest(APIRequestModel):
|
84
|
+
filter: Optional[Union[Dict, TupleListFilter]] = None
|
85
|
+
size: Optional[int] = None
|
86
|
+
last: Optional[str] = None
|
87
|
+
order: Optional[ItemOrder] = None
|
88
|
+
order_by: Optional[TupleOrderBy] = None
|
89
|
+
|
90
|
+
|
91
|
+
class TupleListResult(PangeaResponseResult):
|
92
|
+
tuples: List[Tuple]
|
93
|
+
last: str
|
94
|
+
count: int
|
95
|
+
|
96
|
+
|
97
|
+
class TupleDeleteRequest(APIRequestModel):
|
98
|
+
tuples: List[Tuple]
|
99
|
+
|
100
|
+
|
101
|
+
class TupleDeleteResult(PangeaResponseResult):
|
102
|
+
pass
|
103
|
+
|
104
|
+
|
105
|
+
class CheckRequest(APIRequestModel):
|
106
|
+
resource: Resource
|
107
|
+
action: str
|
108
|
+
subject: Subject
|
109
|
+
debug: Optional[bool] = None
|
110
|
+
attributes: Optional[Dict[str, Any]] = None
|
111
|
+
|
112
|
+
|
113
|
+
class DebugPath(APIResponseModel):
|
114
|
+
namespace: str
|
115
|
+
id: str
|
116
|
+
action: Optional[str]
|
117
|
+
|
118
|
+
|
119
|
+
class Debug(APIResponseModel):
|
120
|
+
path: List[DebugPath]
|
121
|
+
|
122
|
+
|
123
|
+
class CheckResult(PangeaResponseResult):
|
124
|
+
schema_id: str
|
125
|
+
schema_version: int
|
126
|
+
depth: int
|
127
|
+
allowed: bool
|
128
|
+
debug: Optional[Debug] = None
|
129
|
+
|
130
|
+
|
131
|
+
class ListResourcesRequest(APIRequestModel):
|
132
|
+
namespace: str
|
133
|
+
action: str
|
134
|
+
subject: Subject
|
135
|
+
|
136
|
+
|
137
|
+
class ListResourcesResult(PangeaResponseResult):
|
138
|
+
ids: List[str]
|
139
|
+
|
140
|
+
|
141
|
+
class ListSubjectsRequest(APIRequestModel):
|
142
|
+
resource: Resource
|
143
|
+
action: str
|
144
|
+
|
145
|
+
|
146
|
+
class ListSubjectsResult(PangeaResponseResult):
|
147
|
+
subjects: List[Subject]
|
148
|
+
|
149
|
+
|
150
|
+
class AuthZ(ServiceBase):
|
151
|
+
"""AuthZ service client. (Beta)
|
152
|
+
|
153
|
+
Provides methods to interact with the Pangea AuthZ Service.
|
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.
|
157
|
+
|
158
|
+
Examples:
|
159
|
+
import os
|
160
|
+
from pangea.config import PangeaConfig
|
161
|
+
from pangea.services import AuthZ
|
162
|
+
|
163
|
+
PANGEA_TOKEN = os.getenv("PANGEA_AUTHZ_TOKEN")
|
164
|
+
|
165
|
+
authz_config = PangeaConfig(domain="aws.us.pangea.cloud")
|
166
|
+
|
167
|
+
# Setup Pangea AuthZ service client
|
168
|
+
authz = AuthZ(token=PANGEA_TOKEN, config=authz_config)
|
169
|
+
"""
|
170
|
+
|
171
|
+
service_name = "authz"
|
172
|
+
|
173
|
+
def __init__(self, token: str, config=None, logger_name="pangea", config_id: Optional[str] = None):
|
174
|
+
super().__init__(token, config, logger_name, config_id=config_id)
|
175
|
+
|
176
|
+
def tuple_create(self, tuples: List[Tuple]) -> PangeaResponse[TupleCreateResult]:
|
177
|
+
"""Create tuples. (Beta)
|
178
|
+
|
179
|
+
Create tuples in the AuthZ Service. The request will fail if there is no schema
|
180
|
+
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
|
+
|
183
|
+
Args:
|
184
|
+
tuples (List[Tuple]): List of tuples to be created.
|
185
|
+
|
186
|
+
Raises:
|
187
|
+
PangeaAPIException: If an API Error happens.
|
188
|
+
|
189
|
+
Returns:
|
190
|
+
Pangea Response with empty result.
|
191
|
+
Available response fields can be found in our
|
192
|
+
[API Documentation](https://pangea.cloud/docs/api/authz#/v1beta/tuple/create).
|
193
|
+
|
194
|
+
Examples:
|
195
|
+
response = authz.tuple_create(
|
196
|
+
tuples=[
|
197
|
+
Tuple(
|
198
|
+
resource=Resource(namespace="file", id="file_1"),
|
199
|
+
relation="owner",
|
200
|
+
subject=Subject(namespace="user", id="user_1"),
|
201
|
+
)
|
202
|
+
]
|
203
|
+
)
|
204
|
+
"""
|
205
|
+
|
206
|
+
input_data = TupleCreateRequest(tuples=tuples)
|
207
|
+
return self.request.post("v1beta/tuple/create", TupleCreateResult, data=input_data.dict(exclude_none=True))
|
208
|
+
|
209
|
+
def tuple_list(
|
210
|
+
self,
|
211
|
+
filter: TupleListFilter,
|
212
|
+
size: Optional[int] = None,
|
213
|
+
last: Optional[str] = None,
|
214
|
+
order: Optional[ItemOrder] = None,
|
215
|
+
order_by: Optional[TupleOrderBy] = None,
|
216
|
+
) -> PangeaResponse[TupleListResult]:
|
217
|
+
"""List tuples. (Beta)
|
218
|
+
|
219
|
+
Return a paginated list of filtered tuples. The filter is given in terms
|
220
|
+
of a tuple. Fill out the fields that you want to filter. If the filter
|
221
|
+
is empty it will return all the tuples.
|
222
|
+
How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
|
223
|
+
|
224
|
+
Args:
|
225
|
+
filter (TupleListFilter): The filter for listing tuples.
|
226
|
+
size (Optional[int]): The size of the result set. Default is None.
|
227
|
+
last (Optional[str]): The last token from a previous response. Default is None.
|
228
|
+
order (Optional[ItemOrder]): Order results asc(ending) or desc(ending).
|
229
|
+
order_by (Optional[TupleOrderBy]): Which field to order results by.
|
230
|
+
|
231
|
+
Raises:
|
232
|
+
PangeaAPIException: If an API Error happens.
|
233
|
+
|
234
|
+
Returns:
|
235
|
+
Pangea Response with a list of tuples and the last token.
|
236
|
+
Available response fields can be found in our
|
237
|
+
[API Documentation](https://pangea.cloud/docs/api/authz#/v1beta/tuple/list).
|
238
|
+
|
239
|
+
Examples:
|
240
|
+
authz.tuple_list(TupleListFilter(subject_namespace="user", subject_id="user_1"))
|
241
|
+
"""
|
242
|
+
input_data = TupleListRequest(
|
243
|
+
filter=filter.dict(exclude_none=True), size=size, last=last, order=order, order_by=order_by
|
244
|
+
)
|
245
|
+
return self.request.post("v1beta/tuple/list", TupleListResult, data=input_data.dict(exclude_none=True))
|
246
|
+
|
247
|
+
def tuple_delete(self, tuples: List[Tuple]) -> PangeaResponse[TupleDeleteResult]:
|
248
|
+
"""Delete tuples. (Beta)
|
249
|
+
|
250
|
+
Delete tuples in the AuthZ Service.
|
251
|
+
How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
|
252
|
+
|
253
|
+
Args:
|
254
|
+
tuples (List[Tuple]): List of tuples to be deleted.
|
255
|
+
|
256
|
+
Raises:
|
257
|
+
PangeaAPIException: If an API Error happens.
|
258
|
+
|
259
|
+
Returns:
|
260
|
+
Pangea Response with empty result.
|
261
|
+
Available response fields can be found in our
|
262
|
+
[API Documentation](https://pangea.cloud/docs/api/authz#/v1beta/tuple/delete).
|
263
|
+
|
264
|
+
Examples:
|
265
|
+
response = authz.tuple_delete(
|
266
|
+
tuples=[
|
267
|
+
Tuple(
|
268
|
+
resource=Resource(namespace="file", id="file_1"),
|
269
|
+
relation="owner",
|
270
|
+
subject=Subject(namespace="user", id="user_1"),
|
271
|
+
)
|
272
|
+
]
|
273
|
+
)
|
274
|
+
"""
|
275
|
+
|
276
|
+
input_data = TupleDeleteRequest(tuples=tuples)
|
277
|
+
return self.request.post("v1beta/tuple/delete", TupleDeleteResult, data=input_data.dict(exclude_none=True))
|
278
|
+
|
279
|
+
def check(
|
280
|
+
self,
|
281
|
+
resource: Resource,
|
282
|
+
action: str,
|
283
|
+
subject: Subject,
|
284
|
+
debug: Optional[bool] = None,
|
285
|
+
attributes: Optional[Dict[str, Union[int, str]]] = None,
|
286
|
+
) -> PangeaResponse[CheckResult]:
|
287
|
+
"""Perform a check request. (Beta)
|
288
|
+
|
289
|
+
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
|
+
|
292
|
+
Args:
|
293
|
+
resource (Resource): The resource to check.
|
294
|
+
action (str): The action to check.
|
295
|
+
subject (Subject): The subject to check.
|
296
|
+
debug (Optional[bool]): Setting this value to True will provide a detailed analysis of the check.
|
297
|
+
attributes (Optional[Dict[str, Union[int, str]]]): Additional attributes for the check.
|
298
|
+
|
299
|
+
Raises:
|
300
|
+
PangeaAPIException: If an API Error happens.
|
301
|
+
|
302
|
+
Returns:
|
303
|
+
Pangea Response with the result of the check.
|
304
|
+
Available response fields can be found in our
|
305
|
+
[API Documentation](https://pangea.cloud/docs/api/authz#/v1beta/check).
|
306
|
+
|
307
|
+
Examples:
|
308
|
+
response = authz.check(
|
309
|
+
resource=Resource(namespace="file", id="file_1"),
|
310
|
+
action="update",
|
311
|
+
subject=Subject(namespace="user", id="user_1"),
|
312
|
+
debug=True,
|
313
|
+
)
|
314
|
+
"""
|
315
|
+
|
316
|
+
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))
|
318
|
+
|
319
|
+
def list_resources(self, namespace: str, action: str, subject: Subject) -> PangeaResponse[ListResourcesResult]:
|
320
|
+
"""List resources. (Beta)
|
321
|
+
|
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).
|
325
|
+
|
326
|
+
Args:
|
327
|
+
namespace (str): The namespace to filter resources.
|
328
|
+
action (str): The action to filter resources.
|
329
|
+
subject (Subject): The subject to filter resources.
|
330
|
+
|
331
|
+
Raises:
|
332
|
+
PangeaAPIException: If an API Error happens.
|
333
|
+
|
334
|
+
Returns:
|
335
|
+
Pangea Response with a list of resource IDs.
|
336
|
+
Available response fields can be found in our
|
337
|
+
[API Documentation](https://pangea.cloud/docs/api/authz#/v1beta/list-resources).
|
338
|
+
|
339
|
+
Examples:
|
340
|
+
authz.list_resources(
|
341
|
+
namespace="file",
|
342
|
+
action="update",
|
343
|
+
subject=Subject(namespace="user", id="user_1"),
|
344
|
+
)
|
345
|
+
"""
|
346
|
+
|
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))
|
349
|
+
|
350
|
+
def list_subjects(self, resource: Resource, action: str) -> PangeaResponse[ListSubjectsResult]:
|
351
|
+
"""List subjects. (Beta)
|
352
|
+
|
353
|
+
Given a resource and an action, return the list of subjects who have
|
354
|
+
access to the action for the given resource.
|
355
|
+
How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
|
356
|
+
|
357
|
+
Args:
|
358
|
+
resource (Resource): The resource to filter subjects.
|
359
|
+
action (str): The action to filter subjects.
|
360
|
+
|
361
|
+
Raises:
|
362
|
+
PangeaAPIException: If an API Error happens.
|
363
|
+
|
364
|
+
Returns:
|
365
|
+
Pangea Response with a list of subjects.
|
366
|
+
Available response fields can be found in our
|
367
|
+
[API Documentation](https://pangea.cloud/docs/api/authz#/v1beta/list-subjects).
|
368
|
+
|
369
|
+
Examples:
|
370
|
+
response = authz.list_subjects(
|
371
|
+
resource=Resource(namespace="file", id="file_1"),
|
372
|
+
action="update",
|
373
|
+
)
|
374
|
+
"""
|
375
|
+
|
376
|
+
input_data = ListSubjectsRequest(resource=resource, action=action)
|
377
|
+
return self.request.post("v1beta/list-subjects", ListSubjectsResult, data=input_data.dict(exclude_none=True))
|
pangea/services/sanitize.py
CHANGED
@@ -136,10 +136,10 @@ class Sanitize(ServiceBase):
|
|
136
136
|
sync_call: bool = True,
|
137
137
|
) -> PangeaResponse[SanitizeResult]:
|
138
138
|
"""
|
139
|
-
Sanitize
|
139
|
+
Sanitize (Beta)
|
140
140
|
|
141
141
|
Apply file sanitization actions according to specified rules.
|
142
|
-
[
|
142
|
+
How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
|
143
143
|
|
144
144
|
OperationId: sanitize_post_v1beta_sanitize
|
145
145
|
|
@@ -219,11 +219,11 @@ class Sanitize(ServiceBase):
|
|
219
219
|
uploaded_file_name: Optional[str] = None,
|
220
220
|
) -> PangeaResponse[SanitizeResult]:
|
221
221
|
"""
|
222
|
-
Sanitize via presigned URL
|
222
|
+
Sanitize via presigned URL (Beta)
|
223
223
|
|
224
224
|
Apply file sanitization actions according to specified rules via a
|
225
225
|
[presigned URL](https://pangea.cloud/docs/api/presigned-urls).
|
226
|
-
[
|
226
|
+
How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
|
227
227
|
|
228
228
|
OperationId: sanitize_post_v1beta_sanitize 2
|
229
229
|
|
pangea/services/share/share.py
CHANGED
@@ -345,11 +345,11 @@ class Share(ServiceBase):
|
|
345
345
|
self, id: Optional[str] = None, path: Optional[str] = None, force: Optional[bool] = None
|
346
346
|
) -> PangeaResponse[DeleteResult]:
|
347
347
|
"""
|
348
|
-
Delete
|
348
|
+
Delete (Beta)
|
349
349
|
|
350
350
|
Delete object by ID or path. If both are supplied, the path must match
|
351
351
|
that of the object represented by the ID.
|
352
|
-
[
|
352
|
+
How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
|
353
353
|
|
354
354
|
OperationId: share_post_v1beta_delete
|
355
355
|
|
@@ -376,10 +376,10 @@ class Share(ServiceBase):
|
|
376
376
|
tags: Optional[Tags] = None,
|
377
377
|
) -> PangeaResponse[FolderCreateResult]:
|
378
378
|
"""
|
379
|
-
Create a folder
|
379
|
+
Create a folder (Beta)
|
380
380
|
|
381
381
|
Create a folder, either by name or path and parent_id.
|
382
|
-
[
|
382
|
+
How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
|
383
383
|
|
384
384
|
OperationId: share_post_v1beta_folder_create
|
385
385
|
|
@@ -411,11 +411,11 @@ class Share(ServiceBase):
|
|
411
411
|
self, id: Optional[str] = None, path: Optional[str] = None, transfer_method: Optional[TransferMethod] = None
|
412
412
|
) -> PangeaResponse[GetResult]:
|
413
413
|
"""
|
414
|
-
Get an object
|
414
|
+
Get an object (Beta)
|
415
415
|
|
416
416
|
Get object. If both ID and Path are supplied, the call will fail if the
|
417
417
|
target object doesn't match both properties.
|
418
|
-
[
|
418
|
+
How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
|
419
419
|
|
420
420
|
OperationId: share_post_v1beta_get
|
421
421
|
|
@@ -447,10 +447,10 @@ class Share(ServiceBase):
|
|
447
447
|
transfer_method: Optional[TransferMethod] = None,
|
448
448
|
) -> PangeaResponse[GetArchiveResult]:
|
449
449
|
"""
|
450
|
-
Get archive
|
450
|
+
Get archive (Beta)
|
451
451
|
|
452
452
|
Get an archive file of multiple objects.
|
453
|
-
[
|
453
|
+
How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
|
454
454
|
|
455
455
|
OperationId: share_post_v1beta_get_archive
|
456
456
|
|
@@ -486,10 +486,10 @@ class Share(ServiceBase):
|
|
486
486
|
size: Optional[int] = None,
|
487
487
|
) -> PangeaResponse[ListResult]:
|
488
488
|
"""
|
489
|
-
List
|
489
|
+
List (Beta)
|
490
490
|
|
491
491
|
List or filter/search records.
|
492
|
-
[
|
492
|
+
How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
|
493
493
|
|
494
494
|
OperationId: share_post_v1beta_list
|
495
495
|
|
@@ -528,10 +528,10 @@ class Share(ServiceBase):
|
|
528
528
|
size: Optional[int] = None,
|
529
529
|
) -> PangeaResponse[PutResult]:
|
530
530
|
"""
|
531
|
-
Upload a file
|
531
|
+
Upload a file (Beta)
|
532
532
|
|
533
533
|
Upload a file.
|
534
|
-
[
|
534
|
+
How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
|
535
535
|
|
536
536
|
OperationId: share_post_v1beta_put
|
537
537
|
|
@@ -613,10 +613,10 @@ class Share(ServiceBase):
|
|
613
613
|
size: Optional[int] = None,
|
614
614
|
) -> PangeaResponse[PutResult]:
|
615
615
|
"""
|
616
|
-
Request upload URL
|
616
|
+
Request upload URL (Beta)
|
617
617
|
|
618
618
|
Request an upload URL.
|
619
|
-
[
|
619
|
+
How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
|
620
620
|
|
621
621
|
OperationId: share_post_v1beta_put 2
|
622
622
|
|
@@ -688,10 +688,10 @@ class Share(ServiceBase):
|
|
688
688
|
updated_at: Optional[str] = None,
|
689
689
|
) -> PangeaResponse[UpdateResult]:
|
690
690
|
"""
|
691
|
-
Update a file
|
691
|
+
Update a file (Beta)
|
692
692
|
|
693
693
|
Update a file.
|
694
|
-
[
|
694
|
+
How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
|
695
695
|
|
696
696
|
OperationId: share_post_v1beta_update
|
697
697
|
|
@@ -736,10 +736,10 @@ class Share(ServiceBase):
|
|
736
736
|
|
737
737
|
def share_link_create(self, links: List[ShareLinkCreateItem]) -> PangeaResponse[ShareLinkCreateResult]:
|
738
738
|
"""
|
739
|
-
Create share links
|
739
|
+
Create share links (Beta)
|
740
740
|
|
741
741
|
Create a share link.
|
742
|
-
[
|
742
|
+
How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
|
743
743
|
|
744
744
|
OperationId: share_post_v1beta_share_link_create
|
745
745
|
|
@@ -770,10 +770,10 @@ class Share(ServiceBase):
|
|
770
770
|
|
771
771
|
def share_link_get(self, id: str) -> PangeaResponse[ShareLinkGetResult]:
|
772
772
|
"""
|
773
|
-
Get share link
|
773
|
+
Get share link (Beta)
|
774
774
|
|
775
775
|
Get a share link.
|
776
|
-
[
|
776
|
+
How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
|
777
777
|
|
778
778
|
OperationId: share_post_v1beta_share_link_get
|
779
779
|
|
@@ -800,10 +800,10 @@ class Share(ServiceBase):
|
|
800
800
|
size: Optional[int] = None,
|
801
801
|
) -> PangeaResponse[ShareLinkListResult]:
|
802
802
|
"""
|
803
|
-
List share links
|
803
|
+
List share links (Beta)
|
804
804
|
|
805
805
|
Look up share links by filter options.
|
806
|
-
[
|
806
|
+
How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
|
807
807
|
|
808
808
|
OperationId: share_post_v1beta_share_link_list
|
809
809
|
|
@@ -825,10 +825,10 @@ class Share(ServiceBase):
|
|
825
825
|
|
826
826
|
def share_link_delete(self, ids: List[str]) -> PangeaResponse[ShareLinkDeleteResult]:
|
827
827
|
"""
|
828
|
-
Delete share links
|
828
|
+
Delete share links (Beta)
|
829
829
|
|
830
830
|
Delete share links.
|
831
|
-
[
|
831
|
+
How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
|
832
832
|
|
833
833
|
OperationId: share_post_v1beta_share_link_delete
|
834
834
|
|
@@ -850,13 +850,13 @@ class Share(ServiceBase):
|
|
850
850
|
self, links: List[ShareLinkSendItem], sender_email: str, sender_name: Optional[str] = None
|
851
851
|
) -> PangeaResponse[ShareLinkSendResult]:
|
852
852
|
"""
|
853
|
-
Send share links
|
853
|
+
Send share links (Beta)
|
854
854
|
|
855
855
|
Send a secure share-link notification to a set of email addresses. The
|
856
856
|
notification email will contain an Open button that the recipient can
|
857
857
|
use to follow the secured share-link to authenticate and then access the
|
858
858
|
shared content.
|
859
|
-
[
|
859
|
+
How to install a [Beta release](https://pangea.cloud/docs/sdk/python/#beta-releases).
|
860
860
|
|
861
861
|
OperationId: share_post_v1beta_share_link_send
|
862
862
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: pangea-sdk
|
3
|
-
Version: 3.8.
|
3
|
+
Version: 3.8.0b3
|
4
4
|
Summary: Pangea API SDK
|
5
5
|
Home-page: https://pangea.cloud/docs/sdk/python/
|
6
6
|
License: MIT
|
@@ -44,6 +44,8 @@ above.
|
|
44
44
|
|
45
45
|
## Installation
|
46
46
|
|
47
|
+
#### GA releases
|
48
|
+
|
47
49
|
Via pip:
|
48
50
|
|
49
51
|
```bash
|
@@ -56,10 +58,32 @@ Via poetry:
|
|
56
58
|
$ poetry add pangea-sdk
|
57
59
|
```
|
58
60
|
|
61
|
+
<a name="beta-releases"></a>
|
62
|
+
|
63
|
+
#### Beta releases
|
64
|
+
|
65
|
+
Pre-release versions may be available with the `b` (beta) denotation in the
|
66
|
+
version number. These releases serve to preview beta services and APIs. Per
|
67
|
+
Semantic Versioning, they are considered unstable and do not carry the same
|
68
|
+
compatibility guarantees as stable releases. [Beta changelog](https://github.com/pangeacyber/pangea-python/blob/beta/CHANGELOG.md).
|
69
|
+
|
70
|
+
Via pip:
|
71
|
+
|
72
|
+
```bash
|
73
|
+
$ pip3 install pangea-sdk==3.8.0b3
|
74
|
+
```
|
75
|
+
|
76
|
+
Via poetry:
|
77
|
+
|
78
|
+
```bash
|
79
|
+
$ poetry add pangea-sdk==3.8.0b3
|
80
|
+
```
|
81
|
+
|
59
82
|
## Usage
|
60
83
|
|
61
84
|
- [Documentation][]
|
62
|
-
- [Examples][]
|
85
|
+
- [GA Examples][]
|
86
|
+
- [Beta Examples][]
|
63
87
|
|
64
88
|
General usage would be to create a token for a service through the
|
65
89
|
[Pangea Console][] and then construct an API client for that respective service.
|
@@ -213,7 +237,8 @@ It accepts multiple file formats:
|
|
213
237
|
|
214
238
|
|
215
239
|
[Documentation]: https://pangea.cloud/docs/sdk/python/
|
216
|
-
[Examples]: https://github.com/pangeacyber/pangea-python/tree/main/examples
|
240
|
+
[GA Examples]: https://github.com/pangeacyber/pangea-python/tree/main/examples
|
241
|
+
[Beta Examples]: https://github.com/pangeacyber/pangea-python/tree/beta/examples
|
217
242
|
[Pangea Console]: https://console.pangea.cloud/
|
218
243
|
[Slack]: https://pangea.cloud/join-slack/
|
219
244
|
[Secure Audit Log]: https://pangea.cloud/docs/audit
|
@@ -1,17 +1,18 @@
|
|
1
|
-
pangea/__init__.py,sha256=
|
1
|
+
pangea/__init__.py,sha256=CmArwx2RgBaktP0hoxzHwv8oVS_WqKkzHmTxzpRPpQk,251
|
2
2
|
pangea/asyncio/__init__.py,sha256=kjEMkqMQ521LlMSu5jn3_WgweyArwVZ2C-s3x7mR6Pk,45
|
3
3
|
pangea/asyncio/file_uploader.py,sha256=nIBDNvZPwl-iA95OdwgEPeqUizvaBVsOc66Wkfux_6A,1462
|
4
4
|
pangea/asyncio/request.py,sha256=ceFLWZ9MONt40PETarh1DSSDhA2rrDGgLrVz7u4xduQ,17272
|
5
|
-
pangea/asyncio/services/__init__.py,sha256=
|
5
|
+
pangea/asyncio/services/__init__.py,sha256=3IkiTqY_RtFndI7aoDTrb1yLv8xos_cKhmGS1TULcmw,386
|
6
6
|
pangea/asyncio/services/audit.py,sha256=FJzSQSRhzQ0MNuhvMvziGyfGhcFb_HHeJ11NkPS_DBU,19594
|
7
7
|
pangea/asyncio/services/authn.py,sha256=njuhg0SMLkke4Bmqe0C75BybjnmsC1ruAv6ariNbFwY,43812
|
8
|
+
pangea/asyncio/services/authz.py,sha256=kflRVbaZISpkRZTdFKf2xr8Oviu6Vo3Rsux8kI1NqmA,9958
|
8
9
|
pangea/asyncio/services/base.py,sha256=4FtKtlq74NmE9myrgIt9HMA6JDnP4mPZ6krafWr286o,2663
|
9
10
|
pangea/asyncio/services/embargo.py,sha256=8WguyWZUaGVwGpNzic5h8QzLueirA9WpBBik4mpCTeA,3056
|
10
11
|
pangea/asyncio/services/file_scan.py,sha256=WIKYjUNCIx6jF0vQ-KnsKYBcZh53Q5rmccTlsTPP_rY,6301
|
11
12
|
pangea/asyncio/services/intel.py,sha256=SSOBkD1vE0laQ2qWIDi5tHuYphQ8gFM_ikxr6VyoEp4,37665
|
12
13
|
pangea/asyncio/services/redact.py,sha256=Crs8fpPG3gMgxR5uRT22qaS85yorUzec-PY1lYK4FzI,5174
|
13
|
-
pangea/asyncio/services/sanitize.py,sha256=
|
14
|
-
pangea/asyncio/services/share.py,sha256=
|
14
|
+
pangea/asyncio/services/sanitize.py,sha256=eW0Vlf8-xjeUdJKgb5NXJGIJCyYjZJBaXcpcujVCfxI,7576
|
15
|
+
pangea/asyncio/services/share.py,sha256=GM8f_WS5nr5sjwVLqmanZn7T0WZzpYggouwPwqdgFzo,24759
|
15
16
|
pangea/asyncio/services/vault.py,sha256=i8LGfZT5MQ_PFcOSA-zM3aRqlwkGHOu1WJ8U0VJaekc,47360
|
16
17
|
pangea/audit_logger.py,sha256=gRkCfUUT5LDNaycwxkhZUySgY47jDfn1ZeKOul4XCQI,3842
|
17
18
|
pangea/config.py,sha256=mQUu8GX_6weIuv3vjNdG5plppXskXYASmxMWtFQh-hc,1662
|
@@ -23,7 +24,7 @@ pangea/file_uploader.py,sha256=4RQ44xt-faApC61nn2PlwHT7XYrJ4GeQA8Ug4tySEAg,1227
|
|
23
24
|
pangea/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
24
25
|
pangea/request.py,sha256=eJBojjqVkIweNgf-MeHU9JqmuRXAZ-jFx2Rk25vKgIA,24346
|
25
26
|
pangea/response.py,sha256=wKHFCZBkv27PvMG5Z5pa4FYqzmMl_Pp8e_nfmNeed3k,7042
|
26
|
-
pangea/services/__init__.py,sha256
|
27
|
+
pangea/services/__init__.py,sha256=-QsZxRzRq_V1x1lmS_mu4310MNm0DkM4r6g6rfVGnOc,340
|
27
28
|
pangea/services/audit/audit.py,sha256=NFpAz_a8JoI89HqGsBTqJgjSbTP0yflNQYY6McU6rek,32834
|
28
29
|
pangea/services/audit/exceptions.py,sha256=bhVuYe4ammacOVxwg98CChxvwZf5FKgR2DcgqILOcwc,471
|
29
30
|
pangea/services/audit/models.py,sha256=zKx-CozUSv0dem4sWxqUs_By0CcQQtNUFtXYg6IAwtI,12644
|
@@ -31,14 +32,15 @@ pangea/services/audit/signing.py,sha256=pOjw60BIYDcg3_5YKDCMWZUaapsEZpCHaFhyFu7T
|
|
31
32
|
pangea/services/audit/util.py,sha256=C6KAdu6qhValmNrIMUPLdAW0SCiLwcDd5euXti_63Og,7596
|
32
33
|
pangea/services/authn/authn.py,sha256=pjx8CybKhkf0Q9jNpcYUwAPL0KYr1ULg-mhdb0TbQbE,43280
|
33
34
|
pangea/services/authn/models.py,sha256=FZ5kRBZQ-Pr2YD3jFZ4HvJI22ObbXaBb6HStjcN7-D0,18104
|
35
|
+
pangea/services/authz.py,sha256=Ds3Tbg8ZpkM31IpeGdAucV3C0e_Jhmj4UiPDY2GWm48,12627
|
34
36
|
pangea/services/base.py,sha256=60FuZkACFGDDQFZfx9vzspPTtZU0pFqNKM_ViatXejc,3012
|
35
37
|
pangea/services/embargo.py,sha256=WFqBreGU1FPgOSabIIkWCrXBvquYN958Un7h9P1aHSI,3885
|
36
38
|
pangea/services/file_scan.py,sha256=loceEPhHTG4fKxUXk0Qut-ztGm4N-FaSMl2QBy2x20U,6923
|
37
39
|
pangea/services/intel.py,sha256=r-MRWuyo5wPNi69M2PGb3G2TlA4e77ZR2RlSVSmT8as,51637
|
38
40
|
pangea/services/redact.py,sha256=9LSVDyQsL_RBWioMXVq6-6Hf7Tr2bqBZo3ydbDw92Bg,7772
|
39
|
-
pangea/services/sanitize.py,sha256=
|
41
|
+
pangea/services/sanitize.py,sha256=sh_wsMDX2v-OWg57RNdmlZs633N8ZsTc2v4IuevZVgQ,10092
|
40
42
|
pangea/services/share/file_format.py,sha256=1svO1ee_aenA9zoO_AaU-Rk5Ulp7kcPOc_KwNoluyQE,2797
|
41
|
-
pangea/services/share/share.py,sha256=
|
43
|
+
pangea/services/share/share.py,sha256=KLWI4RMDUQqZO9-2ovtwL6H4Zmb6VkprKizSpCcejoo,32497
|
42
44
|
pangea/services/vault/models/asymmetric.py,sha256=ac2Exc66elXxO-HxBqtvLPQWNI7y_00kb6SVqBPKecA,1450
|
43
45
|
pangea/services/vault/models/common.py,sha256=Ks6reIlWx3PU1lD0UlorcAlZV8U9T3j711iOsb6qp3o,11120
|
44
46
|
pangea/services/vault/models/secret.py,sha256=cLgEj-_BeGkB4-pmSeTkWVyasFbaJwcEltIEcOyf1U8,481
|
@@ -47,6 +49,6 @@ pangea/services/vault/vault.py,sha256=5islfGG4QLXHaZDwv7dEIPxpmpV8swFIYwCMz6-iBw
|
|
47
49
|
pangea/tools.py,sha256=sa2pSz-L8tB6GcZg6lghsmm8w0qMQAIkzqcv7dilU6Q,6429
|
48
50
|
pangea/utils.py,sha256=LTWkm7AZO95PITY1w7zbt6N3jWK1OPgzwy69FOKljCY,5289
|
49
51
|
pangea/verify_audit.py,sha256=QthhKzFlIQwoEyjBLojcX4uHGaN3EEGomx-IC5e3L0E,10756
|
50
|
-
pangea_sdk-3.8.
|
51
|
-
pangea_sdk-3.8.
|
52
|
-
pangea_sdk-3.8.
|
52
|
+
pangea_sdk-3.8.0b3.dist-info/METADATA,sha256=ZFeMGPhmzJgl7JSVoQR3mwW-0JozKurmeAQHZ_MHnaQ,7735
|
53
|
+
pangea_sdk-3.8.0b3.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
|
54
|
+
pangea_sdk-3.8.0b3.dist-info/RECORD,,
|
File without changes
|