souleyez 2.43.21__py3-none-any.whl → 2.43.22__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.
souleyez/__init__.py CHANGED
@@ -1,2 +1,2 @@
1
- __version__ = '2.43.21'
1
+ __version__ = '2.43.22'
2
2
 
souleyez/docs/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # SoulEyez Documentation
2
2
 
3
- **Version:** 2.43.21
3
+ **Version:** 2.43.22
4
4
  **Last Updated:** January 12, 2026
5
5
  **Organization:** CyberSoul Security
6
6
 
@@ -833,7 +833,18 @@ def _try_run_plugin(tool: str, target: str, args: List[str], label: str, log_pat
833
833
  cmd_spec = build_command_method(target, args or [], label or "", log_path)
834
834
 
835
835
  if cmd_spec is None:
836
- # build_command returned None - check if plugin has run() method
836
+ # build_command returned None - check if this is a deliberate abort
837
+ # (e.g., gobuster detected host redirect and aborted to avoid wasted scan)
838
+ if os.path.exists(log_path):
839
+ with open(log_path, 'r', encoding='utf-8', errors='replace') as fh:
840
+ log_content = fh.read()
841
+ if 'HOST_REDIRECT_TARGET:' in log_content:
842
+ # Plugin aborted due to host redirect - don't fall through to run()
843
+ # Return success (0) so parser can set WARNING status and trigger retry
844
+ _append_worker_log(f"job {jid}: gobuster aborted due to host redirect")
845
+ return (True, 0)
846
+
847
+ # Otherwise check if plugin has run() method
837
848
  # This allows plugins to signal "use run() instead" by returning None
838
849
  run_method = getattr(plugin, "run", None)
839
850
  if callable(run_method):
@@ -2522,10 +2522,17 @@ def parse_hydra_job(engagement_id: int, log_path: str, job: Dict[str, Any]) -> D
2522
2522
 
2523
2523
  # Check for hydra errors
2524
2524
  hydra_error = detect_tool_error(log_content, 'hydra')
2525
+ summary = None
2525
2526
 
2526
2527
  # Determine status based on results
2527
2528
  if hydra_error:
2528
- status = STATUS_ERROR # Tool failed to connect
2529
+ # "Connection refused" means service not available - not a tool error
2530
+ # This is a valid result: we successfully tested, service doesn't exist
2531
+ if 'connection refused' in hydra_error.lower():
2532
+ status = STATUS_NO_RESULTS # Service not reachable
2533
+ summary = f"Service not reachable (connection refused)"
2534
+ else:
2535
+ status = STATUS_ERROR # Actual tool failure
2529
2536
  elif len(parsed.get('credentials', [])) > 0:
2530
2537
  status = STATUS_DONE # Found valid credentials
2531
2538
  elif len(parsed.get('usernames', [])) > 0:
@@ -2533,7 +2540,7 @@ def parse_hydra_job(engagement_id: int, log_path: str, job: Dict[str, Any]) -> D
2533
2540
  else:
2534
2541
  status = STATUS_NO_RESULTS # No valid credentials or usernames found
2535
2542
 
2536
- return {
2543
+ result = {
2537
2544
  'tool': 'hydra',
2538
2545
  'status': status,
2539
2546
  'target': target,
@@ -2548,6 +2555,9 @@ def parse_hydra_job(engagement_id: int, log_path: str, job: Dict[str, Any]) -> D
2548
2555
  'findings_added': findings_added,
2549
2556
  'attempts': parsed.get('attempts', 0)
2550
2557
  }
2558
+ if summary:
2559
+ result['summary'] = summary
2560
+ return result
2551
2561
  except Exception as e:
2552
2562
  return {'error': str(e)}
2553
2563
 
@@ -3316,8 +3326,10 @@ def parse_http_fingerprint_job(engagement_id: int, log_path: str, job: Dict[str,
3316
3326
  summary_parts = []
3317
3327
 
3318
3328
  if parsed.get('error'):
3319
- status = STATUS_ERROR
3320
- summary_parts.append(f"Error: {parsed.get('error')}")
3329
+ # Network errors (connection refused, timeout, etc.) are findings about the target,
3330
+ # not job failures. The job ran successfully - it just couldn't reach the target.
3331
+ status = STATUS_WARNING
3332
+ summary_parts.append(f"Unreachable: {parsed.get('error')}")
3321
3333
  elif parsed.get('managed_hosting') or parsed.get('waf') or parsed.get('cdn'):
3322
3334
  status = STATUS_DONE # Found useful info
3323
3335
  elif parsed.get('server'):
souleyez/main.py CHANGED
@@ -173,7 +173,7 @@ def _check_privileged_tools():
173
173
 
174
174
 
175
175
  @click.group()
176
- @click.version_option(version='2.43.21')
176
+ @click.version_option(version='2.43.22')
177
177
  def cli():
178
178
  """SoulEyez - AI-Powered Pentesting Platform by CyberSoul Security"""
179
179
  from souleyez.log_config import init_logging
@@ -420,6 +420,18 @@ class GobusterPlugin(PluginBase):
420
420
 
421
421
  # Always run preflight - merge detected length with any existing exclusions
422
422
  preflight = self._preflight_check(base_url, timeout=5.0, log_path=log_path)
423
+
424
+ # If host redirect detected, abort scan immediately
425
+ # Don't waste time running on wrong target - result_handler will spawn retry
426
+ if preflight.get('redirect_host'):
427
+ if log_path:
428
+ with open(log_path, 'a') as f:
429
+ f.write("\n=== SCAN ABORTED ===\n")
430
+ f.write("Host redirect detected. Aborting to avoid wasted scan time.\n")
431
+ f.write("A retry job will be auto-queued with the correct target.\n")
432
+ f.write(f"=== Completed: {time.strftime('%Y-%m-%d %H:%M:%S UTC', time.gmtime())} ===\n")
433
+ return None # Abort - background.py will check log for HOST_REDIRECT_TARGET
434
+
423
435
  if preflight['exclude_length']:
424
436
  # Collect existing exclusions
425
437
  existing_excludes = set()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: souleyez
3
- Version: 2.43.21
3
+ Version: 2.43.22
4
4
  Summary: AI-Powered Penetration Testing Platform with 40+ integrated tools
5
5
  Author-email: CyberSoul Security <contact@cybersoulsecurity.com>
6
6
  Maintainer-email: CyberSoul Security <contact@cybersoulsecurity.com>
@@ -1,10 +1,10 @@
1
- souleyez/__init__.py,sha256=nHX2xDLjvmca2VRMLJEdBe9TLirZpnAEpzpedOJqGVA,25
1
+ souleyez/__init__.py,sha256=4xG_JCsMlgle6DVExX-2w-zoJ3c2sKv-sU3eSlwLkhw,25
2
2
  souleyez/config.py,sha256=av357I3GYRWAklv8Dto-9-5Db699Wq5znez7zo7241Q,11595
3
3
  souleyez/devtools.py,sha256=rptmUY4a5eVvYjdEc6273MSagL-D9xibPOFgohVqUno,3508
4
4
  souleyez/feature_flags.py,sha256=mo6YAq07lc6sR3lEFKmIwTKxXZ2JPxwa5X97uR_mu50,4642
5
5
  souleyez/history.py,sha256=gzs5I_j-3OigIP6yfmBChdqxaFmyUIxvTpzWUPe_Q6c,2853
6
6
  souleyez/log_config.py,sha256=MMhPAJOqgXDfuE-xm5g0RxAfWndcmbhFHvIEMm1a_Wo,5830
7
- souleyez/main.py,sha256=gE3iGvtoke6wSaQyXOpRq-g_yLyxuEcE3Dd0kGtDaeo,129101
7
+ souleyez/main.py,sha256=oPK0zQSh2720ksRigtHsnG2qrJfCKnQdexU24MOxTak,129101
8
8
  souleyez/scanner.py,sha256=U3IWHRrJ5aQ32dSHiVAHB60w1R_z0E0QxfM99msYNlw,3124
9
9
  souleyez/security.py,sha256=S84m1QmnKz_6NgH2I6IBIAorMHxRPNYVFSnks5xjihQ,2479
10
10
  souleyez/ui.py,sha256=15pfsqoDPnojAqr5S0TZHJE2ZkSHzkHpNVfVvsRj66A,34301
@@ -104,7 +104,7 @@ souleyez/detection/__init__.py,sha256=QIhvXjFdjrquQ6A0VQ7GZQkK_EXB59t8Dv9PKXhEUe
104
104
  souleyez/detection/attack_signatures.py,sha256=akgWwiIkh6WYnghCuLhRV0y6FS0SQ0caGF8tZUc49oA,6965
105
105
  souleyez/detection/mitre_mappings.py,sha256=xejE80YK-g8kKaeQoo-vBl8P3t8RTTItbfN0NaVZw6s,20558
106
106
  souleyez/detection/validator.py,sha256=-AJ7QSJ3-6jFKLnPG_Rc34IXyF4JPyI82BFUgTA9zw0,15641
107
- souleyez/docs/README.md,sha256=_ErqwMJP-wkJSIidWRgYCQ-e4iCB5uDv_wytkcrfyvY,7188
107
+ souleyez/docs/README.md,sha256=tBoiaxk833zwYW6EybO6MEcXxRh-dAVcbEdqhGPbwaE,7188
108
108
  souleyez/docs/api-reference/cli-commands.md,sha256=lTLFnILN3YRVdqCaag7WgsYXfDGglb1TuPexkxDsVdE,12917
109
109
  souleyez/docs/api-reference/engagement-api.md,sha256=nd-EvQMtiJrobg2bzFEADp853HP1Uhb9dmgok0_-neE,11672
110
110
  souleyez/docs/api-reference/integration-guide.md,sha256=c96uX79ukHyYotLa54wZ20Kx-EUZnrKegTeGkfLD-pw,16285
@@ -146,13 +146,13 @@ souleyez/docs/user-guide/uninstall.md,sha256=gDknetFhjZ0tnYk4JqhLa369NT4bIRb50rm
146
146
  souleyez/docs/user-guide/worker-management.md,sha256=hNu6eSTVb6XM4Zbb0I9Y5aL4AA2EiWOSFI6iGjn17kU,12035
147
147
  souleyez/docs/user-guide/workflows.md,sha256=4EyZKWRyuWf9wrENJwtidWKN25PGis1Pk33HIHk5UHM,22261
148
148
  souleyez/engine/__init__.py,sha256=THI_89hQfAPJDsfzDcur6H9sEGhGAnTxSNim7UOExYc,110
149
- souleyez/engine/background.py,sha256=55-DOhq9s3oud5POuutV-NmUQARg3i9kvSl_pLy7oBY,85252
149
+ souleyez/engine/background.py,sha256=C1hbkcY5CJme8HVchMcWs7wwfgQphc-x8eEtMWaRB9s,86037
150
150
  souleyez/engine/base.py,sha256=G35U1d-fygUvzmHH8zxLXw-vyQ9JzcfhGaSYOsHJtzQ,728
151
151
  souleyez/engine/job_status.py,sha256=OAEf2rAzapm55m4tc3PSilotdA5ONX15JavUMLre0is,2685
152
152
  souleyez/engine/loader.py,sha256=ke6QQVVWozDnqGNBotajC3RBYOa2_DZmv5DAnDZVgIc,2769
153
153
  souleyez/engine/log_sanitizer.py,sha256=QHF6zSms-wHo6SbL6fHXIh1GG-8G34lE7kl45nbPn70,7130
154
154
  souleyez/engine/manager.py,sha256=aBQMoib-VWNXtIp5Qn34tRj1P1jiLpwAIoo1fexAaLU,3629
155
- souleyez/engine/result_handler.py,sha256=jioWzfRrSdRP7vfrcGIujrhh6-H1POkyiBGDnwjoW9I,143455
155
+ souleyez/engine/result_handler.py,sha256=o59PY0tcuEY1T06P0hGmGKRnTZacvyT0H6b3iwOf_y8,144145
156
156
  souleyez/engine/worker_manager.py,sha256=B7b8RbkKTNofmiIyHTNgdikoZCLXpB-iIl1S4-U3q9o,6127
157
157
  souleyez/export/__init__.py,sha256=2kFHftSqqrRUG6PhtfhCyhnkpkjc-8Zb4utGo-Nb6B4,61
158
158
  souleyez/export/evidence_bundle.py,sha256=hqPn_h2CidhL-1VAT0qraZ8r1yfnUTnLZ3RfPPCK5Ds,9966
@@ -227,7 +227,7 @@ souleyez/plugins/dnsrecon.py,sha256=nxeVgwACUyw5VYEyD-5U277d1U72EkWBX9nR9_DMZrI,
227
227
  souleyez/plugins/enum4linux.py,sha256=VHkKPs8PWX90RLsGdYt5Ieuc3Sz52fbeWvKCL1KquIY,10876
228
228
  souleyez/plugins/ffuf.py,sha256=7c1-Q7xXTMmH_2wHXikjmZnSgZL13Hj5E_asBxZ6Y5U,11652
229
229
  souleyez/plugins/firmware_extract.py,sha256=_hZXx6cHb9noM6uVgi3hwrJLw8hE9mDUelTEHwoIdCU,6460
230
- souleyez/plugins/gobuster.py,sha256=y8QeEjMR5_2tf-T63nxFRUtWmlCzrPez2I4nLqPNOfY,32114
230
+ souleyez/plugins/gobuster.py,sha256=VIW84fB7WIlHm5-0TQXIRlMEkKT9fdB_eelwYCUGCAY,32853
231
231
  souleyez/plugins/hashcat.py,sha256=aigfwBu9IorXKgbyEIWx0qOCEdr1wnZaPqdYwh0PITc,10381
232
232
  souleyez/plugins/http_fingerprint.py,sha256=4ukU-TgcPjpccf929BpJbjfcijxsfWxhUPe0MrEoWf8,21424
233
233
  souleyez/plugins/hydra.py,sha256=kfVJwgh3x1DC0wEtA-lkoY7qhQH1qKViYexUECZSPY4,29520
@@ -371,9 +371,9 @@ souleyez/ui/wazuh_vulns_view.py,sha256=3vJJEmrjgS2wD6EDB7ZV7WxgytBHTm-1WqNDjp7lV
371
371
  souleyez/ui/wordlist_browser.py,sha256=iQ2YYxrVo8FGCfM-Bc0teVBijSAbd2rjbSQ2hOE7eiY,16110
372
372
  souleyez/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
373
373
  souleyez/utils/tool_checker.py,sha256=YzNajZpFyKJA5fp0Kq_gQ0YnKb7J1BaKJSZ8vP-IWj8,30868
374
- souleyez-2.43.21.dist-info/licenses/LICENSE,sha256=J7vDD5QMF4w2oSDm35eBgosATE70ah1M40u9W4EpTZs,1090
375
- souleyez-2.43.21.dist-info/METADATA,sha256=46UCChcyRvVsxY0X53Wkas-Io_LXOXGx92HSI80xrCE,10427
376
- souleyez-2.43.21.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
377
- souleyez-2.43.21.dist-info/entry_points.txt,sha256=bN5W1dhjDZJl3TKclMjRpfQvGPmyrJLwwDuCj_X39HE,48
378
- souleyez-2.43.21.dist-info/top_level.txt,sha256=afAMzS9p4lcdBNxhGo6jl3ipQE9HUvvNIPOdjtPjr_Q,9
379
- souleyez-2.43.21.dist-info/RECORD,,
374
+ souleyez-2.43.22.dist-info/licenses/LICENSE,sha256=J7vDD5QMF4w2oSDm35eBgosATE70ah1M40u9W4EpTZs,1090
375
+ souleyez-2.43.22.dist-info/METADATA,sha256=02sOd2EjVghOfycQhd-jpiqXb91Ftg1PKGfR67BmKEs,10427
376
+ souleyez-2.43.22.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
377
+ souleyez-2.43.22.dist-info/entry_points.txt,sha256=bN5W1dhjDZJl3TKclMjRpfQvGPmyrJLwwDuCj_X39HE,48
378
+ souleyez-2.43.22.dist-info/top_level.txt,sha256=afAMzS9p4lcdBNxhGo6jl3ipQE9HUvvNIPOdjtPjr_Q,9
379
+ souleyez-2.43.22.dist-info/RECORD,,