souleyez 2.43.18__py3-none-any.whl → 2.43.21__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 souleyez might be problematic. Click here for more details.

souleyez/__init__.py CHANGED
@@ -1,2 +1,2 @@
1
- __version__ = '2.43.18'
1
+ __version__ = '2.43.21'
2
2
 
souleyez/docs/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # SoulEyez Documentation
2
2
 
3
- **Version:** 2.43.18
3
+ **Version:** 2.43.21
4
4
  **Last Updated:** January 12, 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.18')
176
+ @click.version_option(version='2.43.21')
177
177
  def cli():
178
178
  """SoulEyez - AI-Powered Pentesting Platform by CyberSoul Security"""
179
179
  from souleyez.log_config import init_logging
@@ -5487,7 +5487,7 @@ def view_job_detail(job_id: int):
5487
5487
 
5488
5488
  # Check if tool has a parser - if yes, hide raw logs by default
5489
5489
  tool = job.get('tool', '')
5490
- has_parser = tool in ['dnsrecon', 'nmap', 'ard', 'nuclei', 'nikto', 'dalfox', 'theharvester', 'sqlmap', 'ffuf', 'gobuster', 'wpscan', 'crackmapexec', 'hydra', 'whois', 'smbmap', 'enum4linux', 'msf_auxiliary', 'searchsploit']
5490
+ has_parser = tool in ['dnsrecon', 'nmap', 'ard', 'nuclei', 'nikto', 'dalfox', 'theharvester', 'sqlmap', 'ffuf', 'gobuster', 'wpscan', 'crackmapexec', 'hydra', 'whois', 'smbmap', 'enum4linux', 'msf_auxiliary', 'searchsploit', 'http_fingerprint']
5491
5491
 
5492
5492
  # Show log file if exists
5493
5493
  log_path = job.get('log')
@@ -5617,7 +5617,51 @@ def view_job_detail(job_id: int):
5617
5617
  with open(log_path, 'r', encoding='utf-8', errors='replace') as f:
5618
5618
  log_content = f.read()
5619
5619
  parsed = parse_gobuster_output(log_content, job.get('target', ''))
5620
-
5620
+
5621
+ # Show warning summary for jobs with warning status
5622
+ if job.get('status') == 'warning':
5623
+ click.echo(click.style("=" * 70, fg='yellow'))
5624
+ click.echo(click.style("⚠️ SCAN WARNING", bold=True, fg='yellow'))
5625
+ click.echo(click.style("=" * 70, fg='yellow'))
5626
+ click.echo()
5627
+
5628
+ # Check for host redirect
5629
+ if 'HOST_REDIRECT_TARGET:' in log_content:
5630
+ import re
5631
+ redirect_match = re.search(r'HOST_REDIRECT_TARGET:\s*(\S+)', log_content)
5632
+ if redirect_match:
5633
+ redirect_target = redirect_match.group(1)
5634
+ click.echo(click.style("Host-Level Redirect Detected", bold=True))
5635
+ click.echo(f" • Original target: {job.get('target', 'unknown')}")
5636
+ click.echo(f" • Redirects to: {redirect_target}")
5637
+ click.echo()
5638
+ click.echo(" The server redirects ALL requests to a different host.")
5639
+ click.echo(" Results are unreliable due to variable redirect response sizes.")
5640
+ click.echo()
5641
+ click.echo(click.style(" → A retry job was auto-queued with the correct target.", fg='green'))
5642
+ click.echo()
5643
+
5644
+ # Check for wildcard response
5645
+ elif 'wildcard' in log_content.lower() or 'the server returns a status code that matches' in log_content.lower():
5646
+ click.echo(click.style("Wildcard Response Detected", bold=True))
5647
+ click.echo(" The server returns the same response for ALL URLs.")
5648
+ click.echo(" Gobuster cannot differentiate real vs fake paths.")
5649
+ click.echo()
5650
+ # Extract exclude length if present
5651
+ import re
5652
+ length_match = re.search(r'Length:\s*(\d+)', log_content)
5653
+ if length_match:
5654
+ click.echo(f" • Response length: {length_match.group(1)} bytes")
5655
+ click.echo()
5656
+ click.echo(click.style(" → A retry job was auto-queued with --exclude-length.", fg='green'))
5657
+ click.echo()
5658
+
5659
+ else:
5660
+ # Generic warning
5661
+ click.echo(" Scan completed with warnings. Check raw logs for details.")
5662
+ click.echo(" Press [r] to view raw logs.")
5663
+ click.echo()
5664
+
5621
5665
  paths = parsed.get('paths', [])
