souleyez 2.43.27__py3-none-any.whl → 2.43.28__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.27'
1
+ __version__ = '2.43.28'
2
2
 
souleyez/docs/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # SoulEyez Documentation
2
2
 
3
- **Version:** 2.43.27
3
+ **Version:** 2.43.28
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.27')
176
+ @click.version_option(version='2.43.28')
177
177
  def cli():
178
178
  """SoulEyez - AI-Powered Pentesting Platform by CyberSoul Security"""
179
179
  from souleyez.log_config import init_logging
@@ -7113,6 +7113,40 @@ def view_job_detail(job_id: int):
7113
7113
  # Fall back to raw log if parsing fails
7114
7114
  pass
7115
7115
 
7116
+ # WHOIS ERROR handler
7117
+ if not show_raw_logs and job.get('tool') == 'whois' and job.get('status') == 'error' and log_path and os.path.exists(log_path):
7118
+ try:
7119
+ with open(log_path, 'r', encoding='utf-8', errors='replace') as f:
7120
+ log_text = f.read()
7121
+
7122
+ click.echo(click.style("=" * 70, fg='red'))
7123
+ click.echo(click.style("[ERROR] WHOIS LOOKUP FAILED", bold=True, fg='red'))
7124
+ click.echo(click.style("=" * 70, fg='red'))
7125
+ click.echo()
7126
+
7127
+ # Check for common whois errors
7128
+ error_msg = None
7129
+ if 'No match for' in log_text or 'NOT FOUND' in log_text.upper():
7130
+ error_msg = "Domain not found in WHOIS database"
7131
+ elif 'timed out' in log_text.lower() or 'timeout' in log_text.lower():
7132
+ error_msg = "WHOIS query timed out - server may be slow"
7133
+ elif 'Connection refused' in log_text:
7134
+ error_msg = "Connection refused - WHOIS server may be down"
7135
+ elif 'rate limit' in log_text.lower() or 'too many' in log_text.lower():
7136
+ error_msg = "Rate limited - too many WHOIS queries"
7137
+
7138
+ if error_msg:
7139
+ click.echo(f" {error_msg}")
7140
+ else:
7141
+ click.echo(" Lookup failed - see raw logs for details (press 'r')")
7142
+
7143
+ click.echo()
7144
+ click.echo(click.style("=" * 70, fg='red'))
7145
+ click.echo()
7146
+
7147
+ except Exception:
7148
+ pass
7149
+
7116
7150
  # Parse and display WHOIS results if available (only when not showing raw logs)
7117
7151
  if not show_raw_logs and job.get('tool') == 'whois' and job.get('status') in ['done', 'completed', 'no_results'] and log_path and os.path.exists(log_path):
7118
7152
  try:
@@ -7192,6 +7226,46 @@ def view_job_detail(job_id: int):
7192
7226
  except Exception as e:
7193
7227
  pass
7194
7228
 
7229
+ # CrackMapExec ERROR handler
7230
+ if not show_raw_logs and job.get('tool') == 'crackmapexec' and job.get('status') == 'error' and log_path and os.path.exists(log_path):
7231
+ try:
7232
+ with open(log_path, 'r', encoding='utf-8', errors='replace') as f:
7233
+ log_text = f.read()
7234
+
7235
+ click.echo(click.style("=" * 70, fg='red'))
7236
+ click.echo(click.style("[ERROR] CRACKMAPEXEC FAILED", bold=True, fg='red'))
7237
+ click.echo(click.style("=" * 70, fg='red'))
7238
+ click.echo()
7239
+
7240
+ # Check for common CME errors
7241
+ error_msg = None
7242
+ if 'Connection refused' in log_text or 'Connection reset' in log_text:
7243
+ error_msg = "Connection refused - SMB service may be down"
7244
+ elif 'timed out' in log_text.lower() or 'timeout' in log_text.lower():
7245
+ error_msg = "Connection timed out - target may be slow or filtering"
7246
+ elif 'STATUS_LOGON_FAILURE' in log_text:
7247
+ error_msg = "Authentication failed - invalid credentials"
7248
+ elif 'STATUS_ACCESS_DENIED' in log_text:
7249
+ error_msg = "Access denied - insufficient privileges"
7250
+ elif 'Errno 113' in log_text or 'No route to host' in log_text:
7251
+ error_msg = "No route to host - network unreachable"
7252
+ elif '[-]' in log_text:
7253
+ match = re.search(r'\[-\]\s*(.+?)(?:\n|$)', log_text)
7254
+ if match:
7255
+ error_msg = match.group(1).strip()[:100]
7256
+
7257
+ if error_msg:
7258
+ click.echo(f" {error_msg}")
7259
+ else:
7260
+ click.echo(" Scan failed - see raw logs for details (press 'r')")
7261
+
7262
+ click.echo()
7263
+ click.echo(click.style("=" * 70, fg='red'))
7264
+ click.echo()
7265
+
7266
+ except Exception:
7267
+ pass
7268
+
7195
7269
  # Parse and display CrackMapExec results if available (only when not showing raw logs)
