praetorian-cli 2.2.11__tar.gz → 2.2.13__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.11/praetorian_cli.egg-info → praetorian_cli-2.2.13}/PKG-INFO +1 -1
  2. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/handlers/add.py +46 -4
  3. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/entities/credentials.py +26 -0
  4. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/entities/jobs.py +8 -5
  5. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/entities/risks.py +13 -6
  6. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/entities/webpage.py +1 -1
  7. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/model/globals.py +1 -0
  8. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/model/query.py +6 -0
  9. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/test/test_z_cli.py +1 -1
  10. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13/praetorian_cli.egg-info}/PKG-INFO +1 -1
  11. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/setup.cfg +1 -1
  12. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/LICENSE +0 -0
  13. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/MANIFEST.in +0 -0
  14. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/README.md +0 -0
  15. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/__init__.py +0 -0
  16. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/handlers/__init__.py +0 -0
  17. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/handlers/aegis.py +0 -0
  18. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/handlers/agent.py +0 -0
  19. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/handlers/chariot.py +0 -0
  20. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/handlers/cli_decorators.py +0 -0
  21. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/handlers/configure.py +0 -0
  22. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/handlers/delete.py +0 -0
  23. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/handlers/enrich.py +0 -0
  24. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/handlers/get.py +0 -0
  25. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/handlers/imports.py +0 -0
  26. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/handlers/link.py +0 -0
  27. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/handlers/list.py +0 -0
  28. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/handlers/script.py +0 -0
  29. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/handlers/search.py +0 -0
  30. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/handlers/ssh_utils.py +0 -0
  31. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/handlers/test.py +0 -0
  32. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/handlers/unlink.py +0 -0
  33. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/handlers/update.py +0 -0
  34. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/handlers/utils.py +0 -0
  35. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/main.py +0 -0
  36. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/scripts/__init__.py +0 -0
  37. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/scripts/commands/__init__.py +0 -0
  38. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/scripts/commands/nmap-example.py +0 -0
  39. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/scripts/utils.py +0 -0
  40. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/__init__.py +0 -0
  41. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/chariot.py +0 -0
  42. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/entities/__init__.py +0 -0
  43. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/entities/accounts.py +0 -0
  44. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/entities/aegis.py +0 -0
  45. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/entities/agents.py +0 -0
  46. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/entities/assets.py +0 -0
  47. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/entities/attributes.py +0 -0
  48. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/entities/capabilities.py +0 -0
  49. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/entities/configurations.py +0 -0
  50. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/entities/definitions.py +0 -0
  51. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/entities/files.py +0 -0
  52. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/entities/integrations.py +0 -0
  53. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/entities/keys.py +0 -0
  54. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/entities/preseeds.py +0 -0
  55. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/entities/scanners.py +0 -0
  56. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/entities/schema.py +0 -0
  57. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/entities/search.py +0 -0
  58. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/entities/seeds.py +0 -0
  59. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/entities/settings.py +0 -0
  60. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/entities/statistics.py +0 -0
  61. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/entities/webhook.py +0 -0
  62. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/keychain.py +0 -0
  63. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/mcp_server.py +0 -0
  64. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/model/__init__.py +0 -0
  65. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/model/aegis.py +0 -0
  66. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/model/utils.py +0 -0
  67. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/test/__init__.py +0 -0
  68. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/test/pytest.ini +0 -0
  69. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/test/test_account.py +0 -0
  70. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/test/test_agent.py +0 -0
  71. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/test/test_asset.py +0 -0
  72. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/test/test_attribute.py +0 -0
  73. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/test/test_capabilities.py +0 -0
  74. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/test/test_configuration.py +0 -0
  75. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/test/test_conversation.py +0 -0
  76. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/test/test_definition.py +0 -0
  77. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/test/test_extend.py +0 -0
  78. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/test/test_file.py +0 -0
  79. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/test/test_job.py +0 -0
  80. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/test/test_key.py +0 -0
  81. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/test/test_mcp.py +0 -0
  82. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/test/test_preseed.py +0 -0
  83. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/test/test_risk.py +0 -0
  84. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/test/test_search.py +0 -0
  85. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/test/test_seed.py +0 -0
  86. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/test/test_setting.py +0 -0
  87. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/test/test_webhook.py +0 -0
  88. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/test/test_webpage.py +0 -0
  89. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/test/ui_mocks.py +0 -0
  90. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/sdk/test/utils.py +0 -0
  91. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/ui/__init__.py +0 -0
  92. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/ui/aegis/__init__.py +0 -0
  93. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/ui/aegis/commands/__init__.py +0 -0
  94. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/ui/aegis/commands/help.py +0 -0
  95. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/ui/aegis/commands/info.py +0 -0
  96. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/ui/aegis/commands/job.py +0 -0
  97. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/ui/aegis/commands/list.py +0 -0
  98. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/ui/aegis/commands/set.py +0 -0
  99. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/ui/aegis/commands/ssh.py +0 -0
  100. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/ui/aegis/constants.py +0 -0
  101. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/ui/aegis/menu.py +0 -0
  102. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/ui/aegis/utils.py +0 -0
  103. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/ui/conversation/__init__.py +0 -0
  104. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli/ui/conversation/textual_chat.py +0 -0
  105. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli.egg-info/SOURCES.txt +0 -0
  106. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli.egg-info/dependency_links.txt +0 -0
  107. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli.egg-info/entry_points.txt +0 -0
  108. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli.egg-info/requires.txt +0 -0
  109. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/praetorian_cli.egg-info/top_level.txt +0 -0
  110. {praetorian_cli-2.2.11 → praetorian_cli-2.2.13}/pyproject.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: praetorian-cli
