souleyez 2.23.0__py3-none-any.whl → 2.27.1__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.
Files changed (36) hide show
  1. souleyez/__init__.py +1 -1
  2. souleyez/assets/__init__.py +1 -0
  3. souleyez/assets/souleyez-icon.png +0 -0
  4. souleyez/core/msf_sync_manager.py +15 -5
  5. souleyez/core/tool_chaining.py +143 -26
  6. souleyez/docs/README.md +2 -2
  7. souleyez/docs/user-guide/configuration.md +1 -1
  8. souleyez/docs/user-guide/installation.md +11 -0
  9. souleyez/engine/background.py +620 -154
  10. souleyez/engine/result_handler.py +262 -1
  11. souleyez/engine/worker_manager.py +98 -2
  12. souleyez/main.py +103 -4
  13. souleyez/parsers/crackmapexec_parser.py +101 -43
  14. souleyez/parsers/dnsrecon_parser.py +50 -35
  15. souleyez/parsers/enum4linux_parser.py +101 -21
  16. souleyez/parsers/http_fingerprint_parser.py +319 -0
  17. souleyez/parsers/hydra_parser.py +56 -5
  18. souleyez/parsers/impacket_parser.py +123 -44
  19. souleyez/parsers/john_parser.py +47 -14
  20. souleyez/parsers/msf_parser.py +20 -5
  21. souleyez/parsers/nmap_parser.py +48 -27
  22. souleyez/parsers/smbmap_parser.py +39 -23
  23. souleyez/parsers/sqlmap_parser.py +18 -9
  24. souleyez/parsers/theharvester_parser.py +21 -13
  25. souleyez/plugins/http_fingerprint.py +598 -0
  26. souleyez/plugins/nuclei.py +41 -17
  27. souleyez/ui/interactive.py +96 -4
  28. souleyez/ui/setup_wizard.py +71 -0
  29. souleyez/ui/tool_setup.py +3 -0
  30. souleyez/utils/tool_checker.py +42 -2
  31. {souleyez-2.23.0.dist-info → souleyez-2.27.1.dist-info}/METADATA +20 -3
  32. {souleyez-2.23.0.dist-info → souleyez-2.27.1.dist-info}/RECORD +36 -32
  33. {souleyez-2.23.0.dist-info → souleyez-2.27.1.dist-info}/WHEEL +0 -0
  34. {souleyez-2.23.0.dist-info → souleyez-2.27.1.dist-info}/entry_points.txt +0 -0
  35. {souleyez-2.23.0.dist-info → souleyez-2.27.1.dist-info}/licenses/LICENSE +0 -0
  36. {souleyez-2.23.0.dist-info → souleyez-2.27.1.dist-info}/top_level.txt +0 -0
@@ -130,6 +130,63 @@ def render_standard_header(title: str, width: int = None) -> None:
130
130
  click.echo()
131
131
 
132
132
 
133
+ def parse_syslog_description(desc: str) -> str:
134
+ """
135
+ Extract meaningful message from syslog-formatted descriptions.
136
+
137
+ Syslog format: <timestamp> <host> [timestamp] <program>[pid]: <message>
138
+ Example input: "Jan 8 07:00:05 192.168.1.111 Jan 8 07:00:05 eyez CRON[537281]: pam_unix(cron:session): session closed for user yoda"
139
+ Example output: "CRON: pam_unix(cron:session): session closed for user yoda"
140
+ """
141
+ import re
142
+
143
+ if not desc:
144
+ return 'No description'
145
+
146
+ # Try to find the actual message after common syslog patterns
147
+ # Pattern 1: Look for process name with PID followed by colon (e.g., "CRON[537281]:")
148
+ pid_match = re.search(r'([A-Za-z_][A-Za-z0-9_-]*)\[(\d+)\]:\s*(.+)$', desc)
149
+ if pid_match:
150
+ process_name = pid_match.group(1)
151
+ message = pid_match.group(3)
152
+ return f"{process_name}: {message}"
153
+
154
+ # Pattern 2: Look for systemd-style messages (e.g., "systemd[1]: Started...")
155
+ systemd_match = re.search(r'(systemd(?:-[a-z]+)?)\[?\d*\]?:\s*(.+)$', desc, re.IGNORECASE)
156
+ if systemd_match:
157
+ return f"{systemd_match.group(1)}: {systemd_match.group(2)}"
158
+
159
+ # Pattern 3: Look for kernel messages
160
+ kernel_match = re.search(r'kernel:\s*(.+)$', desc)
161
+ if kernel_match:
162
+ return f"kernel: {kernel_match.group(1)}"
163
+
164
+ # Pattern 4: Generic - find content after last colon that has substance
165
+ colon_parts = desc.split(': ')
166
+ if len(colon_parts) > 1:
167
+ # Get the meaningful part (usually after the first "process:" pattern)
168
+ for i, part in enumerate(colon_parts):
169
+ # Skip parts that look like timestamps or IPs
170
+ if not re.match(r'^(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec|\d{1,3}\.\d{1,3}|\d{4}-\d{2})', part):
171
+ # Found something meaningful - join from here
172
+ meaningful = ': '.join(colon_parts[i:])
173
+ if len(meaningful) > 10: # Ensure it's substantial
174
+ return meaningful
175
+
176
+ # Pattern 5: Strip leading timestamp patterns
177
+ # Remove patterns like "Jan 8 07:00:05 192.168.1.111 Jan 8 07:00:05 hostname"
178
+ stripped = re.sub(
179
+ r'^(?:[A-Z][a-z]{2}\s+\d+\s+\d{2}:\d{2}:\d{2}\s+\S+\s*)+',
180
+ '', desc
181
+ ).strip()
182
+
183
+ if stripped and len(stripped) > 5:
184
+ return stripped
185
+
186
+ # Fallback: return original if no patterns matched
187
+ return desc
188
+
189
+
133
190
  def _show_upgrade_prompt(feature_name: str):
134
191
  """Show upgrade prompt when FREE user tries to access Pro feature."""
135
192
  from rich.panel import Panel
@@ -5345,7 +5402,7 @@ def view_job_detail(job_id: int):
5345
5402
 
5346
5403
  # Check if tool has a parser - if yes, hide raw logs by default
5347
5404
  tool = job.get('tool', '')