7196
7270
  if not show_raw_logs and job.get('tool') == 'crackmapexec' and job.get('status') in ['done', 'completed', 'no_results'] and log_path and os.path.exists(log_path):
7197
7271
  try:
@@ -7241,6 +7315,46 @@ def view_job_detail(job_id: int):
7241
7315
  except Exception as e:
7242
7316
  pass
7243
7317
 
7318
+ # SMBMap ERROR handler
7319
+ if not show_raw_logs and job.get('tool') == 'smbmap' and job.get('status') == 'error' and log_path and os.path.exists(log_path):
7320
+ try:
7321
+ with open(log_path, 'r', encoding='utf-8', errors='replace') as f:
7322
+ log_text = f.read()
7323
+
7324
+ click.echo(click.style("=" * 70, fg='red'))
7325
+ click.echo(click.style("[ERROR] SMBMAP FAILED", bold=True, fg='red'))
7326
+ click.echo(click.style("=" * 70, fg='red'))
7327
+ click.echo()
7328
+
7329
+ # Check for common smbmap errors
7330
+ error_msg = None
7331
+ if 'Connection refused' in log_text or 'Connection reset' in log_text:
7332
+ error_msg = "Connection refused - SMB service may be down"
7333
+ elif 'timed out' in log_text.lower() or 'timeout' in log_text.lower():
7334
+ error_msg = "Connection timed out - target may be slow or filtering"
7335
+ elif 'Authentication error' in log_text or 'LOGON_FAILURE' in log_text:
7336
+ error_msg = "Authentication failed - invalid credentials"
7337
+ elif 'Access denied' in log_text.lower():
7338
+ error_msg = "Access denied - insufficient privileges"
7339
+ elif 'Errno 113' in log_text or 'No route to host' in log_text:
7340
+ error_msg = "No route to host - network unreachable"
7341
+ elif '[-]' in log_text:
7342
+ match = re.search(r'\[-\]\s*(.+?)(?:\n|$)', log_text)
7343
+ if match:
7344
+ error_msg = match.group(1).strip()[:100]
7345
+
7346
+ if error_msg:
7347
+ click.echo(f" {error_msg}")
7348
+ else:
7349
+ click.echo(" Scan failed - see raw logs for details (press 'r')")
7350
+
7351
+ click.echo()
7352
+ click.echo(click.style("=" * 70, fg='red'))
7353
+ click.echo()
7354
+
7355
+ except Exception:
7356
+ pass
7357
+
7244
7358
  # Parse and display SMBMap results if available (only when not showing raw logs)
7245
7359
  if not show_raw_logs and job.get('tool') == 'smbmap' and job.get('status') in ['done', 'completed', 'no_results'] and log_path and os.path.exists(log_path):
7246
7360
  try:
@@ -7320,6 +7434,44 @@ def view_job_detail(job_id: int):
7320
7434
  except Exception as e:
7321
7435
  pass
7322
7436
 
