praetorian-cli 2.2.13__tar.gz → 2.2.14__tar.gz

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.
Files changed (110) hide show
  1. {praetorian_cli-2.2.13/praetorian_cli.egg-info → praetorian_cli-2.2.14}/PKG-INFO +1 -1
  2. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/chariot.py +25 -14
  3. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/test/test_file.py +16 -0
  4. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14/praetorian_cli.egg-info}/PKG-INFO +1 -1
  5. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/setup.cfg +1 -1
  6. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/LICENSE +0 -0
  7. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/MANIFEST.in +0 -0
  8. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/README.md +0 -0
  9. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/__init__.py +0 -0
  10. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/handlers/__init__.py +0 -0
  11. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/handlers/add.py +0 -0
  12. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/handlers/aegis.py +0 -0
  13. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/handlers/agent.py +0 -0
  14. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/handlers/chariot.py +0 -0
  15. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/handlers/cli_decorators.py +0 -0
  16. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/handlers/configure.py +0 -0
  17. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/handlers/delete.py +0 -0
  18. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/handlers/enrich.py +0 -0
  19. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/handlers/get.py +0 -0
  20. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/handlers/imports.py +0 -0
  21. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/handlers/link.py +0 -0
  22. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/handlers/list.py +0 -0
  23. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/handlers/script.py +0 -0
  24. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/handlers/search.py +0 -0
  25. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/handlers/ssh_utils.py +0 -0
  26. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/handlers/test.py +0 -0
  27. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/handlers/unlink.py +0 -0
  28. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/handlers/update.py +0 -0
  29. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/handlers/utils.py +0 -0
  30. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/main.py +0 -0
  31. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/scripts/__init__.py +0 -0
  32. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/scripts/commands/__init__.py +0 -0
  33. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/scripts/commands/nmap-example.py +0 -0
  34. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/scripts/utils.py +0 -0
  35. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/__init__.py +0 -0
  36. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/entities/__init__.py +0 -0
  37. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/entities/accounts.py +0 -0
  38. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/entities/aegis.py +0 -0
  39. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/entities/agents.py +0 -0
  40. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/entities/assets.py +0 -0
  41. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/entities/attributes.py +0 -0
  42. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/entities/capabilities.py +0 -0
  43. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/entities/configurations.py +0 -0
  44. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/entities/credentials.py +0 -0
  45. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/entities/definitions.py +0 -0
  46. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/entities/files.py +0 -0
  47. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/entities/integrations.py +0 -0
  48. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/entities/jobs.py +0 -0
  49. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/entities/keys.py +0 -0
  50. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/entities/preseeds.py +0 -0
  51. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/entities/risks.py +0 -0
  52. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/entities/scanners.py +0 -0
  53. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/entities/schema.py +0 -0
  54. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/entities/search.py +0 -0
  55. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/entities/seeds.py +0 -0
  56. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/entities/settings.py +0 -0
  57. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/entities/statistics.py +0 -0
  58. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/entities/webhook.py +0 -0
  59. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/entities/webpage.py +0 -0
  60. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/keychain.py +0 -0
  61. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/mcp_server.py +0 -0
  62. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/model/__init__.py +0 -0
  63. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/model/aegis.py +0 -0
  64. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/model/globals.py +0 -0
  65. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/model/query.py +0 -0
  66. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/model/utils.py +0 -0
  67. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/test/__init__.py +0 -0
  68. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/test/pytest.ini +0 -0
  69. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/test/test_account.py +0 -0
  70. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/test/test_agent.py +0 -0
  71. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/test/test_asset.py +0 -0
  72. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/test/test_attribute.py +0 -0
  73. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/test/test_capabilities.py +0 -0
  74. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/test/test_configuration.py +0 -0
  75. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/test/test_conversation.py +0 -0
  76. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/test/test_definition.py +0 -0
  77. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/test/test_extend.py +0 -0
  78. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/test/test_job.py +0 -0
  79. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/test/test_key.py +0 -0
  80. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/test/test_mcp.py +0 -0
  81. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/test/test_preseed.py +0 -0
  82. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/test/test_risk.py +0 -0
  83. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/test/test_search.py +0 -0
  84. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/test/test_seed.py +0 -0
  85. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/test/test_setting.py +0 -0
  86. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/test/test_webhook.py +0 -0
  87. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/test/test_webpage.py +0 -0
  88. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/test/test_z_cli.py +0 -0
  89. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/test/ui_mocks.py +0 -0
  90. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/sdk/test/utils.py +0 -0
  91. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/ui/__init__.py +0 -0
  92. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/ui/aegis/__init__.py +0 -0
  93. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/ui/aegis/commands/__init__.py +0 -0
  94. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/ui/aegis/commands/help.py +0 -0
  95. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/ui/aegis/commands/info.py +0 -0
  96. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/ui/aegis/commands/job.py +0 -0
  97. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/ui/aegis/commands/list.py +0 -0
  98. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/ui/aegis/commands/set.py +0 -0
  99. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/ui/aegis/commands/ssh.py +0 -0
  100. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/ui/aegis/constants.py +0 -0
  101. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/ui/aegis/menu.py +0 -0
  102. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/ui/aegis/utils.py +0 -0
  103. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/ui/conversation/__init__.py +0 -0
  104. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli/ui/conversation/textual_chat.py +0 -0
  105. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli.egg-info/SOURCES.txt +0 -0
  106. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli.egg-info/dependency_links.txt +0 -0
  107. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli.egg-info/entry_points.txt +0 -0
  108. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli.egg-info/requires.txt +0 -0
  109. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/praetorian_cli.egg-info/top_level.txt +0 -0
  110. {praetorian_cli-2.2.13 → praetorian_cli-2.2.14}/pyproject.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: praetorian-cli
