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,319 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Proxy Registration Command
|
|
3
|
+
|
|
4
|
+
This command handles proxy registration functionality with security framework integration.
|
|
5
|
+
It provides endpoints for registration, unregistration, heartbeat, and discovery.
|
|
6
|
+
|
|
7
|
+
Author: Vasiliy Zdanovskiy
|
|
8
|
+
email: vasilyvz@gmail.com
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import json
|
|
12
|
+
import time
|
|
13
|
+
from typing import Dict, Any, List, Optional
|
|
14
|
+
from dataclasses import dataclass
|
|
15
|
+
|
|
16
|
+
from mcp_proxy_adapter.commands.base import Command
|
|
17
|
+
from mcp_proxy_adapter.commands.result import SuccessResult
|
|
18
|
+
from mcp_proxy_adapter.core.logging import get_global_logger
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@dataclass
|
|
22
|
+
class ProxyRegistrationCommandResult(SuccessResult):
|
|
23
|
+
"""Result of proxy registration command."""
|
|
24
|
+
|
|
25
|
+
operation: str
|
|
26
|
+
success: bool
|
|
27
|
+
server_key: Optional[str] = None
|
|
28
|
+
message: str = ""
|
|
29
|
+
details: Optional[Dict[str, Any]] = None
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@classmethod
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class ProxyRegistrationCommand(Command):
|
|
36
|
+
"""Proxy registration command with security framework integration."""
|
|
37
|
+
|
|
38
|
+
name = "proxy_registration"
|
|
39
|
+
descr = "Proxy registration operations (register, unregister, heartbeat, discover)"
|
|
40
|
+
category = "proxy"
|
|
41
|
+
author = "Vasiliy Zdanovskiy"
|
|
42
|
+
email = "vasilyvz@gmail.com"
|
|
43
|
+
|
|
44
|
+
# In-memory registry for testing
|
|
45
|
+
_registry: Dict[str, Dict[str, Any]] = {}
|
|
46
|
+
_server_counter = 1
|
|
47
|
+
|
|
48
|
+
async def execute(self, **kwargs) -> ProxyRegistrationCommandResult:
|
|
49
|
+
"""
|
|
50
|
+
Execute proxy registration command.
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
operation: Operation to perform (register, unregister, heartbeat, discover)
|
|
54
|
+
server_id: Server ID for registration
|
|
55
|
+
server_url: Server URL for registration
|
|
56
|
+
server_name: Server name
|
|
57
|
+
description: Server description
|
|
58
|
+
version: Server version
|
|
59
|
+
capabilities: Server capabilities
|
|
60
|
+
endpoints: Server endpoints
|
|
61
|
+
auth_method: Authentication method
|
|
62
|
+
security_enabled: Whether security is enabled
|
|
63
|
+
server_key: Server key for unregistration/heartbeat
|
|
64
|
+
copy_number: Copy number for unregistration
|
|
65
|
+
timestamp: Timestamp for heartbeat
|
|
66
|
+
status: Status for heartbeat
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
ProxyRegistrationCommandResult
|
|
70
|
+
"""
|
|
71
|
+
operation = kwargs.get("operation", "register")
|
|
72
|
+
|
|
73
|
+
# Check user permissions
|
|
74
|
+
context = kwargs.get("context", {})
|
|
75
|
+
user_info = context.get("user", {})
|
|
76
|
+
user_permissions = user_info.get("permissions", [])
|
|
77
|
+
|
|
78
|
+
# Define required permissions for each operation
|
|
79
|
+
operation_permissions = {
|
|
80
|
+
"register": ["register"],
|
|
81
|
+
"unregister": ["unregister"],
|
|
82
|
+
"heartbeat": ["heartbeat"],
|
|
83
|
+
"discover": ["discover"],
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
required_permissions = operation_permissions.get(operation, ["read"])
|
|
87
|
+
|
|
88
|
+
# Check if security is enabled before checking permissions
|
|
89
|
+
security_enabled = self.config.get("security", {}).get("enabled", False)
|
|
90
|
+
|
|
91
|
+
# Only check permissions if security is enabled
|
|
92
|
+
if security_enabled:
|
|
93
|
+
get_global_logger().info(
|
|
94
|
+
f"Checking permissions: user_permissions={user_permissions}, required={required_permissions}"
|
|
95
|
+
)
|
|
96
|
+
if not self._check_permissions(user_permissions, required_permissions):
|
|
97
|
+
return ProxyRegistrationCommandResult(
|
|
98
|
+
operation=operation,
|
|
99
|
+
success=False,
|
|
100
|
+
message=f"Permission denied: {operation} requires {required_permissions}",
|
|
101
|
+
)
|
|
102
|
+
else:
|
|
103
|
+
get_global_logger().debug(f"Security disabled, skipping permission check for operation: {operation}")
|
|
104
|
+
|
|
105
|
+
get_global_logger().info(f"Executing proxy registration operation: {operation}")
|
|
106
|
+
get_global_logger().debug(
|
|
107
|
+
f"User permissions: {user_permissions}, required: {required_permissions}"
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
if operation == "register":
|
|
111
|
+
return await self._handle_register(kwargs)
|
|
112
|
+
elif operation == "unregister":
|
|
113
|
+
return await self._handle_unregister(kwargs)
|
|
114
|
+
elif operation == "heartbeat":
|
|
115
|
+
return await self._handle_heartbeat(kwargs)
|
|
116
|
+
elif operation == "discover":
|
|
117
|
+
return await self._handle_discover(kwargs)
|
|
118
|
+
else:
|
|
119
|
+
return ProxyRegistrationCommandResult(
|
|
120
|
+
operation=operation,
|
|
121
|
+
success=False,
|
|
122
|
+
message=f"Unknown operation: {operation}",
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
async def _handle_register(
|
|
126
|
+
self, kwargs: Dict[str, Any]
|
|
127
|
+
) -> ProxyRegistrationCommandResult:
|
|
128
|
+
"""Handle registration operation."""
|
|
129
|
+
server_id = kwargs.get("server_id")
|
|
130
|
+
server_url = kwargs.get("server_url")
|
|
131
|
+
server_name = kwargs.get("server_name", "Unknown Server")
|
|
132
|
+
description = kwargs.get("description", "")
|
|
133
|
+
version = kwargs.get("version", "1.0.0")
|
|
134
|
+
capabilities = kwargs.get("capabilities", ["jsonrpc", "rest"])
|
|
135
|
+
endpoints = kwargs.get("endpoints", {})
|
|
136
|
+
auth_method = kwargs.get("auth_method", "none")
|
|
137
|
+
security_enabled = kwargs.get("security_enabled", False)
|
|
138
|
+
|
|
139
|
+
if not server_id or not server_url:
|
|
140
|
+
return ProxyRegistrationCommandResult(
|
|
141
|
+
operation="register",
|
|
142
|
+
success=False,
|
|
143
|
+
message="Missing required parameters: server_id and server_url",
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
# Check if server already exists
|
|
147
|
+
existing_servers = [
|
|
148
|
+
key for key in self._registry.keys() if key.startswith(server_id)
|
|
149
|
+
]
|
|
150
|
+
copy_number = len(existing_servers) + 1
|
|
151
|
+
server_key = f"{server_id}_{copy_number}"
|
|
152
|
+
|
|
153
|
+
# Create server record
|
|
154
|
+
server_record = {
|
|
155
|
+
"server_id": server_id,
|
|
156
|
+
"server_url": server_url,
|
|
157
|
+
"server_name": server_name,
|
|
158
|
+
"description": description,
|
|
159
|
+
"version": version,
|
|
160
|
+
"capabilities": capabilities,
|
|
161
|
+
"endpoints": endpoints,
|
|
162
|
+
"auth_method": auth_method,
|
|
163
|
+
"security_enabled": security_enabled,
|
|
164
|
+
"registered_at": int(time.time()),
|
|
165
|
+
"last_heartbeat": int(time.time()),
|
|
166
|
+
"status": "active",
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
self._registry[server_key] = server_record
|
|
170
|
+
|
|
171
|
+
get_global_logger().info(f"Registered server: {server_key} at {server_url}")
|
|
172
|
+
|
|
173
|
+
return ProxyRegistrationCommandResult(
|
|
174
|
+
operation="register",
|
|
175
|
+
success=True,
|
|
176
|
+
server_key=server_key,
|
|
177
|
+
message=f"Server registered successfully with key: {server_key}",
|
|
178
|
+
details={
|
|
179
|
+
"server_id": server_id,
|
|
180
|
+
"copy_number": copy_number,
|
|
181
|
+
"registered_at": server_record["registered_at"],
|
|
182
|
+
},
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
async def _handle_unregister(
|
|
186
|
+
self, kwargs: Dict[str, Any]
|
|
187
|
+
) -> ProxyRegistrationCommandResult:
|
|
188
|
+
"""Handle unregistration operation."""
|
|
189
|
+
server_id = kwargs.get("server_id")
|
|
190
|
+
copy_number = kwargs.get("copy_number", 1)
|
|
191
|
+
|
|
192
|
+
if not server_id:
|
|
193
|
+
return ProxyRegistrationCommandResult(
|
|
194
|
+
operation="unregister",
|
|
195
|
+
success=False,
|
|
196
|
+
message="Missing required parameter: server_id",
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
server_key = f"{server_id}_{copy_number}"
|
|
200
|
+
|
|
201
|
+
if server_key in self._registry:
|
|
202
|
+
del self._registry[server_key]
|
|
203
|
+
get_global_logger().info(f"Unregistered server: {server_key}")
|
|
204
|
+
|
|
205
|
+
return ProxyRegistrationCommandResult(
|
|
206
|
+
operation="unregister",
|
|
207
|
+
success=True,
|
|
208
|
+
message=f"Server unregistered successfully: {server_key}",
|
|
209
|
+
details={"unregistered": True},
|
|
210
|
+
)
|
|
211
|
+
else:
|
|
212
|
+
return ProxyRegistrationCommandResult(
|
|
213
|
+
operation="unregister",
|
|
214
|
+
success=True,
|
|
215
|
+
message=f"Server not found in registry: {server_key}",
|
|
216
|
+
details={"unregistered": False},
|
|
217
|
+
)
|
|
218
|
+
|
|
219
|
+
async def _handle_heartbeat(
|
|
220
|
+
self, kwargs: Dict[str, Any]
|
|
221
|
+
) -> ProxyRegistrationCommandResult:
|
|
222
|
+
"""Handle heartbeat operation."""
|
|
223
|
+
server_id = kwargs.get("server_id")
|
|
224
|
+
server_key = kwargs.get("server_key")
|
|
225
|
+
timestamp = kwargs.get("timestamp", int(time.time()))
|
|
226
|
+
status = kwargs.get("status", "healthy")
|
|
227
|
+
|
|
228
|
+
if not server_key:
|
|
229
|
+
return ProxyRegistrationCommandResult(
|
|
230
|
+
operation="heartbeat",
|
|
231
|
+
success=False,
|
|
232
|
+
message="Missing required parameter: server_key",
|
|
233
|
+
)
|
|
234
|
+
|
|
235
|
+
if server_key in self._registry:
|
|
236
|
+
self._registry[server_key]["last_heartbeat"] = timestamp
|
|
237
|
+
self._registry[server_key]["status"] = status
|
|
238
|
+
|
|
239
|
+
get_global_logger().debug(f"Heartbeat received for server: {server_key}")
|
|
240
|
+
|
|
241
|
+
return ProxyRegistrationCommandResult(
|
|
242
|
+
operation="heartbeat",
|
|
243
|
+
success=True,
|
|
244
|
+
message="Heartbeat processed successfully",
|
|
245
|
+
details={
|
|
246
|
+
"server_key": server_key,
|
|
247
|
+
"timestamp": timestamp,
|
|
248
|
+
"status": status,
|
|
249
|
+
},
|
|
250
|
+
)
|
|
251
|
+
else:
|
|
252
|
+
return ProxyRegistrationCommandResult(
|
|
253
|
+
operation="heartbeat",
|
|
254
|
+
success=False,
|
|
255
|
+
message=f"Server not found: {server_key}",
|
|
256
|
+
)
|
|
257
|
+
|
|
258
|
+
async def _handle_discover(
|
|
259
|
+
self, kwargs: Dict[str, Any]
|
|
260
|
+
) -> ProxyRegistrationCommandResult:
|
|
261
|
+
"""Handle discovery operation."""
|
|
262
|
+
# Return all registered servers
|
|
263
|
+
proxies = []
|
|
264
|
+
|
|
265
|
+
for server_key, server_record in self._registry.items():
|
|
266
|
+
# Check if server is active (heartbeat within last 5 minutes)
|
|
267
|
+
last_heartbeat = server_record.get("last_heartbeat", 0)
|
|
268
|
+
if time.time() - last_heartbeat < 300: # 5 minutes
|
|
269
|
+
proxy_info = {
|
|
270
|
+
"server_key": server_key,
|
|
271
|
+
"server_id": server_record["server_id"],
|
|
272
|
+
"server_url": server_record["server_url"],
|
|
273
|
+
"server_name": server_record["server_name"],
|
|
274
|
+
"description": server_record["description"],
|
|
275
|
+
"version": server_record["version"],
|
|
276
|
+
"capabilities": server_record["capabilities"],
|
|
277
|
+
"endpoints": server_record["endpoints"],
|
|
278
|
+
"auth_method": server_record["auth_method"],
|
|
279
|
+
"security_enabled": server_record["security_enabled"],
|
|
280
|
+
"registered_at": server_record["registered_at"],
|
|
281
|
+
"last_heartbeat": server_record["last_heartbeat"],
|
|
282
|
+
"status": server_record["status"],
|
|
283
|
+
}
|
|
284
|
+
proxies.append(proxy_info)
|
|
285
|
+
|
|
286
|
+
get_global_logger().info(f"Discovery request returned {len(proxies)} active servers")
|
|
287
|
+
|
|
288
|
+
return ProxyRegistrationCommandResult(
|
|
289
|
+
operation="discover",
|
|
290
|
+
success=True,
|
|
291
|
+
message=f"Found {len(proxies)} active proxy servers",
|
|
292
|
+
details={"proxies": proxies},
|
|
293
|
+
)
|
|
294
|
+
|
|
295
|
+
def _check_permissions(
|
|
296
|
+
self, user_permissions: List[str], required_permissions: List[str]
|
|
297
|
+
) -> bool:
|
|
298
|
+
"""
|
|
299
|
+
Check if user has required permissions.
|
|
300
|
+
|
|
301
|
+
Args:
|
|
302
|
+
user_permissions: User's permissions
|
|
303
|
+
required_permissions: Required permissions
|
|
304
|
+
|
|
305
|
+
Returns:
|
|
306
|
+
True if user has required permissions
|
|
307
|
+
"""
|
|
308
|
+
# Admin has all permissions
|
|
309
|
+
if "*" in user_permissions:
|
|
310
|
+
return True
|
|
311
|
+
|
|
312
|
+
# Check if user has all required permissions
|
|
313
|
+
for required in required_permissions:
|
|
314
|
+
if required not in user_permissions:
|
|
315
|
+
return False
|
|
316
|
+
|
|
317
|
+
return True
|
|
318
|
+
|
|
319
|
+
@classmethod
|