5622
5666
  if paths:
5623
5667
  # Check if status was incorrectly set to no_results
@@ -7133,6 +7177,110 @@ def view_job_detail(job_id: int):
7133
7177
  # Silently fail - not critical
7134
7178
  pass
7135
7179
 
7180
+ # Parse and display http_fingerprint results if available (only when not showing raw logs)
7181
+ if not show_raw_logs and job.get('tool') == 'http_fingerprint' and job.get('status') in ['done', 'completed', 'no_results'] and log_path and os.path.exists(log_path):
7182
+ try:
7183
+ with open(log_path, 'r', encoding='utf-8', errors='replace') as f:
7184
+ log_content = f.read()
7185
+
7186
+ # Extract JSON result from log
7187
+ import json
7188
+ import re
7189
+ json_match = re.search(r'=== JSON_RESULT ===\s*(\{.*?\})\s*=== END_JSON_RESULT ===', log_content, re.DOTALL)
7190
+
7191
+ if json_match:
7192
+ result = json.loads(json_match.group(1))
7193
+
7194
+ click.echo(click.style("=" * 70, fg='cyan'))
7195
+ click.echo(click.style("HTTP FINGERPRINT RESULTS", bold=True, fg='cyan'))
7196
+ click.echo(click.style("=" * 70, fg='cyan'))
7197
+ click.echo()
7198
+
7199
+ # Status and redirects
7200
+ status_code = result.get('status_code')
7201
+ redirect_url = result.get('redirect_url')
7202
+ if status_code:
7203
+ click.echo(f" HTTP Status: {status_code}")
7204
+ if redirect_url:
7205
+ click.echo(f" Redirects to: {redirect_url}")
7206
+
7207
+ # Server info
7208
+ server = result.get('server')
7209
+ server_version = result.get('server_version')
7210
+ if server:
7211
+ server_str = f"{server} {server_version}" if server_version else server
7212
+ click.echo(f" Server: {server_str}")
7213
+
7214
+ # Security detections - WAF (red, important)
7215
+ waf = result.get('waf', [])
7216
+ if waf:
7217
+ click.echo()
7218
+ click.echo(click.style(f" ⚠️ WAF Detected: {', '.join(waf)}", fg='red', bold=True))
7219
+
7220
+ # Managed hosting (yellow)
7221
+ managed_hosting = result.get('managed_hosting')
7222
+ if managed_hosting:
7223
+ click.echo(click.style(f" Managed Hosting: {managed_hosting}", fg='yellow'))
7224
+
7225
+ # CDN
7226
+ cdn = result.get('cdn', [])
7227
+ if cdn:
7228
+ click.echo(f" CDN: {', '.join(cdn)}")
7229
+
7230
+ # Technologies
7231
+ technologies = result.get('technologies', [])
7232
+ if technologies:
7233
+ click.echo(f" Technologies: {', '.join(technologies)}")
7234
+
7235
+ # TLS info
7236
+ tls = result.get('tls')
7237
+ if tls:
7238
+ click.echo()
7239
+ click.echo(click.style(" TLS Certificate:", bold=True))
7240
+ if tls.get('issuer'):
7241
+ click.echo(f" Issuer: {tls['issuer']}")
7242
+ if tls.get('subject'):
7243
+ click.echo(f" Subject: {tls['subject']}")
7244
+ if tls.get('not_after'):
7245
+ click.echo(f" Expires: {tls['not_after']}")
7246
+
7247
+ # Cookies
7248
+ cookies = result.get('cookies', [])
7249
+ if cookies:
7250
+ click.echo()
7251
+ click.echo(click.style(f" Cookies ({len(cookies)}):", bold=True))
7252
+ for cookie in cookies[:5]:
7253
+ # Truncate long cookies
7254
+ cookie_display = cookie[:60] + '...' if len(cookie) > 60 else cookie
7255
+ click.echo(f" • {cookie_display}")
7256
+ if len(cookies) > 5:
7257
+ click.echo(f" ... and {len(cookies) - 5} more")
7258
+
7259
+ # Security headers summary
7260
+ headers = result.get('headers', {})
7261
+ security_headers = []
7262
+ if headers.get('Strict-Transport-Security'):
7263
+ security_headers.append('HSTS')
7264
+ if headers.get('Content-Security-Policy'):
7265
+ security_headers.append('CSP')
7266
+ if headers.get('X-Frame-Options'):
7267
+ security_headers.append('X-Frame-Options')
7268
+ if headers.get('X-Content-Type-Options'):
7269
+ security_headers.append('X-Content-Type-Options')
7270
+ if headers.get('Referrer-Policy'):
7271
+ security_headers.append('Referrer-Policy')
7272
+
7273
+ if security_headers:
7274
+ click.echo()
7275
+ click.echo(click.style(f" Security Headers: {', '.join(security_headers)}", fg='green'))
7276
+
7277
+ click.echo()
7278
+ click.echo(click.style("=" * 70, fg='cyan'))
7279
+
7280
+ except Exception as e:
7281
+ # Silently fail - not critical
7282
+ pass
7283
+
7136
7284
  click.echo()
