36 lines · 1.6 KB
-- Public keys can't prove ownership, so the same key may be registered by several accounts; verification
-- picks the owner whose verified email matches the committer.
CREATE TABLE signing_keys_v2 (
  id TEXT PRIMARY KEY,
  user_id TEXT NOT NULL REFERENCES accounts(id) ON DELETE CASCADE,
  kind TEXT NOT NULL CHECK (kind IN ('ssh', 'gpg')),
  title TEXT NOT NULL,
  fingerprint TEXT NOT NULL,
  public_key TEXT NOT NULL,
  created_at INTEGER NOT NULL,
  UNIQUE (user_id, kind, fingerprint)
);
INSERT INTO signing_keys_v2 (id, user_id, kind, title, fingerprint, public_key, created_at)
  SELECT id, user_id, kind, title, fingerprint, public_key, created_at FROM signing_keys;

CREATE TABLE signing_key_ids_v2 (
  key_id TEXT NOT NULL,
  fingerprint TEXT NOT NULL,
  signing_key_id TEXT NOT NULL REFERENCES signing_keys_v2(id) ON DELETE CASCADE,
  PRIMARY KEY (fingerprint, signing_key_id)
);
INSERT INTO signing_key_ids_v2 (key_id, fingerprint, signing_key_id)
  SELECT key_id, fingerprint, signing_key_id FROM signing_key_ids;

DROP TABLE signing_key_ids;
DROP TABLE signing_keys;
ALTER TABLE signing_keys_v2 RENAME TO signing_keys;
ALTER TABLE signing_key_ids_v2 RENAME TO signing_key_ids;
CREATE INDEX signing_keys_user ON signing_keys(user_id);
CREATE INDEX signing_keys_fingerprint ON signing_keys(kind, fingerprint);
CREATE INDEX signing_key_ids_key_id ON signing_key_ids(key_id);
CREATE INDEX signing_key_ids_signing_key ON signing_key_ids(signing_key_id);

-- Earlier results trusted unverified emails, unbound subkeys and SHA-1; re-verify everything.
DELETE FROM commit_signatures;