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