7137
7285
 
7138
7286
  # Actions menu
@@ -19216,13 +19364,7 @@ def _delete_selected_osint(records: list, console):
19216
19364
 
19217
19365
  # Show confirmation
19218
19366
  click.echo()
19219
- click.echo(click.style(f" ⚠️ WARNING: Delete {len(records)} OSINT record(s)?", fg='red', bold=True))
19220
- click.echo(" This action cannot be undone!")
19221
- click.echo()
19222
-
19223
- confirm = click.prompt(" Type 'DELETE' to confirm", type=str, default='').strip()
19224
-
19225
- if confirm != 'DELETE':
19367
+ if not click.confirm(f" ⚠️ Delete {len(records)} OSINT record(s)? This cannot be undone!", default=False):
19226
19368
  click.echo(click.style(" Cancelled", fg='yellow'))
19227
19369
  click.pause()
19228
19370
  return
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: souleyez
3
- Version: 2.43.18
3
+ Version: 2.43.21
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>
@@ -266,4 +266,4 @@ See [LICENSE](LICENSE) for details.
266
266
 
267
267
  ---
268
268
 
269
- **Version**: 2.43.18 | **Maintainer**: [CyberSoul Security](https://www.cybersoulsecurity.com)
269
+ **Version**: 2.43.21 | **Maintainer**: [CyberSoul Security](https://www.cybersoulsecurity.com)
@@ -1,10 +1,10 @@
1
- souleyez/__init__.py,sha256=Px8tXuFPUMsfvCpC9dq17p-kFvkY9xfhCAyR-X9AhDA,25
1
+ souleyez/__init__.py,sha256=nHX2xDLjvmca2VRMLJEdBe9TLirZpnAEpzpedOJqGVA,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=3TY6fuB1uAuZzgWnhMu2UcbKFYsBPGSPe--a6K8pTrk,129101
7
+ souleyez/main.py,sha256=gE3iGvtoke6wSaQyXOpRq-g_yLyxuEcE3Dd0kGtDaeo,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=9UmX416xxyGhj56UibcGsDt5p_qYoaT5ID1CzOHGvMk,7188
107
+ souleyez/docs/README.md,sha256=_ErqwMJP-wkJSIidWRgYCQ-e4iCB5uDv_wytkcrfyvY,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=XqaN0Jnh-qRud24yAP5U-NViLM2G70sfCaAbcGC65i4,1409179
350
+ souleyez/ui/interactive.py,sha256=fz3HksIGbKlL-mvjPoerrRKwvedSM-PjMLub0xH4PQE,1416776
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.18.dist-info/licenses/LICENSE,sha256=J7vDD5QMF4w2oSDm35eBgosATE70ah1M40u9W4EpTZs,1090
375
- souleyez-2.43.18.dist-info/METADATA,sha256=kD8stPehWalncwAJpryqVuua6_J35FCre8UnGCAShH4,10427
376
- souleyez-2.43.18.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
377
- souleyez-2.43.18.dist-info/entry_points.txt,sha256=bN5W1dhjDZJl3TKclMjRpfQvGPmyrJLwwDuCj_X39HE,48
378
- souleyez-2.43.18.dist-info/top_level.txt,sha256=afAMzS9p4lcdBNxhGo6jl3ipQE9HUvvNIPOdjtPjr_Q,9
379
- souleyez-2.43.18.dist-info/RECORD,,
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,,