osbot-utils 1.29.0__py3-none-any.whl → 1.31.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.
- osbot_utils/helpers/Hashicorp_Secrets.py +101 -0
- osbot_utils/helpers/trace/Trace_Call.py +2 -2
- osbot_utils/utils/Env.py +25 -7
- osbot_utils/utils/Files.py +16 -0
- osbot_utils/utils/Http.py +7 -0
- osbot_utils/version +1 -1
- {osbot_utils-1.29.0.dist-info → osbot_utils-1.31.0.dist-info}/METADATA +2 -2
- {osbot_utils-1.29.0.dist-info → osbot_utils-1.31.0.dist-info}/RECORD +10 -9
- {osbot_utils-1.29.0.dist-info → osbot_utils-1.31.0.dist-info}/LICENSE +0 -0
- {osbot_utils-1.29.0.dist-info → osbot_utils-1.31.0.dist-info}/WHEEL +0 -0
@@ -0,0 +1,101 @@
|
|
1
|
+
from osbot_utils.utils.Env import get_env
|
2
|
+
from osbot_utils.base_classes.Type_Safe import Type_Safe
|
3
|
+
from osbot_utils.utils.Lists import list_index_by
|
4
|
+
from osbot_utils.utils.Misc import list_set
|
5
|
+
|
6
|
+
ENV_VAR__HCP_ACCESS_TOKEN = 'HCP_ACCESS_TOKEN'
|
7
|
+
ENV_VAR__HCP_APP_NAME = 'HCP_APP_NAME'
|
8
|
+
ENV_VAR__HCP_CLIENT_ID = 'HCP_CLIENT_ID'
|
9
|
+
ENV_VAR__HCP_CLIENT_SECRET = 'HCP_CLIENT_SECRET'
|
10
|
+
ENV_VAR__HCP_ORGANIZATION_ID = 'HCP_ORGANIZATION_ID'
|
11
|
+
ENV_VAR__HCP_PROJECT_ID = 'HCP_PROJECT_ID'
|
12
|
+
|
13
|
+
class Hashicorp_Secrets(Type_Safe):
|
14
|
+
|
15
|
+
# helper methods
|
16
|
+
def hcp__auth_details(self):
|
17
|
+
client_id = get_env(ENV_VAR__HCP_CLIENT_ID)
|
18
|
+
client_secret = get_env(ENV_VAR__HCP_CLIENT_SECRET)
|
19
|
+
return client_id, client_secret
|
20
|
+
|
21
|
+
def hcp__access_token(self): # todo: refactor to remove dependency on requests package (which is not part of the OSBOt_utils project)
|
22
|
+
import requests
|
23
|
+
|
24
|
+
access_token = get_env(ENV_VAR__HCP_ACCESS_TOKEN) # todo: add better way to detect when the access token as expired
|
25
|
+
if not access_token:
|
26
|
+
|
27
|
+
client_id, client_secret = self.hcp__auth_details()
|
28
|
+
token_url = 'https://auth.idp.hashicorp.com/oauth2/token'
|
29
|
+
payload = { 'client_id' : client_id ,
|
30
|
+
'client_secret' : client_secret ,
|
31
|
+
'grant_type' : 'client_credentials' ,
|
32
|
+
'audience' : 'https://api.hashicorp.cloud' }
|
33
|
+
|
34
|
+
response = requests.post(token_url, data=payload) # todo: refactor into requests_post method
|
35
|
+
if response.status_code == 200:
|
36
|
+
access_token = response.json().get('access_token')
|
37
|
+
return access_token
|
38
|
+
|
39
|
+
def hcp__enabled(self):
|
40
|
+
if self.hcp__organization_id():
|
41
|
+
if self.hcp__project_id():
|
42
|
+
return True
|
43
|
+
return False
|
44
|
+
|
45
|
+
def hcp__app_name(self):
|
46
|
+
return get_env(ENV_VAR__HCP_APP_NAME)
|
47
|
+
|
48
|
+
def hcp__organization_id(self):
|
49
|
+
return get_env(ENV_VAR__HCP_ORGANIZATION_ID)
|
50
|
+
|
51
|
+
def hcp__project_id(self):
|
52
|
+
return get_env(ENV_VAR__HCP_PROJECT_ID)
|
53
|
+
|
54
|
+
def requests_get(self, path, data_field=None):
|
55
|
+
import requests
|
56
|
+
|
57
|
+
organization_id = self.hcp__organization_id()
|
58
|
+
project_id = self.hcp__project_id()
|
59
|
+
headers = {'Authorization': f"Bearer { self.hcp__access_token()}" }
|
60
|
+
url = f"https://api.cloud.hashicorp.com/secrets/2023-06-13/organizations/{organization_id}/projects/{project_id}/{path}"
|
61
|
+
response = requests.get(url, headers=headers)
|
62
|
+
if response.status_code == 200:
|
63
|
+
json_data = response.json()
|
64
|
+
if data_field is None:
|
65
|
+
data_field = path
|
66
|
+
return json_data.get(data_field)
|
67
|
+
return {}
|
68
|
+
|
69
|
+
# API methods
|
70
|
+
def app_secrets(self, app_name=None):
|
71
|
+
if app_name is None:
|
72
|
+
app_name = self.hcp__app_name()
|
73
|
+
path_secrets = f'apps/{app_name}/secrets'
|
74
|
+
app_secrets = self.requests_get(path_secrets, 'secrets')
|
75
|
+
return app_secrets
|
76
|
+
|
77
|
+
def app_secrets_open(self, app_name=None):
|
78
|
+
if app_name is None:
|
79
|
+
app_name = self.hcp__app_name()
|
80
|
+
path_secrets = f'apps/{app_name}/open'
|
81
|
+
app_secrets = self.requests_get(path_secrets, 'secrets')
|
82
|
+
return app_secrets
|
83
|
+
|
84
|
+
def app_secrets_names(self, app_name=None):
|
85
|
+
app_secrets = self.app_secrets(app_name)
|
86
|
+
return list_set(list_index_by(app_secrets, 'name'))
|
87
|
+
|
88
|
+
def app_secrets_values(self, app_name=None):
|
89
|
+
secrets_values = {}
|
90
|
+
app_secrets = self.app_secrets_open(app_name)
|
91
|
+
for app_secret in app_secrets:
|
92
|
+
secret_name = app_secret.get('name' )
|
93
|
+
secret_value = app_secret.get('version', {}).get('value')
|
94
|
+
secrets_values[secret_name] = secret_value
|
95
|
+
return secrets_values
|
96
|
+
|
97
|
+
|
98
|
+
|
99
|
+
def apps(self):
|
100
|
+
return self.requests_get('apps')
|
101
|
+
|
@@ -11,8 +11,8 @@ from osbot_utils.helpers.trace.Trace_Call__View_Model import Trace_Call__V
|
|
11
11
|
|
12
12
|
|
13
13
|
def trace_calls(title = None , print_traces = True , show_locals = False, source_code = False ,
|
14
|
-
ignore = None , include = None , show_path = False, duration_bigger_than = 0 ,
|
15
|
-
max_string
|
14
|
+
ignore = None , include = None , show_path = False, duration_bigger_than = 0 ,
|
15
|
+
trace_depth = 0 , max_string = None , show_types = False, show_duration = False , # show_caller = False , # todo: add back when show_caller is working again
|
16
16
|
show_class = False, contains = None , show_internals = False, enabled = True ,
|
17
17
|
extra_data = False, show_lines = False, print_lines = False, show_types_padding = None , duration_padding=None):
|
18
18
|
def decorator(func):
|
osbot_utils/utils/Env.py
CHANGED
@@ -6,14 +6,28 @@ from osbot_utils.utils.Files import all_parent_folders, file_exists
|
|
6
6
|
from osbot_utils.utils.Misc import list_set
|
7
7
|
from osbot_utils.utils.Str import strip_quotes
|
8
8
|
|
9
|
-
|
9
|
+
|
10
|
+
def env__home():
|
11
|
+
return get_env('HOME', '')
|
12
|
+
|
13
|
+
def env__home__is__root():
|
10
14
|
return os.getenv('HOME') == '/root'
|
11
15
|
|
12
|
-
def
|
16
|
+
def env__old_pwd():
|
17
|
+
return get_env('OLDPWD', '')
|
18
|
+
|
19
|
+
def env__pwd():
|
20
|
+
return get_env('PWD', '')
|
21
|
+
|
22
|
+
def env__old_pwd__remove(value):
|
23
|
+
return value.replace(env__old_pwd(), '')
|
24
|
+
|
25
|
+
def env__terminal__is__xterm():
|
13
26
|
return os.getenv('TERM') == 'xterm'
|
14
27
|
|
15
|
-
def
|
16
|
-
return not
|
28
|
+
def env__terminal__is_not__xterm():
|
29
|
+
return not env__terminal__is__xterm()
|
30
|
+
|
17
31
|
|
18
32
|
def platform_darwin():
|
19
33
|
return platform == 'darwin'
|
@@ -21,6 +35,10 @@ def platform_darwin():
|
|
21
35
|
def env_value(var_name):
|
22
36
|
return env_vars().get(var_name, None)
|
23
37
|
|
38
|
+
def env_var_set(var_name):
|
39
|
+
value = os.getenv(var_name)
|
40
|
+
return value is not None and value != ''
|
41
|
+
|
24
42
|
def env_vars_list():
|
25
43
|
return list_set(env_vars())
|
26
44
|
|
@@ -109,6 +127,6 @@ def unload_dotenv(dotenv_path=None):
|
|
109
127
|
env_unload_from_file(env_path) # Process it
|
110
128
|
break # Stop after unloading the first .env file
|
111
129
|
|
112
|
-
|
113
|
-
env_load
|
114
|
-
get_env
|
130
|
+
is_env_var_set = env_var_set
|
131
|
+
env_load = load_dotenv
|
132
|
+
get_env = os.getenv
|
osbot_utils/utils/Files.py
CHANGED
@@ -340,6 +340,8 @@ class Files:
|
|
340
340
|
def parent_folder_combine(file, path):
|
341
341
|
return Files.path_combine(os.path.dirname(file),path)
|
342
342
|
|
343
|
+
|
344
|
+
|
343
345
|
@staticmethod
|
344
346
|
def pickle_save_to_file(object_to_save, path=None):
|
345
347
|
path = path or temp_file(extension=".pickle")
|
@@ -491,12 +493,26 @@ def folders_names_in_folder(target):
|
|
491
493
|
folders = folders_in_folder(target)
|
492
494
|
return folders_names(folders)
|
493
495
|
|
496
|
+
def path_combine_safe(base_path, file_location, raise_exception=False): # handle possible directory transversal attacks
|
497
|
+
full_path = os.path.join(base_path, file_location) # Combine and normalize paths
|
498
|
+
normalised_base_path = os.path.normpath(base_path)
|
499
|
+
normalised_full_path = os.path.normpath(full_path)
|
500
|
+
|
501
|
+
if os.path.commonpath([normalised_base_path, normalised_full_path]) == normalised_base_path: # Check for directory traversal
|
502
|
+
return normalised_full_path
|
503
|
+
if raise_exception:
|
504
|
+
raise ValueError("Invalid file location: directory traversal attempt detected.")
|
505
|
+
return None
|
506
|
+
|
494
507
|
def parent_folder_create(target):
|
495
508
|
return folder_create(parent_folder(target))
|
496
509
|
|
497
510
|
def parent_folder_exists(target):
|
498
511
|
return folder_exists(parent_folder(target))
|
499
512
|
|
513
|
+
def parent_folder_name(target):
|
514
|
+
return folder_name(parent_folder(target))
|
515
|
+
|
500
516
|
def parent_folder_not_exists(target):
|
501
517
|
return parent_folder_exists(target) is False
|
502
518
|
|
osbot_utils/utils/Http.py
CHANGED
@@ -22,6 +22,13 @@ def current_host_online(url_to_use=URL_CHECK_HOST_ONLINE):
|
|
22
22
|
def dns_ip_address(host):
|
23
23
|
return socket.gethostbyname(host)
|
24
24
|
|
25
|
+
def is_url_online(target):
|
26
|
+
try:
|
27
|
+
http_request(target, method='HEAD')
|
28
|
+
return True
|
29
|
+
except:
|
30
|
+
return False
|
31
|
+
|
25
32
|
def is_port_open(host, port, timeout=0.5):
|
26
33
|
return port_is_open(host=host, port=port, timeout=timeout)
|
27
34
|
|
osbot_utils/version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
v1.
|
1
|
+
v1.31.0
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: osbot_utils
|
3
|
-
Version: 1.
|
3
|
+
Version: 1.31.0
|
4
4
|
Summary: OWASP Security Bot - Utils
|
5
5
|
Home-page: https://github.com/owasp-sbot/OSBot-Utils
|
6
6
|
License: MIT
|
@@ -22,7 +22,7 @@ Description-Content-Type: text/markdown
|
|
22
22
|
|
23
23
|
Powerful Python util methods and classes that simplify common apis and tasks.
|
24
24
|
|
25
|
-

