souleyez 2.43.26__py3-none-any.whl → 2.43.27__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.26'
1
+ __version__ = '2.43.27'
2
2
 
souleyez/docs/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # SoulEyez Documentation
2
2
 
3
- **Version:** 2.43.26
3
+ **Version:** 2.43.27
4
4
  **Last Updated:** January 13, 2026
5
5
  **Organization:** CyberSoul Security
6
6
 
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.26')
176
+ @click.version_option(version='2.43.27')
177
177
  def cli():
178
178
  """SoulEyez - AI-Powered Pentesting Platform by CyberSoul Security"""
179
179
  from souleyez.log_config import init_logging
@@ -6140,6 +6140,48 @@ def view_job_detail(job_id: int):
6140
6140
  import traceback
6141
6141
  traceback.print_exc()
6142
6142
 
6143
+ # WPScan ERROR handler
6144
+ if not show_raw_logs and job.get('tool') == 'wpscan' and job.get('status') == 'error' and log_path and os.path.exists(log_path):
6145
+ try:
6146
+ with open(log_path, 'r', encoding='utf-8', errors='replace') as f:
6147
+ log_text = f.read()
6148
+
6149
+ click.echo(click.style("=" * 70, fg='red'))
6150
+ click.echo(click.style("[ERROR] WPSCAN FAILED", bold=True, fg='red'))
6151
+ click.echo(click.style("=" * 70, fg='red'))
6152
+ click.echo()
6153
+
6154
+ # Check for common wpscan errors
6155
+ error_msg = None
6156
+ if 'The target is NOT running WordPress' in log_text:
6157
+ error_msg = "Target is not running WordPress"
6158
+ elif 'could not resolve' in log_text.lower():
6159
+ error_msg = "Could not resolve target hostname"
6160
+ elif 'Connection refused' in log_text or 'Unable to connect' in log_text:
6161
+ error_msg = "Connection refused - web server may be down"
6162
+ elif 'timed out' in log_text.lower() or 'timeout' in log_text.lower():
6163
+ error_msg = "Connection timed out - target may be slow or filtering"
6164
+ elif 'SSL' in log_text and ('error' in log_text.lower() or 'fail' in log_text.lower()):
6165
+ error_msg = "SSL error - try with --disable-tls-checks"
6166
+ elif 'API limit' in log_text.lower() or 'rate limit' in log_text.lower():
6167
+ error_msg = "WPScan API rate limit reached - try again later"
6168
+ elif '[!]' in log_text:
6169
+ match = re.search(r'\[!\]\s*(.+?)(?:\n|$)', log_text)
6170
+ if match:
6171
+ error_msg = match.group(1).strip()[:100]
6172
+
6173
+ if error_msg:
6174
+ click.echo(f" {error_msg}")
6175
+ else:
6176
+ click.echo(" Scan failed - see raw logs for details (press 'r')")
6177
+
6178
+ click.echo()
6179
+ click.echo(click.style("=" * 70, fg='red'))
6180
+ click.echo()
6181
+
6182
+ except Exception:
6183
+ pass
6184
+
6143
6185
  # Parse and display WPScan results if available (only when not showing raw logs)
6144
6186
  if not show_raw_logs and job.get('tool') == 'wpscan' and job.get('status') in ['done', 'completed', 'no_results'] and log_path and os.path.exists(log_path):
6145
6187
  try:
@@ -6333,6 +6375,46 @@ def view_job_detail(job_id: int):
6333
6375
  # Silently fail - not critical
6334
6376
  pass
6335
6377
 
