1 PRAGMA foreign_keys = ON;
6 id INTEGER PRIMARY KEY, -- internal use only
7 -- case insensitive match for e.g. emails
8 user TEXT COLLATE NOCASE UNIQUE NOT NULL,
11 -- $2<a/b/x/y>$[cost]$[22 character salt][31 character hash]
12 length(pass) >= 58 AND
13 -- corrected OpenBSD algorithm (from February 2014)
19 login_id INTEGER NOT NULL,
21 CHECK(length(hash) == 32), -- sha256
22 issued_at REAL NOT NULL
23 DEFAULT (unixepoch('now')),
24 expires_at REAL NOT NULL
25 DEFAULT (unixepoch('now', '+2 hours')),
26 redeemed INTEGER NOT NULL DEFAULT (FALSE)
27 CHECK (redeemed = FALSE OR redeemed = TRUE), -- boolean
29 CHECK (expires_at > issued_at),
31 FOREIGN KEY(login_id) REFERENCES login(id)
36 CREATE INDEX token_idx ON token (login_id, hash);
38 -- human-readable view of the tokens
39 CREATE VIEW token_active AS
40 SELECT user, hex(hash) AS hash,
41 strftime('%FT%TZ', datetime(issued_at, 'unixepoch')) as issued_at,
42 strftime('%FT%TZ', datetime(expires_at, 'unixepoch')) as expires_at
44 INNER JOIN login ON login.id = token.login_id
45 WHERE unixepoch('now') < token.expires_at