From 7c8e0372f8230e304cfd26a776803f3cb827c606 Mon Sep 17 00:00:00 2001 From: miker Date: Thu, 7 Feb 2008 19:36:16 +0000 Subject: [PATCH] cross-port the per-object perm scheme from the acq branch git-svn-id: svn://svn.open-ils.org/ILS/trunk@8689 dcc99617-32d9-48b4-a31d-7c20da2025e4 --- Open-ILS/examples/fm_IDL.xml | 51 +++++++++++++++++++ .../src/sql/Pg/006.schema.permissions.sql | 45 ++++++++++++++++ 2 files changed, 96 insertions(+) diff --git a/Open-ILS/examples/fm_IDL.xml b/Open-ILS/examples/fm_IDL.xml index be0110d556..333a03135d 100644 --- a/Open-ILS/examples/fm_IDL.xml +++ b/Open-ILS/examples/fm_IDL.xml @@ -287,6 +287,16 @@ + + + + + + + + + + @@ -1824,6 +1834,20 @@ + + + + + + + + + + + + + + @@ -2026,6 +2050,23 @@ + + + + + + + + + + + + + + + + + @@ -2193,6 +2234,16 @@ + + + + + + + + + + diff --git a/Open-ILS/src/sql/Pg/006.schema.permissions.sql b/Open-ILS/src/sql/Pg/006.schema.permissions.sql index 37c5d2a3f2..b8b42eb387 100644 --- a/Open-ILS/src/sql/Pg/006.schema.permissions.sql +++ b/Open-ILS/src/sql/Pg/006.schema.permissions.sql @@ -39,6 +39,16 @@ CREATE TABLE permission.usr_perm_map ( CONSTRAINT perm_usr_once UNIQUE (usr,perm) ); +CREATE TABLE permission.usr_object_perm_map ( + id SERIAL PRIMARY KEY, + usr INT NOT NULL REFERENCES actor.usr (id) ON DELETE CASCADE, + perm INT NOT NULL REFERENCES permission.perm_list (id) ON DELETE CASCADE, + object_type TEXT NOT NULL, + object_id TEXT NOT NULL, + grantable BOOL NOT NULL DEFAULT FALSE, + CONSTRAINT perm_usr_obj_once UNIQUE (usr,perm,object_type,object_id) +); + CREATE TABLE permission.usr_grp_map ( id SERIAL PRIMARY KEY, usr INT NOT NULL REFERENCES actor.usr (id) ON DELETE CASCADE, @@ -208,6 +218,41 @@ BEGIN END; $$ LANGUAGE PLPGSQL; +CREATE OR REPLACE FUNCTION permission.usr_has_object_perm ( iuser INT, tperm TEXT, obj_type TEXT, obj_id TEXT, target_ou INT ) RETURNS BOOL AS $$ +DECLARE + r_usr actor.usr%ROWTYPE; + res BOOL; +BEGIN + + SELECT * INTO r_usr FROM actor.usr WHERE id = iuser; + + IF r_usr.active = FALSE THEN + RETURN FALSE; + END IF; + + IF r_usr.super_user = TRUE THEN + RETURN TRUE; + END IF; + + SELECT TRUE INTO res FROM permission.usr_object_perm_map WHERE usr = r_usr.id AND object_type = obj_type AND object_id = obj_id; + + IF FOUND THEN + RETURN TRUE; + END IF; + + IF target_ou > -1 THEN + RETURN permission.usr_has_perm( iuser, tperm, target_ou); + END IF; + + RETURN FALSE; + +END; +$$ LANGUAGE PLPGSQL; + +CREATE OR REPLACE FUNCTION permission.usr_has_object_perm ( INT, TEXT, TEXT, TEXT ) RETURNS BOOL AS $$ + SELECT permission.usr_has_object_perm( $1, $2, $3, $4, -1 ); +$$ LANGUAGE SQL; + CREATE OR REPLACE FUNCTION permission.usr_has_perm ( INT, TEXT, INT ) RETURNS BOOL AS $$ SELECT CASE WHEN permission.usr_has_home_perm( $1, $2, $3 ) THEN TRUE -- 2.43.2