3
- Version: 2.2.11
3
+ Version: 2.2.13
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,4 +1,5 @@
1
1
  import datetime
2
+ import json
2
3
  import os.path
3
4
 
4
5
  import click
@@ -163,7 +164,8 @@ def risk(sdk, name, asset, status, comment, capability):
163
164
  @click.option('-c', '--capability', 'capabilities', multiple=True,
164
165
  help='Capabilities to run (can be specified multiple times)')
165
166
  @click.option('-g', '--config', help='JSON configuration string')
166
- def job(sdk, key, capabilities, config):
167
+ @click.option('-s', '--credential', 'credentials', help='Credential ID to use with the job', multiple=True)
168
+ def job(sdk, key, capabilities, config, credentials):
167
169
  """ Schedule scan jobs for an asset or an attribute
168
170
 
169
171
  This command schedules the relevant discovery and vulnerability scans for
@@ -176,8 +178,9 @@ def job(sdk, key, capabilities, config):
176
178
  - praetorian chariot add job --key "#asset#example.com#1.2.3.4" -c subdomain -c portscan
177
179
  - praetorian chariot add job --key "#attribute#ssh#22#asset#api.www.example.com#1.2.3.4"
178
180
  - praetorian chariot add job --key "#asset#example.com#1.2.3.4" --config '{"run-type":"login"}'
181
+ - praetorian chariot add job --key "#asset#example.com#1.2.3.4" --config '{"run-type":"login"} --credential "E4644F37-6985-40B4-8D07-5311516D98F1"'
179
182
  """
180
- sdk.jobs.add(key, capabilities, config)
183
+ sdk.jobs.add(key, capabilities, config, credentials)
181
184
 
182
185
 
183
186
  @add.command()
@@ -333,13 +336,52 @@ def key(sdk, name, expires):
333
336
  @click.option('-p', '--parent', required=False, help='Optional key of the parent WebApplication')
334
337
  def webpage(sdk, url, parent):
