Skip to content

Breach checklist

Under Art. 33 GDPR a controller notifies its supervisory authority within 72 hours of becoming aware of a breach, unless the breach is unlikely to put people at risk. The clock starts when you become aware, not when you have finished investigating. Notify with what you know and follow up.

If you host calit for someone else, you are the processor: tell the controller without undue delay, and they notify the authority.

  • Take the affected replica or database offline, or restrict access, if the breach is ongoing.
  • Rotate what may have leaked: DB_PASSWORD, SESSION_ENCRYPTION_KEY (signs everyone out), MAIL_PASSWORD, GOOGLE_OAUTH_CLIENT_SECRET, OIDC_CLIENT_SECRET.
  • If TOKEN_ENCRYPTION_KEY leaked together with the database, treat the Google tokens and channel URLs as exposed: hosts must disconnect Google, revoke calit’s access in their Google account and reconnect, and replace their channel URLs. Rotating the key alone strands the stored tokens; see Configuration.
  • Write down the time you became aware.

Which tables hold what, from calit’s personal-data inventory (see records of processing):

TableWhose dataWhat
bookingInviteesName, email, booking-field answers (free text, possibly sensitive), meet link, title, description
booking_guestGuestsEmail
email_outboxInvitees, guests, hostsRecipient, subject, full HTML body and .ics invite of mail that went through the outbox (mail queued for transactional dispatch, and direct sends that failed and were parked for retry) in roughly the last 30 days. Mail delivered directly on the first try is not stored
app_userHostsUsername, argon2id password hash, Google and SSO subject ids
owner_settingsHostsDisplay name, email, timezone
google_credentialHostsGoogle account email, subject id, encrypted OAuth tokens
google_calendarHostsCalendar ids and names
notification_channelHostsEncrypted channel URLs (these often embed a bot token or webhook secret), labels
password_reset_tokenHostsHashes of password-reset tokens (valid 30 minutes) and invitation tokens (valid 48 hours); deleted about a day after they expire
login_ticketHostsHashes of sign-in tickets (valid 2 minutes); deleted about a day after they expire
meeting_type, booking_fieldHostsText the host wrote
deleted_usernameFormer hostsSHA-256 hashes of deleted usernames
  • Identify which tables, and which rows, were reachable.
  • Count the affected people in each category.
  • The audit logger category: sign-ins, sign-in failures and privileged admin actions, as AUDIT actor=… action=… target=… ip=… lines.
  • Lines starting with PRIVACY: erasures, account deletions, retention runs and purges, with ids and counts only. These show what was already erased before the breach.
  • Your reverse proxy’s access logs, for the requests themselves.
  • Database logs, if your provider keeps them.

Keep copies somewhere the incident cannot reach.

  • Supervisory authority, within 72 hours: nature of the breach, categories and approximate numbers of people and records, likely consequences, measures taken, and your contact. Authority: [operator].
  • The people affected, without undue delay, when the breach is likely to put them at high risk (Art. 34), for example leaked booking answers holding health data, or password hashes.
  • Hosts on the deployment, who may have their own duties toward their invitees.
  • The controller, if you host calit on someone else’s behalf.
  • Sub-processors whose credentials were involved (Google, your SMTP provider, channel providers).
  • Record the breach in your internal breach register (Art. 33(5)), even if you decided not to notify.
  • Update your operator guide notes and security measures.