7437
+ # enum4linux ERROR handler
7438
+ if not show_raw_logs and job.get('tool') == 'enum4linux' and job.get('status') == 'error' and log_path and os.path.exists(log_path):
7439
+ try:
7440
+ with open(log_path, 'r', encoding='utf-8', errors='replace') as f:
7441
+ log_text = f.read()
7442
+
7443
+ click.echo(click.style("=" * 70, fg='red'))
7444
+ click.echo(click.style("[ERROR] ENUM4LINUX FAILED", bold=True, fg='red'))
7445
+ click.echo(click.style("=" * 70, fg='red'))
7446
+ click.echo()
7447
+
7448
+ # Check for common enum4linux errors
7449
+ error_msg = None
7450
+ if 'Connection refused' in log_text:
7451
+ error_msg = "Connection refused - SMB/NetBIOS service may be down"
7452
+ elif 'timed out' in log_text.lower() or 'timeout' in log_text.lower():
7453
+ error_msg = "Connection timed out - target may be slow or filtering"
7454
+ elif 'NT_STATUS_ACCESS_DENIED' in log_text:
7455
+ error_msg = "Access denied - null session may be blocked"
7456
+ elif 'NT_STATUS_LOGON_FAILURE' in log_text:
7457
+ error_msg = "Logon failure - authentication failed"
7458
+ elif 'Errno 113' in log_text or 'No route to host' in log_text:
7459
+ error_msg = "No route to host - network unreachable"
7460
+ elif 'Could not initialise' in log_text:
7461
+ error_msg = "Could not initialize - target may not support SMB"
7462
+
7463
+ if error_msg:
7464
+ click.echo(f" {error_msg}")
7465
+ else:
7466
+ click.echo(" Scan failed - see raw logs for details (press 'r')")
7467
+
7468
+ click.echo()
7469
+ click.echo(click.style("=" * 70, fg='red'))
7470
+ click.echo()
7471
+
7472
+ except Exception:
7473
+ pass
7474
+
7323
7475
  # Parse and display enum4linux results if available (only when not showing raw logs)
7324
7476
  if not show_raw_logs and job.get('tool') == 'enum4linux' and job.get('status') in ['done', 'completed', 'no_results'] and log_path and os.path.exists(log_path):
7325
7477
  try:
@@ -7410,6 +7562,48 @@ def view_job_detail(job_id: int):
7410
7562
  has_credentials = False
7411
7563
  has_many_credentials = False
7412
7564
 
7565
+ # msf_auxiliary ERROR handler
7566
+ if not show_raw_logs and job.get('tool') == 'msf_auxiliary' and job.get('status') == 'error' and log_path and os.path.exists(log_path):
7567
+ try:
7568
+ with open(log_path, 'r', encoding='utf-8', errors='replace') as f:
7569
+ log_text = f.read()
7570
+
7571
+ click.echo(click.style("=" * 70, fg='red'))
7572
+ click.echo(click.style("[ERROR] METASPLOIT AUXILIARY FAILED", bold=True, fg='red'))
7573
+ click.echo(click.style("=" * 70, fg='red'))
7574
+ click.echo()
7575
+
7576
+ # Check for common MSF errors
7577
+ error_msg = None
7578
+ if 'Connection refused' in log_text:
7579
+ error_msg = "Connection refused - target service may be down"
7580
+ elif 'timed out' in log_text.lower() or 'timeout' in log_text.lower():
7581
+ error_msg = "Connection timed out - target may be slow or filtering"
7582
+ elif 'Exploit failed' in log_text:
7583
+ error_msg = "Exploit failed - target may not be vulnerable"
7584
+ elif 'Module not found' in log_text or 'Unknown module' in log_text:
7585
+ error_msg = "Module not found - check module name"
7586
+ elif 'Required option' in log_text:
7587
+ match = re.search(r'Required option\s*[\'"]?(\w+)[\'"]?\s*is missing', log_text)
7588
+ if match:
7589
+ error_msg = f"Required option '{match.group(1)}' is missing"
7590
+ elif '[-]' in log_text:
7591
+ match = re.search(r'\[-\]\s*(.+?)(?:\n|$)', log_text)
7592
+ if match:
7593
+ error_msg = match.group(1).strip()[:100]
7594
+
7595
+ if error_msg:
7596
+ click.echo(f" {error_msg}")
7597
+ else:
7598
+ click.echo(" Module failed - see raw logs for details (press 'r')")
7599
+
7600
+ click.echo()
7601
+ click.echo(click.style("=" * 70, fg='red'))
7602
+ click.echo()
7603
+
7604
+ except Exception:
7605
+ pass
7606
+
7413
7607
  # Parse and display msf_auxiliary results if available (only when not showing raw logs)
7414
7608
  if not show_raw_logs and job.get('tool') == 'msf_auxiliary' and job.get('status') in ['done', 'completed'] and log_path and os.path.exists(log_path):
7415
7609
  try:
@@ -7627,6 +7821,40 @@ def view_job_detail(job_id: int):
7627
7821
  # Silently fail - not critical
7628
7822
  pass
7629
7823
 
