diff --git a/crm/.env.example b/crm/.env.example index 10b293d3c..7c8a20194 100644 --- a/crm/.env.example +++ b/crm/.env.example @@ -1,4 +1,4 @@ -# Shared password (16+ chars) and a random secret (16+ chars) that signs session cookies. +# Shared password (12+ chars) and a random secret (16+ chars) that signs session cookies. # Rotating either logs everyone out. CRM_PASSWORD= CRM_SESSION_SECRET= diff --git a/crm/README.md b/crm/README.md index c9bfa0f51..37fc1f36a 100644 --- a/crm/README.md +++ b/crm/README.md @@ -78,7 +78,8 @@ The cookie is `nonce.expiry.signature`, signed with `CRM_SESSION_SECRET` (random not the password, so a leaked cookie gives nothing to brute force) and valid only while its nonce is listed in `/data/sessions.json`: logout revokes it, rotating either variable logs everyone out. Login attempts are limited to 10 -per client per 15 minutes. Both variables must be 16 characters or more. +per client per 15 minutes. The password needs 12 characters or more, the +secret 16. Module state (snapshot cache, refresh mutex, PostHog budget, login counters) lives on `globalThis` and the snapshot file is re-read whenever its mtime diff --git a/crm/app/login/page.tsx b/crm/app/login/page.tsx index 863c50047..b788b032b 100644 --- a/crm/app/login/page.tsx +++ b/crm/app/login/page.tsx @@ -12,7 +12,7 @@ export default async function LoginPage({ searchParams }: { searchParams: Promis
{!authConfigured() ? (- CRM_PASSWORD and CRM_SESSION_SECRET must both be set (16 characters minimum). Nobody can log in until they are. + CRM_PASSWORD (12 characters minimum) and CRM_SESSION_SECRET (16 minimum) must both be set. Nobody can log in until they are.
) : (