mcp-security-framework 0.1.0__py3-none-any.whl → 1.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/core/auth_manager.py +12 -2
- mcp_security_framework/core/cert_manager.py +247 -16
- mcp_security_framework/core/permission_manager.py +4 -0
- mcp_security_framework/core/rate_limiter.py +10 -0
- mcp_security_framework/core/security_manager.py +2 -0
- mcp_security_framework/examples/comprehensive_example.py +884 -0
- mcp_security_framework/examples/django_example.py +45 -12
- mcp_security_framework/examples/fastapi_example.py +826 -354
- mcp_security_framework/examples/flask_example.py +51 -11
- mcp_security_framework/examples/gateway_example.py +109 -17
- mcp_security_framework/examples/microservice_example.py +112 -16
- mcp_security_framework/examples/standalone_example.py +646 -430
- mcp_security_framework/examples/test_all_examples.py +556 -0
- mcp_security_framework/middleware/auth_middleware.py +1 -1
- mcp_security_framework/middleware/fastapi_auth_middleware.py +82 -14
- mcp_security_framework/middleware/flask_auth_middleware.py +154 -7
- mcp_security_framework/schemas/models.py +1 -0
- mcp_security_framework/utils/cert_utils.py +5 -5
- {mcp_security_framework-0.1.0.dist-info → mcp_security_framework-1.1.0.dist-info}/METADATA +1 -1
- {mcp_security_framework-0.1.0.dist-info → mcp_security_framework-1.1.0.dist-info}/RECORD +38 -32
- tests/conftest.py +306 -0
- tests/test_cli/test_cert_cli.py +13 -31
- tests/test_core/test_cert_manager.py +12 -12
- tests/test_examples/test_comprehensive_example.py +560 -0
- tests/test_examples/test_fastapi_example.py +214 -116
- tests/test_examples/test_flask_example.py +250 -131
- tests/test_examples/test_standalone_example.py +44 -99
- tests/test_integration/test_auth_flow.py +4 -4
- tests/test_integration/test_certificate_flow.py +1 -1
- tests/test_integration/test_fastapi_integration.py +39 -45
- tests/test_integration/test_flask_integration.py +4 -2
- tests/test_integration/test_standalone_integration.py +48 -48
- tests/test_middleware/test_fastapi_auth_middleware.py +724 -0
- tests/test_middleware/test_flask_auth_middleware.py +638 -0
- tests/test_middleware/test_security_middleware.py +9 -3
- {mcp_security_framework-0.1.0.dist-info → mcp_security_framework-1.1.0.dist-info}/WHEEL +0 -0
- {mcp_security_framework-0.1.0.dist-info → mcp_security_framework-1.1.0.dist-info}/entry_points.txt +0 -0
- {mcp_security_framework-0.1.0.dist-info → mcp_security_framework-1.1.0.dist-info}/top_level.txt +0 -0
@@ -21,13 +21,46 @@ import os
|
|
21
21
|
import json
|
22
22
|
import logging
|
23
23
|
from typing import Dict, List, Any, Optional
|
24
|
-
from datetime import datetime, timedelta
|
24
|
+
from datetime import datetime, timedelta, timezone
|
25
|
+
|
26
|
+
# Configure Django settings before importing Django modules
|
27
|
+
import django
|
28
|
+
from django.conf import settings
|
29
|
+
|
30
|
+
if not settings.configured:
|
31
|
+
settings.configure(
|
32
|
+
DEBUG=True,
|
33
|
+
SECRET_KEY='django-insecure-test-key-for-examples',
|
34
|
+
INSTALLED_APPS=[
|
35
|
+
'django.contrib.auth',
|
36
|
+
'django.contrib.contenttypes',
|
37
|
+
'django.contrib.sessions',
|
38
|
+
],
|
39
|
+
DATABASES={
|
40
|
+
'default': {
|
41
|
+
'ENGINE': 'django.db.backends.sqlite3',
|
42
|
+
'NAME': ':memory:',
|
43
|
+
}
|
44
|
+
},
|
45
|
+
MIDDLEWARE=[
|
46
|
+
'django.middleware.security.SecurityMiddleware',
|
47
|
+
'django.contrib.sessions.middleware.SessionMiddleware',
|
48
|
+
'django.middleware.common.CommonMiddleware',
|
49
|
+
'django.middleware.csrf.CsrfViewMiddleware',
|
50
|
+
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
51
|
+
],
|
52
|
+
ROOT_URLCONF=None,
|
53
|
+
)
|
54
|
+
django.setup()
|
25
55
|
|
26
56
|
from django.http import HttpRequest, HttpResponse, JsonResponse
|
27
57
|
from django.views.decorators.csrf import csrf_exempt
|
28
58
|
from django.views.decorators.http import require_http_methods
|
29
|
-
|
30
|
-
from django.
|
59
|
+
try:
|
60
|
+
from django.middleware.base import BaseMiddleware
|
61
|
+
except ImportError:
|
62
|
+
# Fallback for Django 5.x
|
63
|
+
from django.utils.deprecation import MiddlewareMixin as BaseMiddleware
|
31
64
|
from django.urls import path, include
|
32
65
|
from django.contrib.auth.models import User
|
33
66
|
from django.contrib.auth.decorators import login_required, permission_required
|
@@ -89,10 +122,10 @@ class DjangoSecurityMiddleware(BaseMiddleware):
|
|
89
122
|
security_headers=DEFAULT_SECURITY_HEADERS
|
90
123
|
),
|
91
124
|
ssl=SSLConfig(
|
92
|
-
enabled=
|
93
|
-
cert_file=
|
94
|
-
key_file=
|
95
|
-
ca_cert_file=
|
125
|
+
enabled=False, # Disable SSL for example
|
126
|
+
cert_file=None,
|
127
|
+
key_file=None,
|
128
|
+
ca_cert_file=None,
|
96
129
|
verify_mode="CERT_REQUIRED",
|
97
130
|
min_version="TLSv1.2"
|
98
131
|
),
|
@@ -113,7 +146,7 @@ class DjangoSecurityMiddleware(BaseMiddleware):
|
|
113
146
|
"exempt_roles": ["admin"]
|
114
147
|
},
|
115
148
|
permissions={
|
116
|
-
"enabled":
|
149
|
+
"enabled": False, # Disable permissions for example
|
117
150
|
"roles_file": "config/roles.json",
|
118
151
|
"default_role": "user",
|
119
152
|
"hierarchy_enabled": True
|
@@ -376,7 +409,7 @@ class HealthCheckView(View):
|
|
376
409
|
"""Handle GET request."""
|
377
410
|
return JsonResponse({
|
378
411
|
"status": "healthy",
|
379
|
-
"timestamp": datetime.
|
412
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
380
413
|
"version": "1.0.0"
|
381
414
|
})
|
382
415
|
|
@@ -407,7 +440,7 @@ class UserProfileView(View):
|
|
407
440
|
"username": user_info.get("username"),
|
408
441
|
"roles": user_info.get("roles", []),
|
409
442
|
"permissions": user_info.get("permissions", []),
|
410
|
-
"last_login": datetime.
|
443
|
+
"last_login": datetime.now(timezone.utc).isoformat()
|
411
444
|
})
|
412
445
|
|
413
446
|
|
@@ -461,7 +494,7 @@ class DataView(View):
|
|
461
494
|
"id": "data_123",
|
462
495
|
"created_by": user_info.get("username"),
|
463
496
|
"data": data,
|
464
|
-
"created_at": datetime.
|
497
|
+
"created_at": datetime.now(timezone.utc).isoformat()
|
465
498
|
})
|
466
499
|
|
467
500
|
|
@@ -535,7 +568,7 @@ class DjangoExample:
|
|
535
568
|
"auth_enabled": True,
|
536
569
|
"rate_limiting_enabled": True,
|
537
570
|
"permissions_enabled": True,
|
538
|
-
"timestamp": datetime.
|
571
|
+
"timestamp": datetime.now(timezone.utc).isoformat()
|
539
572
|
}
|
540
573
|
|
541
574
|
|