docs: SECURITY.md sagde noget, dagen havde gjort forkert
"Ingen ratebegrænsning ud over login og nulstilling" var sandt i morges. Det er det ikke længere: andenfaktoren, beaconet og indgående post har fået deres eget loft i løbet af dagen — det sidste tilføjede jeg selv og skrev ikke det her. En SECURITY.md, der siger noget forkert, er værre end de fleste fejl. Den er netop den fil, nogen læser for at afgøre, om de tør køre det her, og hvert eneste punkt i den er en påstand, de ikke selv kan efterprøve uden at læse koden. Samme sted mangler den største åbne ting: notekroppe, opgavetitler, beskrivelser og kommentarer er ikke krypteret. Forseglingen dækker legitimation — postkassers kodeord, OAuth-tokens, andenfaktorens hemmelighed, AI-nøgler — og intet andet. En note med et kodeord i har det i klartekst i hver sikkerhedskopi, man kan hente. Det stod i overleveringen og på dokumentationssiden for noter, og det hørte hjemme her. README's "ikke færdigt"-liste havde Gmail med. Den kører i produktion, inklusive flagningen og dubletbehandlingen, der tog en dag at få rigtig. Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
co-authored by
Claude Opus 5
parent
264f48ae11
commit
23bd784b07
@@ -104,15 +104,21 @@ Apple Reminders, forward mail into it, and add it to Claude as a connector.
|
||||
| AI layer (Anthropic/OpenAI/Google/local) | Built, degrades when unconfigured |
|
||||
| Gmail: OAuth2 with PKCE, polling, one-way to tasks | Done, tested |
|
||||
| Google Calendar: read-only, laid over the task calendar | Built, never run against Google |
|
||||
| Calendar subscriptions: ICS and webcal, several per person | Done, tested |
|
||||
| Times on tasks, set by dragging in the week grid | Done, tested |
|
||||
| Notes: archive, grouped list, images, source view | Done, tested |
|
||||
| Update notice for administrators | Done, tested |
|
||||
| Personal API tokens | Done, tested |
|
||||
| OpenAPI 3.1 spec, checked against the router | Done, tested |
|
||||
| End-to-end smoke tests (Playwright) | Done |
|
||||
| Documentation, landing page, licence | Done |
|
||||
|
||||
**Not finished:** Web Push, the AI providers, and the Gmail and Google Calendar
|
||||
API calls are implemented against their specifications and have only ever been
|
||||
exercised there, not against live services. Everything else has an interface: opening a task shows
|
||||
**Not finished:** Web Push, the AI providers and the Google Calendar API calls are
|
||||
implemented against their specifications and have only ever been exercised there,
|
||||
not against live services. Gmail is no longer in that list — it runs in production,
|
||||
including the flagging and de-duplication that took a day to get right. Calendar
|
||||
subscriptions over ICS and webcal are proven; the Google half of the calendar is
|
||||
not. Everything else has an interface: opening a task shows
|
||||
its description, sub-tasks, comments, files and reminders, and the settings pages
|
||||
cover the account, notifications, integrations, AI, API tokens, import, export and
|
||||
templates.
|
||||
|
||||
+18
-3
@@ -39,8 +39,23 @@ reply within a week.
|
||||
- **The CSP** is computed at startup by hashing the inline scripts in the built
|
||||
page, rather than allowing `unsafe-inline`.
|
||||
|
||||
- **Note bodies, task titles, descriptions and comments are not encrypted.** The
|
||||
sealing above covers credentials — mailbox passwords, OAuth tokens, TOTP secrets,
|
||||
AI keys — and nothing else. A note holding a password is holding it in plain text
|
||||
in every backup that can be downloaded. Encrypting note bodies is on the list and
|
||||
is larger than it sounds: the full-text index and the folded search column are
|
||||
both derived from the body, so both would have to go and search would have to be
|
||||
rewritten to decrypt in application code.
|
||||
|
||||
## What it does not do
|
||||
|
||||
verdande has no rate limiting beyond the login and password-reset endpoints, and
|
||||
no audit log of reads. It is built to be run behind something — a Cloudflare
|
||||
Tunnel, a reverse proxy, a VPN — by somebody who knows what they exposed.
|
||||
Rate limiting covers the endpoints a stranger can reach: signing in, resetting a
|
||||
password, the second factor, the installation beacon, and inbound mail. **Nothing
|
||||
else is limited** — an authenticated caller can ask as often as they like, and a
|
||||
signed-in account that wanted to be a nuisance can be one.
|
||||
|
||||
There is no audit log of reads. Who *changed* something is recorded per project;
|
||||
who looked at it is not.
|
||||
|
||||
It is built to be run behind something — a Cloudflare Tunnel, a reverse proxy, a
|
||||
VPN — by somebody who knows what they exposed.
|
||||
|
||||
Reference in New Issue
Block a user