335
338
  """ Add a Webpage
336
-
339
+
337
340
  Add a web page to the Chariot database. Webpages can optionally be associated
338
341
  with a parent WebApplication or exist independently.
339
-
342
+
340
343
  \b
341
344
  Example usages:
342
345
  - praetorian chariot add webpage --url https://app.example.com/login
343
346
  - praetorian chariot add webpage --url https://app.example.com/admin --parent "#webapplication#https://app.example.com"
344
347
  """
345
348
  sdk.webpage.add(url, parent)
349
+
350
+
351
+ @add.command()
352
+ @cli_handler
353
+ @click.option('-r', '--resource-key', required=True, help='The resource key for the credential (e.g., account key)')
354
+ @click.option('-c', '--category', required=True,
355
+ type=click.Choice(['integration', 'cloud', 'env-integration']),
356
+ help='The category of the credential')
357
+ @click.option('-t', '--type', 'cred_type', required=True,
358
+ help='The type of credential (aws, gcp, azure, static, ssh_key, json, active-directory, default)')
359
+ @click.option('-l', '--label', required=True, help='A human-readable label for the credential')
360
+ @click.option('-p', '--param', 'parameters', multiple=True,
361
+ help='Parameter in format key=value (can be specified multiple times)')
362
+ def credential(sdk, resource_key, category, cred_type, label, parameters):
363
+ """ Add a credential
364
+
365
+ This command adds a credential to the credential broker. Credentials can be used
366
+ for authentication with various cloud providers, integrations, and environment services.
367
+
368
+ \b
369
+ Example usages:
370
+ - praetorian chariot add credential --resource-key "C.0c6cf7104f516b08-OGMPG" --category env-integration --type active-directory --label "Robb Stark" --param username=robb.stark --param password=sexywolfy --param domain=north.sevenkingdoms.local
371
+ - praetorian chariot add credential -r "C.example-key" -c cloud -t aws --label "AWS Production" -p region=us-east-1 -p role_arn=arn:aws:iam::123456789012:role/MyRole
372
+ - praetorian chariot add credential -r "C.example-key" -c integration -t static --label "API Token" -p token=abc123xyz
373
+ """
374
+ # Parse parameters from key=value format
375
+ params = {}
376
+ for param in parameters:
377
+ if '=' not in param:
378
+ error(f"Parameter '{param}' is not in the format key=value")
379
+ return
380
+ key, value = param.split('=', 1)
381
+ params[key] = value
382
+
383
+ try:
384
+ result = sdk.credentials.add(resource_key, category, cred_type, label, params)
385
+ click.echo(json.dumps(result, indent=2))
386
+ except Exception as e:
387
+ error(f'Unable to add credential. Error: {e}')
@@ -9,6 +9,32 @@ class Credentials:
9
9
  def __init__(self, api):
10
10
  self.api = api
11
11
 
12
+ def add(self, resource_key, category, type, label, parameters):
13
+ """
14
+ Add a new credential to the credential broker.
15
+
16
+ :param resource_key: The resource key for the credential (e.g., account key)
17
+ :type resource_key: str
18
+ :param category: The category of the credential ('integration', 'cloud', 'env-integration')
19
+ :type category: str
20
+ :param type: The type of credential ('aws', 'gcp', 'azure', 'static', 'ssh_key', 'json', 'active-directory', 'default')
21
+ :type type: str
22
+ :param label: A human-readable label for the credential
23
+ :type label: str
24
+ :param parameters: Additional parameters for the credential (e.g., username, password, domain)
25
+ :type parameters: dict
26
+ :return: The response from the broker API
27
+ :rtype: dict
28
+ """
29
+ request = {
30
+ 'Operation': 'add',
31
+ 'ResourceKey': resource_key,
32
+ 'Category': category,
33
+ 'Type': type,
34
+ 'Parameters': parameters | {'label': label}
35
+ }
36
+ return self.api.post('broker', request)
37
+
12
38
  def list(self, offset=None, pages=100000):
