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.

Files changed (269) hide show
  1. mcp_proxy_adapter/__init__.py +47 -0
  2. mcp_proxy_adapter/__main__.py +13 -0
  3. mcp_proxy_adapter/api/__init__.py +0 -0
  4. mcp_proxy_adapter/api/app.py +66 -0
  5. mcp_proxy_adapter/api/core/__init__.py +18 -0
  6. mcp_proxy_adapter/api/core/app_factory.py +400 -0
  7. mcp_proxy_adapter/api/core/lifespan_manager.py +55 -0
  8. mcp_proxy_adapter/api/core/registration_context.py +356 -0
  9. mcp_proxy_adapter/api/core/registration_manager.py +307 -0
  10. mcp_proxy_adapter/api/core/registration_tasks.py +84 -0
  11. mcp_proxy_adapter/api/core/ssl_context_factory.py +88 -0
  12. mcp_proxy_adapter/api/handlers.py +181 -0
  13. mcp_proxy_adapter/api/middleware/__init__.py +21 -0
  14. mcp_proxy_adapter/api/middleware/base.py +54 -0
  15. mcp_proxy_adapter/api/middleware/command_permission_middleware.py +73 -0
  16. mcp_proxy_adapter/api/middleware/error_handling.py +76 -0
  17. mcp_proxy_adapter/api/middleware/factory.py +147 -0
  18. mcp_proxy_adapter/api/middleware/logging.py +31 -0
  19. mcp_proxy_adapter/api/middleware/performance.py +51 -0
  20. mcp_proxy_adapter/api/middleware/protocol_middleware.py +140 -0
  21. mcp_proxy_adapter/api/middleware/transport_middleware.py +87 -0
  22. mcp_proxy_adapter/api/middleware/unified_security.py +223 -0
  23. mcp_proxy_adapter/api/middleware/user_info_middleware.py +132 -0
  24. mcp_proxy_adapter/api/openapi/__init__.py +21 -0
  25. mcp_proxy_adapter/api/openapi/command_integration.py +105 -0
  26. mcp_proxy_adapter/api/openapi/openapi_generator.py +40 -0
  27. mcp_proxy_adapter/api/openapi/openapi_registry.py +62 -0
  28. mcp_proxy_adapter/api/openapi/schema_loader.py +116 -0
  29. mcp_proxy_adapter/api/schemas.py +270 -0
  30. mcp_proxy_adapter/api/tool_integration.py +131 -0
  31. mcp_proxy_adapter/api/tools.py +163 -0
  32. mcp_proxy_adapter/cli/__init__.py +12 -0
  33. mcp_proxy_adapter/cli/commands/__init__.py +15 -0
  34. mcp_proxy_adapter/cli/commands/client.py +100 -0
  35. mcp_proxy_adapter/cli/commands/config_generate.py +105 -0
  36. mcp_proxy_adapter/cli/commands/config_validate.py +94 -0
  37. mcp_proxy_adapter/cli/commands/generate.py +259 -0
  38. mcp_proxy_adapter/cli/commands/server.py +174 -0
  39. mcp_proxy_adapter/cli/commands/sets.py +132 -0
  40. mcp_proxy_adapter/cli/commands/testconfig.py +177 -0
  41. mcp_proxy_adapter/cli/examples/__init__.py +8 -0
  42. mcp_proxy_adapter/cli/examples/http_basic.py +82 -0
  43. mcp_proxy_adapter/cli/examples/https_token.py +96 -0
  44. mcp_proxy_adapter/cli/examples/mtls_roles.py +103 -0
  45. mcp_proxy_adapter/cli/main.py +63 -0
  46. mcp_proxy_adapter/cli/parser.py +338 -0
  47. mcp_proxy_adapter/cli/validators.py +231 -0
  48. mcp_proxy_adapter/client/jsonrpc_client/__init__.py +9 -0
  49. mcp_proxy_adapter/client/jsonrpc_client/client.py +42 -0
  50. mcp_proxy_adapter/client/jsonrpc_client/command_api.py +45 -0
  51. mcp_proxy_adapter/client/jsonrpc_client/proxy_api.py +224 -0
  52. mcp_proxy_adapter/client/jsonrpc_client/queue_api.py +60 -0
  53. mcp_proxy_adapter/client/jsonrpc_client/transport.py +108 -0
  54. mcp_proxy_adapter/client/proxy.py +123 -0
  55. mcp_proxy_adapter/commands/__init__.py +66 -0
  56. mcp_proxy_adapter/commands/auth_validation_command.py +69 -0
  57. mcp_proxy_adapter/commands/base.py +389 -0
  58. mcp_proxy_adapter/commands/builtin_commands.py +30 -0
  59. mcp_proxy_adapter/commands/catalog/__init__.py +20 -0
  60. mcp_proxy_adapter/commands/catalog/catalog_loader.py +34 -0
  61. mcp_proxy_adapter/commands/catalog/catalog_manager.py +122 -0
  62. mcp_proxy_adapter/commands/catalog/catalog_syncer.py +149 -0
  63. mcp_proxy_adapter/commands/catalog/command_catalog.py +43 -0
  64. mcp_proxy_adapter/commands/catalog/dependency_manager.py +37 -0
  65. mcp_proxy_adapter/commands/catalog_manager.py +97 -0
  66. mcp_proxy_adapter/commands/cert_monitor_command.py +552 -0
  67. mcp_proxy_adapter/commands/certificate_management_command.py +562 -0
  68. mcp_proxy_adapter/commands/command_registry.py +298 -0
  69. mcp_proxy_adapter/commands/config_command.py +102 -0
  70. mcp_proxy_adapter/commands/dependency_container.py +40 -0
  71. mcp_proxy_adapter/commands/dependency_manager.py +143 -0
  72. mcp_proxy_adapter/commands/echo_command.py +48 -0
  73. mcp_proxy_adapter/commands/health_command.py +142 -0
  74. mcp_proxy_adapter/commands/help_command.py +175 -0
  75. mcp_proxy_adapter/commands/hooks.py +172 -0
  76. mcp_proxy_adapter/commands/key_management_command.py +484 -0
  77. mcp_proxy_adapter/commands/load_command.py +123 -0
  78. mcp_proxy_adapter/commands/plugins_command.py +246 -0
  79. mcp_proxy_adapter/commands/protocol_management_command.py +216 -0
  80. mcp_proxy_adapter/commands/proxy_registration_command.py +319 -0
  81. mcp_proxy_adapter/commands/queue_commands.py +750 -0
  82. mcp_proxy_adapter/commands/registration_status_command.py +76 -0
  83. mcp_proxy_adapter/commands/registry/__init__.py +18 -0
  84. mcp_proxy_adapter/commands/registry/command_info.py +103 -0
  85. mcp_proxy_adapter/commands/registry/command_loader.py +207 -0
  86. mcp_proxy_adapter/commands/registry/command_manager.py +119 -0
  87. mcp_proxy_adapter/commands/registry/command_registry.py +217 -0
  88. mcp_proxy_adapter/commands/reload_command.py +136 -0
  89. mcp_proxy_adapter/commands/result.py +157 -0
  90. mcp_proxy_adapter/commands/role_test_command.py +99 -0
  91. mcp_proxy_adapter/commands/roles_management_command.py +502 -0
  92. mcp_proxy_adapter/commands/security_command.py +472 -0
  93. mcp_proxy_adapter/commands/settings_command.py +113 -0
  94. mcp_proxy_adapter/commands/ssl_setup_command.py +306 -0
  95. mcp_proxy_adapter/commands/token_management_command.py +500 -0
  96. mcp_proxy_adapter/commands/transport_management_command.py +129 -0
  97. mcp_proxy_adapter/commands/unload_command.py +92 -0
  98. mcp_proxy_adapter/config.py +32 -0
  99. mcp_proxy_adapter/core/__init__.py +8 -0
  100. mcp_proxy_adapter/core/app_factory.py +560 -0
  101. mcp_proxy_adapter/core/app_runner.py +318 -0
  102. mcp_proxy_adapter/core/auth_validator.py +508 -0
  103. mcp_proxy_adapter/core/certificate/__init__.py +20 -0
  104. mcp_proxy_adapter/core/certificate/certificate_creator.py +372 -0
  105. mcp_proxy_adapter/core/certificate/certificate_extractor.py +185 -0
  106. mcp_proxy_adapter/core/certificate/certificate_utils.py +249 -0
  107. mcp_proxy_adapter/core/certificate/certificate_validator.py +481 -0
  108. mcp_proxy_adapter/core/certificate/ssl_context_manager.py +65 -0
  109. mcp_proxy_adapter/core/certificate_utils.py +249 -0
  110. mcp_proxy_adapter/core/client.py +608 -0
  111. mcp_proxy_adapter/core/client_manager.py +271 -0
  112. mcp_proxy_adapter/core/client_security.py +411 -0
  113. mcp_proxy_adapter/core/config/__init__.py +18 -0
  114. mcp_proxy_adapter/core/config/config.py +237 -0
  115. mcp_proxy_adapter/core/config/config_factory.py +22 -0
  116. mcp_proxy_adapter/core/config/config_loader.py +66 -0
  117. mcp_proxy_adapter/core/config/feature_manager.py +31 -0
  118. mcp_proxy_adapter/core/config/simple_config.py +204 -0
  119. mcp_proxy_adapter/core/config/simple_config_generator.py +131 -0
  120. mcp_proxy_adapter/core/config/simple_config_validator.py +476 -0
  121. mcp_proxy_adapter/core/config_converter.py +252 -0
  122. mcp_proxy_adapter/core/config_validator.py +211 -0
  123. mcp_proxy_adapter/core/crl_utils.py +362 -0
  124. mcp_proxy_adapter/core/errors.py +276 -0
  125. mcp_proxy_adapter/core/job_manager.py +54 -0
  126. mcp_proxy_adapter/core/logging.py +250 -0
  127. mcp_proxy_adapter/core/mtls_asgi.py +140 -0
  128. mcp_proxy_adapter/core/mtls_asgi_app.py +187 -0
  129. mcp_proxy_adapter/core/mtls_proxy.py +229 -0
  130. mcp_proxy_adapter/core/mtls_server.py +154 -0
  131. mcp_proxy_adapter/core/protocol_manager.py +232 -0
  132. mcp_proxy_adapter/core/proxy/__init__.py +19 -0
  133. mcp_proxy_adapter/core/proxy/auth_manager.py +26 -0
  134. mcp_proxy_adapter/core/proxy/proxy_registration_manager.py +160 -0
  135. mcp_proxy_adapter/core/proxy/registration_client.py +186 -0
  136. mcp_proxy_adapter/core/proxy/ssl_manager.py +101 -0
  137. mcp_proxy_adapter/core/proxy_client.py +184 -0
  138. mcp_proxy_adapter/core/proxy_registration.py +80 -0
  139. mcp_proxy_adapter/core/role_utils.py +103 -0
  140. mcp_proxy_adapter/core/security_adapter.py +343 -0
  141. mcp_proxy_adapter/core/security_factory.py +96 -0
  142. mcp_proxy_adapter/core/security_integration.py +342 -0
  143. mcp_proxy_adapter/core/server_adapter.py +251 -0
  144. mcp_proxy_adapter/core/server_engine.py +217 -0
  145. mcp_proxy_adapter/core/settings.py +260 -0
  146. mcp_proxy_adapter/core/signal_handler.py +107 -0
  147. mcp_proxy_adapter/core/ssl_utils.py +161 -0
  148. mcp_proxy_adapter/core/transport_manager.py +153 -0
  149. mcp_proxy_adapter/core/unified_config_adapter.py +471 -0
  150. mcp_proxy_adapter/core/utils.py +101 -0
  151. mcp_proxy_adapter/core/validation/__init__.py +21 -0
  152. mcp_proxy_adapter/core/validation/config_validator.py +219 -0
  153. mcp_proxy_adapter/core/validation/file_validator.py +131 -0
  154. mcp_proxy_adapter/core/validation/protocol_validator.py +205 -0
  155. mcp_proxy_adapter/core/validation/security_validator.py +140 -0
  156. mcp_proxy_adapter/core/validation/validation_result.py +27 -0
  157. mcp_proxy_adapter/custom_openapi.py +58 -0
  158. mcp_proxy_adapter/examples/__init__.py +16 -0
  159. mcp_proxy_adapter/examples/basic_framework/__init__.py +9 -0
  160. mcp_proxy_adapter/examples/basic_framework/commands/__init__.py +4 -0
  161. mcp_proxy_adapter/examples/basic_framework/hooks/__init__.py +4 -0
  162. mcp_proxy_adapter/examples/basic_framework/main.py +52 -0
  163. mcp_proxy_adapter/examples/bugfix_certificate_config.py +261 -0
  164. mcp_proxy_adapter/examples/cert_manager_bugfix.py +203 -0
  165. mcp_proxy_adapter/examples/check_config.py +413 -0
  166. mcp_proxy_adapter/examples/client_usage_example.py +164 -0
  167. mcp_proxy_adapter/examples/commands/__init__.py +5 -0
  168. mcp_proxy_adapter/examples/config_builder.py +234 -0
  169. mcp_proxy_adapter/examples/config_cli.py +282 -0
  170. mcp_proxy_adapter/examples/create_test_configs.py +174 -0
  171. mcp_proxy_adapter/examples/debug_request_state.py +130 -0
  172. mcp_proxy_adapter/examples/debug_role_chain.py +191 -0
  173. mcp_proxy_adapter/examples/demo_client.py +287 -0
  174. mcp_proxy_adapter/examples/full_application/__init__.py +12 -0
  175. mcp_proxy_adapter/examples/full_application/commands/__init__.py +8 -0
  176. mcp_proxy_adapter/examples/full_application/commands/custom_echo_command.py +45 -0
  177. mcp_proxy_adapter/examples/full_application/commands/dynamic_calculator_command.py +52 -0
  178. mcp_proxy_adapter/examples/full_application/commands/echo_command.py +32 -0
  179. mcp_proxy_adapter/examples/full_application/commands/help_command.py +54 -0
  180. mcp_proxy_adapter/examples/full_application/commands/list_command.py +57 -0
  181. mcp_proxy_adapter/examples/full_application/hooks/__init__.py +5 -0
  182. mcp_proxy_adapter/examples/full_application/hooks/application_hooks.py +29 -0
  183. mcp_proxy_adapter/examples/full_application/hooks/builtin_command_hooks.py +27 -0
  184. mcp_proxy_adapter/examples/full_application/main.py +311 -0
  185. mcp_proxy_adapter/examples/full_application/proxy_endpoints.py +161 -0
  186. mcp_proxy_adapter/examples/full_application/run_mtls.py +252 -0
  187. mcp_proxy_adapter/examples/full_application/run_simple.py +152 -0
  188. mcp_proxy_adapter/examples/full_application/test_minimal_server.py +45 -0
  189. mcp_proxy_adapter/examples/full_application/test_server.py +163 -0
  190. mcp_proxy_adapter/examples/full_application/test_simple_server.py +62 -0
  191. mcp_proxy_adapter/examples/generate_config.py +502 -0
  192. mcp_proxy_adapter/examples/proxy_registration_example.py +335 -0
  193. mcp_proxy_adapter/examples/queue_demo_simple.py +632 -0
  194. mcp_proxy_adapter/examples/queue_integration_example.py +578 -0
  195. mcp_proxy_adapter/examples/queue_server_demo.py +82 -0
  196. mcp_proxy_adapter/examples/queue_server_example.py +85 -0
  197. mcp_proxy_adapter/examples/queue_server_simple.py +173 -0
  198. mcp_proxy_adapter/examples/required_certificates.py +208 -0
  199. mcp_proxy_adapter/examples/run_example.py +77 -0
  200. mcp_proxy_adapter/examples/run_full_test_suite.py +619 -0
  201. mcp_proxy_adapter/examples/run_proxy_server.py +153 -0
  202. mcp_proxy_adapter/examples/run_security_tests_fixed.py +435 -0
  203. mcp_proxy_adapter/examples/security_test/__init__.py +18 -0
  204. mcp_proxy_adapter/examples/security_test/auth_manager.py +14 -0
  205. mcp_proxy_adapter/examples/security_test/ssl_context_manager.py +28 -0
  206. mcp_proxy_adapter/examples/security_test/test_client.py +159 -0
  207. mcp_proxy_adapter/examples/security_test/test_result.py +22 -0
  208. mcp_proxy_adapter/examples/security_test_client.py +72 -0
  209. mcp_proxy_adapter/examples/setup/__init__.py +24 -0
  210. mcp_proxy_adapter/examples/setup/certificate_manager.py +215 -0
  211. mcp_proxy_adapter/examples/setup/config_generator.py +12 -0
  212. mcp_proxy_adapter/examples/setup/config_validator.py +118 -0
  213. mcp_proxy_adapter/examples/setup/environment_setup.py +62 -0
  214. mcp_proxy_adapter/examples/setup/test_files_generator.py +10 -0
  215. mcp_proxy_adapter/examples/setup/test_runner.py +89 -0
  216. mcp_proxy_adapter/examples/setup_test_environment.py +235 -0
  217. mcp_proxy_adapter/examples/simple_protocol_test.py +125 -0
  218. mcp_proxy_adapter/examples/test_chk_hostname_automated.py +211 -0
  219. mcp_proxy_adapter/examples/test_config.py +205 -0
  220. mcp_proxy_adapter/examples/test_config_builder.py +110 -0
  221. mcp_proxy_adapter/examples/test_examples.py +308 -0
  222. mcp_proxy_adapter/examples/test_framework_complete.py +267 -0
  223. mcp_proxy_adapter/examples/test_mcp_server.py +187 -0
  224. mcp_proxy_adapter/examples/test_protocol_examples.py +337 -0
  225. mcp_proxy_adapter/examples/universal_client.py +674 -0
  226. mcp_proxy_adapter/examples/update_config_certificates.py +135 -0
  227. mcp_proxy_adapter/examples/validate_generator_compatibility.py +385 -0
  228. mcp_proxy_adapter/examples/validate_generator_compatibility_simple.py +61 -0
  229. mcp_proxy_adapter/integrations/__init__.py +25 -0
  230. mcp_proxy_adapter/integrations/queuemgr_integration.py +462 -0
  231. mcp_proxy_adapter/main.py +311 -0
  232. mcp_proxy_adapter/openapi.py +375 -0
  233. mcp_proxy_adapter/schemas/base_schema.json +114 -0
  234. mcp_proxy_adapter/schemas/openapi_schema.json +314 -0
  235. mcp_proxy_adapter/schemas/roles.json +37 -0
  236. mcp_proxy_adapter/schemas/roles_schema.json +162 -0
  237. mcp_proxy_adapter/version.py +5 -0
  238. mcp_proxy_adapter-6.9.50.dist-info/METADATA +1088 -0
  239. mcp_proxy_adapter-6.9.50.dist-info/RECORD +242 -0
  240. {mcp_proxy_adapter-2.0.1.dist-info → mcp_proxy_adapter-6.9.50.dist-info}/WHEEL +1 -1
  241. mcp_proxy_adapter-6.9.50.dist-info/entry_points.txt +14 -0
  242. mcp_proxy_adapter-6.9.50.dist-info/top_level.txt +1 -0
  243. adapters/__init__.py +0 -16
  244. analyzers/__init__.py +0 -14
  245. analyzers/docstring_analyzer.py +0 -199
  246. analyzers/type_analyzer.py +0 -151
  247. cli/__init__.py +0 -12
  248. cli/__main__.py +0 -79
  249. cli/command_runner.py +0 -233
  250. dispatchers/__init__.py +0 -14
  251. dispatchers/base_dispatcher.py +0 -85
  252. dispatchers/json_rpc_dispatcher.py +0 -198
  253. generators/__init__.py +0 -14
  254. generators/endpoint_generator.py +0 -172
  255. generators/openapi_generator.py +0 -254
  256. generators/rest_api_generator.py +0 -207
  257. mcp_proxy_adapter-2.0.1.dist-info/METADATA +0 -272
  258. mcp_proxy_adapter-2.0.1.dist-info/RECORD +0 -28
  259. mcp_proxy_adapter-2.0.1.dist-info/licenses/LICENSE +0 -21
  260. mcp_proxy_adapter-2.0.1.dist-info/top_level.txt +0 -7
  261. openapi_schema/__init__.py +0 -38
  262. openapi_schema/command_registry.py +0 -312
  263. openapi_schema/rest_schema.py +0 -510
  264. openapi_schema/rpc_generator.py +0 -307
  265. openapi_schema/rpc_schema.py +0 -416
  266. validators/__init__.py +0 -14
  267. validators/base_validator.py +0 -23
  268. validators/docstring_validator.py +0 -75
  269. 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()