souleyez 2.26.0__py3-none-any.whl → 2.28.0__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 +1 @@
1
- __version__ = '2.26.0'
1
+ __version__ = '2.28.0'
@@ -591,6 +591,23 @@ class ChainRule:
591
591
  if svc_port in group.get('ports', []):
592
592
  port = str(svc_port)
593
593
  break
594
+ elif 'has:services' in self.trigger_condition:
595
+ # For has:services condition, extract port from the services array
596
+ # Prioritize HTTP services for web tools (gobuster, nuclei, etc.)
597
+ services = context.get('services', [])
598
+ http_ports = {80, 443, 8080, 8443, 8000, 8888, 3000, 5000}
599
+
600
+ # First pass: look for HTTP service by name or common HTTP ports
601
+ for svc in services:
602
+ svc_name = svc.get('service_name', '').lower()
603
+ svc_port = svc.get('port')
604
+ if svc_name == 'http' or svc_name == 'https' or svc_port in http_ports:
605
+ port = str(svc_port)
606
+ break
607
+
608
+ # Second pass: if no HTTP service, use the first service's port
609
+ if not port and services:
610
+ port = str(services[0].get('port', ''))
594
611
 
595
612
  # Calculate subnet for {subnet} placeholder (e.g., 10.0.0.88 → 10.0.0.0/24)
596
613
  subnet = ''
@@ -5827,18 +5844,25 @@ class ToolChaining:
5827
5844
  # Auto mode: enqueue immediately
5828
5845
  print(f" 🔗 Chaining {cmd['tool']} for {cmd_target}: {cmd['reason']}")
5829
5846
  # enqueue_job will acquire _lock again (nested lock is safe - same thread)
5830
- job_id = enqueue_job(
5831
- tool=cmd['tool'],
5832
- target=cmd_target,
5833
- args=resolved_args,
5834
- label=source_tool,
5835
- engagement_id=engagement_id,
5836
- parent_id=parent_job_id,
5837
- reason=cmd.get('reason', f"Auto-chain from {source_tool}"),
5838
- metadata=cmd.get('metadata'), # Pass through deduplication metadata
5839
- rule_id=cmd.get('rule_id') # Pass rule ID for tracking
5840
- )
5841
- job_ids.append(job_id)
5847
+ try:
5848
+ job_id = enqueue_job(
5849
+ tool=cmd['tool'],
5850
+ target=cmd_target,
5851
+ args=resolved_args,
5852
+ label=source_tool,
5853
+ engagement_id=engagement_id,
5854
+ parent_id=parent_job_id,
5855
+ reason=cmd.get('reason', f"Auto-chain from {source_tool}"),
5856
+ metadata=cmd.get('metadata'), # Pass through deduplication metadata
5857
+ rule_id=cmd.get('rule_id') # Pass rule ID for tracking
5858
+ )
5859
+ job_ids.append(job_id)
5860
+ except Exception as scope_err:
5861
+ # Handle scope violations gracefully - skip out-of-scope targets
5862
+ if 'ScopeViolationError' in type(scope_err).__name__ or 'out of scope' in str(scope_err).lower():
5863
+ print(f" ⚠️ Skipped (out of scope): {cmd_target}")
5864
+ else:
5865
+ raise # Re-raise unexpected errors
5842
5866
 
5843
5867
  # Lock released here - next iteration gets fresh lock
5844
5868
 
souleyez/docs/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # SoulEyez Documentation
2
2
 
3
- **Version:** 2.26.0
4
- **Last Updated:** January 8, 2026
3
+ **Version:** 2.28.0
4
+ **Last Updated:** January 9, 2026
5
5
  **Organization:** CyberSoul Security
6
6
 
7
7
  Welcome to the SoulEyez documentation! This documentation covers architecture, development, user guides, and operational information for the SoulEyez penetration testing platform.
@@ -748,4 +748,4 @@ rm ~/.souleyez/config.json && souleyez --version
748
748
 
749
749
  ---
750
750
 
751
- **Last Updated:** 2026-01-04 | **Version:** 2.6.0
751
+ **Last Updated:** 2026-01-09 | **Version:** 2.27.1