sumo-wrapper-python 1.9.0__py3-none-any.whl → 1.11.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.
- sumo/wrapper/_auth_provider.py +42 -6
- sumo/wrapper/_version.py +2 -2
- sumo/wrapper/sumo_client.py +9 -0
- {sumo_wrapper_python-1.9.0.dist-info → sumo_wrapper_python-1.11.0.dist-info}/METADATA +1 -1
- sumo_wrapper_python-1.11.0.dist-info/RECORD +16 -0
- {sumo_wrapper_python-1.9.0.dist-info → sumo_wrapper_python-1.11.0.dist-info}/WHEEL +1 -1
- sumo_wrapper_python-1.9.0.dist-info/RECORD +0 -16
- {sumo_wrapper_python-1.9.0.dist-info → sumo_wrapper_python-1.11.0.dist-info}/entry_points.txt +0 -0
- {sumo_wrapper_python-1.9.0.dist-info → sumo_wrapper_python-1.11.0.dist-info}/licenses/LICENSE +0 -0
- {sumo_wrapper_python-1.9.0.dist-info → sumo_wrapper_python-1.11.0.dist-info}/top_level.txt +0 -0
sumo/wrapper/_auth_provider.py
CHANGED
|
@@ -9,6 +9,7 @@ from datetime import UTC, datetime, timedelta
|
|
|
9
9
|
from pathlib import Path
|
|
10
10
|
from urllib.parse import parse_qs
|
|
11
11
|
|
|
12
|
+
import httpx
|
|
12
13
|
import jwt
|
|
13
14
|
import msal
|
|
14
15
|
import tenacity as tn
|
|
@@ -64,7 +65,10 @@ class AuthProvider:
|
|
|
64
65
|
retry_error_callback=_return_last_value,
|
|
65
66
|
before_sleep=_log_retry_info,
|
|
66
67
|
)
|
|
67
|
-
def get_token(self):
|
|
68
|
+
def get_token(self) -> str | None:
|
|
69
|
+
if self._app is None:
|
|
70
|
+
return None
|
|
71
|
+
assert isinstance(self._app, msal.PublicClientApplication)
|
|
68
72
|
accounts = self._app.get_accounts()
|
|
69
73
|
if len(accounts) == 0:
|
|
70
74
|
return None
|
|
@@ -81,6 +85,18 @@ class AuthProvider:
|
|
|
81
85
|
|
|
82
86
|
return {"Authorization": "Bearer " + token}
|
|
83
87
|
|
|
88
|
+
def invalidate_access_tokens(self):
|
|
89
|
+
if self._app is not None:
|
|
90
|
+
assert isinstance(self._app, msal.PublicClientApplication)
|
|
91
|
+
assert isinstance(self._app.token_cache, PersistedTokenCache)
|
|
92
|
+
access_tokens = list(
|
|
93
|
+
self._app.token_cache.search(
|
|
94
|
+
self._app.token_cache.CredentialType.ACCESS_TOKEN
|
|
95
|
+
)
|
|
96
|
+
)
|
|
97
|
+
for access_token in access_tokens:
|
|
98
|
+
self._app.token_cache.remove_at(access_token)
|
|
99
|
+
|
|
84
100
|
def store_shared_access_key_for_case(self, case_uuid, token):
|
|
85
101
|
os.makedirs(get_token_dir(), mode=0o700, exist_ok=True)
|
|
86
102
|
with open(
|
|
@@ -90,6 +106,17 @@ class AuthProvider:
|
|
|
90
106
|
f.write(token)
|
|
91
107
|
protect_token_cache(self._resource_id, ".sharedkey", case_uuid)
|
|
92
108
|
|
|
109
|
+
def _store_fallback_auth(self, sumo_client):
|
|
110
|
+
sync_client = sumo_client._client
|
|
111
|
+
if sync_client is None:
|
|
112
|
+
sumo_client._client = httpx.Client()
|
|
113
|
+
token = sumo_client.get("/createfallbackauth").text
|
|
114
|
+
self.store_shared_access_key_for_case("fallback", token)
|
|
115
|
+
sumo_client._client = sync_client
|
|
116
|
+
|
|
117
|
+
def store_fallback_auth(self, sumo_client):
|
|
118
|
+
return
|
|
119
|
+
|
|
93
120
|
def has_case_token(self, case_uuid):
|
|
94
121
|
return os.path.exists(
|
|
95
122
|
get_token_path(self._resource_id, ".sharedkey", case_uuid)
|
|
@@ -115,6 +142,9 @@ class AuthProviderSilent(AuthProvider):
|
|
|
115
142
|
|
|
116
143
|
self._scope = scope_for_resource(resource_id)
|
|
117
144
|
|
|
145
|
+
def store_fallback_auth(self, sumo_client):
|
|
146
|
+
self._store_fallback_auth(sumo_client)
|
|
147
|
+
|
|
118
148
|
|
|
119
149
|
class AuthProviderAccessToken(AuthProvider):
|
|
120
150
|
def __init__(self, access_token):
|
|
@@ -268,6 +298,9 @@ class AuthProviderInteractive(AuthProvider):
|
|
|
268
298
|
)
|
|
269
299
|
return
|
|
270
300
|
|
|
301
|
+
def store_fallback_auth(self, sumo_client):
|
|
302
|
+
self._store_fallback_auth(sumo_client)
|
|
303
|
+
|
|
271
304
|
|
|
272
305
|
class AuthProviderDeviceCode(AuthProvider):
|
|
273
306
|
def __init__(self, client_id, authority, resource_id):
|
|
@@ -451,12 +484,15 @@ def get_auth_provider(
|
|
|
451
484
|
)
|
|
452
485
|
os.environ["BROWSER"] = "firefox"
|
|
453
486
|
|
|
454
|
-
|
|
487
|
+
auth_interactive = AuthProviderInteractive(
|
|
488
|
+
client_id, authority, resource_id
|
|
489
|
+
)
|
|
490
|
+
token = auth_interactive.get_token()
|
|
491
|
+
if token is not None:
|
|
492
|
+
return auth_interactive
|
|
455
493
|
# ELSE
|
|
456
|
-
if
|
|
457
|
-
|
|
458
|
-
# under Equinor compliant device policy
|
|
459
|
-
return AuthProviderDeviceCode(client_id, authority, resource_id)
|
|
494
|
+
if os.path.exists(get_token_path(resource_id, ".sharedkey", "fallback")):
|
|
495
|
+
return AuthProviderSumoToken(resource_id, "fallback")
|
|
460
496
|
# ELSE
|
|
461
497
|
return AuthProviderNone(resource_id)
|
|
462
498
|
|
sumo/wrapper/_version.py
CHANGED
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '1.
|
|
22
|
-
__version_tuple__ = version_tuple = (1,
|
|
21
|
+
__version__ = version = '1.11.0'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 11, 0)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
sumo/wrapper/sumo_client.py
CHANGED
|
@@ -149,7 +149,11 @@ class SumoClient:
|
|
|
149
149
|
|
|
150
150
|
self.base_url = base_url
|
|
151
151
|
|
|
152
|
+
with contextlib.suppress(Exception):
|
|
153
|
+
self.auth.store_fallback_auth(self)
|
|
154
|
+
|
|
152
155
|
def __enter__(self):
|
|
156
|
+
|
|
153
157
|
return self
|
|
154
158
|
|
|
155
159
|
def __exit__(self, *_):
|
|
@@ -184,6 +188,11 @@ class SumoClient:
|
|
|
184
188
|
return None
|
|
185
189
|
return self.auth.get_token()
|
|
186
190
|
|
|
191
|
+
def invalidate_access_tokens(self):
|
|
192
|
+
if self.auth is None:
|
|
193
|
+
return None
|
|
194
|
+
return self.auth.invalidate_access_tokens()
|
|
195
|
+
|
|
187
196
|
@property
|
|
188
197
|
def blob_client(self) -> BlobClient:
|
|
189
198
|
"""Get blob_client
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
sumo/__init__.py,sha256=ftS-xRPSH-vU7fIHlnZQaCTWbNvs4owJivNW65kzsIM,85
|
|
2
|
+
sumo/wrapper/__init__.py,sha256=srvnJZqUgtAWhvjsM8ovl4dPcppZNU8MXRZszicrUoA,235
|
|
3
|
+
sumo/wrapper/_auth_provider.py,sha256=lE74AFtwBqWNK9rCje6BdW9NaL8Kip7HQJVQ-eE_rxM,17527
|
|
4
|
+
sumo/wrapper/_blob_client.py,sha256=QLJmgjFZk44jgxhbFed95JbQ1a69xpO6eQJFuTKyU3A,1608
|
|
5
|
+
sumo/wrapper/_decorators.py,sha256=ZwyrWkfAXiGNSgYsQSEXA13D-WIQM2XPf0v2z9N8HyQ,1002
|
|
6
|
+
sumo/wrapper/_logging.py,sha256=Au77-3D9eYTK0FhaNQLQV6Pl4sKJi0PpQjcUfCckLus,1144
|
|
7
|
+
sumo/wrapper/_retry_strategy.py,sha256=D-4aayNv9BrDrEYMRhkhod6szvyw5d9oZvTekAa4BBI,2624
|
|
8
|
+
sumo/wrapper/_version.py,sha256=R0RDH1rwZiqBhqHMW83hcuYNyE-V-M_xo-8QDd6aazQ,522
|
|
9
|
+
sumo/wrapper/login.py,sha256=PtpQ5Qi8Gm1N0hMnE79Je4QvQ8JMuKqa46TwZgjHRnM,2328
|
|
10
|
+
sumo/wrapper/sumo_client.py,sha256=FKGSIDMMQQdWitZc68afc-Jgdw4bi9uK_8GutlvucPw,24537
|
|
11
|
+
sumo_wrapper_python-1.11.0.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
12
|
+
sumo_wrapper_python-1.11.0.dist-info/METADATA,sha256=I68WxWzuRaRq3ACd9zqyH_wL4WY6aUX9rTecjYdfSSQ,14616
|
|
13
|
+
sumo_wrapper_python-1.11.0.dist-info/WHEEL,sha256=mOdXR9C3wMVov7cSY8PY-XCzo3SmmWCHvGQr5csJoao,91
|
|
14
|
+
sumo_wrapper_python-1.11.0.dist-info/entry_points.txt,sha256=V_vGky2C3He5vohJAxnBdvpt_fqfUDFj5irUm9HtoFc,55
|
|
15
|
+
sumo_wrapper_python-1.11.0.dist-info/top_level.txt,sha256=rLbKyH9rWgCj3PoLeR7fvC5X8vCaUc5LF8-Y_GBWZL0,5
|
|
16
|
+
sumo_wrapper_python-1.11.0.dist-info/RECORD,,
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
sumo/__init__.py,sha256=ftS-xRPSH-vU7fIHlnZQaCTWbNvs4owJivNW65kzsIM,85
|
|
2
|
-
sumo/wrapper/__init__.py,sha256=srvnJZqUgtAWhvjsM8ovl4dPcppZNU8MXRZszicrUoA,235
|
|
3
|
-
sumo/wrapper/_auth_provider.py,sha256=CkTdDVjQ9DTkoHiaFSC_f4mSFaAlYYKi0w2XaE3NMTg,16171
|
|
4
|
-
sumo/wrapper/_blob_client.py,sha256=QLJmgjFZk44jgxhbFed95JbQ1a69xpO6eQJFuTKyU3A,1608
|
|
5
|
-
sumo/wrapper/_decorators.py,sha256=ZwyrWkfAXiGNSgYsQSEXA13D-WIQM2XPf0v2z9N8HyQ,1002
|
|
6
|
-
sumo/wrapper/_logging.py,sha256=Au77-3D9eYTK0FhaNQLQV6Pl4sKJi0PpQjcUfCckLus,1144
|
|
7
|
-
sumo/wrapper/_retry_strategy.py,sha256=D-4aayNv9BrDrEYMRhkhod6szvyw5d9oZvTekAa4BBI,2624
|
|
8
|
-
sumo/wrapper/_version.py,sha256=OUQ9Ng15kRCe7xhTtcSldmCpPE9ugON0d9kKGsiC7-c,520
|
|
9
|
-
sumo/wrapper/login.py,sha256=PtpQ5Qi8Gm1N0hMnE79Je4QvQ8JMuKqa46TwZgjHRnM,2328
|
|
10
|
-
sumo/wrapper/sumo_client.py,sha256=zROiw6I-zY9kkVsjXz5xN1D6KC8G_jb0Xd175gyp_3E,24295
|
|
11
|
-
sumo_wrapper_python-1.9.0.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
12
|
-
sumo_wrapper_python-1.9.0.dist-info/METADATA,sha256=BHunLpm0o2wwvndk3okJ4uFRynuu9DD0pqpH6p19oYc,14615
|
|
13
|
-
sumo_wrapper_python-1.9.0.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
|
|
14
|
-
sumo_wrapper_python-1.9.0.dist-info/entry_points.txt,sha256=V_vGky2C3He5vohJAxnBdvpt_fqfUDFj5irUm9HtoFc,55
|
|
15
|
-
sumo_wrapper_python-1.9.0.dist-info/top_level.txt,sha256=rLbKyH9rWgCj3PoLeR7fvC5X8vCaUc5LF8-Y_GBWZL0,5
|
|
16
|
-
sumo_wrapper_python-1.9.0.dist-info/RECORD,,
|
{sumo_wrapper_python-1.9.0.dist-info → sumo_wrapper_python-1.11.0.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
{sumo_wrapper_python-1.9.0.dist-info → sumo_wrapper_python-1.11.0.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|
|
File without changes
|