mcp-proxy-adapter 2.0.1__py3-none-any.whl → 6.9.50__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 mcp-proxy-adapter might be problematic. Click here for more details.
- mcp_proxy_adapter/__init__.py +47 -0
- mcp_proxy_adapter/__main__.py +13 -0
- mcp_proxy_adapter/api/__init__.py +0 -0
- mcp_proxy_adapter/api/app.py +66 -0
- mcp_proxy_adapter/api/core/__init__.py +18 -0
- mcp_proxy_adapter/api/core/app_factory.py +400 -0
- mcp_proxy_adapter/api/core/lifespan_manager.py +55 -0
- mcp_proxy_adapter/api/core/registration_context.py +356 -0
- mcp_proxy_adapter/api/core/registration_manager.py +307 -0
- mcp_proxy_adapter/api/core/registration_tasks.py +84 -0
- mcp_proxy_adapter/api/core/ssl_context_factory.py +88 -0
- mcp_proxy_adapter/api/handlers.py +181 -0
- mcp_proxy_adapter/api/middleware/__init__.py +21 -0
- mcp_proxy_adapter/api/middleware/base.py +54 -0
- mcp_proxy_adapter/api/middleware/command_permission_middleware.py +73 -0
- mcp_proxy_adapter/api/middleware/error_handling.py +76 -0
- mcp_proxy_adapter/api/middleware/factory.py +147 -0
- mcp_proxy_adapter/api/middleware/logging.py +31 -0
- mcp_proxy_adapter/api/middleware/performance.py +51 -0
- mcp_proxy_adapter/api/middleware/protocol_middleware.py +140 -0
- mcp_proxy_adapter/api/middleware/transport_middleware.py +87 -0
- mcp_proxy_adapter/api/middleware/unified_security.py +223 -0
- mcp_proxy_adapter/api/middleware/user_info_middleware.py +132 -0
- mcp_proxy_adapter/api/openapi/__init__.py +21 -0
- mcp_proxy_adapter/api/openapi/command_integration.py +105 -0
- mcp_proxy_adapter/api/openapi/openapi_generator.py +40 -0
- mcp_proxy_adapter/api/openapi/openapi_registry.py +62 -0
- mcp_proxy_adapter/api/openapi/schema_loader.py +116 -0
- mcp_proxy_adapter/api/schemas.py +270 -0
- mcp_proxy_adapter/api/tool_integration.py +131 -0
- mcp_proxy_adapter/api/tools.py +163 -0
- mcp_proxy_adapter/cli/__init__.py +12 -0
- mcp_proxy_adapter/cli/commands/__init__.py +15 -0
- mcp_proxy_adapter/cli/commands/client.py +100 -0
- mcp_proxy_adapter/cli/commands/config_generate.py +105 -0
- mcp_proxy_adapter/cli/commands/config_validate.py +94 -0
- mcp_proxy_adapter/cli/commands/generate.py +259 -0
- mcp_proxy_adapter/cli/commands/server.py +174 -0
- mcp_proxy_adapter/cli/commands/sets.py +132 -0
- mcp_proxy_adapter/cli/commands/testconfig.py +177 -0
- mcp_proxy_adapter/cli/examples/__init__.py +8 -0
- mcp_proxy_adapter/cli/examples/http_basic.py +82 -0
- mcp_proxy_adapter/cli/examples/https_token.py +96 -0
- mcp_proxy_adapter/cli/examples/mtls_roles.py +103 -0
- mcp_proxy_adapter/cli/main.py +63 -0
- mcp_proxy_adapter/cli/parser.py +338 -0
- mcp_proxy_adapter/cli/validators.py +231 -0
- mcp_proxy_adapter/client/jsonrpc_client/__init__.py +9 -0
- mcp_proxy_adapter/client/jsonrpc_client/client.py +42 -0
- mcp_proxy_adapter/client/jsonrpc_client/command_api.py +45 -0
- mcp_proxy_adapter/client/jsonrpc_client/proxy_api.py +224 -0
- mcp_proxy_adapter/client/jsonrpc_client/queue_api.py +60 -0
- mcp_proxy_adapter/client/jsonrpc_client/transport.py +108 -0
- mcp_proxy_adapter/client/proxy.py +123 -0
- mcp_proxy_adapter/commands/__init__.py +66 -0
- mcp_proxy_adapter/commands/auth_validation_command.py +69 -0
- mcp_proxy_adapter/commands/base.py +389 -0
- mcp_proxy_adapter/commands/builtin_commands.py +30 -0
- mcp_proxy_adapter/commands/catalog/__init__.py +20 -0
- mcp_proxy_adapter/commands/catalog/catalog_loader.py +34 -0
- mcp_proxy_adapter/commands/catalog/catalog_manager.py +122 -0
- mcp_proxy_adapter/commands/catalog/catalog_syncer.py +149 -0
- mcp_proxy_adapter/commands/catalog/command_catalog.py +43 -0
- mcp_proxy_adapter/commands/catalog/dependency_manager.py +37 -0
- mcp_proxy_adapter/commands/catalog_manager.py +97 -0
- mcp_proxy_adapter/commands/cert_monitor_command.py +552 -0
- mcp_proxy_adapter/commands/certificate_management_command.py +562 -0
- mcp_proxy_adapter/commands/command_registry.py +298 -0
- mcp_proxy_adapter/commands/config_command.py +102 -0
- mcp_proxy_adapter/commands/dependency_container.py +40 -0
- mcp_proxy_adapter/commands/dependency_manager.py +143 -0
- mcp_proxy_adapter/commands/echo_command.py +48 -0
- mcp_proxy_adapter/commands/health_command.py +142 -0
- mcp_proxy_adapter/commands/help_command.py +175 -0
- mcp_proxy_adapter/commands/hooks.py +172 -0
- mcp_proxy_adapter/commands/key_management_command.py +484 -0
- mcp_proxy_adapter/commands/load_command.py +123 -0
- mcp_proxy_adapter/commands/plugins_command.py +246 -0
- mcp_proxy_adapter/commands/protocol_management_command.py +216 -0
- mcp_proxy_adapter/commands/proxy_registration_command.py +319 -0
- mcp_proxy_adapter/commands/queue_commands.py +750 -0
- mcp_proxy_adapter/commands/registration_status_command.py +76 -0
- mcp_proxy_adapter/commands/registry/__init__.py +18 -0
- mcp_proxy_adapter/commands/registry/command_info.py +103 -0
- mcp_proxy_adapter/commands/registry/command_loader.py +207 -0
- mcp_proxy_adapter/commands/registry/command_manager.py +119 -0
- mcp_proxy_adapter/commands/registry/command_registry.py +217 -0
- mcp_proxy_adapter/commands/reload_command.py +136 -0
- mcp_proxy_adapter/commands/result.py +157 -0
- mcp_proxy_adapter/commands/role_test_command.py +99 -0
- mcp_proxy_adapter/commands/roles_management_command.py +502 -0
- mcp_proxy_adapter/commands/security_command.py +472 -0
- mcp_proxy_adapter/commands/settings_command.py +113 -0
- mcp_proxy_adapter/commands/ssl_setup_command.py +306 -0
- mcp_proxy_adapter/commands/token_management_command.py +500 -0
- mcp_proxy_adapter/commands/transport_management_command.py +129 -0
- mcp_proxy_adapter/commands/unload_command.py +92 -0
- mcp_proxy_adapter/config.py +32 -0
- mcp_proxy_adapter/core/__init__.py +8 -0
- mcp_proxy_adapter/core/app_factory.py +560 -0
- mcp_proxy_adapter/core/app_runner.py +318 -0
- mcp_proxy_adapter/core/auth_validator.py +508 -0
- mcp_proxy_adapter/core/certificate/__init__.py +20 -0
- mcp_proxy_adapter/core/certificate/certificate_creator.py +372 -0
- mcp_proxy_adapter/core/certificate/certificate_extractor.py +185 -0
- mcp_proxy_adapter/core/certificate/certificate_utils.py +249 -0
- mcp_proxy_adapter/core/certificate/certificate_validator.py +481 -0
- mcp_proxy_adapter/core/certificate/ssl_context_manager.py +65 -0
- mcp_proxy_adapter/core/certificate_utils.py +249 -0
- mcp_proxy_adapter/core/client.py +608 -0
- mcp_proxy_adapter/core/client_manager.py +271 -0
- mcp_proxy_adapter/core/client_security.py +411 -0
- mcp_proxy_adapter/core/config/__init__.py +18 -0
- mcp_proxy_adapter/core/config/config.py +237 -0
- mcp_proxy_adapter/core/config/config_factory.py +22 -0
- mcp_proxy_adapter/core/config/config_loader.py +66 -0
- mcp_proxy_adapter/core/config/feature_manager.py +31 -0
- mcp_proxy_adapter/core/config/simple_config.py +204 -0
- mcp_proxy_adapter/core/config/simple_config_generator.py +131 -0
- mcp_proxy_adapter/core/config/simple_config_validator.py +476 -0
- mcp_proxy_adapter/core/config_converter.py +252 -0
- mcp_proxy_adapter/core/config_validator.py +211 -0
- mcp_proxy_adapter/core/crl_utils.py +362 -0
- mcp_proxy_adapter/core/errors.py +276 -0
- mcp_proxy_adapter/core/job_manager.py +54 -0
- mcp_proxy_adapter/core/logging.py +250 -0
- mcp_proxy_adapter/core/mtls_asgi.py +140 -0
- mcp_proxy_adapter/core/mtls_asgi_app.py +187 -0
- mcp_proxy_adapter/core/mtls_proxy.py +229 -0
- mcp_proxy_adapter/core/mtls_server.py +154 -0
- mcp_proxy_adapter/core/protocol_manager.py +232 -0
- mcp_proxy_adapter/core/proxy/__init__.py +19 -0
- mcp_proxy_adapter/core/proxy/auth_manager.py +26 -0
- mcp_proxy_adapter/core/proxy/proxy_registration_manager.py +160 -0
- mcp_proxy_adapter/core/proxy/registration_client.py +186 -0
- mcp_proxy_adapter/core/proxy/ssl_manager.py +101 -0
- mcp_proxy_adapter/core/proxy_client.py +184 -0
- mcp_proxy_adapter/core/proxy_registration.py +80 -0
- mcp_proxy_adapter/core/role_utils.py +103 -0
- mcp_proxy_adapter/core/security_adapter.py +343 -0
- mcp_proxy_adapter/core/security_factory.py +96 -0
- mcp_proxy_adapter/core/security_integration.py +342 -0
- mcp_proxy_adapter/core/server_adapter.py +251 -0
- mcp_proxy_adapter/core/server_engine.py +217 -0
- mcp_proxy_adapter/core/settings.py +260 -0
- mcp_proxy_adapter/core/signal_handler.py +107 -0
- mcp_proxy_adapter/core/ssl_utils.py +161 -0
- mcp_proxy_adapter/core/transport_manager.py +153 -0
- mcp_proxy_adapter/core/unified_config_adapter.py +471 -0
- mcp_proxy_adapter/core/utils.py +101 -0
- mcp_proxy_adapter/core/validation/__init__.py +21 -0
- mcp_proxy_adapter/core/validation/config_validator.py +219 -0
- mcp_proxy_adapter/core/validation/file_validator.py +131 -0
- mcp_proxy_adapter/core/validation/protocol_validator.py +205 -0
- mcp_proxy_adapter/core/validation/security_validator.py +140 -0
- mcp_proxy_adapter/core/validation/validation_result.py +27 -0
- mcp_proxy_adapter/custom_openapi.py +58 -0
- mcp_proxy_adapter/examples/__init__.py +16 -0
- mcp_proxy_adapter/examples/basic_framework/__init__.py +9 -0
- mcp_proxy_adapter/examples/basic_framework/commands/__init__.py +4 -0
- mcp_proxy_adapter/examples/basic_framework/hooks/__init__.py +4 -0
- mcp_proxy_adapter/examples/basic_framework/main.py +52 -0
- mcp_proxy_adapter/examples/bugfix_certificate_config.py +261 -0
- mcp_proxy_adapter/examples/cert_manager_bugfix.py +203 -0
- mcp_proxy_adapter/examples/check_config.py +413 -0
- mcp_proxy_adapter/examples/client_usage_example.py +164 -0
- mcp_proxy_adapter/examples/commands/__init__.py +5 -0
- mcp_proxy_adapter/examples/config_builder.py +234 -0
- mcp_proxy_adapter/examples/config_cli.py +282 -0
- mcp_proxy_adapter/examples/create_test_configs.py +174 -0
- mcp_proxy_adapter/examples/debug_request_state.py +130 -0
- mcp_proxy_adapter/examples/debug_role_chain.py +191 -0
- mcp_proxy_adapter/examples/demo_client.py +287 -0
- mcp_proxy_adapter/examples/full_application/__init__.py +12 -0
- mcp_proxy_adapter/examples/full_application/commands/__init__.py +8 -0
- mcp_proxy_adapter/examples/full_application/commands/custom_echo_command.py +45 -0
- mcp_proxy_adapter/examples/full_application/commands/dynamic_calculator_command.py +52 -0
- mcp_proxy_adapter/examples/full_application/commands/echo_command.py +32 -0
- mcp_proxy_adapter/examples/full_application/commands/help_command.py +54 -0
- mcp_proxy_adapter/examples/full_application/commands/list_command.py +57 -0
- mcp_proxy_adapter/examples/full_application/hooks/__init__.py +5 -0
- mcp_proxy_adapter/examples/full_application/hooks/application_hooks.py +29 -0
- mcp_proxy_adapter/examples/full_application/hooks/builtin_command_hooks.py +27 -0
- mcp_proxy_adapter/examples/full_application/main.py +311 -0
- mcp_proxy_adapter/examples/full_application/proxy_endpoints.py +161 -0
- mcp_proxy_adapter/examples/full_application/run_mtls.py +252 -0
- mcp_proxy_adapter/examples/full_application/run_simple.py +152 -0
- mcp_proxy_adapter/examples/full_application/test_minimal_server.py +45 -0
- mcp_proxy_adapter/examples/full_application/test_server.py +163 -0
- mcp_proxy_adapter/examples/full_application/test_simple_server.py +62 -0
- mcp_proxy_adapter/examples/generate_config.py +502 -0
- mcp_proxy_adapter/examples/proxy_registration_example.py +335 -0
- mcp_proxy_adapter/examples/queue_demo_simple.py +632 -0
- mcp_proxy_adapter/examples/queue_integration_example.py +578 -0
- mcp_proxy_adapter/examples/queue_server_demo.py +82 -0
- mcp_proxy_adapter/examples/queue_server_example.py +85 -0
- mcp_proxy_adapter/examples/queue_server_simple.py +173 -0
- mcp_proxy_adapter/examples/required_certificates.py +208 -0
- mcp_proxy_adapter/examples/run_example.py +77 -0
- mcp_proxy_adapter/examples/run_full_test_suite.py +619 -0
- mcp_proxy_adapter/examples/run_proxy_server.py +153 -0
- mcp_proxy_adapter/examples/run_security_tests_fixed.py +435 -0
- mcp_proxy_adapter/examples/security_test/__init__.py +18 -0
- mcp_proxy_adapter/examples/security_test/auth_manager.py +14 -0
- mcp_proxy_adapter/examples/security_test/ssl_context_manager.py +28 -0
- mcp_proxy_adapter/examples/security_test/test_client.py +159 -0
- mcp_proxy_adapter/examples/security_test/test_result.py +22 -0
- mcp_proxy_adapter/examples/security_test_client.py +72 -0
- mcp_proxy_adapter/examples/setup/__init__.py +24 -0
- mcp_proxy_adapter/examples/setup/certificate_manager.py +215 -0
- mcp_proxy_adapter/examples/setup/config_generator.py +12 -0
- mcp_proxy_adapter/examples/setup/config_validator.py +118 -0
- mcp_proxy_adapter/examples/setup/environment_setup.py +62 -0
- mcp_proxy_adapter/examples/setup/test_files_generator.py +10 -0
- mcp_proxy_adapter/examples/setup/test_runner.py +89 -0
- mcp_proxy_adapter/examples/setup_test_environment.py +235 -0
- mcp_proxy_adapter/examples/simple_protocol_test.py +125 -0
- mcp_proxy_adapter/examples/test_chk_hostname_automated.py +211 -0
- mcp_proxy_adapter/examples/test_config.py +205 -0
- mcp_proxy_adapter/examples/test_config_builder.py +110 -0
- mcp_proxy_adapter/examples/test_examples.py +308 -0
- mcp_proxy_adapter/examples/test_framework_complete.py +267 -0
- mcp_proxy_adapter/examples/test_mcp_server.py +187 -0
- mcp_proxy_adapter/examples/test_protocol_examples.py +337 -0
- mcp_proxy_adapter/examples/universal_client.py +674 -0
- mcp_proxy_adapter/examples/update_config_certificates.py +135 -0
- mcp_proxy_adapter/examples/validate_generator_compatibility.py +385 -0
- mcp_proxy_adapter/examples/validate_generator_compatibility_simple.py +61 -0
- mcp_proxy_adapter/integrations/__init__.py +25 -0
- mcp_proxy_adapter/integrations/queuemgr_integration.py +462 -0
- mcp_proxy_adapter/main.py +311 -0
- mcp_proxy_adapter/openapi.py +375 -0
- mcp_proxy_adapter/schemas/base_schema.json +114 -0
- mcp_proxy_adapter/schemas/openapi_schema.json +314 -0
- mcp_proxy_adapter/schemas/roles.json +37 -0
- mcp_proxy_adapter/schemas/roles_schema.json +162 -0
- mcp_proxy_adapter/version.py +5 -0
- mcp_proxy_adapter-6.9.50.dist-info/METADATA +1088 -0
- mcp_proxy_adapter-6.9.50.dist-info/RECORD +242 -0
- {mcp_proxy_adapter-2.0.1.dist-info → mcp_proxy_adapter-6.9.50.dist-info}/WHEEL +1 -1
- mcp_proxy_adapter-6.9.50.dist-info/entry_points.txt +14 -0
- mcp_proxy_adapter-6.9.50.dist-info/top_level.txt +1 -0
- adapters/__init__.py +0 -16
- analyzers/__init__.py +0 -14
- analyzers/docstring_analyzer.py +0 -199
- analyzers/type_analyzer.py +0 -151
- cli/__init__.py +0 -12
- cli/__main__.py +0 -79
- cli/command_runner.py +0 -233
- dispatchers/__init__.py +0 -14
- dispatchers/base_dispatcher.py +0 -85
- dispatchers/json_rpc_dispatcher.py +0 -198
- generators/__init__.py +0 -14
- generators/endpoint_generator.py +0 -172
- generators/openapi_generator.py +0 -254
- generators/rest_api_generator.py +0 -207
- mcp_proxy_adapter-2.0.1.dist-info/METADATA +0 -272
- mcp_proxy_adapter-2.0.1.dist-info/RECORD +0 -28
- mcp_proxy_adapter-2.0.1.dist-info/licenses/LICENSE +0 -21
- mcp_proxy_adapter-2.0.1.dist-info/top_level.txt +0 -7
- openapi_schema/__init__.py +0 -38
- openapi_schema/command_registry.py +0 -312
- openapi_schema/rest_schema.py +0 -510
- openapi_schema/rpc_generator.py +0 -307
- openapi_schema/rpc_schema.py +0 -416
- validators/__init__.py +0 -14
- validators/base_validator.py +0 -23
- validators/docstring_validator.py +0 -75
- validators/metadata_validator.py +0 -76
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"""
|
|
2
|
+
SSL Utilities Module
|
|
3
|
+
|
|
4
|
+
This module provides utilities for SSL/TLS configuration and certificate validation.
|
|
5
|
+
Integrates with AuthValidator from Phase 0 for certificate validation.
|
|
6
|
+
Supports CRL (Certificate Revocation List) validation.
|
|
7
|
+
|
|
8
|
+
Author: Vasiliy Zdanovskiy
|
|
9
|
+
email: vasilyvz@gmail.com
|
|
10
|
+
Version: 1.0.0
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import ssl
|
|
14
|
+
import logging
|
|
15
|
+
from typing import List, Optional, Dict, Any
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
|
|
18
|
+
from .auth_validator import AuthValidator
|
|
19
|
+
from .crl_utils import CRLManager
|
|
20
|
+
|
|
21
|
+
logger = logging.getLogger(__name__)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class SSLUtils:
|
|
25
|
+
"""
|
|
26
|
+
SSL utilities for creating SSL contexts and validating certificates.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
# TLS version mapping
|
|
30
|
+
TLS_VERSIONS = {
|
|
31
|
+
"1.0": ssl.TLSVersion.TLSv1,
|
|
32
|
+
"1.1": ssl.TLSVersion.TLSv1_1,
|
|
33
|
+
"1.2": ssl.TLSVersion.TLSv1_2,
|
|
34
|
+
"1.3": ssl.TLSVersion.TLSv1_3,
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
# Cipher suite mapping
|
|
38
|
+
CIPHER_SUITES = {
|
|
39
|
+
"TLS_AES_256_GCM_SHA384": "TLS_AES_256_GCM_SHA384",
|
|
40
|
+
"TLS_CHACHA20_POLY1305_SHA256": "TLS_CHACHA20_POLY1305_SHA256",
|
|
41
|
+
"TLS_AES_128_GCM_SHA256": "TLS_AES_128_GCM_SHA256",
|
|
42
|
+
"ECDHE-RSA-AES256-GCM-SHA384": "ECDHE-RSA-AES256-GCM-SHA384",
|
|
43
|
+
"ECDHE-RSA-AES128-GCM-SHA256": "ECDHE-RSA-AES128-GCM-SHA256",
|
|
44
|
+
"ECDHE-RSA-CHACHA20-POLY1305": "ECDHE-RSA-CHACHA20-POLY1305",
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
@staticmethod
|
|
48
|
+
|
|
49
|
+
@staticmethod
|
|
50
|
+
def validate_certificate(
|
|
51
|
+
cert_file: str, crl_config: Optional[Dict[str, Any]] = None
|
|
52
|
+
) -> bool:
|
|
53
|
+
"""
|
|
54
|
+
Validate certificate using AuthValidator and optional CRL check.
|
|
55
|
+
|
|
56
|
+
Args:
|
|
57
|
+
cert_file: Path to certificate file
|
|
58
|
+
crl_config: CRL configuration dictionary (optional)
|
|
59
|
+
|
|
60
|
+
Returns:
|
|
61
|
+
True if certificate is valid, False otherwise
|
|
62
|
+
"""
|
|
63
|
+
try:
|
|
64
|
+
validator = AuthValidator()
|
|
65
|
+
result = validator.validate_certificate(cert_file)
|
|
66
|
+
if not result.is_valid:
|
|
67
|
+
return False
|
|
68
|
+
|
|
69
|
+
# Check CRL if configured
|
|
70
|
+
if crl_config:
|
|
71
|
+
try:
|
|
72
|
+
crl_manager = CRLManager(crl_config)
|
|
73
|
+
if crl_manager.is_certificate_revoked(cert_file):
|
|
74
|
+
get_global_logger().warning(
|
|
75
|
+
f"Certificate is revoked according to CRL: {cert_file}"
|
|
76
|
+
)
|
|
77
|
+
return False
|
|
78
|
+
except Exception as e:
|
|
79
|
+
get_global_logger().error(f"CRL check failed: {e}")
|
|
80
|
+
# For security, consider certificate invalid if CRL check fails
|
|
81
|
+
return False
|
|
82
|
+
|
|
83
|
+
return True
|
|
84
|
+
except Exception as e:
|
|
85
|
+
get_global_logger().error(f"Certificate validation failed: {e}")
|
|
86
|
+
return False
|
|
87
|
+
|
|
88
|
+
@staticmethod
|
|
89
|
+
def setup_cipher_suites(context: ssl.SSLContext, cipher_suites: List[str]) -> None:
|
|
90
|
+
"""
|
|
91
|
+
Setup cipher suites for SSL context.
|
|
92
|
+
|
|
93
|
+
Args:
|
|
94
|
+
context: SSL context to configure
|
|
95
|
+
cipher_suites: List of cipher suite names
|
|
96
|
+
"""
|
|
97
|
+
if not cipher_suites:
|
|
98
|
+
return
|
|
99
|
+
|
|
100
|
+
# Convert cipher suite names to actual cipher suite strings
|
|
101
|
+
actual_ciphers = []
|
|
102
|
+
for cipher_name in cipher_suites:
|
|
103
|
+
if cipher_name in SSLUtils.CIPHER_SUITES:
|
|
104
|
+
actual_ciphers.append(SSLUtils.CIPHER_SUITES[cipher_name])
|
|
105
|
+
else:
|
|
106
|
+
get_global_logger().warning(f"Unknown cipher suite: {cipher_name}")
|
|
107
|
+
|
|
108
|
+
if actual_ciphers:
|
|
109
|
+
try:
|
|
110
|
+
context.set_ciphers(":".join(actual_ciphers))
|
|
111
|
+
get_global_logger().info(f"Cipher suites configured: {actual_ciphers}")
|
|
112
|
+
except ssl.SSLError as e:
|
|
113
|
+
get_global_logger().error(f"Failed to set cipher suites: {e}")
|
|
114
|
+
|
|
115
|
+
@staticmethod
|
|
116
|
+
def setup_tls_versions(
|
|
117
|
+
context: ssl.SSLContext, min_version: str, max_version: str
|
|
118
|
+
) -> None:
|
|
119
|
+
"""
|
|
120
|
+
Setup TLS version range for SSL context.
|
|
121
|
+
|
|
122
|
+
Args:
|
|
123
|
+
context: SSL context to configure
|
|
124
|
+
min_version: Minimum TLS version
|
|
125
|
+
max_version: Maximum TLS version
|
|
126
|
+
"""
|
|
127
|
+
try:
|
|
128
|
+
min_tls = SSLUtils.TLS_VERSIONS.get(min_version)
|
|
129
|
+
max_tls = SSLUtils.TLS_VERSIONS.get(max_version)
|
|
130
|
+
|
|
131
|
+
if min_tls and max_tls:
|
|
132
|
+
context.minimum_version = min_tls
|
|
133
|
+
context.maximum_version = max_tls
|
|
134
|
+
get_global_logger().info(f"TLS versions configured: {min_version} - {max_version}")
|
|
135
|
+
else:
|
|
136
|
+
get_global_logger().warning(
|
|
137
|
+
f"Invalid TLS version range: {min_version} - {max_version}"
|
|
138
|
+
)
|
|
139
|
+
except Exception as e:
|
|
140
|
+
get_global_logger().error(f"Failed to set TLS versions: {e}")
|
|
141
|
+
|
|
142
|
+
@staticmethod
|
|
143
|
+
def create_ssl_context(
|
|
144
|
+
cert_file: Optional[str] = None,
|
|
145
|
+
key_file: Optional[str] = None,
|
|
146
|
+
ca_file: Optional[str] = None,
|
|
147
|
+
verify_mode: int = ssl.CERT_REQUIRED,
|
|
148
|
+
check_hostname: bool = True,
|
|
149
|
+
) -> ssl.SSLContext:
|
|
150
|
+
"""Create SSL context with proper configuration."""
|
|
151
|
+
context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH)
|
|
152
|
+
context.check_hostname = check_hostname
|
|
153
|
+
context.verify_mode = verify_mode
|
|
154
|
+
|
|
155
|
+
if cert_file and key_file:
|
|
156
|
+
context.load_cert_chain(cert_file, key_file)
|
|
157
|
+
|
|
158
|
+
if ca_file:
|
|
159
|
+
context.load_verify_locations(ca_file)
|
|
160
|
+
|
|
161
|
+
return context
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Transport manager module.
|
|
3
|
+
|
|
4
|
+
This module provides transport management functionality for the MCP Proxy Adapter.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Dict, Any, Optional
|
|
8
|
+
from dataclasses import dataclass
|
|
9
|
+
from enum import Enum
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
|
|
12
|
+
from mcp_proxy_adapter.core.logging import get_global_logger
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class TransportType(Enum):
|
|
16
|
+
"""Transport types enumeration."""
|
|
17
|
+
|
|
18
|
+
HTTP = "http"
|
|
19
|
+
HTTPS = "https"
|
|
20
|
+
MTLS = "mtls"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@dataclass
|
|
24
|
+
class TransportConfig:
|
|
25
|
+
"""Transport configuration data class."""
|
|
26
|
+
|
|
27
|
+
type: TransportType
|
|
28
|
+
port: Optional[int]
|
|
29
|
+
ssl_enabled: bool
|
|
30
|
+
cert_file: Optional[str]
|
|
31
|
+
key_file: Optional[str]
|
|
32
|
+
ca_cert: Optional[str]
|
|
33
|
+
verify_client: bool
|
|
34
|
+
client_cert_required: bool
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class TransportManager:
|
|
38
|
+
"""
|
|
39
|
+
Transport manager for handling different transport types.
|
|
40
|
+
|
|
41
|
+
This class manages transport configuration and provides utilities
|
|
42
|
+
for determining ports and SSL settings based on transport type.
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
# Default ports for transport types
|
|
46
|
+
DEFAULT_PORTS = {
|
|
47
|
+
TransportType.HTTP: 8000,
|
|
48
|
+
TransportType.HTTPS: 8443,
|
|
49
|
+
TransportType.MTLS: 9443,
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
def __init__(self):
|
|
53
|
+
"""Initialize transport manager."""
|
|
54
|
+
self._config: Optional[TransportConfig] = None
|
|
55
|
+
self._current_transport: Optional[TransportType] = None
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def get_port(self) -> Optional[int]:
|
|
60
|
+
"""
|
|
61
|
+
Get configured port.
|
|
62
|
+
|
|
63
|
+
Returns:
|
|
64
|
+
Port number or None if not configured
|
|
65
|
+
"""
|
|
66
|
+
return self._config.port if self._config else None
|
|
67
|
+
|
|
68
|
+
def is_ssl_enabled(self) -> bool:
|
|
69
|
+
"""
|
|
70
|
+
Check if SSL is enabled.
|
|
71
|
+
|
|
72
|
+
Returns:
|
|
73
|
+
True if SSL is enabled, False otherwise
|
|
74
|
+
"""
|
|
75
|
+
return self._config.ssl_enabled if self._config else False
|
|
76
|
+
|
|
77
|
+
def get_ssl_config(self) -> Optional[Dict[str, Any]]:
|
|
78
|
+
"""
|
|
79
|
+
Get SSL configuration.
|
|
80
|
+
|
|
81
|
+
Returns:
|
|
82
|
+
SSL configuration dict or None if SSL not enabled
|
|
83
|
+
"""
|
|
84
|
+
if not self._config or not self._config.ssl_enabled:
|
|
85
|
+
return None
|
|
86
|
+
|
|
87
|
+
return {
|
|
88
|
+
"cert_file": self._config.cert_file,
|
|
89
|
+
"key_file": self._config.key_file,
|
|
90
|
+
"ca_cert": self._config.ca_cert,
|
|
91
|
+
"verify_client": self._config.verify_client,
|
|
92
|
+
"client_cert_required": self._config.client_cert_required,
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
def is_mtls(self) -> bool:
|
|
96
|
+
"""
|
|
97
|
+
Check if current transport is MTLS.
|
|
98
|
+
|
|
99
|
+
Returns:
|
|
100
|
+
True if MTLS transport, False otherwise
|
|
101
|
+
"""
|
|
102
|
+
return self._current_transport == TransportType.MTLS
|
|
103
|
+
|
|
104
|
+
def is_https(self) -> bool:
|
|
105
|
+
"""
|
|
106
|
+
Check if current transport is HTTPS.
|
|
107
|
+
|
|
108
|
+
Returns:
|
|
109
|
+
True if HTTPS transport, False otherwise
|
|
110
|
+
"""
|
|
111
|
+
return self._current_transport == TransportType.HTTPS
|
|
112
|
+
|
|
113
|
+
def is_http(self) -> bool:
|
|
114
|
+
"""
|
|
115
|
+
Check if current transport is HTTP.
|
|
116
|
+
|
|
117
|
+
Returns:
|
|
118
|
+
True if HTTP transport, False otherwise
|
|
119
|
+
"""
|
|
120
|
+
return self._current_transport == TransportType.HTTP
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def validate_ssl_files(self) -> bool:
|
|
125
|
+
"""
|
|
126
|
+
Check if SSL files exist.
|
|
127
|
+
|
|
128
|
+
Returns:
|
|
129
|
+
True if all SSL files exist, False otherwise
|
|
130
|
+
"""
|
|
131
|
+
if not self._config or not self._config.ssl_enabled:
|
|
132
|
+
return True
|
|
133
|
+
|
|
134
|
+
files_to_check = []
|
|
135
|
+
if self._config.cert_file:
|
|
136
|
+
files_to_check.append(self._config.cert_file)
|
|
137
|
+
if self._config.key_file:
|
|
138
|
+
files_to_check.append(self._config.key_file)
|
|
139
|
+
if self._config.ca_cert:
|
|
140
|
+
files_to_check.append(self._config.ca_cert)
|
|
141
|
+
|
|
142
|
+
for file_path in files_to_check:
|
|
143
|
+
if not Path(file_path).exists():
|
|
144
|
+
get_global_logger().error(f"SSL file not found: {file_path}")
|
|
145
|
+
return False
|
|
146
|
+
|
|
147
|
+
get_global_logger().info(f"All SSL files validated successfully: {files_to_check}")
|
|
148
|
+
return True
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
# Global transport manager instance
|
|
153
|
+
transport_manager = TransportManager()
|