fix: address PR #589 review findings
- Fix anyio.Lock() created at module import time; use lazy init in get_shared_storage() to avoid instantiation before event loop exists - Stop get_login_flow_session from silently swallowing DB exceptions; re-raise and handle in caller with proper error response - Update ProvisionAccessResponse and UpdateScopesResponse status field docs to include all actual values (declined, cancelled, unchanged) - Narrow except clause in present_login_url to (AttributeError, NotImplementedError) instead of bare Exception - Add KeyError handling in LoginFlowV2Client.initiate() and poll() for clear errors on malformed Nextcloud responses - Simplify redundant env-var bypass branches in scope_authorization.py - Extract _maybe_login_flow_cleanup() context manager to replace 4 inline cleanup loop registrations in app.py; move sleep to end of loop body so cleanup runs once at startup - Replace fragile string replacement in _rewrite_login_flow_url with proper urllib.parse URL handling Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.6
parent
1a6ce0fa7d
commit
ba597634bd
+16
-21
@@ -1531,7 +1531,6 @@ def get_app(transport: str = "streamable-http", enabled_apps: list[str] | None =
|
||||
async def _login_flow_cleanup_loop() -> None:
|
||||
"""Periodically clean up expired Login Flow v2 sessions."""
|
||||
while True:
|
||||
await anyio.sleep(3600) # Every hour
|
||||
try:
|
||||
storage = await get_shared_storage()
|
||||
count = await storage.delete_expired_login_flow_sessions()
|
||||
@@ -1539,6 +1538,18 @@ def get_app(transport: str = "streamable-http", enabled_apps: list[str] | None =
|
||||
logger.info(f"Cleaned up {count} expired login flow sessions")
|
||||
except Exception as e:
|
||||
logger.warning(f"Login flow cleanup error: {e}")
|
||||
await anyio.sleep(3600) # Every hour
|
||||
|
||||
@asynccontextmanager
|
||||
async def _maybe_login_flow_cleanup():
|
||||
"""Start Login Flow cleanup task if enabled."""
|
||||
if settings.enable_login_flow:
|
||||
async with anyio.create_task_group() as tg:
|
||||
tg.start_soon(_login_flow_cleanup_loop)
|
||||
yield
|
||||
tg.cancel_scope.cancel()
|
||||
else:
|
||||
yield
|
||||
|
||||
@asynccontextmanager
|
||||
async def starlette_lifespan(app: Starlette):
|
||||
@@ -1772,13 +1783,10 @@ def get_app(transport: str = "streamable-http", enabled_apps: list[str] | None =
|
||||
f"{settings.vector_sync_processor_workers} processors"
|
||||
)
|
||||
|
||||
# Start Login Flow cleanup task if enabled
|
||||
if settings.enable_login_flow:
|
||||
tg.start_soon(_login_flow_cleanup_loop)
|
||||
|
||||
# Run MCP session manager and yield
|
||||
async with AsyncExitStack() as stack:
|
||||
await stack.enter_async_context(mcp.session_manager.run())
|
||||
await stack.enter_async_context(_maybe_login_flow_cleanup())
|
||||
try:
|
||||
yield
|
||||
finally:
|
||||
@@ -1959,13 +1967,10 @@ def get_app(transport: str = "streamable-http", enabled_apps: list[str] | None =
|
||||
f"{settings.vector_sync_processor_workers} processors"
|
||||
)
|
||||
|
||||
# Start Login Flow cleanup task if enabled
|
||||
if settings.enable_login_flow:
|
||||
tg.start_soon(_login_flow_cleanup_loop)
|
||||
|
||||
# Run MCP session manager and yield
|
||||
async with AsyncExitStack() as stack:
|
||||
await stack.enter_async_context(mcp.session_manager.run())
|
||||
await stack.enter_async_context(_maybe_login_flow_cleanup())
|
||||
try:
|
||||
yield
|
||||
finally:
|
||||
@@ -1986,12 +1991,7 @@ def get_app(transport: str = "streamable-http", enabled_apps: list[str] | None =
|
||||
# Just run MCP session manager without vector sync
|
||||
async with AsyncExitStack() as stack:
|
||||
await stack.enter_async_context(mcp.session_manager.run())
|
||||
if settings.enable_login_flow:
|
||||
async with anyio.create_task_group() as cleanup_tg:
|
||||
cleanup_tg.start_soon(_login_flow_cleanup_loop)
|
||||
yield
|
||||
cleanup_tg.cancel_scope.cancel()
|
||||
else:
|
||||
async with _maybe_login_flow_cleanup():
|
||||
yield
|
||||
|
||||
else:
|
||||
@@ -2013,12 +2013,7 @@ def get_app(transport: str = "streamable-http", enabled_apps: list[str] | None =
|
||||
)
|
||||
async with AsyncExitStack() as stack:
|
||||
await stack.enter_async_context(mcp.session_manager.run())
|
||||
if settings.enable_login_flow:
|
||||
async with anyio.create_task_group() as cleanup_tg:
|
||||
cleanup_tg.start_soon(_login_flow_cleanup_loop)
|
||||
yield
|
||||
cleanup_tg.cancel_scope.cancel()
|
||||
else:
|
||||
async with _maybe_login_flow_cleanup():
|
||||
yield
|
||||
|
||||
# Health check endpoints for Kubernetes probes
|
||||
|
||||
Reference in New Issue
Block a user