feat: harden auth, shutdown, and session bundle (0.35.0)
Three features bundled into one release: - rate-limit /auth/login, /register, /me/password (token bucket, 5 req/sec sustained with 10-request burst by default; 429 + Retry-After header on hit; tracing::warn! per hit so operators see attack patterns; AUTH_RATE_PER_SEC / AUTH_RATE_BURST env knobs) - handle SIGTERM for graceful container stops (replaces bare ctrl_c() with a select over ctrl_c + SignalKind::terminate() so docker compose stop runs the daemon shutdown path instead of letting Chromium leak past SIGKILL) - clear session.user on 401 from any API call (setOn401Hook in api/client.ts, registered from session.svelte.ts gated on $app/environment::browser so the SSR bundle never installs it; fixes "logged in but no bookmarks/collections" mid-session expiry state) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -22,6 +22,7 @@ pub struct AuthConfig {
|
||||
pub cookie_secure: bool,
|
||||
pub cookie_domain: Option<String>,
|
||||
pub session_ttl_days: i64,
|
||||
pub rate_limit: crate::auth::rate_limit::RateLimitConfig,
|
||||
}
|
||||
|
||||
impl Default for AuthConfig {
|
||||
@@ -30,6 +31,11 @@ impl Default for AuthConfig {
|
||||
cookie_secure: true,
|
||||
cookie_domain: None,
|
||||
session_ttl_days: 30,
|
||||
// Disabled by default so the test harness inherits a
|
||||
// non-throttling limiter. Production `from_env` overrides
|
||||
// to the [`PRODUCTION_PER_SEC`]/[`PRODUCTION_BURST`]
|
||||
// defaults.
|
||||
rate_limit: crate::auth::rate_limit::RateLimitConfig::default(),
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -145,6 +151,16 @@ impl Config {
|
||||
.ok()
|
||||
.filter(|s| !s.is_empty()),
|
||||
session_ttl_days: env_i64("SESSION_TTL_DAYS", 30),
|
||||
rate_limit: crate::auth::rate_limit::RateLimitConfig {
|
||||
per_sec: env_u64(
|
||||
"AUTH_RATE_PER_SEC",
|
||||
crate::auth::rate_limit::PRODUCTION_PER_SEC.into(),
|
||||
) as u32,
|
||||
burst: env_u64(
|
||||
"AUTH_RATE_BURST",
|
||||
crate::auth::rate_limit::PRODUCTION_BURST.into(),
|
||||
) as u32,
|
||||
},
|
||||
},
|
||||
upload: UploadConfig {
|
||||
max_request_bytes: env_usize("MAX_REQUEST_BYTES", 200 * 1024 * 1024),
|
||||
|
||||
Reference in New Issue
Block a user