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,306 @@
1
+ """
2
+ SSL Setup Command
3
+
4
+ Author: Vasiliy Zdanovskiy
5
+ email: vasilyvz@gmail.com
6
+
7
+ Command for SSL/TLS configuration and certificate management.
8
+ """
9
+
10
+ import logging
11
+ import ssl
12
+ from typing import Dict, Any, Optional
13
+
14
+ from mcp_proxy_adapter.core.logging import get_global_logger
15
+ # Import mcp_security_framework
16
+ try:
17
+ from mcp_security_framework.core.ssl_manager import SSLManager
18
+ from mcp_security_framework.schemas.config import SSLConfig
19
+
20
+ SECURITY_FRAMEWORK_AVAILABLE = True
21
+ except ImportError:
22
+ SECURITY_FRAMEWORK_AVAILABLE = False
23
+
24
+ from .base import Command
25
+ from .result import SuccessResult, ErrorResult
26
+ from ..config import Config
27
+
28
+ logger = logging.getLogger(__name__)
29
+
30
+
31
+ class SSLSetupCommand(Command):
32
+ """
33
+ SSL Setup Command
34
+
35
+ Handles SSL/TLS configuration and certificate management.
36
+ """
37
+
38
+ # Command metadata
39
+ name = "ssl_setup"
40
+ version = "1.0.0"
41
+ descr = "Configure SSL/TLS settings and manage certificates"
42
+ category = "security"
43
+ author = "MCP Proxy Adapter Team"
44
+ email = "team@mcp-proxy-adapter.com"
45
+ source_url = "https://github.com/mcp-proxy-adapter"
46
+ result_class = SuccessResult
47
+
48
+ def __init__(self):
49
+ """Initialize SSL Setup Command."""
50
+ super().__init__()
51
+
52
+ async def execute(self, **kwargs) -> SuccessResult | ErrorResult:
53
+ """
54
+ Execute SSL setup command.
55
+
56
+ Args:
57
+ params: Command parameters including:
58
+ - action: Operation to perform (get, set, update, reset, test)
59
+ - config_data: Configuration data for set/update actions
60
+ - cert_file: Certificate file path for testing
61
+ - key_file: Private key file path for testing
62
+
63
+ Returns:
64
+ SuccessResult or ErrorResult
65
+ """
66
+ try:
67
+ action = kwargs.get("action", "get")
68
+
69
+ if action == "get":
70
+ return await self._get_ssl_config()
71
+ elif action == "set":
72
+ return await self._set_ssl_config(kwargs.get("config_data", {}))
73
+ elif action == "update":
74
+ return await self._update_ssl_config(kwargs.get("config_data", {}))
75
+ elif action == "reset":
76
+ return await self._reset_ssl_config()
77
+ elif action == "test":
78
+ return await self._test_ssl_config(
79
+ kwargs.get("cert_file"), kwargs.get("key_file")
80
+ )
81
+ else:
82
+ return ErrorResult(
83
+ message=f"Unknown action: {action}. Supported actions: get, set, update, reset, test"
84
+ )
85
+
86
+ except Exception as e:
87
+ get_global_logger().error(f"SSL setup command failed: {e}")
88
+ return ErrorResult(message=f"SSL setup command failed: {str(e)}")
89
+
90
+ async def _get_ssl_config(self) -> SuccessResult | ErrorResult:
91
+ """Get current SSL configuration."""
92
+ try:
93
+ config = Config()
94
+ ssl_config = config.get("ssl", {})
95
+
96
+ # Add framework information
97
+ ssl_config["framework_available"] = SECURITY_FRAMEWORK_AVAILABLE
98
+
99
+ return SuccessResult(data={"ssl_config": ssl_config})
100
+
101
+ except Exception as e:
102
+ get_global_logger().error(f"Failed to get SSL config: {e}")
103
+ return ErrorResult(message=f"Failed to get SSL config: {str(e)}")
104
+
105
+ async def _set_ssl_config(
106
+ self, config_data: Dict[str, Any]
107
+ ) -> SuccessResult | ErrorResult:
108
+ """Set SSL configuration."""
109
+ try:
110
+ if not isinstance(config_data, dict):
111
+ return ErrorResult(message="Configuration data must be a dictionary")
112
+
113
+ # Validate configuration if mcp_security_framework is available
114
+ if SECURITY_FRAMEWORK_AVAILABLE:
115
+ try:
116
+ ssl_config = SSLConfig(**config_data)
117
+ config_data = ssl_config.dict()
118
+ except Exception as e:
119
+ return ErrorResult(message=f"Invalid SSL configuration: {str(e)}")
120
+
121
+ # Update configuration
122
+ config = Config()
123
+ config.update_config({"ssl": config_data})
124
+
125
+ return SuccessResult(
126
+ data={"message": "SSL configuration updated", "ssl_config": config_data}
127
+ )
128
+
129
+ except Exception as e:
130
+ get_global_logger().error(f"Failed to set SSL config: {e}")
131
+ return ErrorResult(message=f"Failed to set SSL config: {str(e)}")
132
+
133
+ async def _update_ssl_config(
134
+ self, config_data: Dict[str, Any]
135
+ ) -> SuccessResult | ErrorResult:
136
+ """Update SSL configuration."""
137
+ try:
138
+ if not isinstance(config_data, dict):
139
+ return ErrorResult(message="Configuration data must be a dictionary")
140
+
141
+ config = Config()
142
+ current_config = config.get("ssl", {})
143
+
144
+ # Update with new data
145
+ current_config.update(config_data)
146
+
147
+ # Validate configuration if mcp_security_framework is available
148
+ if SECURITY_FRAMEWORK_AVAILABLE:
149
+ try:
150
+ ssl_config = SSLConfig(**current_config)
151
+ current_config = ssl_config.dict()
152
+ except Exception as e:
153
+ return ErrorResult(message=f"Invalid SSL configuration: {str(e)}")
154
+
155
+ # Update configuration
156
+ config.update_config({"ssl": current_config})
157
+
158
+ return SuccessResult(
159
+ data={
160
+ "message": "SSL configuration updated",
161
+ "ssl_config": current_config,
162
+ }
163
+ )
164
+
165
+ except Exception as e:
166
+ get_global_logger().error(f"Failed to update SSL config: {e}")
167
+ return ErrorResult(message=f"Failed to update SSL config: {str(e)}")
168
+
169
+ async def _reset_ssl_config(self) -> SuccessResult | ErrorResult:
170
+ """Reset SSL configuration to defaults."""
171
+ try:
172
+ default_config = {
173
+ "enabled": False,
174
+ "cert_file": None,
175
+ "key_file": None,
176
+ "ca_file": None,
177
+ "verify_mode": "CERT_REQUIRED",
178
+ "cipher_suites": [],
179
+ "framework_available": SECURITY_FRAMEWORK_AVAILABLE,
180
+ }
181
+
182
+ config = Config()
183
+ config.update_config({"ssl": default_config})
184
+
185
+ return SuccessResult(
186
+ data={
187
+ "message": "SSL configuration reset to defaults",
188
+ "ssl_config": default_config,
189
+ }
190
+ )
191
+
192
+ except Exception as e:
193
+ get_global_logger().error(f"Failed to reset SSL config: {e}")
194
+ return ErrorResult(message=f"Failed to reset SSL config: {str(e)}")
195
+
196
+ async def _test_ssl_config(
197
+ self, cert_file: Optional[str], key_file: Optional[str]
198
+ ) -> SuccessResult | ErrorResult:
199
+ """
200
+ Test SSL configuration.
201
+
202
+ Args:
203
+ cert_file: Path to certificate file
204
+ key_file: Path to private key file
205
+
206
+ Returns:
207
+ SuccessResult or ErrorResult with test results
208
+ """
209
+ try:
210
+ if not cert_file or not key_file:
211
+ return ErrorResult(
212
+ message="Both cert_file and key_file are required for testing"
213
+ )
214
+
215
+ if SECURITY_FRAMEWORK_AVAILABLE:
216
+ return await self._test_ssl_config_with_framework(cert_file, key_file)
217
+ else:
218
+ return await self._test_ssl_config_fallback(cert_file, key_file)
219
+
220
+ except Exception as e:
221
+ get_global_logger().error(f"Failed to test SSL config: {e}")
222
+ return ErrorResult(message=f"Failed to test SSL config: {str(e)}")
223
+
224
+ async def _test_ssl_config_with_framework(
225
+ self, cert_file: str, key_file: str
226
+ ) -> SuccessResult | ErrorResult:
227
+ """Test SSL configuration using mcp_security_framework."""
228
+ try:
229
+ # Create SSL manager
230
+ ssl_config = SSLConfig(cert_file=cert_file, key_file=key_file, enabled=True)
231
+
232
+ ssl_manager = SSLManager(ssl_config)
233
+
234
+ # Test SSL context creation
235
+ context = ssl_manager.create_server_ssl_context()
236
+
237
+ details = {
238
+ "framework": "mcp_security_framework",
239
+ "certificate_loaded": True,
240
+ "private_key_loaded": True,
241
+ "context_created": True,
242
+ "cert_file": cert_file,
243
+ "key_file": key_file,
244
+ }
245
+
246
+ return SuccessResult(data={"success": True, "details": details})
247
+
248
+ except Exception as e:
249
+ return ErrorResult(
250
+ message=f"SSL test failed: {str(e)}",
251
+ data={
252
+ "success": False,
253
+ "error": str(e),
254
+ "details": {
255
+ "framework": "mcp_security_framework",
256
+ "certificate_loaded": False,
257
+ "private_key_loaded": False,
258
+ "context_created": False,
259
+ },
260
+ },
261
+ )
262
+
263
+ async def _test_ssl_config_fallback(
264
+ self, cert_file: str, key_file: str
265
+ ) -> SuccessResult | ErrorResult:
266
+ """Test SSL configuration using fallback method."""
267
+ try:
268
+ # Create SSL context
269
+ context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
270
+ context.check_hostname = False
271
+ context.verify_mode = ssl.CERT_NONE
272
+
273
+ # Load certificate and key
274
+ context.load_cert_chain(cert_file, key_file)
275
+
276
+ # Test basic SSL functionality
277
+ details = {
278
+ "framework": "fallback (ssl module)",
279
+ "ssl_version": ssl.OPENSSL_VERSION,
280
+ "certificate_loaded": True,
281
+ "private_key_loaded": True,
282
+ "context_created": True,
283
+ "cert_file": cert_file,
284
+ "key_file": key_file,
285
+ }
286
+
287
+ return SuccessResult(data={"success": True, "details": details})
288
+
289
+ except Exception as e:
290
+ return ErrorResult(
291
+ message=f"SSL test failed: {str(e)}",
292
+ data={
293
+ "success": False,
294
+ "error": str(e),
295
+ "details": {
296
+ "framework": "fallback (ssl module)",
297
+ "ssl_version": ssl.OPENSSL_VERSION,
298
+ "certificate_loaded": False,
299
+ "private_key_loaded": False,
300
+ "context_created": False,
301
+ },
302
+ },
303
+ )
304
+
305
+
306
+ @classmethod