6378
+ # DNSRecon ERROR handler
6379
+ if not show_raw_logs and job.get('tool') == 'dnsrecon' and job.get('status') == 'error' and log_path and os.path.exists(log_path):
6380
+ try:
6381
+ with open(log_path, 'r', encoding='utf-8', errors='replace') as f:
6382
+ log_text = f.read()
6383
+
6384
+ click.echo(click.style("=" * 70, fg='red'))
6385
+ click.echo(click.style("[ERROR] DNSRECON FAILED", bold=True, fg='red'))
6386
+ click.echo(click.style("=" * 70, fg='red'))
6387
+ click.echo()
6388
+
6389
+ # Check for common dnsrecon errors
6390
+ error_msg = None
6391
+ if 'Could not resolve' in log_text or 'NXDOMAIN' in log_text:
6392
+ error_msg = "Could not resolve domain - check if domain exists"
6393
+ elif 'timed out' in log_text.lower() or 'timeout' in log_text.lower():
6394
+ error_msg = "DNS query timed out - DNS server may be slow"
6395
+ elif 'SERVFAIL' in log_text:
6396
+ error_msg = "DNS server failure (SERVFAIL)"
6397
+ elif 'REFUSED' in log_text:
6398
+ error_msg = "DNS query refused - server may be blocking queries"
6399
+ elif 'No DNS records' in log_text:
6400
+ error_msg = "No DNS records found for domain"
6401
+ elif '[-]' in log_text:
6402
+ match = re.search(r'\[-\]\s*(.+?)(?:\n|$)', log_text)
6403
+ if match:
6404
+ error_msg = match.group(1).strip()[:100]
6405
+
6406
+ if error_msg:
6407
+ click.echo(f" {error_msg}")
6408
+ else:
6409
+ click.echo(" Scan failed - see raw logs for details (press 'r')")
6410
+
6411
+ click.echo()
6412
+ click.echo(click.style("=" * 70, fg='red'))
6413
+ click.echo()
6414
+
6415
+ except Exception:
6416
+ pass
6417
+
6336
6418
  # Parse and display DNSRecon results if available (only when not showing raw logs)
6337
6419
  if not show_raw_logs and job.get('tool') == 'dnsrecon' and job.get('status') in ['done', 'completed', 'no_results'] and log_path and os.path.exists(log_path):
6338
6420
  try:
@@ -6776,6 +6858,46 @@ def view_job_detail(job_id: int):
6776
6858
  except Exception as e:
6777
6859
  pass
6778
6860
 
6861
+ # theHarvester ERROR handler
6862
+ if not show_raw_logs and job.get('tool') == 'theharvester' and job.get('status') == 'error' and log_path and os.path.exists(log_path):
6863
+ try:
6864
+ with open(log_path, 'r', encoding='utf-8', errors='replace') as f:
6865
+ log_text = f.read()
6866
+
6867
+ click.echo(click.style("=" * 70, fg='red'))
6868
+ click.echo(click.style("[ERROR] THEHARVESTER FAILED", bold=True, fg='red'))
6869
+ click.echo(click.style("=" * 70, fg='red'))
6870
+ click.echo()
6871
+
6872
+ # Check for common theharvester errors
6873
+ error_msg = None
6874
+ if 'No results found' in log_text:
6875
+ error_msg = "No results found for the specified domain"
6876
+ elif 'Could not resolve' in log_text or 'DNS' in log_text and 'fail' in log_text.lower():
6877
+ error_msg = "Could not resolve domain"
6878
+ elif 'timed out' in log_text.lower() or 'timeout' in log_text.lower():
6879
+ error_msg = "Connection timed out - source may be slow"
6880
+ elif 'rate limit' in log_text.lower() or 'blocked' in log_text.lower():
6881
+ error_msg = "Rate limited or blocked by source"
6882
+ elif 'API' in log_text and ('key' in log_text.lower() or 'error' in log_text.lower()):
6883
+ error_msg = "API key error - check your API keys configuration"
6884
+ elif '[-]' in log_text:
6885
+ match = re.search(r'\[-\]\s*(.+?)(?:\n|$)', log_text)
6886
+ if match:
6887
+ error_msg = match.group(1).strip()[:100]
6888
+
6889
+ if error_msg:
6890
+ click.echo(f" {error_msg}")
6891
+ else:
6892
+ click.echo(" Scan failed - see raw logs for details (press 'r')")
6893
+
6894
+ click.echo()
6895
+ click.echo(click.style("=" * 70, fg='red'))
6896
+ click.echo()
6897
+
6898
+ except Exception:
6899
+ pass
6900
+
6779
6901
  # Parse and display theHarvester results if available (only when not showing raw logs)
