secator 0.10.1a4__py3-none-any.whl → 0.10.1a6__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.

Potentially problematic release.


This version of secator might be problematic. Click here for more details.

secator/celery.py CHANGED
@@ -260,11 +260,8 @@ def mark_runner_complete(results, runner):
260
260
 
261
261
  # Run final processing
262
262
  runner.results = results
263
- runner.done = True
264
- runner.progress = 100
265
263
  if not runner.no_process:
266
264
  runner.mark_duplicates()
267
- runner.results = runner.filter_results()
268
265
  runner.log_results()
269
266
  runner.run_hooks('on_end')
270
267
  return runner.results
secator/report.py CHANGED
@@ -38,7 +38,7 @@ class Report:
38
38
  exporters (list): List of exporter classes.
39
39
  """
40
40
  def __init__(self, runner, title=None, exporters=[]):
41
- self.title = title or f'{runner.__class__.__name__.lower()}_{runner.config.name}'
41
+ self.title = title or f'{runner.config.type}_{runner.config.name}'
42
42
  self.runner = runner
43
43
  self.timestamp = get_file_timestamp()
44
44
  self.exporters = exporters
secator/runners/_base.py CHANGED
@@ -15,8 +15,8 @@ from secator.config import CONFIG
15
15
  from secator.output_types import FINDING_TYPES, OutputType, Progress, Info, Warning, Error, Target, State
16
16
  from secator.report import Report
17
17
  from secator.rich import console, console_stdout
18
- from secator.runners._helpers import (get_task_folder_id, process_extractor, run_extractors)
19
- from secator.utils import (debug, import_dynamic, merge_opts, rich_to_ansi, should_update)
18
+ from secator.runners._helpers import (get_task_folder_id, run_extractors)
19
+ from secator.utils import (debug, import_dynamic, rich_to_ansi, should_update)
20
20
 
21
21
  logger = logging.getLogger(__name__)
22
22
 
@@ -281,6 +281,8 @@ class Runner:
281
281
  # If any errors happened during valid ation, exit
282
282
  if self.errors:
283
283
  yield from self.errors
284
+ if self.no_process:
285
+ return
284
286
  self.log_results()
285
287
  self.run_hooks('on_end')
286
288
  return
@@ -303,14 +305,12 @@ class Runner:
303
305
  yield from self.join_threads()
304
306
  yield error
305
307
 
306
- # Mark duplicates and filter results
307
- if not self.no_process:
308
+ finally:
309
+ if self.no_process:
310
+ return
308
311
  self.mark_duplicates()
309
- self.results = self.filter_results()
310
-
311
- # Finalize run
312
- self.log_results()
313
- self.run_hooks('on_end')
312
+ self.log_results()
313
+ self.run_hooks('on_end')
314
314
 
315
315
  def join_threads(self):
316
316
  """Wait for all running threads to complete."""
@@ -507,6 +507,8 @@ class Runner:
507
507
  task_id=self.celery_result.id
508
508
  )
509
509
  if self.no_poll:
510
+ self.enable_hooks = False
511
+ self.no_process = True
510
512
  return
511
513
  results = CeleryData.iter_results(
512
514
  self.celery_result,
@@ -686,8 +688,6 @@ class Runner:
686
688
 
687
689
  def log_results(self):
688
690
  """Log runner results."""
689
- if self.no_poll:
690
- return
691
691
  self.started = True
692
692
  self.done = True
693
693
  self.progress = 100
@@ -715,31 +715,6 @@ class Runner:
715
715
  name = self.celery_ids_map.get(task_id, {}).get('full_name')
716
716
  revoke_task(task_id, name)
717
717
 
718
- def filter_results(self):
719
- """Filter runner results using extractors defined in config."""
720
- extractors = self.config.results
721
- results = []
722
- if extractors:
723
- # Keep results based on extractors
724
- opts = merge_opts(self.config.options, self.run_opts)
725
- for extractor in extractors:
726
- tmp = process_extractor(self.results, extractor, ctx=opts)
727
- results.extend(tmp)
728
-
729
- # Keep the field types in results not specified in the extractors.
730
- extract_fields = [e['type'] for e in extractors]
731
- keep_fields = [
732
- _type for _type in FINDING_TYPES
733
- if _type not in extract_fields
734
- ]
735
- results.extend([
736
- item for item in self.results
737
- if item._type in keep_fields
738
- ])
739
- else:
740
- results = self.results
741
- return results
742
-
743
718
  def _convert_item_schema(self, item):
744
719
  """Convert dict item to a secator output type.
