Leave public functions in current schema

Put supporting things into basic_auth schema

Also tested from a clean db
This commit is contained in:
Joe Nelson
2015-11-10 21:00:49 -08:00
parent 2687ad63dd
commit d4ef343b8d
+44 -27
View File
@@ -3,14 +3,14 @@
begin; begin;
drop schema if exists basic_auth cascade; create extension if not exists pgcrypto;
create schema if not exists basic_auth; create schema if not exists basic_auth;
set search_path to basic_auth;
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
-- Utility functions -- Utility functions
create function random_value(len int, out result varchar(32)) as create or replace function
basic_auth.random_value(len int, out result varchar(32)) as
$$ $$
BEGIN BEGIN
SELECT substring(md5(random()::text),0, len) into result; SELECT substring(md5(random()::text),0, len) into result;
@@ -20,7 +20,8 @@ $$ LANGUAGE plpgsql;
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
-- Login storage and constraints -- Login storage and constraints
create table logins ( create table if not exists
basic_auth.logins (
username character varying not null, username character varying not null,
pass character(60) not null, pass character(60) not null,
role name not null, role name not null,
@@ -30,7 +31,8 @@ create table logins (
constraint l_pkey primary key (username) constraint l_pkey primary key (username)
); );
create function check_role_exists() returns trigger create or replace function
basic_auth.check_role_exists() returns trigger
language plpgsql language plpgsql
as $$ as $$
begin begin
@@ -43,12 +45,14 @@ begin
end end
$$; $$;
drop trigger if exists ensure_login_role_exists on basic_auth.logins;
create constraint trigger ensure_login_role_exists create constraint trigger ensure_login_role_exists
after insert or update on logins after insert or update on basic_auth.logins
for each row for each row
execute procedure check_role_exists(); execute procedure basic_auth.check_role_exists();
create function encrypt_pass() returns trigger create or replace function
basic_auth.encrypt_pass() returns trigger
language plpgsql language plpgsql
as $$ as $$
begin begin
@@ -59,12 +63,14 @@ begin
end end
$$; $$;
drop trigger if exists protect_passwords on basic_auth.logins;
create trigger protect_passwords create trigger protect_passwords
before insert or update on logins before insert or update on basic_auth.logins
for each row for each row
execute procedure encrypt_pass(); execute procedure basic_auth.encrypt_pass();
create function send_validation() returns trigger create or replace function
basic_auth.send_validation() returns trigger
language plpgsql language plpgsql
as $$ as $$
declare declare
@@ -77,36 +83,39 @@ begin
json_build_object( json_build_object(
'email', new.email, 'email', new.email,
'username', new.username, 'username', new.username,
'token', tok 'token', tok,
'token_type', 'validation'
)::text )::text
); );
return new; return new;
end end
$$; $$;
drop trigger if exists send_validation_t on basic_auth.logins;
create trigger send_validation_t create trigger send_validation_t
after insert on logins after insert on basic_auth.logins
for each row for each row
execute procedure send_validation(); execute procedure basic_auth.send_validation();
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
-- Email Validation and Password Reset -- Email Validation and Password Reset
create table tokens ( create table if not exists
basic_auth.tokens (
token character varying unique, token character varying unique,
token_type varchar(64) not null, token_type varchar(64) not null,
username character varying not null, username character varying not null,
created_at timestamptz not null default current_date, created_at timestamptz not null default current_date,
constraint t_pk primary key (token), constraint t_pk primary key (token),
constraint t_login_fk foreign key (username) references logins constraint t_login_fk foreign key (username) references basic_auth.logins
on delete cascade on update cascade on delete cascade on update cascade
); );
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
-- Passwording -- Login helper
create function create or replace function
login_role(username text, pass text) returns text basic_auth.login_role(username text, pass text) returns text
language plpgsql language plpgsql
as $$ as $$
begin begin
@@ -118,7 +127,11 @@ begin
end; end;
$$; $$;
create function request_password_reset(username text) returns void -------------------------------------------------------------------------------
-- Public functions (in current schema, not basic_auth)
create or replace function
request_password_reset(username text) returns void
language plpgsql language plpgsql
as $$ as $$
declare declare
@@ -137,13 +150,15 @@ begin
from basic_auth.logins from basic_auth.logins
where logins.username = request_password_reset.username), where logins.username = request_password_reset.username),
'username', request_password_reset.username, 'username', request_password_reset.username,
'token', tok 'token', tok,
'token_type', 'reset'
)::text )::text
); );
end; end;
$$; $$;
create or replace function basic_auth.reset_password(username text, token text, pass text) create or replace function
reset_password(username text, token text, pass text)
returns void returns void
language plpgsql language plpgsql
as $$ as $$
@@ -184,21 +199,23 @@ begin
end; end;
$$; $$;
create type jwt_claims AS (role text, username text); drop type if exists basic_auth.jwt_claims cascade;
create type
basic_auth.jwt_claims AS (role text, username text);
create function create or replace function
obtain_auth_token(username text, pass text) returns jwt_claims create_auth_token(username text, pass text) returns basic_auth.jwt_claims
language plpgsql language plpgsql
as $$ as $$
declare declare
_role character varying; _role character varying;
result jwt_claims; result basic_auth.jwt_claims;
begin begin
select basic_auth.login_role(username, pass) into _role; select basic_auth.login_role(username, pass) into _role;
if _role is null then if _role is null then
raise invalid_password using message = 'invalid user or password'; raise invalid_password using message = 'invalid user or password';
end if; end if;
select _role as role, obtain_auth_token.username as username into result; select _role as role, create_auth_token.username as username into result;
return result; return result;
end; end;
$$; $$;