6780
6902
  if not show_raw_logs and job.get('tool') == 'theharvester' and job.get('status') in ['done', 'completed', 'no_results'] and log_path and os.path.exists(log_path):
6781
6903
  try:
@@ -6864,6 +6986,44 @@ def view_job_detail(job_id: int):
6864
6986
  # Fall back to raw log if parsing fails
6865
6987
  pass
6866
6988
 
6989
+ # Nikto ERROR handler
6990
+ if not show_raw_logs and job.get('tool') == 'nikto' and job.get('status') == 'error' and log_path and os.path.exists(log_path):
6991
+ try:
6992
+ with open(log_path, 'r', encoding='utf-8', errors='replace') as f:
6993
+ log_text = f.read()
6994
+
6995
+ click.echo(click.style("=" * 70, fg='red'))
6996
+ click.echo(click.style("[ERROR] NIKTO SCAN FAILED", bold=True, fg='red'))
6997
+ click.echo(click.style("=" * 70, fg='red'))
6998
+ click.echo()
6999
+
7000
+ # Check for common nikto errors
7001
+ error_msg = None
7002
+ if 'Unable to connect' in log_text or 'Connection refused' in log_text:
7003
+ error_msg = "Unable to connect to target - check if web server is running"
7004
+ elif 'timed out' in log_text.lower() or 'timeout' in log_text.lower():
7005
+ error_msg = "Connection timed out - target may be slow or filtering"
7006
+ elif 'No web server found' in log_text:
7007
+ error_msg = "No web server found on target port"
7008
+ elif 'SSL handshake' in log_text.lower():
7009
+ error_msg = "SSL handshake failed - try with/without -ssl flag"
7010
+ elif 'ERROR:' in log_text:
7011
+ match = re.search(r'ERROR:\s*(.+?)(?:\n|$)', log_text)
7012
+ if match:
7013
+ error_msg = match.group(1).strip()[:100]
7014
+
7015
+ if error_msg:
7016
+ click.echo(f" {error_msg}")
7017
+ else:
7018
+ click.echo(" Scan failed - see raw logs for details (press 'r')")
7019
+
7020
+ click.echo()
7021
+ click.echo(click.style("=" * 70, fg='red'))
7022
+ click.echo()
7023
+
7024
+ except Exception:
7025
+ pass
7026
+
6867
7027
  # Parse and display Nikto results if available (only when not showing raw logs)
6868
7028
  if not show_raw_logs and job.get('tool') == 'nikto' and job.get('status') in ['done', 'completed', 'no_results'] and log_path and os.path.exists(log_path):
6869
7029
  try:
@@ -7668,7 +7828,10 @@ def view_job_detail(job_id: int):
7668
7828
  # =================================================================
7669
7829
 
7670
7830
  # Tools with custom error handlers (don't show generic for these)
7671
- tools_with_error_handlers = ['gobuster', 'ffuf', 'nmap', 'ard', 'hydra', 'nuclei', 'sqlmap']
7831
+ tools_with_error_handlers = [
7832
+ 'gobuster', 'ffuf', 'nmap', 'ard', 'hydra', 'nuclei', 'sqlmap',
7833
+ 'nikto', 'wpscan', 'dnsrecon', 'theharvester'
7834
+ ]
7672
7835
 
7673
7836
  # Tools with custom warning handlers