|
26
26
|
[](https://codecov.io/gh/owasp-sbot/OSBot-Utils)
|
27
27
|
|
28
28
|
|
@@ -57,6 +57,7 @@ osbot_utils/graphs/mgraph/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJW
|
|
57
57
|
osbot_utils/helpers/CFormat.py,sha256=1_XvqGwgU6qC97MbzcKF0o7s9mCXpU5Kq9Yf-1ixUwY,6808
|
58
58
|
osbot_utils/helpers/CPrint.py,sha256=ztKPNmT8BGxeyPXSQKRs63PqqbgxKDz_BiZmzFMup9g,1413
|
59
59
|
osbot_utils/helpers/Dict_To_Attr.py,sha256=NdhXl5mJH7-NaBk213amzc5Nfy3tJgW-N_uYIRE4hoc,208
|
60
|
+
osbot_utils/helpers/Hashicorp_Secrets.py,sha256=zjXa_dQvfR9L1uoulWJ8nYYaDvznV6o_QPPS4zmb6mo,4235
|
60
61
|
osbot_utils/helpers/Local_Cache.py,sha256=0JZZX3fFImcwtbBvxAQl-EbBegSNJRhRMYF6ovTH6zY,3141
|
61
62
|
osbot_utils/helpers/Local_Caches.py,sha256=HvuP5CURyVm_fVvJX-S4dml2bhRauzgA3be237yTaeY,1814
|
62
63
|
osbot_utils/helpers/Print_Table.py,sha256=LEXbyqGg_6WSraI4cob4bNNSu18ddqvALp1zGK7bPhs,19126
|
@@ -227,7 +228,7 @@ osbot_utils/helpers/ssh/SSH__Linux__Amazon.py,sha256=ZJFb7LFTvclAuhH5OoOtJ361NoX
|
|
227
228
|
osbot_utils/helpers/ssh/SSH__Python.py,sha256=O2DAwkbXzwkis8lffoqIL2NPSfYcN44Mr8i9Ey2iMKk,2066
|
228
229
|
osbot_utils/helpers/ssh/TestCase__SSH.py,sha256=MD8sq0_kI4f6pEmEO0cLq2mQOhIqbP45ZxFJNG44Jg4,1773
|
229
230
|
osbot_utils/helpers/ssh/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
230
|
-
osbot_utils/helpers/trace/Trace_Call.py,sha256=
|
231
|
+
osbot_utils/helpers/trace/Trace_Call.py,sha256=nKds4xTyrF-6A3XMCxVOR37KDzB3nfCQLykrrEsqp2k,6424
|
231
232
|
osbot_utils/helpers/trace/Trace_Call__Config.py,sha256=6nJplzrY1adz3WcwTIuwEhBCk1P0U0NbyWRzDyIox_Q,3250
|
232
233
|
osbot_utils/helpers/trace/Trace_Call__Graph.py,sha256=HCrXRKQI42DIQxxyFLcaosWiOcUyoITbeV17ICdXcXM,1156
|
233
234
|
osbot_utils/helpers/trace/Trace_Call__Handler.py,sha256=3gEX-DykEFixfBmD0jBdMhnTujxhNbXkjOhqxNTc9ac,11563
|
@@ -264,11 +265,11 @@ osbot_utils/utils/Assert.py,sha256=u9XLgYn91QvNWZGyPi29SjPJSXRHlm9andIn3NJEVog,1
|
|
264
265
|
osbot_utils/utils/Call_Stack.py,sha256=MAq_0vMxnbeLfCe9qQz7GwJYaOuXpt3qtQwN6wiXsU0,6595
|
265
266
|
osbot_utils/utils/Csv.py,sha256=oHLVpjRJqrLMz9lubMCNEoThXWju5rNTprcwHc1zq2c,1012
|
266
267
|
osbot_utils/utils/Dev.py,sha256=HibpQutYy_iG8gGV8g1GztxNN4l29E4Bi7UZaVL6-L8,1203
|
267
|
-
osbot_utils/utils/Env.py,sha256=
|
268
|
+
osbot_utils/utils/Env.py,sha256=243O6ENzaRjHXp8DIHUuv4Wfk-zHTE18KZr0cU8uWyo,5474
|
268
269
|
osbot_utils/utils/Exceptions.py,sha256=KyOUHkXQ_6jDTq04Xm261dbEZuRidtsM4dgzNwSG8-8,389
|
269
|
-
osbot_utils/utils/Files.py,sha256=
|
270
|
+
osbot_utils/utils/Files.py,sha256=RHbxq8AVdGT9S-OrxEWhNEOhbIrHDRU1UbGB1O05Ga8,21615
|
270
271
|
osbot_utils/utils/Functions.py,sha256=0E6alPJ0fJpBiJgFOWooCOi265wSRyxxXAJ5CELBnso,3498
|
271
|
-
osbot_utils/utils/Http.py,sha256=
|
272
|
+
osbot_utils/utils/Http.py,sha256=WlXEfgT_NaiDVD7vCDUxy_nOm5Qf8x_L0A3zd8B5tX8,4706
|
272
273
|
osbot_utils/utils/Int.py,sha256=PmlUdU4lSwf4gJdmTVdqclulkEp7KPCVUDO6AcISMF4,116
|
273
274
|
osbot_utils/utils/Json.py,sha256=UNaBazuH1R40fsHjpjuK8kmAANmUHoK9Q0PUeYmgPeY,6254
|
274
275
|
osbot_utils/utils/Json_Cache.py,sha256=mLPkkDZN-3ZVJiDvV1KBJXILtKkTZ4OepzOsDoBPhWg,2006
|
@@ -285,8 +286,8 @@ osbot_utils/utils/Toml.py,sha256=dqiegndCJF7V1YT1Tc-b0-Bl6QWyL5q30urmQwMXfMQ,140
|
|
285
286
|
osbot_utils/utils/Version.py,sha256=Ww6ChwTxqp1QAcxOnztkTicShlcx6fbNsWX5xausHrg,422
|
286
287
|
osbot_utils/utils/Zip.py,sha256=t9txUxJzLBEHot6WJwF0iTTUQ1Gf_V2pVwsWzAqw_NU,12163
|
287
288
|
osbot_utils/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
288
|
-
osbot_utils/version,sha256=
|
289
|
-
osbot_utils-1.
|
290
|
-
osbot_utils-1.
|
291
|
-
osbot_utils-1.
|
292
|
-
osbot_utils-1.
|
289
|
+
osbot_utils/version,sha256=xqw0vpyVEQS2xRHlm1kwNututCAIDLAR7pKKQAdsSZo,8
|
290
|
+
osbot_utils-1.31.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
291
|
+
osbot_utils-1.31.0.dist-info/METADATA,sha256=QLHGRLf7-AaRW446YXqvjj86DdwwGuZgC-TeaEgwPTI,1266
|
292
|
+
osbot_utils-1.31.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
293
|
+
osbot_utils-1.31.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|