3
- Version: 2.2.13
3
+ Version: 2.2.14
4
4
  Summary: For interacting with the Chariot API
5
5
  Home-page: https://github.com/praetorian-inc/praetorian-cli
6
6
  Author: Praetorian
@@ -64,25 +64,19 @@ class Chariot:
64
64
  import urllib3
65
65
  urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
66
66
 
67
- def chariot_request(self, method: str, url: str, **kwargs) -> requests.Response:
67
+ def chariot_request(self, method: str, url: str, headers: dict = {}, **kwargs) -> requests.Response:
68
68
  """
69
- Centralized method to make HTTP requests to the Chariot API with all global headers/parameters set.
69
+ Centralized wrapper around requests.request. Take care of proxy, beta flag, and
70
+ supplies the authentication headers
70
71
  """
71
-
72
72
  self.add_beta_url_param(kwargs)
73
73
 
74
- return self.request(method, url, self.keychain.headers(), **kwargs)
75
-
76
- def request(self, method: str, url: str, headers: dict = None, **kwargs) -> requests.Response:
77
- """
78
- Centralized wrapper around requests.request, ensuring the HTTP proxy is respected.
79
- """
80
-
81
74
  if self.proxy:
82
75
  kwargs['proxies'] = {'http': self.proxy, 'https': self.proxy}
83
76
  kwargs['verify'] = False
84
77
 
85
- return requests.request(method, url, headers=headers, **kwargs)
78
+ return requests.request(method, url, headers=(headers | self.keychain.headers()), **kwargs)
79
+
86
80
 
87
81
  def add_beta_url_param(self, kwargs: dict):
88
82
  if 'params' in kwargs:
@@ -206,8 +200,12 @@ class Chariot:
206
200
  return resp
207
201
 
208
202
  def _upload(self, chariot_filepath: str, content: str) -> dict:
209
- # It is a two-step upload. The PUT request to the /file endpoint is to get a presigned URL for S3.
210
- # There is no data transfer.
203
+ # Encrypted files have _encrypted/ prefix in the path. Encrypted files do not use presigned URLs.
204
+ # Instead, they use the /encrypted-file endpoint that directly gets and puts content.
205
+ if is_encrypted_partition(chariot_filepath):
206
+ return self.chariot_request('PUT', self.url('/encrypted-file'), params=dict(name=chariot_filepath), data=content)
207
+
208
+ # Regular files use presigned URLs
211
209
  presigned_url = self.chariot_request('PUT', self.url('/file'), params=dict(name=chariot_filepath))
