CREATE TABLE public.user ( id serial NOT NULL, "name" varchar NOT NULL, "username" varchar NOT NULL, "password" char(96) NOT NULL, totp varchar NOT NULL, last_login timestamp with time zone NOT NULL DEFAULT '1970-01-01 00:00:00', CONSTRAINT user_pk PRIMARY KEY (id), CONSTRAINT user_un UNIQUE (username) ); CREATE TABLE public.session ( id serial NOT NULL, user_id int4 NULL, "uuid" char(36) NOT NULL, created timestamp with time zone NOT NULL DEFAULT NOW(), last_used timestamp with time zone NOT NULL DEFAULT NOW(), CONSTRAINT session_pk PRIMARY KEY (id), CONSTRAINT session_un UNIQUE ("uuid"), CONSTRAINT session_user_fk FOREIGN KEY (user_id) REFERENCES "user"(id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE EXTENSION IF NOT EXISTS pgcrypto SCHEMA public; CREATE FUNCTION password_hash(salt_hex char(32), pass bytea) RETURNS char(96) LANGUAGE plpgsql AS $$ BEGIN RETURN ( SELECT salt_hex || encode( sha256( decode(salt_hex, 'hex') || /* salt in binary */ pass /* password */ ), 'hex' ) ); END; $$;