5348
- has_parser = tool in ['dnsrecon', 'nmap', 'nuclei', 'nikto', 'dalfox', 'theharvester', 'sqlmap', 'ffuf', 'gobuster', 'wpscan', 'crackmapexec', 'hydra', 'whois', 'smbmap', 'enum4linux', 'msf_auxiliary', 'searchsploit']
5405
+ has_parser = tool in ['dnsrecon', 'nmap', 'ard', 'nuclei', 'nikto', 'dalfox', 'theharvester', 'sqlmap', 'ffuf', 'gobuster', 'wpscan', 'crackmapexec', 'hydra', 'whois', 'smbmap', 'enum4linux', 'msf_auxiliary', 'searchsploit']
5349
5406
 
5350
5407
  # Show log file if exists
5351
5408
  log_path = job.get('log')
@@ -5941,7 +5998,9 @@ def view_job_detail(job_id: int):
5941
5998
  pass
5942
5999
 
5943
6000
  # Parse and display Nmap results if available (only when not showing raw logs)
5944
- if not show_raw_logs and job.get('tool') == 'nmap' and job.get('status') in ['done', 'completed'] and log_path and os.path.exists(log_path):
6001
+ # ARD plugin uses nmap under the hood, so include it here
6002
+ nmap_based_tools = ['nmap', 'ard']
6003
+ if not show_raw_logs and job.get('tool') in nmap_based_tools and job.get('status') in ['done', 'completed'] and log_path and os.path.exists(log_path):
5945
6004
  try:
5946
6005
  from souleyez.parsers.nmap_parser import parse_nmap_output
5947
6006
  with open(log_path, 'r', encoding='utf-8', errors='replace') as f:
@@ -8898,7 +8957,8 @@ def _view_wazuh_alerts(engagement_id: int):
8898
8957
  icon = get_level_icon(level)
8899
8958
  rule_id = str(alert.get('rule_id', 'N/A'))[:10]
8900
8959
  agent_name = alert.get('agent_name', 'N/A')[:15]
8901
- desc = (alert.get('description') or 'No description')[:45]
8960
+ raw_desc = alert.get('description') or 'No description'
8961
+ desc = parse_syslog_description(raw_desc)[:45]
8902
8962
  ts = alert.get('timestamp', 'N/A')
8903
8963
  if hasattr(ts, 'strftime'):
8904
8964
  ts = ts.strftime('%Y-%m-%d %H:%M:%S')
@@ -9075,7 +9135,8 @@ def _view_alert_detail(alert: dict):
9075
9135
 
9076
9136
  # Get values from normalized format first, then fall back to raw_data
9077
9137
  rule_id = alert.get('rule_id') or rule.get('id', 'N/A')
9078
- description = alert.get('description') or rule.get('description', 'N/A')
9138
+ raw_description = alert.get('description') or rule.get('description', 'N/A')
9139
+ description = parse_syslog_description(raw_description)
9079
9140
  level = alert.get('level', 0) or rule.get('level', 0)
9080
9141
  severity = alert.get('severity', 'info')
9081
9142
 
@@ -15790,6 +15851,37 @@ def view_findings(engagement_id: int):
15790
15851
  summary_parts.append(f"Filters: {', '.join(active_filters)}")
15791
15852
 
15792
15853
  click.echo(" " + " | ".join(summary_parts))
15854
+
15855
+ # Show tool distribution legend
15856
+ if findings:
15857
+ tool_counts = {}
15858
+ for f in findings:
15859
+ tool = f.get('tool') or 'unknown'
15860
+ tool_counts[tool] = tool_counts.get(tool, 0) + 1
15861
+
15862
+ # Sort by count (descending) and format
15863
+ sorted_tools = sorted(tool_counts.items(), key=lambda x: x[1], reverse=True)
15864
+ tool_parts = [f"{tool}({count})" for tool, count in sorted_tools]
15865
+
15866
+ # Display on one or more lines if needed
15867
+ tool_legend = " Tools: " + " | ".join(tool_parts)
15868
+ if len(tool_legend) > width - 4:
15869
+ # Wrap to multiple lines if too long
15870
+ lines = []
15871
+ current_line = " Tools: "
15872
+ for i, part in enumerate(tool_parts):
15873
+ test_line = current_line + part + (" | " if i < len(tool_parts) - 1 else "")
15874
+ if len(test_line) > width - 4 and current_line != " Tools: ":
15875
+ lines.append(current_line.rstrip(" | "))
15876
+ current_line = " " + part + (" | " if i < len(tool_parts) - 1 else "")
15877
+ else:
15878
+ current_line = test_line
15879
+ lines.append(current_line.rstrip(" | "))
15880
+ for line in lines:
15881
+ click.echo(click.style(line, fg='cyan'))
15882
+ else:
15883
+ click.echo(click.style(tool_legend, fg='cyan'))
15884
+
15793
15885
  click.echo()
15794
15886
 
15795
15887
  if not findings:
@@ -95,6 +95,74 @@ def _configure_sudoers(tool_name: str, tool_path: str) -> bool:
95
95
  return False
96
96
 
97
97
 
