Batch add/remove users support

This commit is contained in:
Juan Ignacio Sánchez Lara 2015-09-07 10:35:04 +02:00
parent 428a2391ad
commit 59d144d91d
3 changed files with 33 additions and 24 deletions

View File

@ -50,37 +50,45 @@ BEGIN
END END
$$ LANGUAGE PLPGSQL VOLATILE; $$ LANGUAGE PLPGSQL VOLATILE;
-- Adds a user to a group -- Adds users to a group, comma-separated
CREATE OR REPLACE CREATE OR REPLACE
FUNCTION cartodb.CDB_Group_AddUser(group_name text, username text) FUNCTION cartodb.CDB_Group_AddUsers(group_name text, usernames text)
RETURNS VOID AS $$ RETURNS VOID AS $$
DECLARE DECLARE
group_role TEXT; group_role TEXT;
user_role TEXT; user_role TEXT;
username TEXT;
BEGIN BEGIN
group_role := cartodb._CDB_Group_GroupRole(group_name); group_role := cartodb._CDB_Group_GroupRole(group_name);
user_role := cartodb._CDB_User_RoleFromUsername(username); foreach username in array string_to_array(usernames, ',')
IF(group_role IS NULL OR user_role IS NULL) loop
THEN user_role := cartodb._CDB_User_RoleFromUsername(username);
RAISE EXCEPTION 'Group role (%) and user role (%) must be already existing', group_role, user_role; IF(group_role IS NULL OR user_role IS NULL)
END IF; THEN
EXECUTE format('GRANT %I TO %I', group_role, user_role); RAISE EXCEPTION 'Group role (%) and user role (%) must be already existing', group_role, user_role;
PERFORM cartodb._CDB_Group_AddUser_API(group_name, username); END IF;
EXECUTE format('GRANT %I TO %I', group_role, user_role);
end loop;
PERFORM cartodb._CDB_Group_AddUsers_API(group_name, usernames);
END END
$$ LANGUAGE PLPGSQL VOLATILE; $$ LANGUAGE PLPGSQL VOLATILE;
-- Removes a user from a group -- Removes a user from a group
CREATE OR REPLACE CREATE OR REPLACE
FUNCTION cartodb.CDB_Group_RemoveUser(group_name text, username text) FUNCTION cartodb.CDB_Group_RemoveUsers(group_name text, usernames text)
RETURNS VOID AS $$ RETURNS VOID AS $$
DECLARE DECLARE
group_role TEXT; group_role TEXT;
user_role TEXT; user_role TEXT;
username TEXT;
BEGIN BEGIN
group_role := cartodb._CDB_Group_GroupRole(group_name); group_role := cartodb._CDB_Group_GroupRole(group_name);
user_role := cartodb._CDB_User_RoleFromUsername(username); foreach username in array string_to_array(usernames, ',')
EXECUTE format('REVOKE %I FROM %I', group_role, user_role); loop
PERFORM cartodb._CDB_Group_RemoveUser_API(group_name, username); user_role := cartodb._CDB_User_RoleFromUsername(username);
EXECUTE format('REVOKE %I FROM %I', group_role, user_role);
end loop;
PERFORM cartodb._CDB_Group_RemoveUsers_API(group_name, usernames);
END END
$$ LANGUAGE PLPGSQL VOLATILE; $$ LANGUAGE PLPGSQL VOLATILE;

View File

@ -45,27 +45,28 @@ $$
$$ LANGUAGE 'plpythonu' VOLATILE SECURITY DEFINER; $$ LANGUAGE 'plpythonu' VOLATILE SECURITY DEFINER;
CREATE OR REPLACE CREATE OR REPLACE
FUNCTION cartodb._CDB_Group_AddUser_API(group_name text, username text) FUNCTION cartodb._CDB_Group_AddUsers_API(group_name text, usernames text)
RETURNS VOID AS RETURNS VOID AS
$$ $$
import string import string
import urllib import urllib
url = '/api/v1/databases/{0}/groups/%s/users' % (urllib.pathname2url(group_name)) url = '/api/v1/databases/{0}/groups/%s/users' % (urllib.pathname2url(group_name))
body = '{ "username": "%s" }' % username body = "{ \"users\": [\"%s\"] }" % "\",\"".join(usernames.split(','))
query = "select cartodb._CDB_Group_API_Request('POST', '%s', '%s', '{200, 409}') as response_status" % (url, body) query = "select cartodb._CDB_Group_API_Request('POST', '%s', '%s', '{200, 409}') as response_status" % (url, body)
plpy.execute(query) plpy.execute(query)
$$ LANGUAGE 'plpythonu' VOLATILE SECURITY DEFINER; $$ LANGUAGE 'plpythonu' VOLATILE SECURITY DEFINER;
CREATE OR REPLACE CREATE OR REPLACE
FUNCTION cartodb._CDB_Group_RemoveUser_API(group_name text, username text) FUNCTION cartodb._CDB_Group_RemoveUsers_API(group_name text, usernames text)
RETURNS VOID AS RETURNS VOID AS
$$ $$
import string import string
import urllib import urllib
url = '/api/v1/databases/{0}/groups/%s/users/%s' % (urllib.pathname2url(group_name), username) url = '/api/v1/databases/{0}/groups/%s/users' % (urllib.pathname2url(group_name))
query = "select cartodb._CDB_Group_API_Request('DELETE', '%s', '', '{200, 404}') as response_status" % url body = "{ \"users\": [\"%s\"] }" % "\",\"".join(usernames.split(','))
query = "select cartodb._CDB_Group_API_Request('DELETE', '%s', '%s', '{200, 404}') as response_status" % (url, body)
plpy.execute(query) plpy.execute(query)
$$ LANGUAGE 'plpythonu' VOLATILE SECURITY DEFINER; $$ LANGUAGE 'plpythonu' VOLATILE SECURITY DEFINER;