13
39
  """
14
40
  List credentials available to the current principal.
@@ -8,7 +8,7 @@ class Jobs:
8
8
  def __init__(self, api):
9
9
  self.api = api
10
10
 
11
- def add(self, target_key, capabilities=[], config=None):
11
+ def add(self, target_key, capabilities=[], config=None, credentials=[]):
12
12
  """
13
13
  Add a job to execute capabilities against an asset or attribute.
14
14
 
@@ -62,19 +62,22 @@ class Jobs:
62
62
  - crawler: Web application crawler
63
63
  - whois: Domain registration information lookup
64
64
  """
65
- params = dict(key=target_key)
65
+ body = dict(key=target_key)
66
66
  if capabilities:
67
- params = params | dict(capabilities=capabilities)
67
+ body = body | dict(capabilities=capabilities)
68
68
 
69
69
  if config:
70
70
  try:
71
- params = params | dict(config=json.loads(config))
71
+ body = body | dict(config=json.loads(config))
72
72
  except json.JSONDecodeError as e:
73
73
  raise Exception(f"Invalid JSON in configuration string: {e}")
74
74
  except Exception as e:
75
75
  raise Exception(f"Error processing configuration string: {e}")
76
76
 
77
- return self.api.force_add('job', params)
77
+ if credentials:
78
+ body = body | dict(credential_ids=credentials)
79
+
80
+ return self.api.force_add('job', body)
78
81
 
79
82
  def get(self, key):
80
83
  """
@@ -1,5 +1,5 @@
1
1
  from praetorian_cli.sdk.model.globals import Kind
2
- from praetorian_cli.sdk.model.query import Relationship, Node, Query, risk_of_key, ASSET_NODE, ATTRIBUTE_NODE, Filter
2
+ from praetorian_cli.sdk.model.query import Relationship, Node, Query, risk_of_key, ASSET_NODE, PORT_NODE, Filter, WEBPAGE_NODE
3
3
 
4
4
 
5
5
  class Risks:
@@ -132,7 +132,7 @@ class Risks:
132
132
  Get all assets affected by a risk.
133
133
 
134
134
  This method finds assets that are directly linked to the risk via HAS_VULNERABILITY
135
- relationships, as well as assets indirectly linked via attributes that have the risk.
135
+ relationships, as well as assets indirectly linked via ports that have the risk.
136
136
 
137
137
  :param key: The key of the risk to get affected assets for
138
138
  :type key: str
@@ -144,11 +144,18 @@ class Risks:
144
144
  query = Query(Node(ASSET_NODE, relationships=[to_this]))
145
145
  assets, _ = self.api.search.by_query(query)
146
146
 
147
- # assets indirectly linked to the risk via an attribute
148
- attributes = Node(ATTRIBUTE_NODE, relationships=[to_this])
149
- to_attributes = Relationship(Relationship.Label.HAS_ATTRIBUTE, target=attributes)
150
- query = Query(Node(ASSET_NODE, relationships=[to_attributes]))
147
+ # assets indirectly linked to the risk via a port
148
+ ports = Node(PORT_NODE, relationships=[to_this])
149
+ to_ports = Relationship(Relationship.Label.HAS_PORT, target=ports)
150
+ query = Query(Node(ASSET_NODE, relationships=[to_ports]))
151
151
  indirect_assets, _ = self.api.search.by_query(query)
152
152
 
153
+ # webpages linked to the risk
154
+ webpages = Node(WEBPAGE_NODE, relationships=[to_this])
155
+ to_webpages = Relationship(Relationship.Label.HAS_WEBPAGE, target=webpages)
156
+ query = Query(Node(ASSET_NODE, relationships=[to_webpages]))
157
+ web_assets, _ = self.api.search.by_query(query)
158
+
153
159
  assets.extend(indirect_assets)
160
+ assets.extend(web_assets)
154
161
  return assets
@@ -126,7 +126,7 @@ class Webpage:
126
126
  urlFilter = Filter(field=Filter.Field.KEY, operator=Filter.Operator.CONTAINS, value=filter)