7824
+ # SearchSploit ERROR handler
7825
+ if not show_raw_logs and job.get('tool') == 'searchsploit' and job.get('status') == 'error' and log_path and os.path.exists(log_path):
7826
+ try:
7827
+ with open(log_path, 'r', encoding='utf-8', errors='replace') as f:
7828
+ log_text = f.read()
7829
+
7830
+ click.echo(click.style("=" * 70, fg='red'))
7831
+ click.echo(click.style("[ERROR] SEARCHSPLOIT FAILED", bold=True, fg='red'))
7832
+ click.echo(click.style("=" * 70, fg='red'))
7833
+ click.echo()
7834
+
7835
+ # Check for common searchsploit errors
7836
+ error_msg = None
7837
+ if 'not found' in log_text.lower() and 'command' in log_text.lower():
7838
+ error_msg = "searchsploit not found - install exploitdb package"
7839
+ elif 'database' in log_text.lower() and ('not found' in log_text.lower() or 'missing' in log_text.lower()):
7840
+ error_msg = "Exploit database not found - run searchsploit -u to update"
7841
+ elif 'Error' in log_text:
7842
+ match = re.search(r'Error[:\s]+(.+?)(?:\n|$)', log_text, re.IGNORECASE)
7843
+ if match:
7844
+ error_msg = match.group(1).strip()[:100]
7845
+
7846
+ if error_msg:
7847
+ click.echo(f" {error_msg}")
7848
+ else:
7849
+ click.echo(" Search failed - see raw logs for details (press 'r')")
7850
+
7851
+ click.echo()
7852
+ click.echo(click.style("=" * 70, fg='red'))
7853
+ click.echo()
7854
+
7855
+ except Exception:
7856
+ pass
7857
+
7630
7858
  # Parse and display SearchSploit results if available (only when not showing raw logs)
7631
7859
  if not show_raw_logs and job.get('tool') == 'searchsploit' and job.get('status') in ['done', 'completed', 'no_results'] and log_path and os.path.exists(log_path):
7632
7860
  try:
@@ -7830,7 +8058,8 @@ def view_job_detail(job_id: int):
7830
8058
  # Tools with custom error handlers (don't show generic for these)
7831
8059
  tools_with_error_handlers = [
7832
8060
  'gobuster', 'ffuf', 'nmap', 'ard', 'hydra', 'nuclei', 'sqlmap',
7833
- 'nikto', 'wpscan', 'dnsrecon', 'theharvester'
8061
+ 'nikto', 'wpscan', 'dnsrecon', 'theharvester', 'crackmapexec',
8062
+ 'smbmap', 'enum4linux', 'whois', 'searchsploit', 'msf_auxiliary'
7834
8063
  ]
7835
8064
 
7836
8065
  # Tools with custom warning handlers
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: souleyez
3
- Version: 2.43.27
3
+ Version: 2.43.28
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=OXioAdydP3dSiLSr9BJA6YoY7WSOxYycfwaRKWWJ_y4,25
1
+ souleyez/__init__.py,sha256=kVE1JLiNloJr9atzRGbxg0OhOragXoFGVkJas3aXhm0,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=xsjD3Nz9MaPIYKqBt6NuxCXRV04UlOQ4Q47bYg7W_zs,129101
7
+ souleyez/main.py,sha256=1B2rnpVf2U7UPngg2jBg76KpAelIGzVQeWiMCTiiV9A,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=TRn7M2nuQzEiXsERpf1LjKeMeZd2JEvouAaSSh_T3zE,7188
107
+ souleyez/docs/README.md,sha256=xY9_fFYXXI8RfmhGBxWEA6u0Ps9dl0YIPZcsQvY33A8,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=Z4ixYut7u_RymcHTjeMkTMjFmQ2z-tqyF4gxIO8KMMU,1450904
350
+ souleyez/ui/interactive.py,sha256=7lfrKAABudjxifkZELjZbgB8aVtlGtwNENr2q-8Dgzg,1462170
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.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,,
374
+ souleyez-2.43.28.dist-info/licenses/LICENSE,sha256=J7vDD5QMF4w2oSDm35eBgosATE70ah1M40u9W4EpTZs,1090
375
+ souleyez-2.43.28.dist-info/METADATA,sha256=BXRZf9vfaEjCH-lRUyRxbcJD3jaVa0gFtr7T3-8RAnk,10427
376
+ souleyez-2.43.28.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
377
+ souleyez-2.43.28.dist-info/entry_points.txt,sha256=bN5W1dhjDZJl3TKclMjRpfQvGPmyrJLwwDuCj_X39HE,48
378
+ souleyez-2.43.28.dist-info/top_level.txt,sha256=afAMzS9p4lcdBNxhGo6jl3ipQE9HUvvNIPOdjtPjr_Q,9
379
+ souleyez-2.43.28.dist-info/RECORD,,