mcp-proxy-adapter 6.9.28__py3-none-any.whl → 6.9.30__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 +10 -0
- mcp_proxy_adapter/__main__.py +8 -21
- mcp_proxy_adapter/api/app.py +10 -913
- mcp_proxy_adapter/api/core/__init__.py +18 -0
- mcp_proxy_adapter/api/core/app_factory.py +243 -0
- mcp_proxy_adapter/api/core/lifespan_manager.py +55 -0
- mcp_proxy_adapter/api/core/registration_manager.py +166 -0
- mcp_proxy_adapter/api/core/ssl_context_factory.py +88 -0
- mcp_proxy_adapter/api/handlers.py +78 -199
- mcp_proxy_adapter/api/middleware/__init__.py +1 -44
- mcp_proxy_adapter/api/middleware/base.py +0 -42
- mcp_proxy_adapter/api/middleware/command_permission_middleware.py +0 -85
- mcp_proxy_adapter/api/middleware/error_handling.py +1 -127
- mcp_proxy_adapter/api/middleware/factory.py +0 -94
- mcp_proxy_adapter/api/middleware/logging.py +0 -112
- mcp_proxy_adapter/api/middleware/performance.py +0 -35
- mcp_proxy_adapter/api/middleware/protocol_middleware.py +2 -98
- mcp_proxy_adapter/api/middleware/transport_middleware.py +0 -37
- mcp_proxy_adapter/api/middleware/unified_security.py +10 -10
- mcp_proxy_adapter/api/middleware/user_info_middleware.py +0 -118
- 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 +0 -61
- mcp_proxy_adapter/api/tool_integration.py +0 -117
- mcp_proxy_adapter/api/tools.py +0 -46
- 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 +21 -0
- mcp_proxy_adapter/cli/commands/config_validate.py +36 -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 +128 -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 +324 -0
- mcp_proxy_adapter/cli/validators.py +231 -0
- mcp_proxy_adapter/client/jsonrpc_client.py +406 -0
- mcp_proxy_adapter/client/proxy.py +45 -0
- mcp_proxy_adapter/commands/__init__.py +44 -28
- mcp_proxy_adapter/commands/auth_validation_command.py +7 -344
- mcp_proxy_adapter/commands/base.py +19 -43
- mcp_proxy_adapter/commands/builtin_commands.py +0 -75
- 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 +58 -928
- mcp_proxy_adapter/commands/cert_monitor_command.py +0 -88
- mcp_proxy_adapter/commands/certificate_management_command.py +0 -45
- mcp_proxy_adapter/commands/command_registry.py +172 -904
- mcp_proxy_adapter/commands/config_command.py +0 -28
- mcp_proxy_adapter/commands/dependency_container.py +1 -70
- mcp_proxy_adapter/commands/dependency_manager.py +0 -128
- mcp_proxy_adapter/commands/echo_command.py +0 -34
- mcp_proxy_adapter/commands/health_command.py +0 -3
- mcp_proxy_adapter/commands/help_command.py +0 -159
- mcp_proxy_adapter/commands/hooks.py +0 -137
- mcp_proxy_adapter/commands/key_management_command.py +0 -25
- mcp_proxy_adapter/commands/load_command.py +7 -78
- mcp_proxy_adapter/commands/plugins_command.py +0 -16
- mcp_proxy_adapter/commands/protocol_management_command.py +0 -28
- mcp_proxy_adapter/commands/proxy_registration_command.py +0 -88
- mcp_proxy_adapter/commands/queue_commands.py +750 -0
- mcp_proxy_adapter/commands/registration_status_command.py +0 -43
- 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 +0 -80
- mcp_proxy_adapter/commands/result.py +25 -77
- mcp_proxy_adapter/commands/role_test_command.py +0 -44
- mcp_proxy_adapter/commands/roles_management_command.py +0 -199
- mcp_proxy_adapter/commands/security_command.py +0 -30
- mcp_proxy_adapter/commands/settings_command.py +0 -68
- mcp_proxy_adapter/commands/ssl_setup_command.py +0 -42
- mcp_proxy_adapter/commands/token_management_command.py +0 -1
- mcp_proxy_adapter/commands/transport_management_command.py +0 -20
- mcp_proxy_adapter/commands/unload_command.py +0 -71
- mcp_proxy_adapter/config.py +15 -626
- mcp_proxy_adapter/core/__init__.py +5 -39
- mcp_proxy_adapter/core/app_factory.py +14 -36
- mcp_proxy_adapter/core/app_runner.py +0 -27
- mcp_proxy_adapter/core/auth_validator.py +1 -93
- mcp_proxy_adapter/core/certificate/__init__.py +20 -0
- mcp_proxy_adapter/core/certificate/certificate_creator.py +371 -0
- mcp_proxy_adapter/core/certificate/certificate_extractor.py +183 -0
- mcp_proxy_adapter/core/certificate/certificate_utils.py +249 -0
- mcp_proxy_adapter/core/certificate/certificate_validator.py +110 -0
- mcp_proxy_adapter/core/certificate/ssl_context_manager.py +70 -0
- mcp_proxy_adapter/core/certificate_utils.py +64 -903
- mcp_proxy_adapter/core/client.py +10 -9
- mcp_proxy_adapter/core/client_manager.py +0 -19
- mcp_proxy_adapter/core/client_security.py +0 -2
- mcp_proxy_adapter/core/config/__init__.py +18 -0
- mcp_proxy_adapter/core/config/config.py +195 -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 +112 -0
- mcp_proxy_adapter/core/config/simple_config_generator.py +50 -0
- mcp_proxy_adapter/core/config/simple_config_validator.py +96 -0
- mcp_proxy_adapter/core/config_converter.py +0 -186
- mcp_proxy_adapter/core/config_validator.py +96 -1238
- mcp_proxy_adapter/core/errors.py +7 -42
- mcp_proxy_adapter/core/job_manager.py +54 -0
- mcp_proxy_adapter/core/logging.py +2 -22
- mcp_proxy_adapter/core/mtls_asgi.py +0 -20
- mcp_proxy_adapter/core/mtls_asgi_app.py +0 -12
- mcp_proxy_adapter/core/mtls_proxy.py +0 -80
- mcp_proxy_adapter/core/mtls_server.py +3 -173
- mcp_proxy_adapter/core/protocol_manager.py +1 -191
- mcp_proxy_adapter/core/proxy/__init__.py +22 -0
- mcp_proxy_adapter/core/proxy/auth_manager.py +27 -0
- mcp_proxy_adapter/core/proxy/proxy_registration_manager.py +137 -0
- mcp_proxy_adapter/core/proxy/registration_client.py +60 -0
- mcp_proxy_adapter/core/proxy/ssl_manager.py +101 -0
- mcp_proxy_adapter/core/proxy_client.py +0 -1
- mcp_proxy_adapter/core/proxy_registration.py +36 -913
- mcp_proxy_adapter/core/role_utils.py +0 -308
- mcp_proxy_adapter/core/security_adapter.py +1 -36
- mcp_proxy_adapter/core/security_factory.py +1 -150
- mcp_proxy_adapter/core/security_integration.py +0 -33
- mcp_proxy_adapter/core/server_adapter.py +1 -40
- mcp_proxy_adapter/core/server_engine.py +2 -173
- mcp_proxy_adapter/core/settings.py +0 -127
- mcp_proxy_adapter/core/signal_handler.py +0 -65
- mcp_proxy_adapter/core/ssl_utils.py +19 -137
- mcp_proxy_adapter/core/transport_manager.py +0 -151
- mcp_proxy_adapter/core/unified_config_adapter.py +1 -193
- mcp_proxy_adapter/core/utils.py +1 -182
- mcp_proxy_adapter/core/validation/__init__.py +21 -0
- mcp_proxy_adapter/core/validation/config_validator.py +211 -0
- mcp_proxy_adapter/core/validation/file_validator.py +73 -0
- mcp_proxy_adapter/core/validation/protocol_validator.py +191 -0
- mcp_proxy_adapter/core/validation/security_validator.py +58 -0
- mcp_proxy_adapter/core/validation/validation_result.py +27 -0
- mcp_proxy_adapter/custom_openapi.py +33 -652
- mcp_proxy_adapter/examples/bugfix_certificate_config.py +0 -23
- mcp_proxy_adapter/examples/check_config.py +0 -2
- mcp_proxy_adapter/examples/client_usage_example.py +164 -0
- mcp_proxy_adapter/examples/config_builder.py +13 -2
- mcp_proxy_adapter/examples/config_cli.py +0 -1
- mcp_proxy_adapter/examples/create_test_configs.py +0 -46
- mcp_proxy_adapter/examples/debug_request_state.py +0 -1
- mcp_proxy_adapter/examples/full_application/commands/custom_echo_command.py +0 -47
- mcp_proxy_adapter/examples/full_application/commands/dynamic_calculator_command.py +0 -45
- mcp_proxy_adapter/examples/full_application/commands/echo_command.py +0 -12
- mcp_proxy_adapter/examples/full_application/commands/help_command.py +0 -12
- mcp_proxy_adapter/examples/full_application/commands/list_command.py +0 -7
- mcp_proxy_adapter/examples/full_application/hooks/__init__.py +0 -2
- mcp_proxy_adapter/examples/full_application/hooks/application_hooks.py +0 -59
- mcp_proxy_adapter/examples/full_application/hooks/builtin_command_hooks.py +0 -54
- mcp_proxy_adapter/examples/full_application/main.py +186 -150
- mcp_proxy_adapter/examples/full_application/proxy_endpoints.py +0 -107
- mcp_proxy_adapter/examples/full_application/test_minimal_server.py +0 -24
- mcp_proxy_adapter/examples/full_application/test_server.py +0 -58
- mcp_proxy_adapter/examples/generate_config.py +65 -11
- 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 +0 -2
- mcp_proxy_adapter/examples/run_full_test_suite.py +0 -29
- mcp_proxy_adapter/examples/run_proxy_server.py +31 -71
- mcp_proxy_adapter/examples/run_security_tests_fixed.py +0 -27
- 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 +24 -1075
- 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 +133 -1425
- mcp_proxy_adapter/examples/test_config.py +0 -3
- mcp_proxy_adapter/examples/test_config_builder.py +25 -405
- mcp_proxy_adapter/examples/test_examples.py +0 -1
- mcp_proxy_adapter/examples/test_framework_complete.py +0 -2
- mcp_proxy_adapter/examples/test_mcp_server.py +0 -1
- mcp_proxy_adapter/examples/test_protocol_examples.py +0 -1
- mcp_proxy_adapter/examples/universal_client.py +0 -6
- mcp_proxy_adapter/examples/update_config_certificates.py +0 -1
- mcp_proxy_adapter/examples/validate_generator_compatibility.py +0 -1
- mcp_proxy_adapter/examples/validate_generator_compatibility_simple.py +0 -187
- mcp_proxy_adapter/integrations/__init__.py +25 -0
- mcp_proxy_adapter/integrations/queuemgr_integration.py +462 -0
- mcp_proxy_adapter/main.py +70 -62
- mcp_proxy_adapter/openapi.py +0 -22
- mcp_proxy_adapter/version.py +1 -1
- {mcp_proxy_adapter-6.9.28.dist-info → mcp_proxy_adapter-6.9.30.dist-info}/METADATA +2 -1
- mcp_proxy_adapter-6.9.30.dist-info/RECORD +235 -0
- {mcp_proxy_adapter-6.9.28.dist-info → mcp_proxy_adapter-6.9.30.dist-info}/entry_points.txt +1 -1
- mcp_proxy_adapter-6.9.28.dist-info/RECORD +0 -149
- {mcp_proxy_adapter-6.9.28.dist-info → mcp_proxy_adapter-6.9.30.dist-info}/WHEEL +0 -0
- {mcp_proxy_adapter-6.9.28.dist-info → mcp_proxy_adapter-6.9.30.dist-info}/top_level.txt +0 -0
|
@@ -11,9 +11,7 @@ import os
|
|
|
11
11
|
import sys
|
|
12
12
|
import argparse
|
|
13
13
|
import time
|
|
14
|
-
import subprocess
|
|
15
14
|
from pathlib import Path
|
|
16
|
-
from typing import Dict, Any, Optional
|
|
17
15
|
|
|
18
16
|
# Import mcp_security_framework
|
|
19
17
|
try:
|
|
@@ -38,7 +36,6 @@ def validate_config_with_new_system(config: Dict[str, Any]) -> bool:
|
|
|
38
36
|
"""
|
|
39
37
|
try:
|
|
40
38
|
from mcp_proxy_adapter.core.config_validator import ConfigValidator
|
|
41
|
-
from mcp_proxy_adapter.core.errors import ConfigError
|
|
42
39
|
|
|
43
40
|
print("🔍 Validating configuration with new validation system...")
|
|
44
41
|
validator = ConfigValidator()
|
|
@@ -9,7 +9,6 @@ email: vasilyvz@gmail.com
|
|
|
9
9
|
import json
|
|
10
10
|
import tempfile
|
|
11
11
|
from pathlib import Path
|
|
12
|
-
from typing import Dict, Any
|
|
13
12
|
|
|
14
13
|
from config_builder import ConfigBuilder, ConfigFactory, Protocol, AuthMethod
|
|
15
14
|
|
|
@@ -17,421 +16,42 @@ from config_builder import ConfigBuilder, ConfigFactory, Protocol, AuthMethod
|
|
|
17
16
|
class TestConfigBuilder:
|
|
18
17
|
"""Test cases for ConfigBuilder class."""
|
|
19
18
|
|
|
20
|
-
def test_default_configuration(self):
|
|
21
|
-
"""Test default configuration structure."""
|
|
22
|
-
builder = ConfigBuilder()
|
|
23
|
-
config = builder.build()
|
|
24
|
-
|
|
25
|
-
# Check required fields
|
|
26
|
-
assert "uuid" in config
|
|
27
|
-
assert "server" in config
|
|
28
|
-
assert "ssl" in config
|
|
29
|
-
assert "security" in config
|
|
30
|
-
assert "protocols" in config
|
|
31
|
-
|
|
32
|
-
# Check default values
|
|
33
|
-
assert config["server"]["host"] == "0.0.0.0"
|
|
34
|
-
assert config["server"]["port"] == 8000
|
|
35
|
-
assert config["ssl"]["enabled"] is False
|
|
36
|
-
assert config["security"]["enabled"] is False
|
|
37
|
-
|
|
38
|
-
def test_set_server(self):
|
|
39
|
-
"""Test server configuration setting."""
|
|
40
|
-
builder = ConfigBuilder()
|
|
41
|
-
config = builder.set_server(host="127.0.0.1", port=9000, debug=True, log_level="DEBUG").build()
|
|
42
|
-
|
|
43
|
-
assert config["server"]["host"] == "127.0.0.1"
|
|
44
|
-
assert config["server"]["port"] == 9000
|
|
45
|
-
assert config["server"]["debug"] is True
|
|
46
|
-
assert config["server"]["log_level"] == "DEBUG"
|
|
47
|
-
|
|
48
|
-
def test_set_logging(self):
|
|
49
|
-
"""Test logging configuration setting."""
|
|
50
|
-
builder = ConfigBuilder()
|
|
51
|
-
config = builder.set_logging(log_dir="/tmp/logs", level="WARNING", console_output=False).build()
|
|
52
|
-
|
|
53
|
-
assert config["logging"]["log_dir"] == "/tmp/logs"
|
|
54
|
-
assert config["logging"]["level"] == "WARNING"
|
|
55
|
-
assert config["logging"]["console_output"] is False
|
|
56
|
-
|
|
57
|
-
def test_set_protocol_http(self):
|
|
58
|
-
"""Test HTTP protocol configuration."""
|
|
59
|
-
builder = ConfigBuilder()
|
|
60
|
-
config = builder.set_protocol(Protocol.HTTP).build()
|
|
61
|
-
|
|
62
|
-
assert config["ssl"]["enabled"] is False
|
|
63
|
-
assert config["ssl"]["chk_hostname"] is False
|
|
64
|
-
assert config["security"]["ssl"]["enabled"] is False
|
|
65
|
-
assert config["security"]["ssl"]["chk_hostname"] is False
|
|
66
|
-
assert config["protocols"]["allowed_protocols"] == ["http"]
|
|
67
|
-
assert config["protocols"]["default_protocol"] == "http"
|
|
68
|
-
assert config["protocols"]["protocol_handlers"]["http"]["enabled"] is True
|
|
69
|
-
assert config["protocols"]["protocol_handlers"]["https"]["enabled"] is False
|
|
70
|
-
assert config["protocols"]["protocol_handlers"]["mtls"]["enabled"] is False
|
|
71
|
-
|
|
72
|
-
def test_set_protocol_https(self):
|
|
73
|
-
"""Test HTTPS protocol configuration."""
|
|
74
|
-
builder = ConfigBuilder()
|
|
75
|
-
config = builder.set_protocol(Protocol.HTTPS, cert_dir="/tmp/certs", key_dir="/tmp/keys").build()
|
|
76
|
-
|
|
77
|
-
assert config["ssl"]["enabled"] is True
|
|
78
|
-
assert config["ssl"]["chk_hostname"] is True
|
|
79
|
-
assert config["ssl"]["cert_file"] == "/tmp/certs/server_cert.pem"
|
|
80
|
-
assert config["ssl"]["key_file"] == "/tmp/keys/server_key.pem"
|
|
81
|
-
assert config["ssl"]["ca_cert"] == "/tmp/certs/ca_cert.pem"
|
|
82
|
-
|
|
83
|
-
assert config["security"]["ssl"]["enabled"] is True
|
|
84
|
-
assert config["security"]["ssl"]["chk_hostname"] is True
|
|
85
|
-
assert config["security"]["ssl"]["cert_file"] == "/tmp/certs/server_cert.pem"
|
|
86
|
-
assert config["security"]["ssl"]["key_file"] == "/tmp/keys/server_key.pem"
|
|
87
|
-
assert config["security"]["ssl"]["ca_cert_file"] == "/tmp/certs/ca_cert.pem"
|
|
88
|
-
|
|
89
|
-
assert config["protocols"]["allowed_protocols"] == ["https"]
|
|
90
|
-
assert config["protocols"]["default_protocol"] == "https"
|
|
91
|
-
assert config["protocols"]["protocol_handlers"]["http"]["enabled"] is False
|
|
92
|
-
assert config["protocols"]["protocol_handlers"]["https"]["enabled"] is True
|
|
93
|
-
assert config["protocols"]["protocol_handlers"]["mtls"]["enabled"] is False
|
|
94
|
-
|
|
95
|
-
def test_set_protocol_mtls(self):
|
|
96
|
-
"""Test mTLS protocol configuration."""
|
|
97
|
-
builder = ConfigBuilder()
|
|
98
|
-
config = builder.set_protocol(Protocol.MTLS, cert_dir="/tmp/certs", key_dir="/tmp/keys").build()
|
|
99
|
-
|
|
100
|
-
assert config["ssl"]["enabled"] is True
|
|
101
|
-
assert config["ssl"]["chk_hostname"] is True
|
|
102
|
-
assert config["ssl"]["verify_client"] is True
|
|
103
|
-
assert config["ssl"]["client_cert_required"] is True
|
|
104
|
-
|
|
105
|
-
assert config["security"]["ssl"]["enabled"] is True
|
|
106
|
-
assert config["security"]["ssl"]["chk_hostname"] is True
|
|
107
|
-
assert config["security"]["ssl"]["client_cert_file"] == "/tmp/certs/admin_cert.pem"
|
|
108
|
-
assert config["security"]["ssl"]["client_key_file"] == "/tmp/keys/admin_key.pem"
|
|
109
|
-
assert config["security"]["ssl"]["verify_mode"] == "CERT_REQUIRED"
|
|
110
|
-
|
|
111
|
-
assert config["protocols"]["allowed_protocols"] == ["mtls"]
|
|
112
|
-
assert config["protocols"]["default_protocol"] == "mtls"
|
|
113
|
-
assert config["protocols"]["protocol_handlers"]["http"]["enabled"] is False
|
|
114
|
-
assert config["protocols"]["protocol_handlers"]["https"]["enabled"] is False
|
|
115
|
-
assert config["protocols"]["protocol_handlers"]["mtls"]["enabled"] is True
|
|
116
|
-
assert config["protocols"]["protocol_handlers"]["mtls"]["client_cert_required"] is True
|
|
117
|
-
|
|
118
|
-
def test_set_auth_none(self):
|
|
119
|
-
"""Test no authentication configuration."""
|
|
120
|
-
builder = ConfigBuilder()
|
|
121
|
-
config = builder.set_auth(AuthMethod.NONE).build()
|
|
122
|
-
|
|
123
|
-
assert config["security"]["enabled"] is False
|
|
124
|
-
assert config["security"]["auth"]["enabled"] is False
|
|
125
|
-
|
|
126
|
-
def test_set_auth_token(self):
|
|
127
|
-
"""Test token authentication configuration."""
|
|
128
|
-
api_keys = {"admin": "admin-key", "user": "user-key"}
|
|
129
|
-
builder = ConfigBuilder()
|
|
130
|
-
config = builder.set_auth(AuthMethod.TOKEN, api_keys=api_keys).build()
|
|
131
|
-
|
|
132
|
-
assert config["security"]["enabled"] is True
|
|
133
|
-
assert config["security"]["auth"]["enabled"] is True
|
|
134
|
-
assert config["security"]["auth"]["methods"] == ["api_key"]
|
|
135
|
-
assert config["security"]["auth"]["api_keys"] == api_keys
|
|
136
|
-
|
|
137
|
-
def test_set_auth_basic(self):
|
|
138
|
-
"""Test basic authentication configuration."""
|
|
139
|
-
builder = ConfigBuilder()
|
|
140
|
-
config = builder.set_auth(AuthMethod.BASIC).build()
|
|
141
|
-
|
|
142
|
-
assert config["security"]["enabled"] is True
|
|
143
|
-
assert config["security"]["auth"]["enabled"] is True
|
|
144
|
-
assert config["security"]["auth"]["methods"] == ["basic_auth"]
|
|
145
|
-
assert config["security"]["auth"]["basic_auth"] is True
|
|
146
|
-
|
|
147
|
-
def test_set_auth_with_roles(self):
|
|
148
|
-
"""Test authentication with roles configuration."""
|
|
149
|
-
roles = {"admin": ["read", "write"], "user": ["read"]}
|
|
150
|
-
builder = ConfigBuilder()
|
|
151
|
-
config = builder.set_auth(AuthMethod.TOKEN, roles=roles).build()
|
|
152
|
-
|
|
153
|
-
assert config["security"]["auth"]["user_roles"] == roles
|
|
154
|
-
assert config["roles"]["enabled"] is True
|
|
155
|
-
assert config["security"]["permissions"]["enabled"] is True
|
|
156
|
-
|
|
157
|
-
def test_set_proxy_registration(self):
|
|
158
|
-
"""Test proxy registration configuration."""
|
|
159
|
-
builder = ConfigBuilder()
|
|
160
|
-
config = builder.set_proxy_registration(
|
|
161
|
-
enabled=True,
|
|
162
|
-
proxy_url="https://proxy.example.com:8080",
|
|
163
|
-
server_id="test_server",
|
|
164
|
-
cert_dir="/tmp/certs"
|
|
165
|
-
).build()
|
|
166
|
-
|
|
167
|
-
assert config["proxy_registration"]["enabled"] is True
|
|
168
|
-
assert config["proxy_registration"]["server_url"] == "https://proxy.example.com:8080/register"
|
|
169
|
-
assert config["proxy_registration"]["proxy_url"] == "https://proxy.example.com:8080"
|
|
170
|
-
assert config["proxy_registration"]["fallback_proxy_url"] == "http://proxy.example.com:8080"
|
|
171
|
-
assert config["proxy_registration"]["ssl"]["ca_cert"] == "/tmp/certs/ca_cert.pem"
|
|
172
|
-
assert config["proxy_registration"]["server_id"] == "test_server"
|
|
173
|
-
assert config["proxy_registration"]["server_name"] == "Test_Server Server"
|
|
174
|
-
assert config["proxy_registration"]["description"] == "Test server for test_server"
|
|
175
|
-
|
|
176
|
-
def test_set_debug(self):
|
|
177
|
-
"""Test debug configuration."""
|
|
178
|
-
builder = ConfigBuilder()
|
|
179
|
-
config = builder.set_debug(enabled=True, log_level="DEBUG").build()
|
|
180
|
-
|
|
181
|
-
assert config["debug"]["enabled"] is True
|
|
182
|
-
assert config["debug"]["log_level"] == "DEBUG"
|
|
183
|
-
assert config["logging"]["level"] == "DEBUG"
|
|
184
|
-
|
|
185
|
-
def test_set_commands(self):
|
|
186
|
-
"""Test commands configuration."""
|
|
187
|
-
enabled = ["health", "echo", "test"]
|
|
188
|
-
disabled = ["admin", "debug"]
|
|
189
|
-
builder = ConfigBuilder()
|
|
190
|
-
config = builder.set_commands(enabled_commands=enabled, disabled_commands=disabled).build()
|
|
191
|
-
|
|
192
|
-
assert config["commands"]["enabled_commands"] == enabled
|
|
193
|
-
assert config["commands"]["disabled_commands"] == disabled
|
|
194
19
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
"""Test hostname check behavior with different protocols."""
|
|
211
|
-
# HTTP should have chk_hostname = False
|
|
212
|
-
builder = ConfigBuilder()
|
|
213
|
-
config = builder.set_protocol(Protocol.HTTP).build()
|
|
214
|
-
assert config["ssl"]["chk_hostname"] is False
|
|
215
|
-
assert config["security"]["ssl"]["chk_hostname"] is False
|
|
216
|
-
|
|
217
|
-
# HTTPS should have chk_hostname = True
|
|
218
|
-
builder = ConfigBuilder()
|
|
219
|
-
config = builder.set_protocol(Protocol.HTTPS).build()
|
|
220
|
-
assert config["ssl"]["chk_hostname"] is True
|
|
221
|
-
assert config["security"]["ssl"]["chk_hostname"] is True
|
|
222
|
-
|
|
223
|
-
# mTLS should have chk_hostname = True
|
|
224
|
-
builder = ConfigBuilder()
|
|
225
|
-
config = builder.set_protocol(Protocol.MTLS).build()
|
|
226
|
-
assert config["ssl"]["chk_hostname"] is True
|
|
227
|
-
assert config["security"]["ssl"]["chk_hostname"] is True
|
|
228
|
-
|
|
229
|
-
def test_save_configuration(self):
|
|
230
|
-
"""Test saving configuration to file."""
|
|
231
|
-
with tempfile.TemporaryDirectory() as temp_dir:
|
|
232
|
-
builder = ConfigBuilder()
|
|
233
|
-
builder.set_server(port=9000)
|
|
234
|
-
config_path = builder.save(Path(temp_dir) / "test_config.json")
|
|
235
|
-
|
|
236
|
-
assert config_path.exists()
|
|
237
|
-
|
|
238
|
-
with open(config_path, 'r') as f:
|
|
239
|
-
saved_config = json.load(f)
|
|
240
|
-
|
|
241
|
-
assert saved_config["server"]["port"] == 9000
|
|
242
|
-
|
|
243
|
-
def test_reset_configuration(self):
|
|
244
|
-
"""Test configuration reset."""
|
|
245
|
-
builder = ConfigBuilder()
|
|
246
|
-
builder.set_server(port=9000)
|
|
247
|
-
builder.set_auth(AuthMethod.TOKEN)
|
|
248
|
-
|
|
249
|
-
config1 = builder.build()
|
|
250
|
-
assert config1["server"]["port"] == 9000
|
|
251
|
-
assert config1["security"]["enabled"] is True
|
|
252
|
-
|
|
253
|
-
builder.reset()
|
|
254
|
-
config2 = builder.build()
|
|
255
|
-
assert config2["server"]["port"] == 8000 # Default value
|
|
256
|
-
assert config2["security"]["enabled"] is False # Default value
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
257
35
|
|
|
258
36
|
|
|
259
37
|
class TestConfigFactory:
|
|
260
38
|
"""Test cases for ConfigFactory class."""
|
|
261
39
|
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
assert config["ssl"]["enabled"] is False
|
|
270
|
-
assert config["security"]["enabled"] is False
|
|
271
|
-
assert config["protocols"]["allowed_protocols"] == ["http"]
|
|
272
|
-
assert config["proxy_registration"]["enabled"] is False
|
|
273
|
-
|
|
274
|
-
def test_create_http_token(self):
|
|
275
|
-
"""Test HTTP token configuration creation."""
|
|
276
|
-
api_keys = {"admin": "admin-key", "user": "user-key"}
|
|
277
|
-
config = ConfigFactory.create_http_token(api_keys=api_keys)
|
|
278
|
-
|
|
279
|
-
assert config["ssl"]["enabled"] is False
|
|
280
|
-
assert config["security"]["enabled"] is True
|
|
281
|
-
assert config["security"]["auth"]["enabled"] is True
|
|
282
|
-
assert config["security"]["auth"]["methods"] == ["api_key"]
|
|
283
|
-
assert config["security"]["auth"]["api_keys"] == api_keys
|
|
284
|
-
|
|
285
|
-
def test_create_https_simple(self):
|
|
286
|
-
"""Test HTTPS simple configuration creation."""
|
|
287
|
-
config = ConfigFactory.create_https_simple(cert_dir="/tmp/certs", key_dir="/tmp/keys")
|
|
288
|
-
|
|
289
|
-
assert config["ssl"]["enabled"] is True
|
|
290
|
-
assert config["ssl"]["cert_file"] == "/tmp/certs/server_cert.pem"
|
|
291
|
-
assert config["ssl"]["key_file"] == "/tmp/keys/server_key.pem"
|
|
292
|
-
assert config["protocols"]["allowed_protocols"] == ["https"]
|
|
293
|
-
assert config["security"]["ssl"]["enabled"] is True
|
|
294
|
-
|
|
295
|
-
def test_create_https_token(self):
|
|
296
|
-
"""Test HTTPS token configuration creation."""
|
|
297
|
-
api_keys = {"admin": "admin-key"}
|
|
298
|
-
config = ConfigFactory.create_https_token(api_keys=api_keys)
|
|
299
|
-
|
|
300
|
-
assert config["ssl"]["enabled"] is True
|
|
301
|
-
assert config["security"]["enabled"] is True
|
|
302
|
-
assert config["security"]["auth"]["enabled"] is True
|
|
303
|
-
assert config["security"]["auth"]["api_keys"] == api_keys
|
|
304
|
-
assert config["protocols"]["allowed_protocols"] == ["https"]
|
|
305
|
-
|
|
306
|
-
def test_create_mtls_simple(self):
|
|
307
|
-
"""Test mTLS simple configuration creation."""
|
|
308
|
-
config = ConfigFactory.create_mtls_simple()
|
|
309
|
-
|
|
310
|
-
assert config["ssl"]["enabled"] is True
|
|
311
|
-
assert config["ssl"]["verify_client"] is True
|
|
312
|
-
assert config["ssl"]["client_cert_required"] is True
|
|
313
|
-
assert config["protocols"]["allowed_protocols"] == ["mtls"]
|
|
314
|
-
assert config["security"]["ssl"]["verify_mode"] == "CERT_REQUIRED"
|
|
315
|
-
|
|
316
|
-
def test_create_mtls_with_roles(self):
|
|
317
|
-
"""Test mTLS with roles configuration creation."""
|
|
318
|
-
roles = {"admin": ["read", "write"], "user": ["read"]}
|
|
319
|
-
config = ConfigFactory.create_mtls_with_roles(roles=roles)
|
|
320
|
-
|
|
321
|
-
assert config["ssl"]["enabled"] is True
|
|
322
|
-
assert config["protocols"]["allowed_protocols"] == ["mtls"]
|
|
323
|
-
assert config["security"]["auth"]["user_roles"] == roles
|
|
324
|
-
assert config["roles"]["enabled"] is True
|
|
325
|
-
assert config["security"]["permissions"]["enabled"] is True
|
|
326
|
-
|
|
327
|
-
def test_create_mtls_with_proxy(self):
|
|
328
|
-
"""Test mTLS with proxy configuration creation."""
|
|
329
|
-
config = ConfigFactory.create_mtls_with_proxy(
|
|
330
|
-
proxy_url="https://proxy.example.com:8080",
|
|
331
|
-
server_id="test_server"
|
|
332
|
-
)
|
|
333
|
-
|
|
334
|
-
assert config["ssl"]["enabled"] is True
|
|
335
|
-
assert config["protocols"]["allowed_protocols"] == ["mtls"]
|
|
336
|
-
assert config["proxy_registration"]["enabled"] is True
|
|
337
|
-
assert config["proxy_registration"]["proxy_url"] == "https://proxy.example.com:8080"
|
|
338
|
-
assert config["proxy_registration"]["server_id"] == "test_server"
|
|
339
|
-
|
|
340
|
-
def test_create_full_featured(self):
|
|
341
|
-
"""Test full-featured configuration creation."""
|
|
342
|
-
config = ConfigFactory.create_full_featured()
|
|
343
|
-
|
|
344
|
-
assert config["ssl"]["enabled"] is True
|
|
345
|
-
assert config["protocols"]["allowed_protocols"] == ["mtls"]
|
|
346
|
-
assert config["security"]["enabled"] is True
|
|
347
|
-
assert config["security"]["auth"]["enabled"] is True
|
|
348
|
-
assert config["proxy_registration"]["enabled"] is True
|
|
349
|
-
assert config["debug"]["enabled"] is True
|
|
350
|
-
assert config["roles"]["enabled"] is True
|
|
351
|
-
assert config["security"]["permissions"]["enabled"] is True
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
|
|
352
47
|
|
|
353
48
|
|
|
354
49
|
class TestConfigurationCombinations:
|
|
355
50
|
"""Test all possible combinations of configuration parameters."""
|
|
356
51
|
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
auth_methods = [AuthMethod.NONE, AuthMethod.TOKEN, AuthMethod.BASIC]
|
|
361
|
-
|
|
362
|
-
for protocol in protocols:
|
|
363
|
-
for auth_method in auth_methods:
|
|
364
|
-
builder = ConfigBuilder()
|
|
365
|
-
config = (builder
|
|
366
|
-
.set_protocol(protocol)
|
|
367
|
-
.set_auth(auth_method)
|
|
368
|
-
.build())
|
|
369
|
-
|
|
370
|
-
# Verify protocol settings
|
|
371
|
-
if protocol == Protocol.HTTP:
|
|
372
|
-
assert config["ssl"]["enabled"] is False
|
|
373
|
-
assert config["protocols"]["allowed_protocols"] == ["http"]
|
|
374
|
-
elif protocol == Protocol.HTTPS:
|
|
375
|
-
assert config["ssl"]["enabled"] is True
|
|
376
|
-
assert config["protocols"]["allowed_protocols"] == ["https"]
|
|
377
|
-
elif protocol == Protocol.MTLS:
|
|
378
|
-
assert config["ssl"]["enabled"] is True
|
|
379
|
-
assert config["ssl"]["verify_client"] is True
|
|
380
|
-
assert config["protocols"]["allowed_protocols"] == ["mtls"]
|
|
381
|
-
|
|
382
|
-
# Verify auth settings
|
|
383
|
-
if auth_method == AuthMethod.NONE:
|
|
384
|
-
assert config["security"]["enabled"] is False
|
|
385
|
-
else:
|
|
386
|
-
assert config["security"]["enabled"] is True
|
|
387
|
-
assert config["security"]["auth"]["enabled"] is True
|
|
388
|
-
|
|
389
|
-
def test_proxy_registration_with_all_protocols(self):
|
|
390
|
-
"""Test proxy registration with all protocols."""
|
|
391
|
-
protocols = [Protocol.HTTP, Protocol.HTTPS, Protocol.MTLS]
|
|
392
|
-
|
|
393
|
-
for protocol in protocols:
|
|
394
|
-
builder = ConfigBuilder()
|
|
395
|
-
config = (builder
|
|
396
|
-
.set_protocol(protocol)
|
|
397
|
-
.set_proxy_registration(enabled=True, proxy_url="https://proxy.test:8080")
|
|
398
|
-
.build())
|
|
399
|
-
|
|
400
|
-
assert config["proxy_registration"]["enabled"] is True
|
|
401
|
-
assert config["proxy_registration"]["proxy_url"] == "https://proxy.test:8080"
|
|
402
|
-
assert config["proxy_registration"]["server_url"] == "https://proxy.test:8080/register"
|
|
403
|
-
|
|
404
|
-
def test_roles_with_all_auth_methods(self):
|
|
405
|
-
"""Test roles configuration with all authentication methods."""
|
|
406
|
-
auth_methods = [AuthMethod.TOKEN, AuthMethod.BASIC]
|
|
407
|
-
roles = {"admin": ["read", "write"], "user": ["read"]}
|
|
408
|
-
|
|
409
|
-
for auth_method in auth_methods:
|
|
410
|
-
builder = ConfigBuilder()
|
|
411
|
-
config = (builder
|
|
412
|
-
.set_auth(auth_method, roles=roles)
|
|
413
|
-
.build())
|
|
414
|
-
|
|
415
|
-
assert config["security"]["auth"]["user_roles"] == roles
|
|
416
|
-
assert config["roles"]["enabled"] is True
|
|
417
|
-
assert config["security"]["permissions"]["enabled"] is True
|
|
418
|
-
|
|
419
|
-
def test_debug_with_all_combinations(self):
|
|
420
|
-
"""Test debug configuration with various combinations."""
|
|
421
|
-
builder = ConfigBuilder()
|
|
422
|
-
config = (builder
|
|
423
|
-
.set_protocol(Protocol.HTTPS)
|
|
424
|
-
.set_auth(AuthMethod.TOKEN)
|
|
425
|
-
.set_proxy_registration(enabled=True)
|
|
426
|
-
.set_debug(enabled=True)
|
|
427
|
-
.build())
|
|
428
|
-
|
|
429
|
-
assert config["debug"]["enabled"] is True
|
|
430
|
-
assert config["debug"]["log_level"] == "DEBUG"
|
|
431
|
-
assert config["logging"]["level"] == "DEBUG"
|
|
432
|
-
assert config["ssl"]["enabled"] is True
|
|
433
|
-
assert config["security"]["enabled"] is True
|
|
434
|
-
assert config["proxy_registration"]["enabled"] is True
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
|
|
435
55
|
|
|
436
56
|
|
|
437
57
|
def run_comprehensive_tests():
|
|
@@ -13,8 +13,6 @@ import time
|
|
|
13
13
|
import requests
|
|
14
14
|
import ssl
|
|
15
15
|
from pathlib import Path
|
|
16
|
-
from typing import Dict, List, Optional, Tuple
|
|
17
|
-
import logging
|
|
18
16
|
|
|
19
17
|
# Configure logging
|
|
20
18
|
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
|
@@ -12,12 +12,9 @@ import json
|
|
|
12
12
|
import os
|
|
13
13
|
import ssl
|
|
14
14
|
import time
|
|
15
|
-
from typing import Dict, Any, Optional, List, Union
|
|
16
|
-
from urllib.parse import urljoin
|
|
17
15
|
from pathlib import Path
|
|
18
16
|
import aiohttp
|
|
19
17
|
import requests
|
|
20
|
-
from requests.exceptions import RequestException
|
|
21
18
|
|
|
22
19
|
# Import security framework components
|
|
23
20
|
try:
|
|
@@ -27,16 +24,13 @@ try:
|
|
|
27
24
|
CertificateManager,
|
|
28
25
|
PermissionManager,
|
|
29
26
|
)
|
|
30
|
-
from mcp_security_framework.utils import (
|
|
31
27
|
generate_api_key,
|
|
32
28
|
create_jwt_token,
|
|
33
29
|
validate_jwt_token,
|
|
34
30
|
)
|
|
35
|
-
from mcp_security_framework.utils import (
|
|
36
31
|
extract_roles_from_cert,
|
|
37
32
|
validate_certificate_chain,
|
|
38
33
|
)
|
|
39
|
-
from mcp_security_framework.utils import (
|
|
40
34
|
create_ssl_context,
|
|
41
35
|
validate_server_certificate,
|
|
42
36
|
)
|