127
127
  filters.append(urlFilter)
128
128
  node = Node(labels=[Node.Label.WEBPAGE], filters=filters, relationships=relationships)
129
- query = Query(node=node, page=offset, limit=pages)
129
+ query = Query(node=node, page=offset)
130
130
  return self.api.search.by_query(query, pages)
131
131
 
132
132
  def delete(self, key):
@@ -110,6 +110,7 @@ class Kind(Enum):
110
110
  OTHERS = 'others'
111
111
  WEBAPPLICATION = 'webapplication'
112
112
  WEBPAGE = 'webpage'
113
+ PORT = 'port'
113
114
 
114
115
  EXACT_FLAG = {'exact': 'true'}
115
116
  DESCENDING_FLAG = {'desc': 'true'}
@@ -68,6 +68,7 @@ class Relationship:
68
68
  DISCOVERED = 'DISCOVERED'
69
69
  HAS_ATTRIBUTE = 'HAS_ATTRIBUTE'
70
70
  HAS_WEBPAGE = 'HAS_WEBPAGE'
71
+ HAS_PORT = 'HAS_PORT'
71
72
 
72
73
  def __init__(self, label: Label, source: 'Node' = None, target: 'Node' = None, optional: bool = False, length: int = 0):
73
74
  self.label = label
@@ -97,6 +98,7 @@ class Node:
97
98
  ADDOMAIN = 'ADDomain'
98
99
  ATTRIBUTE = 'Attribute'
99
100
  RISK = 'Risk'
101
+ PORT = 'Port'
100
102
  PRESEED = 'Preseed'
101
103
  SEED = 'Seed'
102
104
  TTL = 'TTL'
@@ -152,11 +154,15 @@ class Query:
152
154
  ASSET_NODE = [Node.Label.ASSET]
153
155
  RISK_NODE = [Node.Label.RISK]
154
156
  ATTRIBUTE_NODE = [Node.Label.ATTRIBUTE]
157
+ PORT_NODE = [Node.Label.PORT]
158
+ WEBAPPLICATION_NODE = [Node.Label.WEBAPPLICATION]
159
+ WEBPAGE_NODE = [Node.Label.WEBPAGE]
155
160
 
156
161
  KIND_TO_LABEL = {
157
162
  Kind.ASSET.value: Node.Label.ASSET,
158
163
  Kind.RISK.value: Node.Label.RISK,
159
164
  Kind.ATTRIBUTE.value: Node.Label.ATTRIBUTE,
165
+ Kind.PORT.value: Node.Label.PORT,
160
166
  Kind.SEED.value: Node.Label.SEED,
161
167
  Kind.PRESEED.value: Node.Label.PRESEED,
162
168
  Kind.REPOSITORY.value: Node.Label.REPOSITORY,
@@ -102,7 +102,7 @@ class TestZCli:
102
102
  self.verify(f'update risk "{o.risk_key}" -s {Risk.OPEN_LOW.value}')
103
103
  self.verify(f'get risk "{o.risk_key}"', [o.risk_key, f'"status": "{Risk.OPEN_LOW.value}"'])
104
104
 
105
- self.verify(f'delete risk "{o.risk_key}"')
105
+ self.verify(f'delete risk "{o.risk_key}" -s {Risk.DELETED_OTHER_LOW.value}')
106
106
  self.verify(f'get risk "{o.risk_key}"', [
107
107
  o.risk_key, f'"status": "{Risk.DELETED_OTHER_LOW.value}"',
108
108
  f'"to": "{Risk.DELETED_OTHER_LOW.value}"'])
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: praetorian-cli
3
- Version: 2.2.11
3
+ Version: 2.2.13
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.11
3
+ version = 2.2.13
4
4
  author = Praetorian
5
5
  author_email = support@praetorian.com
6
6
  description = For interacting with the Chariot API
File without changes