98
+ def _install_desktop_shortcut():
99
+ """
100
+ Install desktop shortcut for SoulEyez in Applications menu.
101
+
102
+ This runs silently during setup - any errors are ignored to not
103
+ disrupt the setup flow.
104
+ """
105
+ try:
106
+ applications_dir = Path.home() / '.local' / 'share' / 'applications'
107
+ icons_dir = Path.home() / '.local' / 'share' / 'icons'
108
+ desktop_file = applications_dir / 'souleyez.desktop'
109
+ icon_dest = icons_dir / 'souleyez.png'
110
+
111
+ # Skip if already installed
112
+ if desktop_file.exists():
113
+ return
114
+
115
+ # Create directories
116
+ applications_dir.mkdir(parents=True, exist_ok=True)
117
+ icons_dir.mkdir(parents=True, exist_ok=True)
118
+
119
+ # Find and copy icon
120
+ try:
121
+ # Try importlib.resources first (Python 3.9+)
122
+ try:
123
+ from importlib.resources import files
124
+ icon_source = files('souleyez.assets').joinpath('souleyez-icon.png')
125
+ with open(icon_source, 'rb') as src:
126
+ icon_data = src.read()
127
+ except (ImportError, TypeError, FileNotFoundError):
128
+ # Fallback: find icon relative to this file
129
+ icon_source = Path(__file__).parent.parent / 'assets' / 'souleyez-icon.png'
130
+ with open(icon_source, 'rb') as src:
131
+ icon_data = src.read()
132
+
133
+ with open(icon_dest, 'wb') as dst:
134
+ dst.write(icon_data)
135
+ except Exception:
136
+ icon_dest = "utilities-terminal" # Fallback to system icon
137
+
138
+ # Create .desktop file
139
+ desktop_content = f"""[Desktop Entry]
140
+ Name=SoulEyez
141
+ Comment=AI-Powered Penetration Testing Platform
142
+ Exec=souleyez interactive
143
+ Icon={icon_dest}
144
+ Terminal=true
145
+ Type=Application
146
+ Categories=Security;System;Network;
147
+ Keywords=pentest;security;hacking;nmap;metasploit;
148
+ """
149
+
150
+ desktop_file.write_text(desktop_content)
151
+
152
+ # Update desktop database (optional)
153
+ try:
154
+ subprocess.run(['update-desktop-database', str(applications_dir)],
155
+ capture_output=True, check=False, timeout=5)
156
+ except Exception:
157
+ pass
158
+
159
+ click.echo(f" {click.style('✓', fg='green')} Desktop shortcut: Added to Applications menu")
160
+
161
+ except Exception:
162
+ # Silently ignore errors - desktop shortcut is nice-to-have
163
+ pass
164
+
165
+
98
166
  def _run_tool_installs(
99
167
  missing_tools: List[Dict],
100
168
  wrong_version_tools: List[Dict],
@@ -1106,6 +1174,9 @@ def _wizard_summary(encryption_enabled, engagement_info, tool_status, ai_enabled
1106
1174
  click.echo(" " + click.style("You're ready to start!", bold=True, fg='cyan'))
1107
1175
  click.echo()
1108
1176
 
1177
+ # Install desktop shortcut automatically
1178
+ _install_desktop_shortcut()
1179
+
1109
1180
  # Prompt for interactive tutorial
1110
1181
  click.echo(" ┌" + "─" * 56 + "┐")
1111
1182
  click.echo(" │" + click.style(" Would you like to run the interactive tutorial?", fg='cyan').center(65) + "│")
souleyez/ui/tool_setup.py CHANGED
@@ -542,6 +542,9 @@ def run_tool_setup(check_only: bool = False, install_all: bool = False):
542
542
 
543
543
  def _run_post_install_tasks(console, distro: str):
544
544
  """Run tasks that should happen after tool installation or when all tools are present."""
545
+ # Ensure PATH is configured in shell rc files
546
+ _add_paths_to_shell_rc()
547
+
545
548
  # Configure passwordless sudo for privileged scans
546
549
  _configure_sudoers(console)
547
550
 
@@ -721,6 +721,7 @@ def check_msfdb_status() -> Dict[str, any]:
721
721
  - message: str - Human-readable status message
722
722
  """
723
723
  import subprocess
724
+ from pathlib import Path
724
725
 
725
726
  result = {
726
727
  'initialized': False,
@@ -734,6 +735,32 @@ def check_msfdb_status() -> Dict[str, any]:
734
735
  result['message'] = 'msfdb command not found - Metasploit may not be installed'
735
736
  return result
736
737
 
738
+ # Helper to check if PostgreSQL is running
739
+ def check_postgresql_running() -> bool:
740
+ try:
741
+ proc = subprocess.run(
742
+ ['systemctl', 'is-active', 'postgresql'],
743
+ capture_output=True,
744
+ text=True,
745
+ timeout=5
746
+ )
747
+ return proc.returncode == 0 and 'active' in proc.stdout.lower()
748
+ except Exception:
749
+ return False
750
+
751
+ # Helper to check system-wide MSF database config (Kali fallback)
752
+ def check_system_config() -> bool:
753
+ """Check if system-wide database.yml exists with valid PostgreSQL config."""
754
+ config_path = Path('/usr/share/metasploit-framework/config/database.yml')
755
+ if config_path.exists():
756
+ try:
757
+ content = config_path.read_text()
758
+ # Check for PostgreSQL adapter configuration
759
+ return 'adapter: postgresql' in content and 'database: msf' in content
760
+ except Exception:
761
+ return False
762
+ return False
763
+
737
764
  try:
738
765
  # Run msfdb status
739
766
  proc = subprocess.run(
@@ -743,10 +770,23 @@ def check_msfdb_status() -> Dict[str, any]:
743
770
  timeout=10
744
771
  )
745
772
  output = proc.stdout + proc.stderr
746
-
747
- # Parse output for status indicators
748
773
  output_lower = output.lower()
749
774
 
775
+ # Check if msfdb requires root (common on Kali)
776
+ if 'run as root' in output_lower or (proc.returncode != 0 and 'error' in output_lower):
777
+ # Fall back to checking system config file and PostgreSQL status
778
+ result['running'] = check_postgresql_running()
779
+ if check_system_config():
780
+ result['initialized'] = True
781
+ if result['running']:
782
+ result['connected'] = True
783
+ result['message'] = 'Database initialized and running'
784
+ else:
785
+ result['message'] = 'Database initialized but PostgreSQL not running - run: sudo systemctl start postgresql'
786
+ else:
787
+ result['message'] = 'Need sudo to verify - run: sudo msfdb status'
788
+ return result
789
+
750
790
  # Check if database is initialized
751
791
  if 'no database' in output_lower or 'not initialized' in output_lower:
752
792
  result['message'] = 'Database not initialized - run: msfdb init'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: souleyez
3
- Version: 2.23.0
3
+ Version: 2.27.1
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>
@@ -51,6 +51,12 @@ Dynamic: license-file
51
51
 
52
52
  # SoulEyez Beta Program
53
53
 
54
+ [![CI](https://github.com/cyber-soul-security/souleyez/actions/workflows/python-ci.yml/badge.svg)](https://github.com/cyber-soul-security/souleyez/actions/workflows/python-ci.yml)
55
+ [![codecov](https://codecov.io/gh/cyber-soul-security/souleyez/branch/main/graph/badge.svg)](https://codecov.io/gh/cyber-soul-security/souleyez)
56
+ [![Python 3.9+](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/downloads/)
57
+ [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
58
+ [![Security: bandit](https://img.shields.io/badge/security-bandit-yellow.svg)](https://github.com/PyCQA/bandit)
59
+
54
60
  Welcome to the SoulEyez beta! Thank you for helping us test and improve this penetration testing management platform.
55
61
 
56
62
  ---
@@ -72,7 +78,7 @@ Welcome to the SoulEyez beta! Thank you for helping us test and improve this pen
72
78
 
73
79
  > ⚠️ **Important**: Only use SoulEyez on systems you have explicit authorization to test.
74
80
 
75
- ## Version: 2.23.0
81
+ ## Version: 2.27.1
76
82
 
77
83
  ### What's Included
78
84
 
@@ -110,6 +116,17 @@ Welcome to the SoulEyez beta! Thank you for helping us test and improve this pen
110
116
  - **Python**: 3.8 or newer
111
117
  - **Storage**: ~500MB for SoulEyez + tools
112
118
 
119
+ > **🐉 Kali Linux Recommended**
120
+ >
121
+ > SoulEyez performs significantly better on **Kali Linux** than other distributions:
122
+ > - All pentesting tools pre-installed and optimized
123
+ > - Metasploit database and RPC already configured
124
+ > - Security-focused kernel and networking stack
125
+ > - No dependency hunting or version conflicts
126
+ > - Wordlists, databases, and tool configs ready to go
127
+ >
128
+ > While Ubuntu and other Debian-based distros are supported, you may experience slower setup times and occasional tool compatibility issues.
129
+
113
130
  ### Known Issues
114
131
 
115
132
  - Very large scan outputs (>10MB) may slow the interface
@@ -299,4 +316,4 @@ Happy hacking! 🛡️
299
316
 
300
317
  ---
301
318
 
302
- **Version**: 2.23.0 | **Release Date**: January 2026 | **Maintainer**: CyberSoul Security
319
+ **Version**: 2.27.1 | **Release Date**: January 2026 | **Maintainer**: CyberSoul Security
@@ -1,10 +1,10 @@
1
- souleyez/__init__.py,sha256=Gfo1bPtx3vXPruBuKBhFTBXQMeD59Ul8vKsAH84yQsk,23
1
+ souleyez/__init__.py,sha256=DCZYmUbJ3L06l0IpvF_tgXmfnxVH810CXC0q6BS-Sbo,23
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=apVMU33AxgtFm1DF_AzHeM4fDAxtQ8xG1TIzicrEWDI,118990
7
+ souleyez/main.py,sha256=TEX0N6aDqH7jHV84vfKMBJRh8vcVSNcU0PNojXxD7tA,122774
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
@@ -28,6 +28,8 @@ souleyez/ai/report_prompts.py,sha256=5LjCoqYfDtXGHp9oevgrX9avhzMJdfnx1YmPNnuTaeM
28
28
  souleyez/ai/report_service.py,sha256=N5yVMCGeNcrtFPMTV4eROZbVyh6QLLlLaJNBl-G_7L4,14130
29
29
  souleyez/ai/result_parser.py,sha256=nB38fxo7PcQxLqGx2eJ2FC2vsDAZIa-jd2LG251fSls,16155
30
30
  souleyez/ai/safety.py,sha256=6xIeXFbOLw7hXrwbAkO8eNdylEdFd5hQSe-LodyR0po,5374
31
+ souleyez/assets/__init__.py,sha256=q_whKfZE_dG80ZYzbRA1WbW4TPr5YkRGjZujHof_Dhg,26
32
+ souleyez/assets/souleyez-icon.png,sha256=pKhXWuUH3y--9GyD7hmyq8CWiPOYwh_MCm9iykljk_c,11978
31
33
  souleyez/auth/__init__.py,sha256=9oCzIyabC1MgboYBXYoSa34jGS8teHLdhnLfbAaMLDE,2171
32
34
  souleyez/auth/audit.py,sha256=fucBP0s0cpB1wgJE4sG1UDrupfxoNTPCmEPMyGPBOhs,9638
33
35
  souleyez/auth/engagement_access.py,sha256=b3XafCq7XDMe5f9Po3o7O1EnWwOWb0mi0WZCeQC1K4A,10852
@@ -52,12 +54,12 @@ souleyez/core/msf_database.py,sha256=xaGt0wMX15CQv3-s2NobLK8niHgrE98qAkmS9zhrLe8
52
54
  souleyez/core/msf_integration.py,sha256=J9EXecxq72q65Itv1lBqjSkhh8Zx6SbZO2VPtlZXuOg,64842
53
55
  souleyez/core/msf_rpc_client.py,sha256=DL-_uJz_6G1pQud8iTg3_SjRJmgl4-W1YWmb0xg6f8Q,15994
54
56
  souleyez/core/msf_rpc_manager.py,sha256=8irWzXdiASVIokGSTf8DV57Uh_DUJ3Q6L-2oR9y8qeI,15572
55
- souleyez/core/msf_sync_manager.py,sha256=iEZ8_CJNdFAaEpp4PecIqrqslSH5oR23qrfJnrPntOg,27354
57
+ souleyez/core/msf_sync_manager.py,sha256=1alAqM2jHiMxbBdPTQL9Vjzbl8XVhrnS2VYhVdfNwUw,27779
56
58
  souleyez/core/network_utils.py,sha256=-4WgUE91RBzyXDFgGTxMa0zsWowJ47cEOAKXNeVa-Wc,4555
57
59
  souleyez/core/parser_handler.py,sha256=cyZtEDctqMdWgubsU0Jg6o4XqBgyfaJ_AeBHQmmv4hM,5564
58
60
  souleyez/core/pending_chains.py,sha256=Dnka7JK7A8gTWCGpTu6qrIgIDIXprkZmwJ0Rm2oWqRE,10972
59
61
  souleyez/core/templates.py,sha256=DzlXlAz8_lwAFjjUWPp3r81KCCzbNeK-bkN1IlgQBSU,18112
60
- souleyez/core/tool_chaining.py,sha256=hJ5uTI38blqJYexkCZOlxCR8KyrwI5vOGpqfdn1y5zo,270431
62
+ souleyez/core/tool_chaining.py,sha256=1OhSpo3JRj1bbhO5KjprZliYFnInfmi6QQx8QZxOuvE,275414
61
63
  souleyez/core/version_utils.py,sha256=UOrOa3qfUdLKdzWT6GAGNV9TauwinXyLyelS8sOk0eE,11769
62
64
  souleyez/core/vuln_correlation.py,sha256=U69MSI5I-AtiyOAbXohGDKMpEHRW9y4G_0M1ppRGX18,14765
63
65
  souleyez/core/web_utils.py,sha256=f-Dqa6tH8ROnygn6-k7J1y8Qz2f1FmeJnPjPE0WRn34,4902
@@ -102,7 +104,7 @@ souleyez/detection/__init__.py,sha256=QIhvXjFdjrquQ6A0VQ7GZQkK_EXB59t8Dv9PKXhEUe
102
104
  souleyez/detection/attack_signatures.py,sha256=akgWwiIkh6WYnghCuLhRV0y6FS0SQ0caGF8tZUc49oA,6965
103
105
  souleyez/detection/mitre_mappings.py,sha256=xejE80YK-g8kKaeQoo-vBl8P3t8RTTItbfN0NaVZw6s,20558
104
106
  souleyez/detection/validator.py,sha256=-AJ7QSJ3-6jFKLnPG_Rc34IXyF4JPyI82BFUgTA9zw0,15641
105
- souleyez/docs/README.md,sha256=0lxLcTBckFxVigWPoKJ-_PZnqidWk9An7LQKfK2bjrE,7183
107
+ souleyez/docs/README.md,sha256=lV7hWl6j5zw13dOqhC2JVzuwFR-IDg1MVbrHEG3Lw-0,7183
106
108
  souleyez/docs/api-reference/cli-commands.md,sha256=lTLFnILN3YRVdqCaag7WgsYXfDGglb1TuPexkxDsVdE,12917
107
109
  souleyez/docs/api-reference/engagement-api.md,sha256=nd-EvQMtiJrobg2bzFEADp853HP1Uhb9dmgok0_-neE,11672
108
110
  souleyez/docs/api-reference/integration-guide.md,sha256=c96uX79ukHyYotLa54wZ20Kx-EUZnrKegTeGkfLD-pw,16285
@@ -126,13 +128,13 @@ souleyez/docs/security/threat-model.md,sha256=JcR5AR-l977-7HTe5O2LULBikaxJovcxHE
126
128
  souleyez/docs/user-guide/ai-integration.md,sha256=erC3Svg6XosKhT1BoHRQ98PUp71OdNQ6bkJIh7shN_Y,8859
127
129
  souleyez/docs/user-guide/attack-surface.md,sha256=9QabVuuPkCNNDgAXx_Yerbtmnk61lPkU8Gjl_M6-rG8,12924
128
130
  souleyez/docs/user-guide/auto-chaining.md,sha256=UjQ8J8rBgukQIikIrH3U7XoX0WF8EHO_a9i3qDomsXg,21144
129
- souleyez/docs/user-guide/configuration.md,sha256=7-CKFcJ4MpE_MMBAKI0IsCG65uSzETpVIpbwFkUOQFY,14649
131
+ souleyez/docs/user-guide/configuration.md,sha256=PT01AWD0AINtXmh12Qh-Md0FXkSvXo2Yo6BZInZ3fMo,14650
130
132
  souleyez/docs/user-guide/deliverables-screenshots.md,sha256=D5ATXKZRhwXu8OsGMEEUzbXW3hJl-qTh4wsUPx8gNUA,15148
131
133
  souleyez/docs/user-guide/dependencies.md,sha256=WOPilg0W0U3KnsdGREkM5_gAG7Rr5P10oco7qDKkJEY,7475
132
134
  souleyez/docs/user-guide/evidence-vault.md,sha256=PNg7cIUlVXr41iMJTi66j4qUV2fkrPATljunx0pD5sI,9454
133
135
  souleyez/docs/user-guide/exploit-suggestions.md,sha256=Qv9CPwDe9ypKoeUG3XAL6dtg4YA5PmlE5DA6JVHK4Nk,17971
134
136
  souleyez/docs/user-guide/getting-started.md,sha256=4QfZiQlYnReORAUpsy2gWzKe1uFHOePZyzDSz8zldgc,20932
135
- souleyez/docs/user-guide/installation.md,sha256=HGD4G2UYydiO-lp_VEvyClLtyBqnpqq52IuE6_al8lQ,13911
137
+ souleyez/docs/user-guide/installation.md,sha256=uM_qBpgG5YjkxSf8u6gUJh0TGYtPlo4pbn_wEXJHX0Q,14431
136
138
  souleyez/docs/user-guide/metasploit-integration.md,sha256=kSCai2PO4kiv3BEUSXa6mIC3vCdqIA70GyLVQH_Kaj4,10026
137
139
  souleyez/docs/user-guide/rbac.md,sha256=ULY5IbTCoNGOnvRrT1oH5XayCqD10PKoUwRDBRzpK2g,21055
138
140
  souleyez/docs/user-guide/report-generation.md,sha256=7Qe47jfPxmZ4U1uuM3kggPLQ6JM7_TCOOhYIvYen4Ao,20754
@@ -143,14 +145,14 @@ souleyez/docs/user-guide/uninstall.md,sha256=gDknetFhjZ0tnYk4JqhLa369NT4bIRb50rm
143
145
  souleyez/docs/user-guide/worker-management.md,sha256=hNu6eSTVb6XM4Zbb0I9Y5aL4AA2EiWOSFI6iGjn17kU,12035
144
146
  souleyez/docs/user-guide/workflows.md,sha256=4EyZKWRyuWf9wrENJwtidWKN25PGis1Pk33HIHk5UHM,22261
145
147
  souleyez/engine/__init__.py,sha256=THI_89hQfAPJDsfzDcur6H9sEGhGAnTxSNim7UOExYc,110
146
- souleyez/engine/background.py,sha256=ss8q0LexT6LPWB2bZHyPBjphB-BY9lNdrA6jyitD6sE,65224
148
+ souleyez/engine/background.py,sha256=HnzpN8P6TcDNxLW4R2re2cgBbBsEOfCdshiCOfJDx-g,83140
147
149
  souleyez/engine/base.py,sha256=G35U1d-fygUvzmHH8zxLXw-vyQ9JzcfhGaSYOsHJtzQ,728
148
150
  souleyez/engine/job_status.py,sha256=OAEf2rAzapm55m4tc3PSilotdA5ONX15JavUMLre0is,2685
149
151
  souleyez/engine/loader.py,sha256=ke6QQVVWozDnqGNBotajC3RBYOa2_DZmv5DAnDZVgIc,2769
150
152
  souleyez/engine/log_sanitizer.py,sha256=QHF6zSms-wHo6SbL6fHXIh1GG-8G34lE7kl45nbPn70,7130
151
153
  souleyez/engine/manager.py,sha256=aBQMoib-VWNXtIp5Qn34tRj1P1jiLpwAIoo1fexAaLU,3629
152
- souleyez/engine/result_handler.py,sha256=FJNqy-_UUJaKhzZAGGrcTr0WcneRqmgyyAsYAepBolU,126062
153
- souleyez/engine/worker_manager.py,sha256=exepzHnyUc2PpAxVJSdrU7LCrlm-s6JBMgQyivSV46Y,2905
154
+ souleyez/engine/result_handler.py,sha256=IIESU1rGDR3W7yZcZzDyfBTCIVZtHifS8HQv5Ns0eoE,136657
155
+ souleyez/engine/worker_manager.py,sha256=B7b8RbkKTNofmiIyHTNgdikoZCLXpB-iIl1S4-U3q9o,6127
154
156
  souleyez/export/__init__.py,sha256=2kFHftSqqrRUG6PhtfhCyhnkpkjc-8Zb4utGo-Nb6B4,61
155
157
  souleyez/export/evidence_bundle.py,sha256=hqPn_h2CidhL-1VAT0qraZ8r1yfnUTnLZ3RfPPCK5Ds,9966
156
158
  souleyez/feature_flags/__init__.py,sha256=shd9UIGrNh_1jnHhKeGxWpwbBnFxd-UjgVyOZPYE7DE,42
@@ -189,25 +191,26 @@ souleyez/migrations/__init__.py,sha256=S4ZorUykM6txYkZHuQ64QbzHWeNQ3QDFP-PvgMPbp
189
191
  souleyez/migrations/fix_job_counter.py,sha256=-NSm7TQaGln5ut2vYVyJ7fPFOliX2rD7lPUQngPx04w,2423
190
192
  souleyez/parsers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
191
193
  souleyez/parsers/bloodhound_parser.py,sha256=r1f5ePsuPc90CJOySnZ6WkfYQoeVJWraTiE7dnI8BbI,3134
192
- souleyez/parsers/crackmapexec_parser.py,sha256=1dzS_jGzTulODVsupCBGttidSAX6l4JeMmO051MHYgc,8056
194
+ souleyez/parsers/crackmapexec_parser.py,sha256=HN3nCBMdCEoP1OuYPLmf080b2YmMphZ7Wtm1ByrKGu0,10849
193
195
  souleyez/parsers/dalfox_parser.py,sha256=w_eCeyL-Eu9zGyXqYmq0XKbnOIR7lnDD-zbRT7SPco0,6856
194
- souleyez/parsers/dnsrecon_parser.py,sha256=sFVZ4ag2CMBLgTOQyE1qKjRUdZpA6iMv9f3zHVY-MlA,7364
195
- souleyez/parsers/enum4linux_parser.py,sha256=ycMiVKsBHEu4zOJpl337kccx9WLQgVjyYGr-Q_B_7Lw,14324
196
+ souleyez/parsers/dnsrecon_parser.py,sha256=zy9_d-dxVSWSSNy7UgMQ2J_r8uoPacHiAMwkAjomXcM,7885
197
+ souleyez/parsers/enum4linux_parser.py,sha256=8C9VQ0f-VzKFBkRmScPM84Q8CYvPwidBuQFLH2TJ48c,17728
196
198
  souleyez/parsers/ffuf_parser.py,sha256=xoLicqbwjgJqMrkGEyUFmBIx1Jn7t2OG7OtXkN-wvUE,1706
197
199
  souleyez/parsers/gobuster_parser.py,sha256=-DS8fpA7uoSKhrGnoMdjowhl7OcitAPoEee-LXiogYs,5960
198
200
  souleyez/parsers/hashcat_parser.py,sha256=fQl8r9xko5dbbUXAYJEQonUhrp9gqK5WnJioAAk3TsU,5036
199
- souleyez/parsers/hydra_parser.py,sha256=EAqtfj7Wtr6UhzogaIN3ArCKH38025VaAev4RNdG6Lw,10971
200
- souleyez/parsers/impacket_parser.py,sha256=yADVWMlBveRXJGol1wS_scH417wXxcxqEmTjt92dd3Y,9200
201
- souleyez/parsers/john_parser.py,sha256=PcWWbLFdQNKq7oGFAvJ85JG9JHAw-lwKWgdMgydCjYg,6194
202
- souleyez/parsers/msf_parser.py,sha256=rn2YwAzccRAWciWFBaH0IcbXOsJORCkWmoimhGWADQU,39495
201
+ souleyez/parsers/http_fingerprint_parser.py,sha256=UESf59YQwMxplBV2cr7ZrZW8qv2kxawaYQxAUAGuVrs,9629
202
+ souleyez/parsers/hydra_parser.py,sha256=lTB_ja18ZEyrLrQAyovqaq_5MyyN5Flij7WeZ6xOsUg,13249
203
+ souleyez/parsers/impacket_parser.py,sha256=RV9ZU3aPn7UWM5blZsRMLTKlQvygc0rPAsCC0sJSNvI,12541
204
+ souleyez/parsers/john_parser.py,sha256=M-vzMoiC5E7UXeDv38n6cTZZnimdtQA40Ky6LEALYOw,7734
205
+ souleyez/parsers/msf_parser.py,sha256=DlpIcwwV5HzHoNZiLPTMDoQca_6vwO2dH23ci3u9GRg,40428
203
206
  souleyez/parsers/nikto_parser.py,sha256=faNxu1S1FhLble9lVN4Xjr5v2u3kzGKStdvsKO2CpH0,7160
204
- souleyez/parsers/nmap_parser.py,sha256=puqOeGtmgJGUMZLt26-5BCyRENXkVcjLnCJLB-X7Lfs,28802
207
+ souleyez/parsers/nmap_parser.py,sha256=LXZWGZVf7VdZhPPUe6q_Hgb22jlSSj5XRt2aUl3qeWc,30106
205
208
  souleyez/parsers/nuclei_parser.py,sha256=Magk6ID5WJNtGOGP7e6-R12pgtYcGdoFHmuB68fOTlo,3975
206
209
  souleyez/parsers/responder_parser.py,sha256=3LInW7ZnrSyktlpk8Boid1ftcdGf8SaSBfMpcLGzJ2g,3494
207
210
  souleyez/parsers/searchsploit_parser.py,sha256=XEXkpN0uixS85WvhtSXZslv2ELXQM7l9q0T5v79GUok,7560
208
- souleyez/parsers/smbmap_parser.py,sha256=3_MdS32HoG47-6-IXwpAd8L2QZ82fIVNpv8wOSpMf8w,12543
209
- souleyez/parsers/sqlmap_parser.py,sha256=P8FZ8EP_zt3yLFpMnKs34YXotlUx7fw8g8grnN4lwDI,34716
210
- souleyez/parsers/theharvester_parser.py,sha256=j2eV8t7vh4GxUBUPVh_ru4aYCu1MKKmelxUu-5lJY-Y,5045
211
+ souleyez/parsers/smbmap_parser.py,sha256=cKK026Bhs2m6jLKk_S706XaYb0plG75OHhDiTjcZnzU,13395
212
+ souleyez/parsers/sqlmap_parser.py,sha256=CYh4rpxrdSgkJdQLWqWzERTmloKsBUqLZA_1fpR8de4,35413
213
+ souleyez/parsers/theharvester_parser.py,sha256=Pu9lQ8ip3FAt-XlwSnTpLqaTLHVpK5nSRFSxCNrz-YI,5844
211
214
  souleyez/parsers/whois_parser.py,sha256=o0dUR0Ow2HNXV_3SksCtX8DvblJ0X1fjSDtEmRVUu8c,9451
212
215
  souleyez/parsers/wpscan_parser.py,sha256=qKxJitB7_yOAoGc-2WwtYFRztRv8-utGipfQrzUG6J8,15014
213
216
  souleyez/plugins/__init__.py,sha256=ZuA8EzOdz7SvbB1kAj6pnyjgPLZShINGZAiSwEDZ0Bo,109
@@ -224,6 +227,7 @@ souleyez/plugins/ffuf.py,sha256=7c1-Q7xXTMmH_2wHXikjmZnSgZL13Hj5E_asBxZ6Y5U,1165
224
227
  souleyez/plugins/firmware_extract.py,sha256=_hZXx6cHb9noM6uVgi3hwrJLw8hE9mDUelTEHwoIdCU,6460
225
228
  souleyez/plugins/gobuster.py,sha256=GMTUyfkVnZ2gp3kh_R-KQ4EIGEBX5fxBIMfHZrwkVFo,29285
226
229
  souleyez/plugins/hashcat.py,sha256=aigfwBu9IorXKgbyEIWx0qOCEdr1wnZaPqdYwh0PITc,10381
230
+ souleyez/plugins/http_fingerprint.py,sha256=_D5UVAtDC0f-uy4pQcBI43c4jnsJ5wyvCIvttUiVurw,21202
227
231
  souleyez/plugins/hydra.py,sha256=kfVJwgh3x1DC0wEtA-lkoY7qhQH1qKViYexUECZSPY4,29520
228
232
  souleyez/plugins/impacket_getnpusers.py,sha256=6TBxVTO9NGUbn5ShV-dCxPP11CFqf-Y3lAgt8_oP2Vg,8652
229
233
  souleyez/plugins/impacket_psexec.py,sha256=gU_MDSazDMj1TeWm5V9cD6wrLe3ULwbDv4jhg3Vm2rQ,8813
@@ -236,7 +240,7 @@ souleyez/plugins/msf_auxiliary.py,sha256=pOL9yLJr_L0niwaHLPguM2Gaunr3iAe7HdIFbDL
236
240
  souleyez/plugins/msf_exploit.py,sha256=BNAZz5EO4jgwx64dEB4OE-CQdYkqJk5N4eXT140DRqs,23765
237
241
  souleyez/plugins/nikto.py,sha256=_BPzypwNTliBg2Tr6sPGMKYFTvnQgqEHO1xesDZ-6uo,9957
238
242
  souleyez/plugins/nmap.py,sha256=Bh3xauEfsDw_hxSarNfLN-J6tNda-mG3DqHHkphpttE,15997
239
- souleyez/plugins/nuclei.py,sha256=wIqlkwfLvn2NfHog8Z_P7roxMFyJs0xmuclL584UaqI,14999
243
+ souleyez/plugins/nuclei.py,sha256=A2pbSVFGJCu1QlokpV4-d4SJWw4Yv8FrQiLHE9lwRfc,15862
240
244
  souleyez/plugins/plugin_base.py,sha256=zB0wzZBBx5V63Ipc7CUEApYADLC8T-A__CLnTaXb49A,6731
241
245
  souleyez/plugins/plugin_template.py,sha256=Tcd_JrCBNgT1o88On4vjG5Y7mlGSVGh-hXyUak_KXlE,1786
242
246
  souleyez/plugins/responder.py,sha256=ImhISPLtvzqvJSUQrgavlZ_h9ZrJ4s9NrTkPAhEcHQM,13160
@@ -338,7 +342,7 @@ souleyez/ui/export_view.py,sha256=0nQvVsKk7FU4uRzSfJ_qBZh_Lfn8hgGA2rbJ5bNg5-Y,65
338
342
  souleyez/ui/gap_analysis_view.py,sha256=AytAOEBq010wwo9hne1TE-uJpY_xicjLrFANbvN3r3w,30727
339
343
  souleyez/ui/help_system.py,sha256=nKGxLaMi-TKYs6xudTyw_tZqBb1cGFEuYYh6N-MAsJE,16648
340
344
  souleyez/ui/intelligence_view.py,sha256=VeAQ-3mANRnLIVpRqocL3JV0HUmJtADdxDeC5lzQhE0,32168
341
- souleyez/ui/interactive.py,sha256=3jhlwxhrc0NzGTsYNiakWcdB516Gn2wNzYbgzpT7jR8,1371279
345
+ souleyez/ui/interactive.py,sha256=d-fGuSDG1n2a5GeF1aY_mZMTDWqMsQfBB2_-1kpSobw,1375354
342
346
  souleyez/ui/interactive_selector.py,sha256=6A51fgmFRnemBY0aCPHIhK2Rpba16NjSGKLzC0Q5vI8,16407
343
347
  souleyez/ui/log_formatter.py,sha256=akhIkYoO_cCaKxS1V5N3iPmIrHzgsU7pmsedx70s9TI,3845
344
348
  souleyez/ui/menu_components.py,sha256=N8zq2QXGmfaLJ08l53MMYt1y-5LRWgpZH6r8nXHonj8,3519
@@ -347,7 +351,7 @@ souleyez/ui/pending_chains_view.py,sha256=FTxBbZ6zVgYC2dFqppx2GIHkwcS7TcFPgmck6A
347
351
  souleyez/ui/progress_indicators.py,sha256=CqAbnz_c6A7UHtGvsZwTCR2tcQkiCZpqVIyldvbhRio,4709
348
352
  souleyez/ui/recommendations_view.py,sha256=MbfDzOWrvZziRHg74O3KXU237MX7UrCj33jj0apSGwQ,10590
349
353
  souleyez/ui/rule_builder.py,sha256=GbH1JyqyG2XAbC2Utjlqm0hcjDYbIRXcaFzU0gpa_iY,19089
350
- souleyez/ui/setup_wizard.py,sha256=vTkNTmDZnKU0UCIWt7N83pVzsScq4AJdAkHam7k1Kx0,46613
354
+ souleyez/ui/setup_wizard.py,sha256=flzJqN5KhoALNmwnZ4edvic4lyq4i-nbb-ar2gcC6no,49056
351
355
  souleyez/ui/shortcuts.py,sha256=2rKWOh5H1LfHeP7dF3_iAbBE0_LhXILlUH4NfA98Ge8,10988
352
356
  souleyez/ui/splunk_gap_analysis_view.py,sha256=pjEVnXw7AUVDCRSgzAqf4OdjFDEor8ti9gcplXrkJ7o,39909
353
357
  souleyez/ui/splunk_vulns_view.py,sha256=sRHP8DpoUeDb9BIZuClq7Hl1po7dYnMeYlo-c0XUoKQ,13740
@@ -355,15 +359,15 @@ souleyez/ui/team_dashboard.py,sha256=ejM_44nbJbEIPxxxdEK7SCPcqQtcuJLjoO-C53qED2Y
355
359
  souleyez/ui/template_selector.py,sha256=qQJkFNnVjYctb-toeYlupP_U1asGrJWYi5-HR89Ab9g,19103
356
360
  souleyez/ui/terminal.py,sha256=Sw9ma1-DZclJE1sENjTZ3Q7r-Ct1NiB3Lpmv-RZW5tE,2372
357
361
  souleyez/ui/timeline_view.py,sha256=Ze8Mev9VE4_ECdNFEJwZK2V42EBguR83uCCdwAbJqmc,11111
358
- souleyez/ui/tool_setup.py,sha256=1PEWz0CpgeLjn0QZergH9Hzsd0qJZNXjV4e3gyzc-bE,32511
362
+ souleyez/ui/tool_setup.py,sha256=pkOUr-1inZlYnvaIc8Kj-Qaxk2KHWR2opJAgI_Er-Wo,32591
359
363
  souleyez/ui/tutorial.py,sha256=GGbBsze0ioL00WBWKEwPKy1ikegP1eusI2REDVMx4gY,14262
360
364
  souleyez/ui/tutorial_state.py,sha256=Thf7_qCj4VKjG7UqgJqa9kjIqiFUU-7Q7kG4v-u2B4A,8123
361
365
  souleyez/ui/wazuh_vulns_view.py,sha256=3vJJEmrjgS2wD6EDB7ZV7WxgytBHTm-1WqNDjp7lVEI,21830
362
366
  souleyez/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
363
- souleyez/utils/tool_checker.py,sha256=98G61Mp62P0wzzQ8QAdbnse3Ld2eKFe84PjrFHnXboY,28955
364
- souleyez-2.23.0.dist-info/licenses/LICENSE,sha256=J7vDD5QMF4w2oSDm35eBgosATE70ah1M40u9W4EpTZs,1090
365
- souleyez-2.23.0.dist-info/METADATA,sha256=b8F6zhXI0yv8Got_iyRNJ87Eo2IJUXRIOMu6KPRpMSc,10171
366
- souleyez-2.23.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
367
- souleyez-2.23.0.dist-info/entry_points.txt,sha256=bN5W1dhjDZJl3TKclMjRpfQvGPmyrJLwwDuCj_X39HE,48
368
- souleyez-2.23.0.dist-info/top_level.txt,sha256=afAMzS9p4lcdBNxhGo6jl3ipQE9HUvvNIPOdjtPjr_Q,9
369
- souleyez-2.23.0.dist-info/RECORD,,
367
+ souleyez/utils/tool_checker.py,sha256=kQcXJVY5NiO-orQAUnpHhpQvR5UOBNHJ0PaT0fBxYoQ,30782
368
+ souleyez-2.27.1.dist-info/licenses/LICENSE,sha256=J7vDD5QMF4w2oSDm35eBgosATE70ah1M40u9W4EpTZs,1090
369
+ souleyez-2.27.1.dist-info/METADATA,sha256=GlHqMvLdOjRtM1yYeUPfY5RCilFwx9sGrCl_4DQXv7A,11345
370
+ souleyez-2.27.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
371
+ souleyez-2.27.1.dist-info/entry_points.txt,sha256=bN5W1dhjDZJl3TKclMjRpfQvGPmyrJLwwDuCj_X39HE,48
372
+ souleyez-2.27.1.dist-info/top_level.txt,sha256=afAMzS9p4lcdBNxhGo6jl3ipQE9HUvvNIPOdjtPjr_Q,9
373
+ souleyez-2.27.1.dist-info/RECORD,,