View File

@ -187,7 +187,7 @@ function setup() {
sql "SELECT cartodb.CDB_Group_CreateGroup('group_a_tmp')" sql "SELECT cartodb.CDB_Group_CreateGroup('group_a_tmp')"
sql "SELECT cartodb.CDB_Group_RenameGroup('group_a_tmp', 'group_a')" sql "SELECT cartodb.CDB_Group_RenameGroup('group_a_tmp', 'group_a')"
sql "SELECT cartodb.CDB_Group_AddUser('group_a', 'cdb_testmember_1')" sql "SELECT cartodb.CDB_Group_AddUsers('group_a', 'cdb_testmember_1')"
sql "SELECT cartodb.CDB_Group_CreateGroup('group_b')" sql "SELECT cartodb.CDB_Group_CreateGroup('group_b')"
} }
@ -203,7 +203,7 @@ function tear_down() {
sql "select cartodb.CDB_Group_DropGroup('group_b')" sql "select cartodb.CDB_Group_DropGroup('group_b')"
sql "SELECT cartodb.CDB_Group_RemoveUser('group_a', 'cdb_testmember_1')" sql "SELECT cartodb.CDB_Group_RemoveUsers('group_a', 'cdb_testmember_1')"
sql "select cartodb.CDB_Group_DropGroup('group_a')" sql "select cartodb.CDB_Group_DropGroup('group_a')"
sql "SELECT cartodb.CDB_Organization_RemoveAdmin('cdb_org_admin');" sql "SELECT cartodb.CDB_Organization_RemoveAdmin('cdb_org_admin');"
@ -474,8 +474,8 @@ function test_group_management_functions_cant_be_used_by_normal_members() {
sql cdb_testmember_1 "SELECT cartodb.CDB_Group_CreateGroup('group_x_1');" fails sql cdb_testmember_1 "SELECT cartodb.CDB_Group_CreateGroup('group_x_1');" fails
sql cdb_testmember_1 "SELECT cartodb.CDB_Group_RenameGroup('group_a', 'group_x_2');" fails sql cdb_testmember_1 "SELECT cartodb.CDB_Group_RenameGroup('group_a', 'group_x_2');" fails
sql cdb_testmember_1 "SELECT cartodb.CDB_Group_DropGroup('group_a');" fails sql cdb_testmember_1 "SELECT cartodb.CDB_Group_DropGroup('group_a');" fails
sql cdb_testmember_1 "SELECT cartodb.CDB_Group_AddUser('group_a', 'cdb_testmember_2');" fails sql cdb_testmember_1 "SELECT cartodb.CDB_Group_AddUsers('group_a', 'cdb_testmember_2');" fails
sql cdb_testmember_1 "SELECT cartodb.CDB_Group_RemoveUser('group_a', 'cdb_testmember_1');" fails sql cdb_testmember_1 "SELECT cartodb.CDB_Group_RemoveUsers('group_a', 'cdb_testmember_1');" fails
} }
function test_group_permission_functions_cant_be_used_by_normal_members() { function test_group_permission_functions_cant_be_used_by_normal_members() {
@ -496,8 +496,8 @@ function test_group_permission_functions_cant_be_used_by_normal_members() {
function test_group_management_functions_can_be_used_by_org_admin() { function test_group_management_functions_can_be_used_by_org_admin() {
sql cdb_org_admin "SELECT cartodb.CDB_Group_CreateGroup('group_x_tmp');" sql cdb_org_admin "SELECT cartodb.CDB_Group_CreateGroup('group_x_tmp');"
sql cdb_org_admin "SELECT cartodb.CDB_Group_RenameGroup('group_x_tmp', 'group_x');" sql cdb_org_admin "SELECT cartodb.CDB_Group_RenameGroup('group_x_tmp', 'group_x');"
sql cdb_org_admin "SELECT cartodb.CDB_Group_AddUser('group_x', 'cdb_testmember_1');" sql cdb_org_admin "SELECT cartodb.CDB_Group_AddUsers('group_x', 'cdb_testmember_1');"
sql cdb_org_admin "SELECT cartodb.CDB_Group_RemoveUser('group_x', 'cdb_testmember_1');" sql cdb_org_admin "SELECT cartodb.CDB_Group_RemoveUsers('group_x', 'cdb_testmember_1');"
# TODO: workaround superadmin limitation # TODO: workaround superadmin limitation
sql "SELECT cartodb.CDB_Group_DropGroup('group_x');" sql "SELECT cartodb.CDB_Group_DropGroup('group_x');"
} }