/* Required for the gen_random_bytes function */
CREATE EXTENSION pgcrypto;

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;
$$;

/* Password has to be able to accommodate 96 characters instead of previous 64.
 * It can't be char(96), because then the password would be padded to 96 characters. */
ALTER TABLE public."user" ALTER COLUMN "password" TYPE varchar(96) USING "password"::varchar;

/* Update all users with salted and hashed passwords */
UPDATE public.user
SET password = password_hash( encode(gen_random_bytes(16),'hex'), password::bytea);

/* After the password hashing, all passwords are now hex encoded 32 characters salt and 64 characters hash,
 * and the varchar type is not longer necessary. */
ALTER TABLE public."user" ALTER COLUMN "password" TYPE char(96) USING "password"::varchar;
