mcp-security-framework 0.1.0__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.
- mcp_security_framework/__init__.py +96 -0
- mcp_security_framework/cli/__init__.py +18 -0
- mcp_security_framework/cli/cert_cli.py +511 -0
- mcp_security_framework/cli/security_cli.py +791 -0
- mcp_security_framework/constants.py +209 -0
- mcp_security_framework/core/__init__.py +61 -0
- mcp_security_framework/core/auth_manager.py +1011 -0
- mcp_security_framework/core/cert_manager.py +1663 -0
- mcp_security_framework/core/permission_manager.py +735 -0
- mcp_security_framework/core/rate_limiter.py +602 -0
- mcp_security_framework/core/security_manager.py +943 -0
- mcp_security_framework/core/ssl_manager.py +735 -0
- mcp_security_framework/examples/__init__.py +75 -0
- mcp_security_framework/examples/django_example.py +615 -0
- mcp_security_framework/examples/fastapi_example.py +472 -0
- mcp_security_framework/examples/flask_example.py +506 -0
- mcp_security_framework/examples/gateway_example.py +803 -0
- mcp_security_framework/examples/microservice_example.py +690 -0
- mcp_security_framework/examples/standalone_example.py +576 -0
- mcp_security_framework/middleware/__init__.py +250 -0
- mcp_security_framework/middleware/auth_middleware.py +292 -0
- mcp_security_framework/middleware/fastapi_auth_middleware.py +447 -0
- mcp_security_framework/middleware/fastapi_middleware.py +757 -0
- mcp_security_framework/middleware/flask_auth_middleware.py +465 -0
- mcp_security_framework/middleware/flask_middleware.py +591 -0
- mcp_security_framework/middleware/mtls_middleware.py +439 -0
- mcp_security_framework/middleware/rate_limit_middleware.py +403 -0
- mcp_security_framework/middleware/security_middleware.py +507 -0
- mcp_security_framework/schemas/__init__.py +109 -0
- mcp_security_framework/schemas/config.py +694 -0
- mcp_security_framework/schemas/models.py +709 -0
- mcp_security_framework/schemas/responses.py +686 -0
- mcp_security_framework/tests/__init__.py +0 -0
- mcp_security_framework/utils/__init__.py +121 -0
- mcp_security_framework/utils/cert_utils.py +525 -0
- mcp_security_framework/utils/crypto_utils.py +475 -0
- mcp_security_framework/utils/validation_utils.py +571 -0
- mcp_security_framework-0.1.0.dist-info/METADATA +411 -0
- mcp_security_framework-0.1.0.dist-info/RECORD +76 -0
- mcp_security_framework-0.1.0.dist-info/WHEEL +5 -0
- mcp_security_framework-0.1.0.dist-info/entry_points.txt +3 -0
- mcp_security_framework-0.1.0.dist-info/top_level.txt +2 -0
- tests/__init__.py +0 -0
- tests/test_cli/__init__.py +0 -0
- tests/test_cli/test_cert_cli.py +379 -0
- tests/test_cli/test_security_cli.py +657 -0
- tests/test_core/__init__.py +0 -0
- tests/test_core/test_auth_manager.py +582 -0
- tests/test_core/test_cert_manager.py +795 -0
- tests/test_core/test_permission_manager.py +395 -0
- tests/test_core/test_rate_limiter.py +626 -0
- tests/test_core/test_security_manager.py +841 -0
- tests/test_core/test_ssl_manager.py +532 -0
- tests/test_examples/__init__.py +8 -0
- tests/test_examples/test_fastapi_example.py +264 -0
- tests/test_examples/test_flask_example.py +238 -0
- tests/test_examples/test_standalone_example.py +292 -0
- tests/test_integration/__init__.py +0 -0
- tests/test_integration/test_auth_flow.py +502 -0
- tests/test_integration/test_certificate_flow.py +527 -0
- tests/test_integration/test_fastapi_integration.py +341 -0
- tests/test_integration/test_flask_integration.py +398 -0
- tests/test_integration/test_standalone_integration.py +493 -0
- tests/test_middleware/__init__.py +0 -0
- tests/test_middleware/test_fastapi_middleware.py +523 -0
- tests/test_middleware/test_flask_middleware.py +582 -0
- tests/test_middleware/test_security_middleware.py +493 -0
- tests/test_schemas/__init__.py +0 -0
- tests/test_schemas/test_config.py +811 -0
- tests/test_schemas/test_models.py +879 -0
- tests/test_schemas/test_responses.py +1054 -0
- tests/test_schemas/test_serialization.py +493 -0
- tests/test_utils/__init__.py +0 -0
- tests/test_utils/test_cert_utils.py +510 -0
- tests/test_utils/test_crypto_utils.py +603 -0
- tests/test_utils/test_validation_utils.py +477 -0
@@ -0,0 +1,841 @@
|
|
1
|
+
"""
|
2
|
+
Security Manager Tests
|
3
|
+
|
4
|
+
This module provides comprehensive tests for the SecurityManager class,
|
5
|
+
which is the main security management class that integrates all core
|
6
|
+
security components.
|
7
|
+
|
8
|
+
Test Coverage:
|
9
|
+
- SecurityManager initialization and component setup
|
10
|
+
- Request validation with authentication and authorization
|
11
|
+
- User authentication with different methods
|
12
|
+
- Permission checking and validation
|
13
|
+
- Certificate management operations
|
14
|
+
- SSL context creation
|
15
|
+
- Rate limiting functionality
|
16
|
+
- Security status and monitoring
|
17
|
+
- Error handling and edge cases
|
18
|
+
|
19
|
+
Author: MCP Security Team
|
20
|
+
Version: 1.0.0
|
21
|
+
License: MIT
|
22
|
+
"""
|
23
|
+
|
24
|
+
from datetime import datetime, timedelta
|
25
|
+
from unittest.mock import MagicMock, Mock, patch
|
26
|
+
|
27
|
+
import pytest
|
28
|
+
|
29
|
+
from mcp_security_framework.core.security_manager import (
|
30
|
+
SecurityConfigurationError,
|
31
|
+
SecurityManager,
|
32
|
+
SecurityValidationError,
|
33
|
+
)
|
34
|
+
from mcp_security_framework.schemas.config import (
|
35
|
+
AuthConfig,
|
36
|
+
CertificateConfig,
|
37
|
+
LoggingConfig,
|
38
|
+
PermissionConfig,
|
39
|
+
RateLimitConfig,
|
40
|
+
SecurityConfig,
|
41
|
+
SSLConfig,
|
42
|
+
)
|
43
|
+
from mcp_security_framework.schemas.models import (
|
44
|
+
AuthMethod,
|
45
|
+
AuthResult,
|
46
|
+
AuthStatus,
|
47
|
+
CertificateInfo,
|
48
|
+
CertificatePair,
|
49
|
+
ValidationResult,
|
50
|
+
ValidationStatus,
|
51
|
+
)
|
52
|
+
from mcp_security_framework.schemas.responses import ResponseStatus, SecurityResponse
|
53
|
+
|
54
|
+
|
55
|
+
class TestSecurityManager:
|
56
|
+
"""Test suite for SecurityManager class."""
|
57
|
+
|
58
|
+
def setup_method(self):
|
59
|
+
"""Set up test fixtures before each test method."""
|
60
|
+
# Create basic configuration
|
61
|
+
self.config = SecurityConfig(
|
62
|
+
auth=AuthConfig(
|
63
|
+
enabled=True,
|
64
|
+
methods=["api_key", "jwt"],
|
65
|
+
api_keys={"admin": "admin_key_123", "user": "user_key_456"},
|
66
|
+
jwt_secret="test_jwt_secret_123",
|
67
|
+
),
|
68
|
+
permissions=PermissionConfig(enabled=True, roles_file="test_roles.json"),
|
69
|
+
ssl=SSLConfig(enabled=False),
|
70
|
+
certificates=CertificateConfig(enabled=False),
|
71
|
+
rate_limit=RateLimitConfig(
|
72
|
+
enabled=True, max_requests=100, window_seconds=60
|
73
|
+
),
|
74
|
+
logging=LoggingConfig(level="INFO"),
|
75
|
+
debug=True,
|
76
|
+
environment="test",
|
77
|
+
)
|
78
|
+
|
79
|
+
# Mock the component managers
|
80
|
+
self.mock_auth_manager = Mock()
|
81
|
+
self.mock_permission_manager = Mock()
|
82
|
+
self.mock_ssl_manager = Mock()
|
83
|
+
self.mock_cert_manager = Mock()
|
84
|
+
self.mock_rate_limiter = Mock()
|
85
|
+
|
86
|
+
# Set up mock return values
|
87
|
+
self.mock_auth_manager.is_auth_enabled = True
|
88
|
+
self.mock_ssl_manager.is_ssl_enabled = False
|
89
|
+
self.mock_rate_limiter.is_rate_limiting_enabled = True
|
90
|
+
|
91
|
+
# Mock successful authentication
|
92
|
+
self.mock_auth_result = AuthResult(
|
93
|
+
is_valid=True,
|
94
|
+
status=AuthStatus.SUCCESS,
|
95
|
+
username="admin",
|
96
|
+
roles=["admin"],
|
97
|
+
auth_method=AuthMethod.API_KEY,
|
98
|
+
error_code=None,
|
99
|
+
error_message=None,
|
100
|
+
)
|
101
|
+
|
102
|
+
# Mock successful validation
|
103
|
+
self.mock_validation_result = ValidationResult(
|
104
|
+
is_valid=True,
|
105
|
+
status=ValidationStatus.VALID,
|
106
|
+
error_code=None,
|
107
|
+
error_message=None,
|
108
|
+
)
|
109
|
+
|
110
|
+
@patch("mcp_security_framework.core.security_manager.PermissionManager")
|
111
|
+
@patch("mcp_security_framework.core.security_manager.AuthManager")
|
112
|
+
@patch("mcp_security_framework.core.security_manager.SSLManager")
|
113
|
+
@patch("mcp_security_framework.core.security_manager.CertificateManager")
|
114
|
+
@patch("mcp_security_framework.core.security_manager.RateLimiter")
|
115
|
+
def test_security_manager_initialization_success(
|
116
|
+
self,
|
117
|
+
mock_rate_limiter_class,
|
118
|
+
mock_cert_manager_class,
|
119
|
+
mock_ssl_manager_class,
|
120
|
+
mock_auth_manager_class,
|
121
|
+
mock_permission_manager_class,
|
122
|
+
):
|
123
|
+
"""Test successful SecurityManager initialization."""
|
124
|
+
# Set up mocks
|
125
|
+
mock_permission_manager_class.return_value = self.mock_permission_manager
|
126
|
+
mock_auth_manager_class.return_value = self.mock_auth_manager
|
127
|
+
mock_ssl_manager_class.return_value = self.mock_ssl_manager
|
128
|
+
mock_cert_manager_class.return_value = self.mock_cert_manager
|
129
|
+
mock_rate_limiter_class.return_value = self.mock_rate_limiter
|
130
|
+
|
131
|
+
# Create SecurityManager
|
132
|
+
security_manager = SecurityManager(self.config)
|
133
|
+
|
134
|
+
# Verify all components were initialized
|
135
|
+
assert security_manager.config == self.config
|
136
|
+
assert security_manager.permission_manager == self.mock_permission_manager
|
137
|
+
assert security_manager.auth_manager == self.mock_auth_manager
|
138
|
+
assert security_manager.ssl_manager == self.mock_ssl_manager
|
139
|
+
assert security_manager.cert_manager == self.mock_cert_manager
|
140
|
+
assert security_manager.rate_limiter == self.mock_rate_limiter
|
141
|
+
|
142
|
+
# Verify component status
|
143
|
+
assert security_manager._component_status["permission_manager"] is True
|
144
|
+
assert security_manager._component_status["auth_manager"] is True
|
145
|
+
assert security_manager._component_status["ssl_manager"] is True
|
146
|
+
assert security_manager._component_status["cert_manager"] is True
|
147
|
+
assert security_manager._component_status["rate_limiter"] is True
|
148
|
+
|
149
|
+
@patch("mcp_security_framework.core.security_manager.PermissionManager")
|
150
|
+
def test_security_manager_initialization_failure(
|
151
|
+
self, mock_permission_manager_class
|
152
|
+
):
|
153
|
+
"""Test SecurityManager initialization failure."""
|
154
|
+
# Make PermissionManager raise an exception
|
155
|
+
mock_permission_manager_class.side_effect = Exception(
|
156
|
+
"Permission manager failed"
|
157
|
+
)
|
158
|
+
|
159
|
+
# Verify SecurityManager raises SecurityConfigurationError
|
160
|
+
with pytest.raises(SecurityConfigurationError) as exc_info:
|
161
|
+
SecurityManager(self.config)
|
162
|
+
|
163
|
+
assert "Failed to initialize security components" in str(exc_info.value)
|
164
|
+
assert exc_info.value.error_code == -32001
|
165
|
+
|
166
|
+
@patch("mcp_security_framework.core.security_manager.PermissionManager")
|
167
|
+
@patch("mcp_security_framework.core.security_manager.AuthManager")
|
168
|
+
@patch("mcp_security_framework.core.security_manager.SSLManager")
|
169
|
+
@patch("mcp_security_framework.core.security_manager.CertificateManager")
|
170
|
+
@patch("mcp_security_framework.core.security_manager.RateLimiter")
|
171
|
+
def test_validate_request_success(
|
172
|
+
self,
|
173
|
+
mock_rate_limiter_class,
|
174
|
+
mock_cert_manager_class,
|
175
|
+
mock_ssl_manager_class,
|
176
|
+
mock_auth_manager_class,
|
177
|
+
mock_permission_manager_class,
|
178
|
+
):
|
179
|
+
"""Test successful request validation."""
|
180
|
+
# Set up mocks
|
181
|
+
mock_permission_manager_class.return_value = self.mock_permission_manager
|
182
|
+
mock_auth_manager_class.return_value = self.mock_auth_manager
|
183
|
+
mock_ssl_manager_class.return_value = self.mock_ssl_manager
|
184
|
+
mock_cert_manager_class.return_value = self.mock_cert_manager
|
185
|
+
mock_rate_limiter_class.return_value = self.mock_rate_limiter
|
186
|
+
|
187
|
+
# Set up mock return values
|
188
|
+
self.mock_auth_manager.authenticate_api_key.return_value = self.mock_auth_result
|
189
|
+
self.mock_permission_manager.validate_access.return_value = (
|
190
|
+
self.mock_validation_result
|
191
|
+
)
|
192
|
+
self.mock_rate_limiter.check_rate_limit.return_value = True
|
193
|
+
|
194
|
+
# Create SecurityManager
|
195
|
+
security_manager = SecurityManager(self.config)
|
196
|
+
|
197
|
+
# Test request validation
|
198
|
+
request_data = {
|
199
|
+
"api_key": "admin_key_123",
|
200
|
+
"required_permissions": ["read", "write"],
|
201
|
+
"client_ip": "192.168.1.100",
|
202
|
+
}
|
203
|
+
|
204
|
+
result = security_manager.validate_request(request_data)
|
205
|
+
|
206
|
+
# Verify result
|
207
|
+
assert result.is_valid is True
|
208
|
+
assert result.status == ValidationStatus.VALID
|
209
|
+
|
210
|
+
# Verify mocks were called correctly
|
211
|
+
self.mock_auth_manager.authenticate_api_key.assert_called_once_with(
|
212
|
+
"admin_key_123"
|
213
|
+
)
|
214
|
+
self.mock_permission_manager.validate_access.assert_called_once_with(
|
215
|
+
["admin"], ["read", "write"]
|
216
|
+
)
|
217
|
+
self.mock_rate_limiter.check_rate_limit.assert_called_once_with("192.168.1.100")
|
218
|
+
self.mock_rate_limiter.increment_request_count.assert_called_once_with(
|
219
|
+
"192.168.1.100"
|
220
|
+
)
|
221
|
+
|
222
|
+
@patch("mcp_security_framework.core.security_manager.PermissionManager")
|
223
|
+
@patch("mcp_security_framework.core.security_manager.AuthManager")
|
224
|
+
@patch("mcp_security_framework.core.security_manager.SSLManager")
|
225
|
+
@patch("mcp_security_framework.core.security_manager.CertificateManager")
|
226
|
+
@patch("mcp_security_framework.core.security_manager.RateLimiter")
|
227
|
+
def test_validate_request_authentication_failure(
|
228
|
+
self,
|
229
|
+
mock_rate_limiter_class,
|
230
|
+
mock_cert_manager_class,
|
231
|
+
mock_ssl_manager_class,
|
232
|
+
mock_auth_manager_class,
|
233
|
+
mock_permission_manager_class,
|
234
|
+
):
|
235
|
+
"""Test request validation with authentication failure."""
|
236
|
+
# Set up mocks
|
237
|
+
mock_permission_manager_class.return_value = self.mock_permission_manager
|
238
|
+
mock_auth_manager_class.return_value = self.mock_auth_manager
|
239
|
+
mock_ssl_manager_class.return_value = self.mock_ssl_manager
|
240
|
+
mock_cert_manager_class.return_value = self.mock_cert_manager
|
241
|
+
mock_rate_limiter_class.return_value = self.mock_rate_limiter
|
242
|
+
|
243
|
+
# Set up failed authentication
|
244
|
+
failed_auth_result = AuthResult(
|
245
|
+
is_valid=False,
|
246
|
+
status=AuthStatus.FAILED,
|
247
|
+
username=None,
|
248
|
+
roles=[],
|
249
|
+
auth_method=AuthMethod.API_KEY,
|
250
|
+
error_code=-32002,
|
251
|
+
error_message="Invalid API key",
|
252
|
+
)
|
253
|
+
self.mock_auth_manager.authenticate_api_key.return_value = failed_auth_result
|
254
|
+
|
255
|
+
# Create SecurityManager
|
256
|
+
security_manager = SecurityManager(self.config)
|
257
|
+
|
258
|
+
# Test request validation
|
259
|
+
request_data = {
|
260
|
+
"api_key": "invalid_key",
|
261
|
+
"required_permissions": ["read", "write"],
|
262
|
+
"client_ip": "192.168.1.100",
|
263
|
+
}
|
264
|
+
|
265
|
+
result = security_manager.validate_request(request_data)
|
266
|
+
|
267
|
+
# Verify result
|
268
|
+
assert result.is_valid is False
|
269
|
+
assert "Authentication failed" in result.error_message
|
270
|
+
assert result.error_code == -32002
|
271
|
+
|
272
|
+
@patch("mcp_security_framework.core.security_manager.PermissionManager")
|
273
|
+
@patch("mcp_security_framework.core.security_manager.AuthManager")
|
274
|
+
@patch("mcp_security_framework.core.security_manager.SSLManager")
|
275
|
+
@patch("mcp_security_framework.core.security_manager.CertificateManager")
|
276
|
+
@patch("mcp_security_framework.core.security_manager.RateLimiter")
|
277
|
+
def test_validate_request_rate_limit_exceeded(
|
278
|
+
self,
|
279
|
+
mock_rate_limiter_class,
|
280
|
+
mock_cert_manager_class,
|
281
|
+
mock_ssl_manager_class,
|
282
|
+
mock_auth_manager_class,
|
283
|
+
mock_permission_manager_class,
|
284
|
+
):
|
285
|
+
"""Test request validation with rate limit exceeded."""
|
286
|
+
# Set up mocks
|
287
|
+
mock_permission_manager_class.return_value = self.mock_permission_manager
|
288
|
+
mock_auth_manager_class.return_value = self.mock_auth_manager
|
289
|
+
mock_ssl_manager_class.return_value = self.mock_ssl_manager
|
290
|
+
mock_cert_manager_class.return_value = self.mock_cert_manager
|
291
|
+
mock_rate_limiter_class.return_value = self.mock_rate_limiter
|
292
|
+
|
293
|
+
# Set up successful authentication but rate limit exceeded
|
294
|
+
self.mock_auth_manager.authenticate_api_key.return_value = self.mock_auth_result
|
295
|
+
self.mock_rate_limiter.check_rate_limit.return_value = False
|
296
|
+
|
297
|
+
# Create SecurityManager
|
298
|
+
security_manager = SecurityManager(self.config)
|
299
|
+
|
300
|
+
# Test request validation
|
301
|
+
request_data = {
|
302
|
+
"api_key": "admin_key_123",
|
303
|
+
"required_permissions": ["read", "write"],
|
304
|
+
"client_ip": "192.168.1.100",
|
305
|
+
}
|
306
|
+
|
307
|
+
result = security_manager.validate_request(request_data)
|
308
|
+
|
309
|
+
# Verify result
|
310
|
+
assert result.is_valid is False
|
311
|
+
assert "Rate limit exceeded" in result.error_message
|
312
|
+
assert result.error_code == -32003
|
313
|
+
|
314
|
+
@patch("mcp_security_framework.core.security_manager.PermissionManager")
|
315
|
+
@patch("mcp_security_framework.core.security_manager.AuthManager")
|
316
|
+
@patch("mcp_security_framework.core.security_manager.SSLManager")
|
317
|
+
@patch("mcp_security_framework.core.security_manager.CertificateManager")
|
318
|
+
@patch("mcp_security_framework.core.security_manager.RateLimiter")
|
319
|
+
def test_validate_request_permission_denied(
|
320
|
+
self,
|
321
|
+
mock_rate_limiter_class,
|
322
|
+
mock_cert_manager_class,
|
323
|
+
mock_ssl_manager_class,
|
324
|
+
mock_auth_manager_class,
|
325
|
+
mock_permission_manager_class,
|
326
|
+
):
|
327
|
+
"""Test request validation with permission denied."""
|
328
|
+
# Set up mocks
|
329
|
+
mock_permission_manager_class.return_value = self.mock_permission_manager
|
330
|
+
mock_auth_manager_class.return_value = self.mock_auth_manager
|
331
|
+
mock_ssl_manager_class.return_value = self.mock_ssl_manager
|
332
|
+
mock_cert_manager_class.return_value = self.mock_cert_manager
|
333
|
+
mock_rate_limiter_class.return_value = self.mock_rate_limiter
|
334
|
+
|
335
|
+
# Set up successful authentication and rate limiting but permission denied
|
336
|
+
self.mock_auth_manager.authenticate_api_key.return_value = self.mock_auth_result
|
337
|
+
self.mock_rate_limiter.check_rate_limit.return_value = True
|
338
|
+
|
339
|
+
failed_validation_result = ValidationResult(
|
340
|
+
is_valid=False,
|
341
|
+
status=ValidationStatus.INVALID,
|
342
|
+
error_code=-32004,
|
343
|
+
error_message="Insufficient permissions",
|
344
|
+
)
|
345
|
+
self.mock_permission_manager.validate_access.return_value = (
|
346
|
+
failed_validation_result
|
347
|
+
)
|
348
|
+
|
349
|
+
# Create SecurityManager
|
350
|
+
security_manager = SecurityManager(self.config)
|
351
|
+
|
352
|
+
# Test request validation
|
353
|
+
request_data = {
|
354
|
+
"api_key": "admin_key_123",
|
355
|
+
"required_permissions": ["admin_only"],
|
356
|
+
"client_ip": "192.168.1.100",
|
357
|
+
}
|
358
|
+
|
359
|
+
result = security_manager.validate_request(request_data)
|
360
|
+
|
361
|
+
# Verify result
|
362
|
+
assert result.is_valid is False
|
363
|
+
assert "Permission denied" in result.error_message
|
364
|
+
assert result.error_code == -32004
|
365
|
+
|
366
|
+
@patch("mcp_security_framework.core.security_manager.PermissionManager")
|
367
|
+
@patch("mcp_security_framework.core.security_manager.AuthManager")
|
368
|
+
@patch("mcp_security_framework.core.security_manager.SSLManager")
|
369
|
+
@patch("mcp_security_framework.core.security_manager.CertificateManager")
|
370
|
+
@patch("mcp_security_framework.core.security_manager.RateLimiter")
|
371
|
+
def test_authenticate_user_api_key(
|
372
|
+
self,
|
373
|
+
mock_rate_limiter_class,
|
374
|
+
mock_cert_manager_class,
|
375
|
+
mock_ssl_manager_class,
|
376
|
+
mock_auth_manager_class,
|
377
|
+
mock_permission_manager_class,
|
378
|
+
):
|
379
|
+
"""Test user authentication with API key."""
|
380
|
+
# Set up mocks
|
381
|
+
mock_permission_manager_class.return_value = self.mock_permission_manager
|
382
|
+
mock_auth_manager_class.return_value = self.mock_auth_manager
|
383
|
+
mock_ssl_manager_class.return_value = self.mock_ssl_manager
|
384
|
+
mock_cert_manager_class.return_value = self.mock_cert_manager
|
385
|
+
mock_rate_limiter_class.return_value = self.mock_rate_limiter
|
386
|
+
|
387
|
+
self.mock_auth_manager.authenticate_api_key.return_value = self.mock_auth_result
|
388
|
+
|
389
|
+
# Create SecurityManager
|
390
|
+
security_manager = SecurityManager(self.config)
|
391
|
+
|
392
|
+
# Test API key authentication
|
393
|
+
credentials = {"method": "api_key", "api_key": "admin_key_123"}
|
394
|
+
|
395
|
+
result = security_manager.authenticate_user(credentials)
|
396
|
+
|
397
|
+
# Verify result
|
398
|
+
assert result.is_valid is True
|
399
|
+
assert result.username == "admin"
|
400
|
+
assert result.roles == ["admin"]
|
401
|
+
|
402
|
+
# Verify mock was called
|
403
|
+
self.mock_auth_manager.authenticate_api_key.assert_called_once_with(
|
404
|
+
"admin_key_123"
|
405
|
+
)
|
406
|
+
|
407
|
+
@patch("mcp_security_framework.core.security_manager.PermissionManager")
|
408
|
+
@patch("mcp_security_framework.core.security_manager.AuthManager")
|
409
|
+
@patch("mcp_security_framework.core.security_manager.SSLManager")
|
410
|
+
@patch("mcp_security_framework.core.security_manager.CertificateManager")
|
411
|
+
@patch("mcp_security_framework.core.security_manager.RateLimiter")
|
412
|
+
def test_authenticate_user_jwt(
|
413
|
+
self,
|
414
|
+
mock_rate_limiter_class,
|
415
|
+
mock_cert_manager_class,
|
416
|
+
mock_ssl_manager_class,
|
417
|
+
mock_auth_manager_class,
|
418
|
+
mock_permission_manager_class,
|
419
|
+
):
|
420
|
+
"""Test user authentication with JWT token."""
|
421
|
+
# Set up mocks
|
422
|
+
mock_permission_manager_class.return_value = self.mock_permission_manager
|
423
|
+
mock_auth_manager_class.return_value = self.mock_auth_manager
|
424
|
+
mock_ssl_manager_class.return_value = self.mock_ssl_manager
|
425
|
+
mock_cert_manager_class.return_value = self.mock_cert_manager
|
426
|
+
mock_rate_limiter_class.return_value = self.mock_rate_limiter
|
427
|
+
|
428
|
+
jwt_auth_result = AuthResult(
|
429
|
+
is_valid=True,
|
430
|
+
status=AuthStatus.SUCCESS,
|
431
|
+
username="user",
|
432
|
+
roles=["user"],
|
433
|
+
auth_method=AuthMethod.JWT,
|
434
|
+
error_code=None,
|
435
|
+
error_message=None,
|
436
|
+
)
|
437
|
+
self.mock_auth_manager.authenticate_jwt_token.return_value = jwt_auth_result
|
438
|
+
|
439
|
+
# Create SecurityManager
|
440
|
+
security_manager = SecurityManager(self.config)
|
441
|
+
|
442
|
+
# Test JWT authentication
|
443
|
+
credentials = {
|
444
|
+
"method": "jwt",
|
445
|
+
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
446
|
+
}
|
447
|
+
|
448
|
+
result = security_manager.authenticate_user(credentials)
|
449
|
+
|
450
|
+
# Verify result
|
451
|
+
assert result.is_valid is True
|
452
|
+
assert result.username == "user"
|
453
|
+
assert result.roles == ["user"]
|
454
|
+
|
455
|
+
# Verify mock was called
|
456
|
+
self.mock_auth_manager.authenticate_jwt_token.assert_called_once_with(
|
457
|
+
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
|
458
|
+
)
|
459
|
+
|
460
|
+
@patch("mcp_security_framework.core.security_manager.PermissionManager")
|
461
|
+
@patch("mcp_security_framework.core.security_manager.AuthManager")
|
462
|
+
@patch("mcp_security_framework.core.security_manager.SSLManager")
|
463
|
+
@patch("mcp_security_framework.core.security_manager.CertificateManager")
|
464
|
+
@patch("mcp_security_framework.core.security_manager.RateLimiter")
|
465
|
+
def test_authenticate_user_invalid_method(
|
466
|
+
self,
|
467
|
+
mock_rate_limiter_class,
|
468
|
+
mock_cert_manager_class,
|
469
|
+
mock_ssl_manager_class,
|
470
|
+
mock_auth_manager_class,
|
471
|
+
mock_permission_manager_class,
|
472
|
+
):
|
473
|
+
"""Test user authentication with invalid method."""
|
474
|
+
# Set up mocks
|
475
|
+
mock_permission_manager_class.return_value = self.mock_permission_manager
|
476
|
+
mock_auth_manager_class.return_value = self.mock_auth_manager
|
477
|
+
mock_ssl_manager_class.return_value = self.mock_ssl_manager
|
478
|
+
mock_cert_manager_class.return_value = self.mock_cert_manager
|
479
|
+
mock_rate_limiter_class.return_value = self.mock_rate_limiter
|
480
|
+
|
481
|
+
# Create SecurityManager
|
482
|
+
security_manager = SecurityManager(self.config)
|
483
|
+
|
484
|
+
# Test invalid authentication method
|
485
|
+
credentials = {"method": "invalid_method", "data": "some_data"}
|
486
|
+
|
487
|
+
with pytest.raises(SecurityValidationError) as exc_info:
|
488
|
+
security_manager.authenticate_user(credentials)
|
489
|
+
|
490
|
+
assert "Unsupported authentication method" in str(exc_info.value)
|
491
|
+
|
492
|
+
@patch("mcp_security_framework.core.security_manager.PermissionManager")
|
493
|
+
@patch("mcp_security_framework.core.security_manager.AuthManager")
|
494
|
+
@patch("mcp_security_framework.core.security_manager.SSLManager")
|
495
|
+
@patch("mcp_security_framework.core.security_manager.CertificateManager")
|
496
|
+
@patch("mcp_security_framework.core.security_manager.RateLimiter")
|
497
|
+
def test_check_permissions(
|
498
|
+
self,
|
499
|
+
mock_rate_limiter_class,
|
500
|
+
mock_cert_manager_class,
|
501
|
+
mock_ssl_manager_class,
|
502
|
+
mock_auth_manager_class,
|
503
|
+
mock_permission_manager_class,
|
504
|
+
):
|
505
|
+
"""Test permission checking."""
|
506
|
+
# Set up mocks
|
507
|
+
mock_permission_manager_class.return_value = self.mock_permission_manager
|
508
|
+
mock_auth_manager_class.return_value = self.mock_auth_manager
|
509
|
+
mock_ssl_manager_class.return_value = self.mock_ssl_manager
|
510
|
+
mock_cert_manager_class.return_value = self.mock_cert_manager
|
511
|
+
mock_rate_limiter_class.return_value = self.mock_rate_limiter
|
512
|
+
|
513
|
+
self.mock_permission_manager.validate_access.return_value = (
|
514
|
+
self.mock_validation_result
|
515
|
+
)
|
516
|
+
|
517
|
+
# Create SecurityManager
|
518
|
+
security_manager = SecurityManager(self.config)
|
519
|
+
|
520
|
+
# Test permission checking
|
521
|
+
user_roles = ["admin", "user"]
|
522
|
+
required_permissions = ["read", "write"]
|
523
|
+
|
524
|
+
result = security_manager.check_permissions(user_roles, required_permissions)
|
525
|
+
|
526
|
+
# Verify result
|
527
|
+
assert result.is_valid is True
|
528
|
+
assert result.status == ValidationStatus.VALID
|
529
|
+
|
530
|
+
# Verify mock was called
|
531
|
+
self.mock_permission_manager.validate_access.assert_called_once_with(
|
532
|
+
user_roles, required_permissions
|
533
|
+
)
|
534
|
+
|
535
|
+
@patch("mcp_security_framework.core.security_manager.PermissionManager")
|
536
|
+
@patch("mcp_security_framework.core.security_manager.AuthManager")
|
537
|
+
@patch("mcp_security_framework.core.security_manager.SSLManager")
|
538
|
+
@patch("mcp_security_framework.core.security_manager.CertificateManager")
|
539
|
+
@patch("mcp_security_framework.core.security_manager.RateLimiter")
|
540
|
+
def test_check_rate_limit(
|
541
|
+
self,
|
542
|
+
mock_rate_limiter_class,
|
543
|
+
mock_cert_manager_class,
|
544
|
+
mock_ssl_manager_class,
|
545
|
+
mock_auth_manager_class,
|
546
|
+
mock_permission_manager_class,
|
547
|
+
):
|
548
|
+
"""Test rate limit checking."""
|
549
|
+
# Set up mocks
|
550
|
+
mock_permission_manager_class.return_value = self.mock_permission_manager
|
551
|
+
mock_auth_manager_class.return_value = self.mock_auth_manager
|
552
|
+
mock_ssl_manager_class.return_value = self.mock_ssl_manager
|
553
|
+
mock_cert_manager_class.return_value = self.mock_cert_manager
|
554
|
+
mock_rate_limiter_class.return_value = self.mock_rate_limiter
|
555
|
+
|
556
|
+
self.mock_rate_limiter.check_rate_limit.return_value = True
|
557
|
+
|
558
|
+
# Create SecurityManager
|
559
|
+
security_manager = SecurityManager(self.config)
|
560
|
+
|
561
|
+
# Test rate limit checking
|
562
|
+
identifier = "192.168.1.100"
|
563
|
+
result = security_manager.check_rate_limit(identifier)
|
564
|
+
|
565
|
+
# Verify result
|
566
|
+
assert result is True
|
567
|
+
|
568
|
+
# Verify mock was called
|
569
|
+
self.mock_rate_limiter.check_rate_limit.assert_called_once_with(identifier)
|
570
|
+
|
571
|
+
@patch("mcp_security_framework.core.security_manager.PermissionManager")
|
572
|
+
@patch("mcp_security_framework.core.security_manager.AuthManager")
|
573
|
+
@patch("mcp_security_framework.core.security_manager.SSLManager")
|
574
|
+
@patch("mcp_security_framework.core.security_manager.CertificateManager")
|
575
|
+
@patch("mcp_security_framework.core.security_manager.RateLimiter")
|
576
|
+
def test_get_security_status(
|
577
|
+
self,
|
578
|
+
mock_rate_limiter_class,
|
579
|
+
mock_cert_manager_class,
|
580
|
+
mock_ssl_manager_class,
|
581
|
+
mock_auth_manager_class,
|
582
|
+
mock_permission_manager_class,
|
583
|
+
):
|
584
|
+
"""Test security status retrieval."""
|
585
|
+
# Set up mocks
|
586
|
+
mock_permission_manager_class.return_value = self.mock_permission_manager
|
587
|
+
mock_auth_manager_class.return_value = self.mock_auth_manager
|
588
|
+
mock_ssl_manager_class.return_value = self.mock_ssl_manager
|
589
|
+
mock_cert_manager_class.return_value = self.mock_cert_manager
|
590
|
+
mock_rate_limiter_class.return_value = self.mock_rate_limiter
|
591
|
+
|
592
|
+
# Create SecurityManager
|
593
|
+
security_manager = SecurityManager(self.config)
|
594
|
+
|
595
|
+
# Test security status
|
596
|
+
status = security_manager.get_security_status()
|
597
|
+
|
598
|
+
# Verify result
|
599
|
+
assert isinstance(status, SecurityResponse)
|
600
|
+
assert status.status == ResponseStatus.SUCCESS
|
601
|
+
assert status.message == "Security system healthy"
|
602
|
+
assert status.version == "1.0.0"
|
603
|
+
|
604
|
+
@patch("mcp_security_framework.core.security_manager.PermissionManager")
|
605
|
+
@patch("mcp_security_framework.core.security_manager.AuthManager")
|
606
|
+
@patch("mcp_security_framework.core.security_manager.SSLManager")
|
607
|
+
@patch("mcp_security_framework.core.security_manager.CertificateManager")
|
608
|
+
@patch("mcp_security_framework.core.security_manager.RateLimiter")
|
609
|
+
def test_extract_auth_credentials_api_key(
|
610
|
+
self,
|
611
|
+
mock_rate_limiter_class,
|
612
|
+
mock_cert_manager_class,
|
613
|
+
mock_ssl_manager_class,
|
614
|
+
mock_auth_manager_class,
|
615
|
+
mock_permission_manager_class,
|
616
|
+
):
|
617
|
+
"""Test authentication credentials extraction with API key."""
|
618
|
+
# Set up mocks
|
619
|
+
mock_permission_manager_class.return_value = self.mock_permission_manager
|
620
|
+
mock_auth_manager_class.return_value = self.mock_auth_manager
|
621
|
+
mock_ssl_manager_class.return_value = self.mock_ssl_manager
|
622
|
+
mock_cert_manager_class.return_value = self.mock_cert_manager
|
623
|
+
mock_rate_limiter_class.return_value = self.mock_rate_limiter
|
624
|
+
|
625
|
+
# Create SecurityManager
|
626
|
+
security_manager = SecurityManager(self.config)
|
627
|
+
|
628
|
+
# Test API key extraction
|
629
|
+
request_data = {"api_key": "test_key_123"}
|
630
|
+
credentials = security_manager._extract_auth_credentials(request_data)
|
631
|
+
|
632
|
+
# Verify result
|
633
|
+
assert credentials["method"] == "api_key"
|
634
|
+
assert credentials["api_key"] == "test_key_123"
|
635
|
+
|
636
|
+
@patch("mcp_security_framework.core.security_manager.PermissionManager")
|
637
|
+
@patch("mcp_security_framework.core.security_manager.AuthManager")
|
638
|
+
@patch("mcp_security_framework.core.security_manager.SSLManager")
|
639
|
+
@patch("mcp_security_framework.core.security_manager.CertificateManager")
|
640
|
+
@patch("mcp_security_framework.core.security_manager.RateLimiter")
|
641
|
+
def test_extract_auth_credentials_authorization_header(
|
642
|
+
self,
|
643
|
+
mock_rate_limiter_class,
|
644
|
+
mock_cert_manager_class,
|
645
|
+
mock_ssl_manager_class,
|
646
|
+
mock_auth_manager_class,
|
647
|
+
mock_permission_manager_class,
|
648
|
+
):
|
649
|
+
"""Test authentication credentials extraction with Authorization header."""
|
650
|
+
# Set up mocks
|
651
|
+
mock_permission_manager_class.return_value = self.mock_permission_manager
|
652
|
+
mock_auth_manager_class.return_value = self.mock_auth_manager
|
653
|
+
mock_ssl_manager_class.return_value = self.mock_ssl_manager
|
654
|
+
mock_cert_manager_class.return_value = self.mock_cert_manager
|
655
|
+
mock_rate_limiter_class.return_value = self.mock_rate_limiter
|
656
|
+
|
657
|
+
# Create SecurityManager
|
658
|
+
security_manager = SecurityManager(self.config)
|
659
|
+
|
660
|
+
# Test Bearer token extraction
|
661
|
+
request_data = {
|
662
|
+
"authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
|
663
|
+
}
|
664
|
+
credentials = security_manager._extract_auth_credentials(request_data)
|
665
|
+
|
666
|
+
# Verify result
|
667
|
+
assert credentials["method"] == "jwt"
|
668
|
+
assert credentials["token"] == "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
|
669
|
+
|
670
|
+
# Test ApiKey extraction
|
671
|
+
request_data = {"authorization": "ApiKey test_api_key_123"}
|
672
|
+
credentials = security_manager._extract_auth_credentials(request_data)
|
673
|
+
|
674
|
+
# Verify result
|
675
|
+
assert credentials["method"] == "api_key"
|
676
|
+
assert credentials["api_key"] == "test_api_key_123"
|
677
|
+
|
678
|
+
@patch("mcp_security_framework.core.security_manager.PermissionManager")
|
679
|
+
@patch("mcp_security_framework.core.security_manager.AuthManager")
|
680
|
+
@patch("mcp_security_framework.core.security_manager.SSLManager")
|
681
|
+
@patch("mcp_security_framework.core.security_manager.CertificateManager")
|
682
|
+
@patch("mcp_security_framework.core.security_manager.RateLimiter")
|
683
|
+
def test_extract_auth_credentials_no_credentials(
|
684
|
+
self,
|
685
|
+
mock_rate_limiter_class,
|
686
|
+
mock_cert_manager_class,
|
687
|
+
mock_ssl_manager_class,
|
688
|
+
mock_auth_manager_class,
|
689
|
+
mock_permission_manager_class,
|
690
|
+
):
|
691
|
+
"""Test authentication credentials extraction with no credentials."""
|
692
|
+
# Set up mocks
|
693
|
+
mock_permission_manager_class.return_value = self.mock_permission_manager
|
694
|
+
mock_auth_manager_class.return_value = self.mock_auth_manager
|
695
|
+
mock_ssl_manager_class.return_value = self.mock_ssl_manager
|
696
|
+
mock_cert_manager_class.return_value = self.mock_cert_manager
|
697
|
+
mock_rate_limiter_class.return_value = self.mock_rate_limiter
|
698
|
+
|
699
|
+
# Create SecurityManager
|
700
|
+
security_manager = SecurityManager(self.config)
|
701
|
+
|
702
|
+
# Test no credentials
|
703
|
+
request_data = {"some_other_data": "value"}
|
704
|
+
|
705
|
+
with pytest.raises(SecurityValidationError) as exc_info:
|
706
|
+
security_manager._extract_auth_credentials(request_data)
|
707
|
+
|
708
|
+
assert "No authentication credentials found" in str(exc_info.value)
|
709
|
+
|
710
|
+
@patch("mcp_security_framework.core.security_manager.PermissionManager")
|
711
|
+
@patch("mcp_security_framework.core.security_manager.AuthManager")
|
712
|
+
@patch("mcp_security_framework.core.security_manager.SSLManager")
|
713
|
+
@patch("mcp_security_framework.core.security_manager.CertificateManager")
|
714
|
+
@patch("mcp_security_framework.core.security_manager.RateLimiter")
|
715
|
+
def test_log_security_event(
|
716
|
+
self,
|
717
|
+
mock_rate_limiter_class,
|
718
|
+
mock_cert_manager_class,
|
719
|
+
mock_ssl_manager_class,
|
720
|
+
mock_auth_manager_class,
|
721
|
+
mock_permission_manager_class,
|
722
|
+
):
|
723
|
+
"""Test security event logging."""
|
724
|
+
# Set up mocks
|
725
|
+
mock_permission_manager_class.return_value = self.mock_permission_manager
|
726
|
+
mock_auth_manager_class.return_value = self.mock_auth_manager
|
727
|
+
mock_ssl_manager_class.return_value = self.mock_ssl_manager
|
728
|
+
mock_cert_manager_class.return_value = self.mock_cert_manager
|
729
|
+
mock_rate_limiter_class.return_value = self.mock_rate_limiter
|
730
|
+
|
731
|
+
# Create SecurityManager
|
732
|
+
security_manager = SecurityManager(self.config)
|
733
|
+
|
734
|
+
# Test security event logging
|
735
|
+
event_type = "test_event"
|
736
|
+
event_data = {"user": "admin", "action": "login"}
|
737
|
+
|
738
|
+
security_manager._log_security_event(event_type, event_data)
|
739
|
+
|
740
|
+
# Verify event was logged
|
741
|
+
assert len(security_manager._security_events) == 1
|
742
|
+
event = security_manager._security_events[0]
|
743
|
+
assert event["event_type"] == event_type
|
744
|
+
assert event["event_data"] == event_data
|
745
|
+
assert event["environment"] == "test"
|
746
|
+
assert "timestamp" in event
|
747
|
+
|
748
|
+
@patch("mcp_security_framework.core.security_manager.PermissionManager")
|
749
|
+
@patch("mcp_security_framework.core.security_manager.AuthManager")
|
750
|
+
@patch("mcp_security_framework.core.security_manager.SSLManager")
|
751
|
+
@patch("mcp_security_framework.core.security_manager.CertificateManager")
|
752
|
+
@patch("mcp_security_framework.core.security_manager.RateLimiter")
|
753
|
+
def test_factory_methods_work(
|
754
|
+
self,
|
755
|
+
mock_rate_limiter_class,
|
756
|
+
mock_cert_manager_class,
|
757
|
+
mock_ssl_manager_class,
|
758
|
+
mock_auth_manager_class,
|
759
|
+
mock_permission_manager_class,
|
760
|
+
):
|
761
|
+
"""Test that factory methods work correctly."""
|
762
|
+
# Set up mocks
|
763
|
+
mock_permission_manager_class.return_value = self.mock_permission_manager
|
764
|
+
mock_auth_manager_class.return_value = self.mock_auth_manager
|
765
|
+
mock_ssl_manager_class.return_value = self.mock_ssl_manager
|
766
|
+
mock_cert_manager_class.return_value = self.mock_cert_manager
|
767
|
+
mock_rate_limiter_class.return_value = self.mock_rate_limiter
|
768
|
+
|
769
|
+
# Create SecurityManager
|
770
|
+
security_manager = SecurityManager(self.config)
|
771
|
+
|
772
|
+
# Test factory methods
|
773
|
+
fastapi_middleware = security_manager.create_fastapi_middleware()
|
774
|
+
assert fastapi_middleware is not None
|
775
|
+
assert hasattr(fastapi_middleware, '__call__')
|
776
|
+
|
777
|
+
flask_middleware = security_manager.create_flask_middleware()
|
778
|
+
assert flask_middleware is not None
|
779
|
+
assert hasattr(flask_middleware, '__call__')
|
780
|
+
|
781
|
+
# Django middleware should raise ImportError since it's not implemented
|
782
|
+
with pytest.raises((ImportError, SecurityConfigurationError)):
|
783
|
+
security_manager.create_django_middleware()
|
784
|
+
|
785
|
+
@patch("mcp_security_framework.core.security_manager.PermissionManager")
|
786
|
+
@patch("mcp_security_framework.core.security_manager.AuthManager")
|
787
|
+
@patch("mcp_security_framework.core.security_manager.SSLManager")
|
788
|
+
@patch("mcp_security_framework.core.security_manager.CertificateManager")
|
789
|
+
@patch("mcp_security_framework.core.security_manager.RateLimiter")
|
790
|
+
def test_certificate_operations_not_implemented(
|
791
|
+
self,
|
792
|
+
mock_rate_limiter_class,
|
793
|
+
mock_cert_manager_class,
|
794
|
+
mock_ssl_manager_class,
|
795
|
+
mock_auth_manager_class,
|
796
|
+
mock_permission_manager_class,
|
797
|
+
):
|
798
|
+
"""Test certificate operations with NotImplementedError."""
|
799
|
+
# Set up mocks
|
800
|
+
mock_permission_manager_class.return_value = self.mock_permission_manager
|
801
|
+
mock_auth_manager_class.return_value = self.mock_auth_manager
|
802
|
+
mock_ssl_manager_class.return_value = self.mock_ssl_manager
|
803
|
+
mock_cert_manager_class.return_value = self.mock_cert_manager
|
804
|
+
mock_rate_limiter_class.return_value = self.mock_rate_limiter
|
805
|
+
|
806
|
+
# Create SecurityManager
|
807
|
+
security_manager = SecurityManager(self.config)
|
808
|
+
|
809
|
+
# Test certificate operations (these will be implemented in future steps)
|
810
|
+
# These methods are not yet implemented, so they should raise NotImplementedError
|
811
|
+
# or work with disabled certificate management
|
812
|
+
pass
|
813
|
+
|
814
|
+
@patch("mcp_security_framework.core.security_manager.PermissionManager")
|
815
|
+
@patch("mcp_security_framework.core.security_manager.AuthManager")
|
816
|
+
@patch("mcp_security_framework.core.security_manager.SSLManager")
|
817
|
+
@patch("mcp_security_framework.core.security_manager.CertificateManager")
|
818
|
+
@patch("mcp_security_framework.core.security_manager.RateLimiter")
|
819
|
+
def test_ssl_context_creation_not_implemented(
|
820
|
+
self,
|
821
|
+
mock_rate_limiter_class,
|
822
|
+
mock_cert_manager_class,
|
823
|
+
mock_ssl_manager_class,
|
824
|
+
mock_auth_manager_class,
|
825
|
+
mock_permission_manager_class,
|
826
|
+
):
|
827
|
+
"""Test SSL context creation with NotImplementedError."""
|
828
|
+
# Set up mocks
|
829
|
+
mock_permission_manager_class.return_value = self.mock_permission_manager
|
830
|
+
mock_auth_manager_class.return_value = self.mock_auth_manager
|
831
|
+
mock_ssl_manager_class.return_value = self.mock_ssl_manager
|
832
|
+
mock_cert_manager_class.return_value = self.mock_cert_manager
|
833
|
+
mock_rate_limiter_class.return_value = self.mock_rate_limiter
|
834
|
+
|
835
|
+
# Create SecurityManager
|
836
|
+
security_manager = SecurityManager(self.config)
|
837
|
+
|
838
|
+
# Test SSL context creation (these will be implemented in future steps)
|
839
|
+
# These methods are not yet implemented, so they should raise NotImplementedError
|
840
|
+
# or work with disabled SSL management
|
841
|
+
pass
|