mdb-engine 0.4.11__tar.gz → 0.4.12__tar.gz
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.
- {mdb_engine-0.4.11/mdb_engine.egg-info → mdb_engine-0.4.12}/PKG-INFO +1 -1
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/__init__.py +5 -7
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/core/engine.py +28 -5
- {mdb_engine-0.4.11 → mdb_engine-0.4.12/mdb_engine.egg-info}/PKG-INFO +1 -1
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/pyproject.toml +1 -1
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/setup.py +1 -1
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/LICENSE +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/MANIFEST.in +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/README.md +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/README.md +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/auth/ARCHITECTURE.md +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/auth/README.md +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/auth/__init__.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/auth/audit.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/auth/base.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/auth/casbin_factory.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/auth/casbin_models.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/auth/config_defaults.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/auth/config_helpers.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/auth/cookie_utils.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/auth/csrf.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/auth/decorators.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/auth/dependencies.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/auth/helpers.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/auth/integration.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/auth/jwt.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/auth/middleware.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/auth/oso_factory.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/auth/provider.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/auth/rate_limiter.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/auth/restrictions.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/auth/session_manager.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/auth/shared_middleware.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/auth/shared_users.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/auth/token_lifecycle.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/auth/token_store.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/auth/users.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/auth/utils.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/cli/__init__.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/cli/commands/__init__.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/cli/commands/generate.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/cli/commands/migrate.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/cli/commands/show.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/cli/commands/validate.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/cli/main.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/cli/utils.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/config.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/constants.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/core/README.md +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/core/__init__.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/core/app_registration.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/core/app_secrets.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/core/connection.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/core/encryption.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/core/index_management.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/core/manifest.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/core/ray_integration.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/core/seeding.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/core/service_initialization.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/core/types.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/database/README.md +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/database/__init__.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/database/abstraction.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/database/connection.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/database/query_validator.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/database/resource_limiter.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/database/scoped_wrapper.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/dependencies.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/di/__init__.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/di/container.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/di/providers.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/di/scopes.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/embeddings/README.md +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/embeddings/__init__.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/embeddings/dependencies.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/embeddings/service.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/exceptions.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/indexes/README.md +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/indexes/__init__.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/indexes/helpers.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/indexes/manager.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/memory/README.md +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/memory/__init__.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/memory/service.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/observability/README.md +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/observability/__init__.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/observability/health.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/observability/logging.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/observability/metrics.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/repositories/__init__.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/repositories/base.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/repositories/mongo.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/repositories/unit_of_work.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/routing/README.md +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/routing/__init__.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/routing/websockets.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/utils/__init__.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine/utils/mongo.py +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine.egg-info/SOURCES.txt +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine.egg-info/dependency_links.txt +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine.egg-info/entry_points.txt +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine.egg-info/requires.txt +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/mdb_engine.egg-info/top_level.txt +0 -0
- {mdb_engine-0.4.11 → mdb_engine-0.4.12}/setup.cfg +0 -0
|
@@ -82,13 +82,11 @@ from .repositories import Entity, MongoRepository, Repository, UnitOfWork
|
|
|
82
82
|
from .utils import clean_mongo_doc, clean_mongo_docs
|
|
83
83
|
|
|
84
84
|
__version__ = (
|
|
85
|
-
"0.4.
|
|
86
|
-
# -
|
|
87
|
-
# -
|
|
88
|
-
# -
|
|
89
|
-
# -
|
|
90
|
-
# - Better logging throughout WebSocket registration process
|
|
91
|
-
# - All WebSocket multi-app SSO features now work automatically
|
|
85
|
+
"0.4.12" # Fix CSRF middleware rejecting WebSocket connections
|
|
86
|
+
# - Skip CSRF middleware on child apps in multi-app setups (parent handles it)
|
|
87
|
+
# - Merge child app public routes into parent CSRF exempt list
|
|
88
|
+
# - WebSocket connections now work correctly in multi-app SSO setups
|
|
89
|
+
# - Security maintained: parent app CSRF middleware protects all routes
|
|
92
90
|
)
|
|
93
91
|
|
|
94
92
|
__all__ = [
|
|
@@ -1499,8 +1499,9 @@ class MongoDBEngine:
|
|
|
1499
1499
|
|
|
1500
1500
|
# Add CSRF middleware (after auth - auto-enabled for shared mode)
|
|
1501
1501
|
# CSRF protection is enabled by default for shared auth mode
|
|
1502
|
+
# SKIP for sub-apps in multi-app setups - parent app handles CSRF
|
|
1502
1503
|
csrf_config = auth_config.get("csrf_protection", True if auth_mode == "shared" else False)
|
|
1503
|
-
if csrf_config:
|
|
1504
|
+
if csrf_config and not is_sub_app: # Don't add CSRF to child apps
|
|
1504
1505
|
from ..auth.csrf import create_csrf_middleware
|
|
1505
1506
|
|
|
1506
1507
|
csrf_middleware = create_csrf_middleware(
|
|
@@ -1508,6 +1509,11 @@ class MongoDBEngine:
|
|
|
1508
1509
|
)
|
|
1509
1510
|
app.add_middleware(csrf_middleware)
|
|
1510
1511
|
logger.info(f"CSRFMiddleware added for '{slug}'")
|
|
1512
|
+
elif csrf_config and is_sub_app:
|
|
1513
|
+
logger.debug(
|
|
1514
|
+
f"CSRFMiddleware skipped for child app '{slug}' - "
|
|
1515
|
+
f"parent app handles CSRF protection for WebSocket routes"
|
|
1516
|
+
)
|
|
1511
1517
|
|
|
1512
1518
|
# Add security middleware (HSTS, headers)
|
|
1513
1519
|
security_config = auth_config.get("security", {})
|
|
@@ -2127,17 +2133,33 @@ class MongoDBEngine:
|
|
|
2127
2133
|
"Path prefix validation failed:\n" + "\n".join(f" - {e}" for e in errors)
|
|
2128
2134
|
)
|
|
2129
2135
|
|
|
2130
|
-
# Check if any app uses shared auth
|
|
2136
|
+
# Check if any app uses shared auth and collect public routes for CSRF exemption
|
|
2131
2137
|
has_shared_auth = False
|
|
2138
|
+
all_public_routes = [
|
|
2139
|
+
"/health",
|
|
2140
|
+
"/docs",
|
|
2141
|
+
"/openapi.json",
|
|
2142
|
+
"/_mdb/routes",
|
|
2143
|
+
] # Base exempt routes
|
|
2132
2144
|
for app_config in apps:
|
|
2133
2145
|
try:
|
|
2134
2146
|
manifest_path = app_config["manifest"]
|
|
2147
|
+
path_prefix = app_config.get("path_prefix", f"/{app_config.get('slug')}")
|
|
2135
2148
|
with open(manifest_path) as f:
|
|
2136
2149
|
app_manifest_pre = json.load(f)
|
|
2137
2150
|
auth_config = app_manifest_pre.get("auth", {})
|
|
2138
2151
|
if auth_config.get("mode") == "shared":
|
|
2139
2152
|
has_shared_auth = True
|
|
2140
|
-
|
|
2153
|
+
# Collect public routes with path prefix for CSRF exemption
|
|
2154
|
+
child_public_routes = auth_config.get("public_routes", [])
|
|
2155
|
+
for route in child_public_routes:
|
|
2156
|
+
# Add path prefix to make route absolute on parent app
|
|
2157
|
+
if route.startswith("/"):
|
|
2158
|
+
prefixed_route = f"{path_prefix.rstrip('/')}{route}"
|
|
2159
|
+
else:
|
|
2160
|
+
prefixed_route = f"{path_prefix.rstrip('/')}/{route}"
|
|
2161
|
+
if prefixed_route not in all_public_routes:
|
|
2162
|
+
all_public_routes.append(prefixed_route)
|
|
2141
2163
|
except (FileNotFoundError, json.JSONDecodeError, KeyError) as e:
|
|
2142
2164
|
logger.warning(f"Could not check auth mode for app '{app_config.get('slug')}': {e}")
|
|
2143
2165
|
|
|
@@ -2812,10 +2834,11 @@ class MongoDBEngine:
|
|
|
2812
2834
|
from ..auth.csrf import create_csrf_middleware
|
|
2813
2835
|
|
|
2814
2836
|
# Create CSRF middleware with default config (will use parent app's CORS config)
|
|
2815
|
-
# Exempt routes that don't need CSRF (health checks,
|
|
2837
|
+
# Exempt routes that don't need CSRF (health checks, public routes from child apps)
|
|
2838
|
+
# all_public_routes includes base routes + child app public routes with path prefixes
|
|
2816
2839
|
parent_csrf_config = {
|
|
2817
2840
|
"csrf_protection": True,
|
|
2818
|
-
"public_routes":
|
|
2841
|
+
"public_routes": all_public_routes,
|
|
2819
2842
|
}
|
|
2820
2843
|
csrf_middleware = create_csrf_middleware(parent_csrf_config)
|
|
2821
2844
|
parent_app.add_middleware(csrf_middleware)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|