Skip to content

Commit f99bba6

Browse files
authored
Add trail helpler functions migrations (#315)
* add trial helper procedures * move trial helpers to end
1 parent fe6db57 commit f99bba6

File tree

2 files changed

+110
-0
lines changed

2 files changed

+110
-0
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
DROP PROCEDURE add_reference_permissions_for_trial_users;
2+
DROP PROCEDURE create_trial_role_on_reference_data;
3+
DROP PROCEDURE create_trial_user;
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
CREATE DEFINER = 'insert_rbac'@'localhost' PROCEDURE create_trial_user(IN auth0id VARCHAR(32), IN orgid CHAR(36), IN add_reference_role BOOLEAN)
2+
COMMENT 'Inserts a new trial user into the organization and add permission to read reference data only, returning new user id'
3+
MODIFIES SQL DATA SQL SECURITY DEFINER
4+
BEGIN
5+
DECLARE userid BINARY(16);
6+
DECLARE binorgid BINARY(16);
7+
SET userid = UUID_TO_BIN(UUID(), 1);
8+
SET binorgid = UUID_TO_BIN(orgid, 1);
9+
INSERT INTO arbiter_data.users (id, auth0_id, organization_id) VALUES (
10+
userid, auth0id, binorgid);
11+
IF add_reference_role THEN
12+
CALL arbiter_data.add_reference_role_to_user(userid);
13+
END IF;
14+
CALL arbiter_data.create_default_user_role(userid, binorgid);
15+
SELECT BIN_TO_UUID(userid, 1);
16+
END;
17+
18+
GRANT EXECUTE ON PROCEDURE arbiter_data.create_trial_user TO 'insert_rbac'@'localhost';
19+
GRANT EXECUTE ON PROCEDURE arbiter_data.create_trial_user TO 'frameworkadmin'@'%';
20+
21+
22+
CREATE DEFINER = 'insert_rbac'@'localhost' PROCEDURE create_trial_role_on_reference_data (IN objects JSON, IN trial_name VARCHAR(64), OUT roleid BINARY(16))
23+
COMMENT 'Create a role that provides the read access to select reference data'
24+
MODIFIES SQL DATA SQL SECURITY DEFINER
25+
BEGIN
26+
DECLARE reforg BINARY(16);
27+
DECLARE roleperm BINARY(16);
28+
DECLARE permission_table JSON;
29+
DECLARE invalidobjects BOOLEAN;
30+
31+
SET roleid = UUID_TO_BIN(UUID(), 1);
32+
SET roleperm = UUID_TO_BIN(UUID(), 1);
33+
SET reforg = get_organization_id('Reference');
34+
35+
-- first check that all objects are valid
36+
SET invalidobjects = (SELECT NOT IFNULL(COUNT(*), FALSE) FROM JSON_TABLE(objects, '$[*]' COLUMNS(
37+
id CHAR(36) PATH '$.id' ERROR ON EMPTY ERROR ON ERROR,
38+
object_type VARCHAR(32) PATH '$.object_type' ERROR ON EMPTY ERROR ON ERROR)
39+
) AS ot WHERE get_object_organization(UUID_TO_BIN(ot.id, 1), ot.object_type) = reforg);
40+
41+
IF invalidobjects THEN
42+
SIGNAL SQLSTATE '42000' SET MESSAGE_TEXT = 'Items in objects do not belong to Reference organization',
43+
MYSQL_ERRNO = 1216;
44+
END IF;
45+
46+
SET permission_table = JSON_ARRAY(
47+
JSON_OBJECT('id', UUID(), 'description', 'Read reports for ', 'action', 'read', 'object_type', 'reports'),
48+
JSON_OBJECT('id', UUID(), 'description', 'Read report values for ', 'action', 'read_values', 'object_type', 'reports'),
49+
JSON_OBJECT('id', UUID(), 'description', 'Read sites for ', 'action', 'read', 'object_type', 'sites'),
50+
JSON_OBJECT('id', UUID(), 'description', 'Read forecasts for ', 'action', 'read', 'object_type', 'forecasts'),
51+
JSON_OBJECT('id', UUID(), 'description', 'Read forecast values for ', 'action', 'read_values', 'object_type', 'forecasts'),
52+
JSON_OBJECT('id', UUID(), 'description', 'Read observations for ', 'action', 'read', 'object_type', 'observations'),
53+
JSON_OBJECT('id', UUID(), 'description', 'Read observation values for ', 'action', 'read_values', 'object_type', 'observations'),
54+
JSON_OBJECT('id', UUID(), 'description', 'Read cdf_forecasts for ', 'action', 'read', 'object_type', 'cdf_forecasts'),
55+
JSON_OBJECT('id', UUID(), 'description', 'Read cdf_forecast values for ', 'action', 'read_values', 'object_type', 'cdf_forecasts'),
56+
JSON_OBJECT('id', UUID(), 'description', 'Read aggregates for ', 'action', 'read', 'object_type', 'aggregates'),
57+
JSON_OBJECT('id', UUID(), 'description', 'Read aggregate values for ', 'action', 'read_values', 'object_type', 'aggregates')
58+
);
59+
60+
INSERT INTO arbiter_data.roles (name, description, id, organization_id) VALUES (
61+
CONCAT(trial_name, ' Support'), CONCAT('Allow reading of select reference data for ', trial_name),
62+
roleid, reforg);
63+
INSERT INTO arbiter_data.permissions (id, description, organization_id, applies_to_all, action, object_type)
64+
SELECT UUID_TO_BIN(pt.id, 1), CONCAT(pt.description, trial_name), reforg, FALSE, pt.action,
65+
pt.object_type FROM JSON_TABLE(
66+
permission_table, "$[*]" COLUMNS (
67+
id CHAR(36) PATH '$.id',
68+
description VARCHAR(64) PATH '$.description',
69+
action VARCHAR(32) PATH '$.action',
70+
object_type VARCHAR(32) PATH '$.object_type')
71+
) AS pt;
72+
INSERT INTO arbiter_data.role_permission_mapping (role_id, permission_id)
73+
SELECT roleid, UUID_TO_BIN(pt.id, 1) FROM JSON_TABLE(
74+
permission_table, "$[*]" COLUMNS (
75+
id CHAR(36) PATH '$.id')) AS pt;
76+
77+
-- add permission to read the role
78+
INSERT INTO arbiter_data.permissions (id, description, organization_id, applies_to_all, action, object_type)
79+
VALUES (roleperm, CONCAT('Read the reference role for ', trial_name, ' support'), reforg, FALSE, 'read', 'roles');
80+
INSERT INTO arbiter_data.role_permission_mapping (role_id, permission_id) VALUES (roleid, roleperm);
81+
INSERT INTO arbiter_data.permission_object_mapping (permission_id, object_id) VALUES (roleperm, roleid);
82+
-- choose not to give read permission to the permission objects
83+
84+
INSERT INTO arbiter_data.permission_object_mapping (permission_id, object_id)
85+
SELECT UUID_TO_BIN(pt.id, 1), UUID_TO_BIN(ot.id, 1) FROM JSON_TABLE(permission_table, '$[*]' COLUMNS (
86+
id CHAR(36) PATH '$.id', object_type VARCHAR(32) PATH '$.object_type')
87+
) AS pt JOIN JSON_TABLE(objects, '$[*]' COLUMNS(
88+
id CHAR(36) PATH '$.id' ERROR ON EMPTY ERROR ON ERROR,
89+
object_type VARCHAR(32) PATH '$.object_type' ERROR ON EMPTY ERROR ON ERROR)
90+
) AS ot ON pt.object_type = ot.object_type WHERE get_object_organization(UUID_TO_BIN(ot.id, 1),
91+
ot.object_type) = reforg;
92+
END;
93+
GRANT EXECUTE ON PROCEDURE arbiter_data.create_trial_role_on_reference_data TO 'insert_rbac'@'localhost';
94+
95+
96+
-- add new role to trial users
97+
CREATE DEFINER = 'insert_rbac'@'localhost' PROCEDURE add_reference_permissions_for_trial_users(IN users JSON, IN objects JSON, IN trial_name VARCHAR(64))
98+
COMMENT 'Creates a role that provides the read access to select reference data and adds the role for each user'
99+
MODIFIES SQL DATA SQL SECURITY DEFINER
100+
BEGIN
101+
DECLARE roleid BINARY(16);
102+
CALL create_trial_role_on_reference_data(objects, trial_name, roleid);
103+
INSERT INTO arbiter_data.user_role_mapping (user_id, role_id) SELECT UUID_TO_BIN(userid, 1), roleid FROM JSON_TABLE(
104+
users, '$[*]' COLUMNS(userid CHAR(36) PATH '$' ERROR ON EMPTY ERROR ON ERROR)) AS jt;
105+
END;
106+
GRANT EXECUTE ON PROCEDURE arbiter_data.add_reference_permissions_for_trial_users TO 'insert_rbac'@'localhost';
107+
GRANT EXECUTE ON PROCEDURE arbiter_data.add_reference_permissions_for_trial_users TO 'frameworkadmin'@'%';

0 commit comments

Comments
 (0)