212
210
  process_failure(presigned_url)
213
211
  resp = requests.put(presigned_url.json()['url'], data=content)
@@ -216,6 +214,15 @@ class Chariot:
216
214
 
217
215
  def download(self, name: str, global_=False) -> bytes:
218
216
  params = dict(name=name)
217
+ # Encrypted files have _encrypted/ prefix in the path. Encrypted files do not use presigned URLs.
218
+ # Instead, they use the /encrypted-file endpoint that directly gets and puts content.
219
+ if is_encrypted_partition(name):
220
+ accept_binary = {'Accept': 'application/octet-stream'}
221
+ resp = self.chariot_request('GET', self.url('/encrypted-file'), params=params, headers=accept_binary)
222
+ process_failure(resp)
223
+ return resp.content
224
+
225
+ # Regular files, use presigned URLs
219
226
  if global_:
220
227
  params |= GLOBAL_FLAG
221
228
 
@@ -228,7 +235,7 @@ class Chariot:
228
235
  message = f'Download request failed: response missing URL' + (f'\nBody: {resp.text}' if resp.text else '(empty)')
229
236
  raise Exception(message)
230
237
 
231
- resp = self.request('GET', url)
238
+ resp = requests.request('GET', url)
232
239
  process_failure(resp)
233
240
  return resp.content
234
241
 
@@ -355,3 +362,7 @@ def extend(accumulate: dict, new: dict) -> dict:
355
362
  extend(accumulate[key], value)
356
363
 
357
364
  return accumulate
365
+
366
+
367
+ def is_encrypted_partition(chariot_filepath: str) -> bool:
368
+ return chariot_filepath.startswith('_encrypted/')
@@ -12,6 +12,7 @@ class TestFile:
12
12
  self.sdk = setup_chariot()
13
13
  micro = epoch_micro()
14
14
  self.chariot_filepath = f'home/test-file-{micro}.txt'
15
+ self.encrypted_chariot_filepath = f'_encrypted/test-file-{micro}.txt'
15
16
  self.sanitized_filepath = f'home_test-file-{micro}.txt'
16
17
  self.bogus_filepath = f'bogus-filepath-{micro}.txt'
17
18
  self.local_filepath = f'./test-file-{micro}.txt'
@@ -52,6 +53,21 @@ class TestFile:
52
53
  self.sdk.files.get(self.chariot_filepath)
53
54
  assert str(ex_info.value) == f'File {self.chariot_filepath} not found.'
54
55
 
56
+ def test_add_encrypted_file(self):
57
+ self.sdk.files.add(self.local_filepath, self.encrypted_chariot_filepath)
58
+ files, offset = self.sdk.files.list(self.encrypted_chariot_filepath)
59
+ assert files[0]['name'] == self.encrypted_chariot_filepath
60
+
61
+ def test_get_encrypted_file(self):
62
+ content = self.sdk.files.get_utf8(self.encrypted_chariot_filepath)
63
+ assert content == self.content
64
+
65
+ def test_delete_encrypted_file(self):
66
+ self.sdk.files.delete(self.encrypted_chariot_filepath)
67
+ with pytest.raises(Exception) as ex_info:
68
+ self.sdk.files.get(self.encrypted_chariot_filepath)
69
+ assert str(ex_info.value) == f'File {self.encrypted_chariot_filepath} not found.'
70
+
55
71
  def teardown_class(self):
56
72
  os.remove(self.local_filepath)
57
73
  os.remove(self.sanitized_filepath)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: praetorian-cli
3
- Version: 2.2.13
3
+ Version: 2.2.14
4
4
  Summary: For interacting with the Chariot API
5
5
  Home-page: https://github.com/praetorian-inc/praetorian-cli
6
6
  Author: Praetorian
@@ -1,6 +1,6 @@
1
1
  [metadata]
2
2
  name = praetorian-cli
3
- version = 2.2.13
3
+ version = 2.2.14
4
4
  author = Praetorian
5
5
  author_email = support@praetorian.com
6
6
  description = For interacting with the Chariot API
File without changes