]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/sql/Postgres/006.schema.permissions.sql
removing "profile" stuff, using "groups" instead
[working/Evergreen.git] / Open-ILS / src / sql / Postgres / 006.schema.permissions.sql
1 DROP SCHEMA permission CASCADE;
2
3 BEGIN;
4 CREATE SCHEMA permission;
5
6 CREATE TABLE permission.perm_list (
7         id      SERIAL  PRIMARY KEY,
8         code    TEXT    NOT NULL UNIQUE
9 );
10 CREATE INDEX perm_list_code_idx ON permission.perm_list (code);
11 INSERT INTO permission.perm_list VALUES (DEFAULT,'EVERYTHING');
12 INSERT INTO permission.perm_list VALUES (DEFAULT,'OPAC_LOGIN');
13
14 CREATE TABLE permission.grp_tree (
15         id      SERIAL  PRIMARY KEY,
16         name    TEXT    NOT NULL UNIQUE,
17         parent  INT     REFERENCES permission.grp_tree (id) ON DELETE RESTRICT
18 );
19 CREATE INDEX grp_tree_parent ON permission.grp_tree (parent);
20 INSERT INTO permission.grp_tree VALUES (DEFAULT,'Users');
21 INSERT INTO permission.grp_tree VALUES (DEFAULT,'Admin',1);
22
23 CREATE TABLE permission.grp_perm_map (
24         id      SERIAL  PRIMARY KEY,
25         grp     INT     NOT NULL REFERENCES permission.grp_tree (id),
26         perm    INT     NOT NULL REFERENCES permission.perm_list (id),
27         depth   INT     NOT NULL,
28                 CONSTRAINT perm_grp_once UNIQUE (grp,perm)
29 );
30 INSERT INTO permission.grp_perm_map VALUES (DEFAULT,1,2,0);
31 INSERT INTO permission.grp_perm_map VALUES (DEFAULT,2,1,0);
32
33 CREATE TABLE permission.usr_perm_map (
34         id      SERIAL  PRIMARY KEY,
35         usr     INT     NOT NULL REFERENCES actor.usr (id),
36         perm    INT     NOT NULL REFERENCES permission.perm_list (id),
37         depth   INT     NOT NULL,
38                 CONSTRAINT perm_usr_once UNIQUE (usr,perm)
39 );
40
41 CREATE TABLE permission.usr_grp_map (
42         id      SERIAL  PRIMARY KEY,
43         usr     INT     NOT NULL REFERENCES actor.usr (id),
44         grp     INT     NOT NULL REFERENCES permission.grp_tree (id),
45                 CONSTRAINT usr_grp_once UNIQUE (usr,grp)
46 );
47
48 INSERT INTO permission.usr_grp_map (usr,grp)
49         SELECT id, (SELECT id FROM permission.grp_tree WHERE parent IS NULL LIMIT 1) FROM actor.usr;
50
51 INSERT INTO permission.usr_grp_map (usr,grp)
52         SELECT 1, id FROM permission.grp_tree WHERE name = 'Admin';
53
54 CREATE OR REPLACE RULE add_usr_to_group AS
55         ON INSERT TO actor.usr DO ALSO
56                 INSERT  INTO permission.usr_grp_map (usr, grp) VALUES (
57                         NEW.id,
58                         (SELECT id FROM permission.grp_tree WHERE parent IS NULL LIMIT 1)
59                 );
60
61
62 CREATE OR REPLACE FUNCTION permission.grp_ancestors ( INT ) RETURNS SETOF permission.grp_tree AS $$
63         SELECT  a.*
64         FROM    connectby('permission.grp_tree','parent','id','name',$1,'100','.')
65                         AS t(keyid text, parent_keyid text, level int, branch text,pos int)
66                 JOIN permission.grp_tree a ON a.id = t.keyid
67         ORDER BY
68                 CASE WHEN a.parent IS NULL
69                         THEN 0
70                         ELSE 1
71                 END, a.name;
72 $$ LANGUAGE SQL STABLE;
73
74 CREATE OR REPLACE FUNCTION permission.usr_perms ( iuser INT ) RETURNS SETOF permission.usr_perm_map AS $$
75 DECLARE
76         u_perm  permission.usr_perm_map%ROWTYPE;
77         grp     permission.usr_grp_map%ROWTYPE;
78         g_list  permission.grp_tree%ROWTYPE;
79 BEGIN
80         FOR u_perm IN SELECT * FROM permission.usr_perm_map WHERE usr = iuser LOOP
81                 RETURN NEXT u_perm;
82         END LOOP;
83
84         FOR g_list IN   SELECT  *
85                           FROM  permission.grp_ancestors(
86                                   (     SELECT  u.profile
87                                           FROM  actor.usr u
88                                           WHERE u.id = iuser
89                                   )
90                                 )
91                 LOOP
92
93                 FOR u_perm IN   SELECT  DISTINCT -p.id, iuser AS usr, p.perm, p.depth
94                                   FROM  permission.grp_perm_map p
95                                   WHERE p.grp = g_list.id LOOP
96
97                         RETURN NEXT u_perm;
98
99                 END LOOP;
100         END LOOP;
101
102         FOR grp IN      SELECT  *
103                           FROM  permission.usr_grp_map
104                           WHERE usr = iuser LOOP
105
106                 FOR g_list IN   SELECT  *
107                                   FROM  permission.grp_ancestors( grp.grp ) LOOP
108
109                         FOR u_perm IN   SELECT  DISTINCT -p.id, iuser AS usr, p.perm, p.depth
110                                           FROM  permission.grp_perm_map p
111                                                 JOIN permission.usr_grp_map m ON (m.grp = p.grp)
112                                           WHERE m.grp = g_list.id LOOP
113
114                                 RETURN NEXT u_perm;
115
116                         END LOOP;
117                 END LOOP;
118         END LOOP;
119
120         RETURN;
121 END;
122 $$ LANGUAGE PLPGSQL;
123
124 CREATE OR REPLACE FUNCTION permission.usr_has_perm ( iuser INT, tperm TEXT, target INT ) RETURNS BOOL AS $$
125 DECLARE
126         r_usr   actor.usr%ROWTYPE;
127         r_perm  permission.usr_perm_map%ROWTYPE;
128 BEGIN
129
130         SELECT * INTO r_usr FROM actor.usr WHERE id = iuser;
131
132         FOR r_perm IN   SELECT  *
133                           FROM  permission.usr_perms(iuser) p
134                                 JOIN permission.perm_list l
135                                         ON (l.id = p.perm)
136                           WHERE l.code = tperm LOOP
137
138                 PERFORM *
139                   FROM  actor.org_unit_descendants(target,r_perm.depth)
140                   WHERE id = r_usr.home_ou;
141
142                 IF FOUND THEN
143                         RETURN TRUE;
144                 ELSE
145                         RETURN FALSE;
146                 END IF;
147         END LOOP;
148
149         RETURN FALSE;
150 END;
151 $$ LANGUAGE PLPGSQL;
152
153 COMMIT;
154