7674
7837
  tools_with_warning_handlers = ['gobuster', 'ffuf']
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: souleyez
3
- Version: 2.43.26
3
+ Version: 2.43.27
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=W7_ihmKebGDg5wOXze4pirFaaBA2KbGP_fIT3exGUTg,25
1
+ souleyez/__init__.py,sha256=OXioAdydP3dSiLSr9BJA6YoY7WSOxYycfwaRKWWJ_y4,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=ofrfuhN8kGrX6zj9Za9oHKTKaI1fT_DeCY0MIaoNkX4,129101
7
+ souleyez/main.py,sha256=xsjD3Nz9MaPIYKqBt6NuxCXRV04UlOQ4Q47bYg7W_zs,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=n8Xwj9zC-sjYh3ehIgjZBDCl_k92dhLyjJBMkezu6Aw,7188
107
+ souleyez/docs/README.md,sha256=TRn7M2nuQzEiXsERpf1LjKeMeZd2JEvouAaSSh_T3zE,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
@@ -347,7 +347,7 @@ souleyez/ui/export_view.py,sha256=0nQvVsKk7FU4uRzSfJ_qBZh_Lfn8hgGA2rbJ5bNg5-Y,65
347
347
  souleyez/ui/gap_analysis_view.py,sha256=AytAOEBq010wwo9hne1TE-uJpY_xicjLrFANbvN3r3w,30727
348
348
  souleyez/ui/help_system.py,sha256=nKGxLaMi-TKYs6xudTyw_tZqBb1cGFEuYYh6N-MAsJE,16648
349
349
  souleyez/ui/intelligence_view.py,sha256=VeAQ-3mANRnLIVpRqocL3JV0HUmJtADdxDeC5lzQhE0,32168
350
- souleyez/ui/interactive.py,sha256=WkxOlN1OyMvI49pZXje_tulORScHfoV5RNvE6PZPi50,1442929
350
+ souleyez/ui/interactive.py,sha256=Z4ixYut7u_RymcHTjeMkTMjFmQ2z-tqyF4gxIO8KMMU,1450904
351
351
  souleyez/ui/interactive_selector.py,sha256=6A51fgmFRnemBY0aCPHIhK2Rpba16NjSGKLzC0Q5vI8,16407
352
352
  souleyez/ui/log_formatter.py,sha256=akhIkYoO_cCaKxS1V5N3iPmIrHzgsU7pmsedx70s9TI,3845
353
353
  souleyez/ui/menu_components.py,sha256=N8zq2QXGmfaLJ08l53MMYt1y-5LRWgpZH6r8nXHonj8,3519
@@ -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.26.dist-info/licenses/LICENSE,sha256=J7vDD5QMF4w2oSDm35eBgosATE70ah1M40u9W4EpTZs,1090
375
- souleyez-2.43.26.dist-info/METADATA,sha256=lPnWrbGHwqpBwcB6xinsSJ8WYUdpMnBaDCjbCpIit_E,10427
376
- souleyez-2.43.26.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
377
- souleyez-2.43.26.dist-info/entry_points.txt,sha256=bN5W1dhjDZJl3TKclMjRpfQvGPmyrJLwwDuCj_X39HE,48
378
- souleyez-2.43.26.dist-info/top_level.txt,sha256=afAMzS9p4lcdBNxhGo6jl3ipQE9HUvvNIPOdjtPjr_Q,9
379
- souleyez-2.43.26.dist-info/RECORD,,
374
+ souleyez-2.43.27.dist-info/licenses/LICENSE,sha256=J7vDD5QMF4w2oSDm35eBgosATE70ah1M40u9W4EpTZs,1090
375
+ souleyez-2.43.27.dist-info/METADATA,sha256=0OBxVlojl_y7pAyeh5UqGqBDvV8MhKvYhomVeyiNXzU,10427
376
+ souleyez-2.43.27.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
377
+ souleyez-2.43.27.dist-info/entry_points.txt,sha256=bN5W1dhjDZJl3TKclMjRpfQvGPmyrJLwwDuCj_X39HE,48
378
+ souleyez-2.43.27.dist-info/top_level.txt,sha256=afAMzS9p4lcdBNxhGo6jl3ipQE9HUvvNIPOdjtPjr_Q,9
379
+ souleyez-2.43.27.dist-info/RECORD,,