745
720
 
secator/runners/scan.py CHANGED
@@ -33,6 +33,7 @@ class Scan(Runner):
33
33
  sigs = []
34
34
  for name, workflow_opts in self.config.workflows.items():
35
35
  run_opts = self.run_opts.copy()
36
+ run_opts['no_poll'] = True
36
37
  opts = merge_opts(scan_opts, workflow_opts, run_opts)
37
38
  config = TemplateLoader(name=f'workflows/{name}')
38
39
  workflow = Workflow(
secator/runners/task.py CHANGED
@@ -6,8 +6,8 @@ from celery import chain
6
6
 
7
7
 
8
8
  class Task(Runner):
9
+
9
10
  default_exporters = CONFIG.tasks.exporters
10
- enable_hooks = False
11
11
 
12
12
  @classmethod
13
13
  def delay(cls, *args, **kwargs):
@@ -37,6 +37,7 @@ class Task(Runner):
37
37
  # Set task output types
38
38
  self.output_types = task_cls.output_types
39
39
  self.enable_duplicate_check = False
40
+ self.enable_hooks = False
40
41
 
41
42
  # Get hooks
42
43
  hooks = self._hooks.get(Task, {})
secator/scans/__init__.py CHANGED
@@ -1,28 +1,29 @@
1
1
  from secator.cli import ALL_SCANS
2
+ from secator.runners import Scan
2
3
 
3
4
 
4
- def generate_class(config):
5
- from secator.runners import Scan
5
+ class DynamicScan(Scan):
6
+ def __init__(self, config):
7
+ self.config = config
6
8
 
7
- class scan(Scan):
8
- def __init__(self, inputs=[], **run_opts):
9
- hooks = run_opts.pop('hooks', {})
10
- results = run_opts.pop('results', [])
11
- context = run_opts.pop('context', {})
12
- super().__init__(
13
- config=config,
14
- inputs=inputs,
15
- results=results,
16
- run_opts=run_opts,
17
- hooks=hooks,
18
- context=context)
19
- return scan, config.name
9
+ def __call__(self, targets, **kwargs):
10
+ hooks = kwargs.pop('hooks', {})
11
+ results = kwargs.pop('results', [])
12
+ context = kwargs.pop('context', {})
13
+ super().__init__(
14
+ config=self.config,
15
+ inputs=targets,
16
+ results=results,
17
+ hooks=hooks,
18
+ context=context,
19
+ run_opts=kwargs)
20
+ return self
20
21
 
21
22
 
22
23
  DYNAMIC_SCANS = {}
23
24
  for scan in ALL_SCANS:
24
- cls, name = generate_class(scan)
25
- DYNAMIC_SCANS[name] = cls
25
+ instance = DynamicScan(scan)
26
+ DYNAMIC_SCANS[scan.name] = instance
26
27
 
27
28
  globals().update(DYNAMIC_SCANS)
28
29
  __all__ = list(DYNAMIC_SCANS)
@@ -1,28 +1,29 @@
1
1
  from secator.cli import ALL_WORKFLOWS
2
+ from secator.runners import Workflow
2
3
 
3
4
 
4
- def generate_class(config):
5
- from secator.runners import Workflow
5
+ class DynamicWorkflow(Workflow):
6
+ def __init__(self, config):
7
+ self.config = config
6
8
 
7
- class workflow(Workflow):
8
- def __init__(self, inputs=[], **run_opts):
9
- hooks = run_opts.pop('hooks', {})
10
- results = run_opts.pop('results', [])
11
- context = run_opts.pop('context', {})
12
- super().__init__(
13
- config=config,
14
- inputs=inputs,
15
- results=results,
16
- run_opts=run_opts,
17
- hooks=hooks,
18
- context=context)
19
- return workflow, config.name
9
+ def __call__(self, targets, **kwargs):
10
+ hooks = kwargs.pop('hooks', {})
11
+ results = kwargs.pop('results', [])
12
+ context = kwargs.pop('context', {})
13
+ super().__init__(
14
+ config=self.config,
15
+ inputs=targets,
16
+ results=results,
17
+ hooks=hooks,
18
+ context=context,
19
+ run_opts=kwargs)
20
+ return self
20
21
 
21
22
 
22
23
  DYNAMIC_WORKFLOWS = {}
23
24
  for workflow in ALL_WORKFLOWS:
24
- cls, name = generate_class(workflow)
25
- DYNAMIC_WORKFLOWS[name] = cls
25
+ instance = DynamicWorkflow(workflow)
26
+ DYNAMIC_WORKFLOWS[workflow.name] = instance
26
27
 
27
28
  globals().update(DYNAMIC_WORKFLOWS)
28
29
  __all__ = list(DYNAMIC_WORKFLOWS)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: secator
3
- Version: 0.10.1a4
3
+ Version: 0.10.1a6
4
4
  Summary: The pentester's swiss knife.
5
5
  Project-URL: Homepage, https://github.com/freelabz/secator
6
6
  Project-URL: Issues, https://github.com/freelabz/secator/issues
@@ -1,6 +1,6 @@
1
1
  secator/.gitignore,sha256=da8MUc3hdb6Mo0WjZu2upn5uZMbXcBGvhdhTQ1L89HI,3093
2
2
  secator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- secator/celery.py,sha256=8BV-G_r0gYZ48oYejMpvY4wvPJwYcjZ3NHnpjzOkB94,9706
3
+ secator/celery.py,sha256=PC4l00gLNN9ftxbTqMPgYNsFq5jOlCrEgFPyiWwbJLg,9620
4
4
  secator/celery_signals.py,sha256=iumfx7tTeoavAbHijBtij0JzeIqElxQldNZtuZmFY_U,4456
5
5
  secator/celery_utils.py,sha256=bW1yzMCjfIiesU4SOVNVuy0I8HukJyh8KmNB4w0woJM,8857
6
6
  secator/cli.py,sha256=3_tTTusW12MCejFgtOeYjiedjrJpyQj_gsCK8FkTMJA,43922
@@ -8,7 +8,7 @@ secator/config.py,sha256=CdVBh6d4k13SpkQKyHQfMFHgkLypUH07kAKLmCJJO1w,19688
8
8
  secator/decorators.py,sha256=3kYadCz6haIZtnjkFHSRfenTdc6Yu7bHd-0IVjhD72w,13902
9
9
  secator/definitions.py,sha256=gFtLT9fjNtX_1qkiCjNfQyCvYq07IhScsQzX4o20_SE,3084
10
10
  secator/installer.py,sha256=Q5qmGbxGmuhysEA9YovTpy-YY2TxxFskhrzSX44c42E,17971
11
- secator/report.py,sha256=qJkEdCFttDBXIwUNUzZqFU_sG8l0PvyTSTogZVBv1Rs,3628
11
+ secator/report.py,sha256=rocJgsAMT2BgcwCqm3pwjAyymENlZZpHBqsBsXtXde4,3613
12
12
  secator/rich.py,sha256=owmuLcTTUt8xYBTE3_SqWTkPeAomcU_8bPdW_V-U8VM,3264
13
13
  secator/template.py,sha256=Sb6PjCTGIkZ7I0OGWFp5CaXmjt-6VPe_xpcRhWhjGpU,4409
14
14
  secator/thread.py,sha256=rgRgEtcMgs2wyfLWVlCTUCLWeg6jsMo5iKpyyrON5rY,655
@@ -69,14 +69,14 @@ secator/output_types/user_account.py,sha256=rm10somxyu30JHjj629IkR15Nhahylud_fVO
69
69
  secator/output_types/vulnerability.py,sha256=nF7OT9zGez8sZvLrkhjBOORjVi8hCqfCYUFq3eZ_ywo,2870
70
70
  secator/output_types/warning.py,sha256=47GtmG083GqGPb_R5JDFmARJ9Mqrme58UxwJhgdGPuI,853
71
71
  secator/runners/__init__.py,sha256=EBbOk37vkBy9p8Hhrbi-2VtM_rTwQ3b-0ggTyiD22cE,290
72
- secator/runners/_base.py,sha256=3LNWH_jEfaZbtgHYzfl6mFmUJ9IoC62vKmLlv-MmTAw,31293
72
+ secator/runners/_base.py,sha256=FMqUix_6GVe5U2OT1jiQ_zbaWEieBBxtZVQfeGZKWpU,30512
73
73
  secator/runners/_helpers.py,sha256=QhJmdmFdu5XSx3LBFf4Q4Hy2EXS6bLGnJUq8G7C6f68,2410
74
74
  secator/runners/celery.py,sha256=bqvDTTdoHiGRCt0FRvlgFHQ_nsjKMP5P0PzGbwfCj_0,425
75
75
  secator/runners/command.py,sha256=9AvjZgSXctP8D-ffPCtlnXEiGqTeaD2wVGhiGNuROb0,25469
76
- secator/runners/scan.py,sha256=9FjDsFmQrAWfA6crWkCJaVqG3-t2HBVjcsv4UQp_9b8,1500
77
- secator/runners/task.py,sha256=59jPXKSxFtSNXsm6VTAz8li2jxpM0Bkcgcn77HIDCrY,1869
76
+ secator/runners/scan.py,sha256=jKguiqlH4jw0uRGMN6GNsqgexw9T0HBIL7_4mIUo3xA,1530
77
+ secator/runners/task.py,sha256=RXVnNLPflFC7g9u6M8u6cnB7MYVyRALmQsjCCBtk7kA,1876
78
78
  secator/runners/workflow.py,sha256=qldnRm7r_SCvRHJFkZ7eaml62RZkOeCdT18PU357grY,2982
79
- secator/scans/__init__.py,sha256=1EEbngbDbvWxmeDYC6uux00WWy1v5qHtSpk6NVz27rM,617
79
+ secator/scans/__init__.py,sha256=s4Ojsk5CWwyWqHu_A4zaXUL5Hm5L5nCmCHZn7wdD3Io,623
80
80
  secator/serializers/__init__.py,sha256=OP5cmFl77ovgSCW_IDcZ21St2mUt5UK4QHfrsK2KvH8,248
81
81
  secator/serializers/dataclass.py,sha256=RqICpfsYWGjHAACAA2h2jZ_69CFHim4VZwcBqowGMcQ,1010
82
82
  secator/serializers/json.py,sha256=UJwAymRzjF-yBKOgz1MTOyBhQcdQg7fOKRXgmHIu8fo,411
@@ -109,9 +109,9 @@ secator/tasks/nuclei.py,sha256=bMXCRU5VWyrwI7Cv6BCj84NTpfjuALFumPqUSZ4Y6Ug,4243
109
109
  secator/tasks/searchsploit.py,sha256=gvtLZbL2hzAZ07Cf0cSj2Qs0GvWK94XyHvoPFsetXu8,3321
110
110
  secator/tasks/subfinder.py,sha256=C6W5NnXT92OUB1aSS9IYseqdI3wDMAz70TOEl8X-o3U,1213
111
111
  secator/tasks/wpscan.py,sha256=036ywiEqZfX_Bt071U7qIm7bi6pNk7vodflmuslJurA,5550
112
- secator/workflows/__init__.py,sha256=ivpZHiYYlj4JqlXLRmB9cmAPUGdk8QcUrCRL34hIqEA,665
113
- secator-0.10.1a4.dist-info/METADATA,sha256=EWh5NvMc8ZTE9xYmtbbE7eikaHPHgQfTasXPWlsyQdA,14726
114
- secator-0.10.1a4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
115
- secator-0.10.1a4.dist-info/entry_points.txt,sha256=lPgsqqUXWgiuGSfKy-se5gHdQlAXIwS_A46NYq7Acic,44
116
- secator-0.10.1a4.dist-info/licenses/LICENSE,sha256=19W5Jsy4WTctNkqmZIqLRV1gTDOp01S3LDj9iSgWaJ0,2867
117
- secator-0.10.1a4.dist-info/RECORD,,
112
+ secator/workflows/__init__.py,sha256=R_TTyjg9f2Ph2_LYiF0lL07IjTrfRE_zqJzy-N7_WCk,675
113
+ secator-0.10.1a6.dist-info/METADATA,sha256=mCzqqxVeSyNqStpurizNJqoDeXE_HbIsabiuxZ48-xE,14726
114
+ secator-0.10.1a6.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
115
+ secator-0.10.1a6.dist-info/entry_points.txt,sha256=lPgsqqUXWgiuGSfKy-se5gHdQlAXIwS_A46NYq7Acic,44
116
+ secator-0.10.1a6.dist-info/licenses/LICENSE,sha256=19W5Jsy4WTctNkqmZIqLRV1gTDOp01S3LDj9iSgWaJ0,2867
117
+ secator-0.10.1a6.dist-info/RECORD,,