mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-10-24 01:15:24 +08:00
* fix(platform): enforce credential-session TTL on a timer, not on traffic The four adapter registration flows (Lark one-click app, DingTalk device flow, WeCom bot, QQ Official bind) each park a short-lived secret in an in-memory session dict until the caller persists it: app_secret, client_secret, or the bot secret. Each store had a TTL and a cleanup function, but the cleanup only ran at the top of a route handler. An abandoned flow therefore kept its secret in memory until some *other* request happened to arrive, which for a quiet instance can be far past the validity window (15 min for Lark, 10 for DingTalk, 5 for WeCom/QQ). Changes: - Move the sweep to module level as _sweep_credential_sessions(stores) so it is directly testable, and have it scrub app_secret/client_secret/secret as it evicts, so an evicted session dict no longer retains a readable credential. - Add a background sweeper task started from the router group's initialize(), running every 60s, so the TTL holds regardless of traffic. - Keep the per-route cleanups: they make eviction immediate under load. Tests: 9 new cases (expiry, fresh sessions survive, secret scrubbing, per-store TTL, cancelling a pending handshake task, not cancelling a finished one, malformed session without created_at, multiple evictions, empty stores). Co-authored-by: multica-agent <[email protected]> * fix(platform): tolerate a task manager without create_task when starting the sweeper The sweeper is started from the adapter router group's initialize(). Some embeddings of the app provide a task manager that only exposes create_user_task, so an unconditional create_task broke those harnesses. Fall back to the per-route cleanups when create_task is unavailable. Co-authored-by: multica-agent <[email protected]> --------- Co-authored-by: multica-agent <[email protected]>