pangea-sdk 3.8.0b1__py3-none-any.whl → 5.3.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 -1
- pangea/asyncio/file_uploader.py +1 -1
- pangea/asyncio/request.py +49 -31
- pangea/asyncio/services/__init__.py +2 -0
- pangea/asyncio/services/audit.py +192 -31
- pangea/asyncio/services/authn.py +187 -109
- pangea/asyncio/services/authz.py +285 -0
- pangea/asyncio/services/base.py +21 -2
- pangea/asyncio/services/embargo.py +2 -2
- pangea/asyncio/services/file_scan.py +24 -9
- pangea/asyncio/services/intel.py +108 -34
- pangea/asyncio/services/redact.py +72 -4
- pangea/asyncio/services/sanitize.py +217 -0
- pangea/asyncio/services/share.py +246 -73
- pangea/asyncio/services/vault.py +1710 -750
- pangea/crypto/rsa.py +135 -0
- pangea/deep_verify.py +7 -1
- pangea/dump_audit.py +9 -8
- pangea/request.py +83 -59
- pangea/response.py +49 -31
- pangea/services/__init__.py +2 -0
- pangea/services/audit/audit.py +205 -42
- pangea/services/audit/models.py +56 -8
- pangea/services/audit/signing.py +6 -5
- pangea/services/audit/util.py +3 -3
- pangea/services/authn/authn.py +140 -70
- pangea/services/authn/models.py +167 -11
- pangea/services/authz.py +400 -0
- pangea/services/base.py +39 -8
- pangea/services/embargo.py +2 -2
- pangea/services/file_scan.py +32 -15
- pangea/services/intel.py +157 -32
- pangea/services/redact.py +152 -4
- pangea/services/sanitize.py +388 -0
- pangea/services/share/share.py +683 -107
- pangea/services/vault/models/asymmetric.py +120 -18
- pangea/services/vault/models/common.py +439 -141
- pangea/services/vault/models/keys.py +94 -0
- pangea/services/vault/models/secret.py +27 -3
- pangea/services/vault/models/symmetric.py +68 -22
- pangea/services/vault/vault.py +1690 -749
- pangea/tools.py +6 -7
- pangea/utils.py +16 -27
- pangea/verify_audit.py +270 -83
- {pangea_sdk-3.8.0b1.dist-info → pangea_sdk-5.3.0.dist-info}/METADATA +43 -35
- pangea_sdk-5.3.0.dist-info/RECORD +56 -0
- {pangea_sdk-3.8.0b1.dist-info → pangea_sdk-5.3.0.dist-info}/WHEEL +1 -1
- pangea_sdk-3.8.0b1.dist-info/RECORD +0 -50
pangea/tools.py
CHANGED
@@ -95,7 +95,7 @@ def file_events(root_hashes: Dict[int, str], f: io.TextIOWrapper) -> Iterator[Ev
|
|
95
95
|
else:
|
96
96
|
raise ValueError("invalid data")
|
97
97
|
except (json.JSONDecodeError, ValueError, KeyError) as e:
|
98
|
-
exit_with_error(f"failed to parse line {idx}: {
|
98
|
+
exit_with_error(f"failed to parse line {idx}: {e!s}")
|
99
99
|
|
100
100
|
|
101
101
|
def init_audit(token: str, domain: str) -> Audit:
|
@@ -108,15 +108,14 @@ def init_audit(token: str, domain: str) -> Audit:
|
|
108
108
|
def make_aware_datetime(d: datetime) -> datetime:
|
109
109
|
if d.tzinfo is None or d.tzinfo.utcoffset(d) is None:
|
110
110
|
return d.replace(tzinfo=timezone.utc)
|
111
|
-
|
112
|
-
return d
|
111
|
+
return d
|
113
112
|
|
114
113
|
|
115
114
|
def filter_deep_none(data: Dict) -> Dict:
|
116
115
|
return {k: v if not isinstance(v, Dict) else filter_deep_none(v) for k, v in data.items() if v is not None}
|
117
116
|
|
118
117
|
|
119
|
-
def _load_env_var(env_var_name: str):
|
118
|
+
def _load_env_var(env_var_name: str) -> str:
|
120
119
|
value = os.getenv(env_var_name)
|
121
120
|
if not value:
|
122
121
|
raise PangeaException(f"{env_var_name} env var need to be set")
|
@@ -124,12 +123,12 @@ def _load_env_var(env_var_name: str):
|
|
124
123
|
return value
|
125
124
|
|
126
125
|
|
127
|
-
def get_test_domain(environment: TestEnvironment):
|
126
|
+
def get_test_domain(environment: TestEnvironment) -> str:
|
128
127
|
env_var_name = f"PANGEA_INTEGRATION_DOMAIN_{environment}"
|
129
128
|
return _load_env_var(env_var_name)
|
130
129
|
|
131
130
|
|
132
|
-
def get_test_token(environment: TestEnvironment):
|
131
|
+
def get_test_token(environment: TestEnvironment) -> str:
|
133
132
|
env_var_name = f"PANGEA_INTEGRATION_TOKEN_{environment}"
|
134
133
|
return _load_env_var(env_var_name)
|
135
134
|
|
@@ -200,7 +199,7 @@ loggers: Dict[str, bool] = {}
|
|
200
199
|
|
201
200
|
|
202
201
|
def logger_set_pangea_config(logger_name: str, level=logging.DEBUG):
|
203
|
-
if loggers.get(logger_name
|
202
|
+
if loggers.get(logger_name) is not None:
|
204
203
|
return
|
205
204
|
|
206
205
|
loggers[logger_name] = True
|
pangea/utils.py
CHANGED
@@ -1,13 +1,13 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
1
3
|
import base64
|
2
4
|
import copy
|
3
5
|
import datetime
|
4
6
|
import io
|
5
7
|
import json
|
6
|
-
from collections import OrderedDict
|
7
8
|
from hashlib import md5, new, sha1, sha256, sha512
|
8
|
-
from typing import Union
|
9
9
|
|
10
|
-
from google_crc32c import Checksum as CRC32C
|
10
|
+
from google_crc32c import Checksum as CRC32C
|
11
11
|
from pydantic import BaseModel
|
12
12
|
|
13
13
|
|
@@ -31,24 +31,13 @@ def default_encoder(obj) -> str:
|
|
31
31
|
return str(obj)
|
32
32
|
|
33
33
|
|
34
|
-
def str2str_b64(data: str):
|
35
|
-
return base64.b64encode(data.encode(
|
36
|
-
|
37
|
-
|
38
|
-
def dict_order_keys(data: dict) -> OrderedDict:
|
39
|
-
if isinstance(data, dict):
|
40
|
-
return OrderedDict(sorted(data.items()))
|
41
|
-
else:
|
42
|
-
return data
|
43
|
-
|
34
|
+
def str2str_b64(data: str, encoding: str = "utf-8") -> str:
|
35
|
+
return base64.b64encode(data.encode(encoding)).decode("ascii")
|
44
36
|
|
45
|
-
def dict_order_keys_recursive(data: dict) -> OrderedDict:
|
46
|
-
if isinstance(data, dict):
|
47
|
-
for k, v in data.items():
|
48
|
-
if type(v) is dict:
|
49
|
-
data[k] = dict_order_keys_recursive(v)
|
50
37
|
|
51
|
-
|
38
|
+
def str_b64_2bytes(data: str) -> bytes:
|
39
|
+
data += "=" * ((4 - len(data) % 4) % 4) # add padding if needed
|
40
|
+
return base64.urlsafe_b64decode(data)
|
52
41
|
|
53
42
|
|
54
43
|
def canonicalize_nested_json(data: dict) -> dict:
|
@@ -77,7 +66,7 @@ def canonicalize(data: dict) -> str:
|
|
77
66
|
return str(data)
|
78
67
|
|
79
68
|
|
80
|
-
def hash_sha256(input:
|
69
|
+
def hash_sha256(input: str | io.BufferedReader) -> str:
|
81
70
|
# Return SHA256 hash in hex format
|
82
71
|
hash = sha256()
|
83
72
|
if isinstance(input, io.BufferedReader):
|
@@ -90,12 +79,12 @@ def hash_sha256(input: Union[str, io.BufferedReader]) -> str:
|
|
90
79
|
|
91
80
|
input.seek(0) # restart reading
|
92
81
|
else:
|
93
|
-
hash.update(input)
|
82
|
+
hash.update(input.encode("utf-8"))
|
94
83
|
|
95
84
|
return hash.hexdigest()
|
96
85
|
|
97
86
|
|
98
|
-
def hash_sha1(input:
|
87
|
+
def hash_sha1(input: str | io.BufferedReader) -> str:
|
99
88
|
# Return SHA1 hash in hex format
|
100
89
|
hash = sha1()
|
101
90
|
if isinstance(input, io.BufferedReader):
|
@@ -108,12 +97,12 @@ def hash_sha1(input: Union[str, io.BufferedReader]) -> str:
|
|
108
97
|
|
109
98
|
input.seek(0) # restart reading
|
110
99
|
else:
|
111
|
-
hash.update(input)
|
100
|
+
hash.update(input.encode("utf-8"))
|
112
101
|
|
113
102
|
return hash.hexdigest()
|
114
103
|
|
115
104
|
|
116
|
-
def hash_sha512(input:
|
105
|
+
def hash_sha512(input: str | io.BufferedReader) -> str:
|
117
106
|
# Return SHA512 hash in hex format
|
118
107
|
hash = sha512()
|
119
108
|
if isinstance(input, io.BufferedReader):
|
@@ -126,7 +115,7 @@ def hash_sha512(input: Union[str, io.BufferedReader]) -> str:
|
|
126
115
|
|
127
116
|
input.seek(0) # restart reading
|
128
117
|
else:
|
129
|
-
hash.update(input)
|
118
|
+
hash.update(input.encode("utf-8"))
|
130
119
|
|
131
120
|
return hash.hexdigest()
|
132
121
|
|
@@ -136,7 +125,7 @@ def hash_ntlm(data: str) -> str:
|
|
136
125
|
return new("md4", data.encode("utf-16le")).hexdigest()
|
137
126
|
|
138
127
|
|
139
|
-
def hash_md5(input:
|
128
|
+
def hash_md5(input: str | io.BufferedReader) -> str:
|
140
129
|
# Return MD5 hash in hex format
|
141
130
|
hash = md5()
|
142
131
|
if isinstance(input, io.BufferedReader):
|
@@ -150,7 +139,7 @@ def hash_md5(input: Union[str, io.BufferedReader]) -> str:
|
|
150
139
|
|
151
140
|
input.seek(0) # restart reading
|
152
141
|
else:
|
153
|
-
hash.update(input)
|
142
|
+
hash.update(input.encode("utf-8"))
|
154
143
|
|
155
144
|
return hash.hexdigest()
|
156
145
|
|