mirror of
https://github.com/usmannasir/cyberpanel.git
synced 2025-11-05 04:46:07 +01:00
Remove SECURITY_INSTALLATION.md and implement SSL reconciliation features in manageSSL module. Add new views and URLs for SSL reconciliation, enhance mobile responsiveness in templates, and update SSL utilities for improved functionality. Update upgrade script for scheduled SSL reconciliation tasks.
This commit is contained in:
236
test_ssl_integration.py
Normal file
236
test_ssl_integration.py
Normal file
@@ -0,0 +1,236 @@
|
||||
#!/usr/local/CyberCP/bin/python
|
||||
"""
|
||||
Test script for SSL integration
|
||||
This script tests the SSL reconciliation functionality
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import django
|
||||
|
||||
# Add CyberPanel to Python path
|
||||
sys.path.append('/usr/local/CyberCP')
|
||||
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings")
|
||||
django.setup()
|
||||
|
||||
from plogical.sslReconcile import SSLReconcile
|
||||
from plogical.sslUtilities import sslUtilities
|
||||
from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging
|
||||
|
||||
|
||||
def test_ssl_reconcile_module():
|
||||
"""Test the SSL reconciliation module"""
|
||||
print("Testing SSL Reconciliation Module...")
|
||||
|
||||
try:
|
||||
# Test 1: Check if module can be imported
|
||||
print("✓ SSLReconcile module imported successfully")
|
||||
|
||||
# Test 2: Test utility functions
|
||||
print("Testing utility functions...")
|
||||
|
||||
# Test trim function
|
||||
test_text = " test text "
|
||||
trimmed = SSLReconcile.trim(test_text)
|
||||
assert trimmed == "test text", f"Trim failed: '{trimmed}'"
|
||||
print("✓ trim() function works correctly")
|
||||
|
||||
# Test 3: Test certificate fingerprint function
|
||||
print("Testing certificate functions...")
|
||||
|
||||
# Test with non-existent file
|
||||
fp = SSLReconcile.sha256fp("/nonexistent/file.pem")
|
||||
assert fp == "", f"Expected empty string for non-existent file, got: '{fp}'"
|
||||
print("✓ sha256fp() handles non-existent files correctly")
|
||||
|
||||
# Test issuer CN function
|
||||
issuer = SSLReconcile.issuer_cn("/nonexistent/file.pem")
|
||||
assert issuer == "", f"Expected empty string for non-existent file, got: '{issuer}'"
|
||||
print("✓ issuer_cn() handles non-existent files correctly")
|
||||
|
||||
print("✓ All utility functions working correctly")
|
||||
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"✗ SSL reconciliation module test failed: {str(e)}")
|
||||
return False
|
||||
|
||||
|
||||
def test_ssl_utilities_integration():
|
||||
"""Test the enhanced SSL utilities"""
|
||||
print("\nTesting Enhanced SSL Utilities...")
|
||||
|
||||
try:
|
||||
# Test 1: Check if new methods exist
|
||||
assert hasattr(sslUtilities, 'reconcile_ssl_all'), "reconcile_ssl_all method not found"
|
||||
assert hasattr(sslUtilities, 'reconcile_ssl_domain'), "reconcile_ssl_domain method not found"
|
||||
assert hasattr(sslUtilities, 'fix_acme_challenge_context'), "fix_acme_challenge_context method not found"
|
||||
print("✓ All new SSL utility methods found")
|
||||
|
||||
# Test 2: Test method signatures
|
||||
import inspect
|
||||
|
||||
# Check reconcile_ssl_all signature
|
||||
sig = inspect.signature(sslUtilities.reconcile_ssl_all)
|
||||
assert len(sig.parameters) == 0, f"reconcile_ssl_all should have no parameters, got: {sig.parameters}"
|
||||
print("✓ reconcile_ssl_all signature correct")
|
||||
|
||||
# Check reconcile_ssl_domain signature
|
||||
sig = inspect.signature(sslUtilities.reconcile_ssl_domain)
|
||||
assert 'domain' in sig.parameters, f"reconcile_ssl_domain should have 'domain' parameter, got: {sig.parameters}"
|
||||
print("✓ reconcile_ssl_domain signature correct")
|
||||
|
||||
# Check fix_acme_challenge_context signature
|
||||
sig = inspect.signature(sslUtilities.fix_acme_challenge_context)
|
||||
assert 'virtualHostName' in sig.parameters, f"fix_acme_challenge_context should have 'virtualHostName' parameter, got: {sig.parameters}"
|
||||
print("✓ fix_acme_challenge_context signature correct")
|
||||
|
||||
print("✓ All SSL utility method signatures correct")
|
||||
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"✗ SSL utilities integration test failed: {str(e)}")
|
||||
return False
|
||||
|
||||
|
||||
def test_vhost_configuration_fixes():
|
||||
"""Test that vhost configuration fixes are applied"""
|
||||
print("\nTesting VHost Configuration Fixes...")
|
||||
|
||||
try:
|
||||
from plogical.vhostConfs import vhostConfs
|
||||
|
||||
# Test 1: Check that ACME challenge contexts use $VH_ROOT
|
||||
ols_master_conf = vhostConfs.olsMasterConf
|
||||
assert '$VH_ROOT/public_html/.well-known/acme-challenge' in ols_master_conf, "ACME challenge context not fixed in olsMasterConf"
|
||||
print("✓ olsMasterConf ACME challenge context fixed")
|
||||
|
||||
# Test 2: Check child configuration
|
||||
ols_child_conf = vhostConfs.olsChildConf
|
||||
assert '$VH_ROOT/public_html/.well-known/acme-challenge' in ols_child_conf, "ACME challenge context not fixed in olsChildConf"
|
||||
print("✓ olsChildConf ACME challenge context fixed")
|
||||
|
||||
# Test 3: Check Apache configurations
|
||||
apache_conf = vhostConfs.apacheConf
|
||||
assert '/home/{virtualHostName}/public_html/.well-known/acme-challenge' in apache_conf, "Apache ACME challenge alias not fixed"
|
||||
print("✓ Apache ACME challenge alias fixed")
|
||||
|
||||
print("✓ All vhost configuration fixes applied correctly")
|
||||
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"✗ VHost configuration fixes test failed: {str(e)}")
|
||||
return False
|
||||
|
||||
|
||||
def test_management_command():
|
||||
"""Test the Django management command"""
|
||||
print("\nTesting Django Management Command...")
|
||||
|
||||
try:
|
||||
import subprocess
|
||||
|
||||
# Test 1: Check if management command exists
|
||||
result = subprocess.run([
|
||||
'python', 'manage.py', 'ssl_reconcile', '--help'
|
||||
], capture_output=True, text=True, cwd='/usr/local/CyberCP')
|
||||
|
||||
if result.returncode == 0:
|
||||
print("✓ SSL reconcile management command exists and responds to --help")
|
||||
else:
|
||||
print(f"✗ SSL reconcile management command failed: {result.stderr}")
|
||||
return False
|
||||
|
||||
# Test 2: Check command options
|
||||
help_output = result.stdout
|
||||
assert '--all' in help_output, "--all option not found in help"
|
||||
assert '--domain' in help_output, "--domain option not found in help"
|
||||
assert '--fix-acme' in help_output, "--fix-acme option not found in help"
|
||||
print("✓ All management command options present")
|
||||
|
||||
print("✓ Django management command working correctly")
|
||||
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"✗ Django management command test failed: {str(e)}")
|
||||
return False
|
||||
|
||||
|
||||
def test_cron_integration():
|
||||
"""Test that cron integration is properly configured"""
|
||||
print("\nTesting Cron Integration...")
|
||||
|
||||
try:
|
||||
# Check if cron file exists and contains SSL reconciliation
|
||||
cron_paths = [
|
||||
'/var/spool/cron/crontabs/root',
|
||||
'/etc/crontab'
|
||||
]
|
||||
|
||||
ssl_reconcile_found = False
|
||||
|
||||
for cron_path in cron_paths:
|
||||
if os.path.exists(cron_path):
|
||||
with open(cron_path, 'r') as f:
|
||||
content = f.read()
|
||||
if 'ssl_reconcile --all' in content:
|
||||
ssl_reconcile_found = True
|
||||
print(f"✓ SSL reconciliation cron job found in {cron_path}")
|
||||
break
|
||||
|
||||
if not ssl_reconcile_found:
|
||||
print("✗ SSL reconciliation cron job not found in any cron file")
|
||||
return False
|
||||
|
||||
print("✓ Cron integration working correctly")
|
||||
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"✗ Cron integration test failed: {str(e)}")
|
||||
return False
|
||||
|
||||
|
||||
def main():
|
||||
"""Run all tests"""
|
||||
print("=" * 60)
|
||||
print("SSL Integration Test Suite")
|
||||
print("=" * 60)
|
||||
|
||||
tests = [
|
||||
test_ssl_reconcile_module,
|
||||
test_ssl_utilities_integration,
|
||||
test_vhost_configuration_fixes,
|
||||
test_management_command,
|
||||
test_cron_integration
|
||||
]
|
||||
|
||||
passed = 0
|
||||
total = len(tests)
|
||||
|
||||
for test in tests:
|
||||
try:
|
||||
if test():
|
||||
passed += 1
|
||||
except Exception as e:
|
||||
print(f"✗ Test {test.__name__} failed with exception: {str(e)}")
|
||||
|
||||
print("\n" + "=" * 60)
|
||||
print(f"Test Results: {passed}/{total} tests passed")
|
||||
print("=" * 60)
|
||||
|
||||
if passed == total:
|
||||
print("🎉 All tests passed! SSL integration is working correctly.")
|
||||
return True
|
||||
else:
|
||||
print("❌ Some tests failed. Please check the output above.")
|
||||
return False
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
success = main()
|
||||
sys.exit(0 if success else 1)
|
||||
Reference in New Issue
Block a user