From 428a2391ad8649d97e44dcf106f28ca89c102c95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Ignacio=20S=C3=A1nchez=20Lara?= Date: Mon, 7 Sep 2015 09:56:59 +0200 Subject: [PATCH 1/6] Refactor Member -> User --- scripts-available/CDB_Groups.sql | 8 ++++---- scripts-available/CDB_Groups_API.sql | 4 ++-- test/organization/test.sh | 12 ++++++------ 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/scripts-available/CDB_Groups.sql b/scripts-available/CDB_Groups.sql index 41687fa..06d4d03 100644 --- a/scripts-available/CDB_Groups.sql +++ b/scripts-available/CDB_Groups.sql @@ -52,7 +52,7 @@ $$ LANGUAGE PLPGSQL VOLATILE; -- Adds a user to a group CREATE OR REPLACE -FUNCTION cartodb.CDB_Group_AddMember(group_name text, username text) +FUNCTION cartodb.CDB_Group_AddUser(group_name text, username text) RETURNS VOID AS $$ DECLARE group_role TEXT; @@ -65,13 +65,13 @@ BEGIN RAISE EXCEPTION 'Group role (%) and user role (%) must be already existing', group_role, user_role; END IF; EXECUTE format('GRANT %I TO %I', group_role, user_role); - PERFORM cartodb._CDB_Group_AddMember_API(group_name, username); + PERFORM cartodb._CDB_Group_AddUser_API(group_name, username); END $$ LANGUAGE PLPGSQL VOLATILE; -- Removes a user from a group CREATE OR REPLACE -FUNCTION cartodb.CDB_Group_RemoveMember(group_name text, username text) +FUNCTION cartodb.CDB_Group_RemoveUser(group_name text, username text) RETURNS VOID AS $$ DECLARE group_role TEXT; @@ -80,7 +80,7 @@ BEGIN group_role := cartodb._CDB_Group_GroupRole(group_name); user_role := cartodb._CDB_User_RoleFromUsername(username); EXECUTE format('REVOKE %I FROM %I', group_role, user_role); - PERFORM cartodb._CDB_Group_RemoveMember_API(group_name, username); + PERFORM cartodb._CDB_Group_RemoveUser_API(group_name, username); END $$ LANGUAGE PLPGSQL VOLATILE; diff --git a/scripts-available/CDB_Groups_API.sql b/scripts-available/CDB_Groups_API.sql index 5287802..db3ad0e 100644 --- a/scripts-available/CDB_Groups_API.sql +++ b/scripts-available/CDB_Groups_API.sql @@ -45,7 +45,7 @@ $$ $$ LANGUAGE 'plpythonu' VOLATILE SECURITY DEFINER; CREATE OR REPLACE -FUNCTION cartodb._CDB_Group_AddMember_API(group_name text, username text) +FUNCTION cartodb._CDB_Group_AddUser_API(group_name text, username text) RETURNS VOID AS $$ import string @@ -58,7 +58,7 @@ $$ $$ LANGUAGE 'plpythonu' VOLATILE SECURITY DEFINER; CREATE OR REPLACE -FUNCTION cartodb._CDB_Group_RemoveMember_API(group_name text, username text) +FUNCTION cartodb._CDB_Group_RemoveUser_API(group_name text, username text) RETURNS VOID AS $$ import string diff --git a/test/organization/test.sh b/test/organization/test.sh index 56a5b0d..5d55115 100644 --- a/test/organization/test.sh +++ b/test/organization/test.sh @@ -187,7 +187,7 @@ function setup() { 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_AddMember('group_a', 'cdb_testmember_1')" + sql "SELECT cartodb.CDB_Group_AddUser('group_a', 'cdb_testmember_1')" 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_RemoveMember('group_a', 'cdb_testmember_1')" + sql "SELECT cartodb.CDB_Group_RemoveUser('group_a', 'cdb_testmember_1')" sql "select cartodb.CDB_Group_DropGroup('group_a')" 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_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_AddMember('group_a', 'cdb_testmember_2');" fails - sql cdb_testmember_1 "SELECT cartodb.CDB_Group_RemoveMember('group_a', 'cdb_testmember_1');" fails + sql cdb_testmember_1 "SELECT cartodb.CDB_Group_AddUser('group_a', 'cdb_testmember_2');" fails + sql cdb_testmember_1 "SELECT cartodb.CDB_Group_RemoveUser('group_a', 'cdb_testmember_1');" fails } 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() { 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_AddMember('group_x', 'cdb_testmember_1');" - sql cdb_org_admin "SELECT cartodb.CDB_Group_RemoveMember('group_x', 'cdb_testmember_1');" + sql cdb_org_admin "SELECT cartodb.CDB_Group_AddUser('group_x', 'cdb_testmember_1');" + sql cdb_org_admin "SELECT cartodb.CDB_Group_RemoveUser('group_x', 'cdb_testmember_1');" # TODO: workaround superadmin limitation sql "SELECT cartodb.CDB_Group_DropGroup('group_x');" } From 59d144d91d69299ce0fa8c6f301ad93dcbef28cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Ignacio=20S=C3=A1nchez=20Lara?= Date: Mon, 7 Sep 2015 10:35:04 +0200 Subject: [PATCH 2/6] Batch add/remove users support --- scripts-available/CDB_Groups.sql | 34 +++++++++++++++++----------- scripts-available/CDB_Groups_API.sql | 11 +++++---- test/organization/test.sh | 12 +++++----- 3 files changed, 33 insertions(+), 24 deletions(-) diff --git a/scripts-available/CDB_Groups.sql b/scripts-available/CDB_Groups.sql index 06d4d03..253e72c 100644 --- a/scripts-available/CDB_Groups.sql +++ b/scripts-available/CDB_Groups.sql @@ -50,37 +50,45 @@ BEGIN END $$ LANGUAGE PLPGSQL VOLATILE; --- Adds a user to a group +-- Adds users to a group, comma-separated 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 $$ DECLARE group_role TEXT; user_role TEXT; + username TEXT; BEGIN group_role := cartodb._CDB_Group_GroupRole(group_name); - user_role := cartodb._CDB_User_RoleFromUsername(username); - IF(group_role IS NULL OR user_role IS NULL) - THEN - RAISE EXCEPTION 'Group role (%) and user role (%) must be already existing', group_role, user_role; - END IF; - EXECUTE format('GRANT %I TO %I', group_role, user_role); - PERFORM cartodb._CDB_Group_AddUser_API(group_name, username); + foreach username in array string_to_array(usernames, ',') + loop + user_role := cartodb._CDB_User_RoleFromUsername(username); + IF(group_role IS NULL OR user_role IS NULL) + THEN + RAISE EXCEPTION 'Group role (%) and user role (%) must be already existing', group_role, user_role; + END IF; + EXECUTE format('GRANT %I TO %I', group_role, user_role); + end loop; + PERFORM cartodb._CDB_Group_AddUsers_API(group_name, usernames); END $$ LANGUAGE PLPGSQL VOLATILE; -- Removes a user from a group 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 $$ DECLARE group_role TEXT; user_role TEXT; + username TEXT; BEGIN group_role := cartodb._CDB_Group_GroupRole(group_name); - user_role := cartodb._CDB_User_RoleFromUsername(username); - EXECUTE format('REVOKE %I FROM %I', group_role, user_role); - PERFORM cartodb._CDB_Group_RemoveUser_API(group_name, username); + foreach username in array string_to_array(usernames, ',') + loop + 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 $$ LANGUAGE PLPGSQL VOLATILE; diff --git a/scripts-available/CDB_Groups_API.sql b/scripts-available/CDB_Groups_API.sql index db3ad0e..79eb057 100644 --- a/scripts-available/CDB_Groups_API.sql +++ b/scripts-available/CDB_Groups_API.sql @@ -45,27 +45,28 @@ $$ $$ LANGUAGE 'plpythonu' VOLATILE SECURITY DEFINER; 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 $$ import string import urllib 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) plpy.execute(query) $$ LANGUAGE 'plpythonu' VOLATILE SECURITY DEFINER; 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 $$ import string import urllib - url = '/api/v1/databases/{0}/groups/%s/users/%s' % (urllib.pathname2url(group_name), username) - query = "select cartodb._CDB_Group_API_Request('DELETE', '%s', '', '{200, 404}') as response_status" % url + url = '/api/v1/databases/{0}/groups/%s/users' % (urllib.pathname2url(group_name)) + 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) $$ LANGUAGE 'plpythonu' VOLATILE SECURITY DEFINER; diff --git a/test/organization/test.sh b/test/organization/test.sh index 5d55115..17ec967 100644 --- a/test/organization/test.sh +++ b/test/organization/test.sh @@ -187,7 +187,7 @@ function setup() { 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_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')" } @@ -203,7 +203,7 @@ function tear_down() { 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_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_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_AddUser('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_AddUsers('group_a', 'cdb_testmember_2');" 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() { @@ -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() { 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_AddUser('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_AddUsers('group_x', 'cdb_testmember_1');" + sql cdb_org_admin "SELECT cartodb.CDB_Group_RemoveUsers('group_x', 'cdb_testmember_1');" # TODO: workaround superadmin limitation sql "SELECT cartodb.CDB_Group_DropGroup('group_x');" } From b73eb486a59f9e9fe2e92fd32f3dc2aa2706bac5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Ignacio=20S=C3=A1nchez=20Lara?= Date: Mon, 7 Sep 2015 10:35:32 +0200 Subject: [PATCH 3/6] Old functions cleanup --- scripts-available/CDB_Groups_API.sql | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/scripts-available/CDB_Groups_API.sql b/scripts-available/CDB_Groups_API.sql index 79eb057..ed5447f 100644 --- a/scripts-available/CDB_Groups_API.sql +++ b/scripts-available/CDB_Groups_API.sql @@ -5,6 +5,12 @@ -- Requires configuration parameter. Example: SELECT cartodb.CDB_Conf_SetConf('groups_api', '{ "host": "127.0.0.1", "port": 3000, "timeout": 10, "username": "extension", "password": "elephant" }'); ---------------------------------- +-- TODO: delete this development cleanup before final merge +DROP FUNCTION IF EXISTS cartodb.CDB_Group_AddMember(group_name text, username text); +DROP FUNCTION IF EXISTS cartodb.CDB_Group_RemoveMember(group_name text, username text); +DROP FUNCTION IF EXISTS cartodb._CDB_Group_AddMember_API(group_name text, username text); +DROP FUNCTION IF EXISTS cartodb._CDB_Group_RemoveMember_API(group_name text, username text); + -- Sends the create group request CREATE OR REPLACE FUNCTION cartodb._CDB_Group_CreateGroup_API(group_name text, group_role text) From 154eff6d2599f5d55b1b708265f8c6d75a0a8ac6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Ignacio=20S=C3=A1nchez=20Lara?= Date: Mon, 7 Sep 2015 11:43:46 +0200 Subject: [PATCH 4/6] Array notation for batch group functions --- scripts-available/CDB_Groups.sql | 8 ++++---- scripts-available/CDB_Groups_API.sql | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/scripts-available/CDB_Groups.sql b/scripts-available/CDB_Groups.sql index 253e72c..716032e 100644 --- a/scripts-available/CDB_Groups.sql +++ b/scripts-available/CDB_Groups.sql @@ -52,7 +52,7 @@ $$ LANGUAGE PLPGSQL VOLATILE; -- Adds users to a group, comma-separated CREATE OR REPLACE -FUNCTION cartodb.CDB_Group_AddUsers(group_name text, usernames text) +FUNCTION cartodb.CDB_Group_AddUsers(group_name text, usernames text[]) RETURNS VOID AS $$ DECLARE group_role TEXT; @@ -60,7 +60,7 @@ DECLARE username TEXT; BEGIN group_role := cartodb._CDB_Group_GroupRole(group_name); - foreach username in array string_to_array(usernames, ',') + foreach username in array usernames loop user_role := cartodb._CDB_User_RoleFromUsername(username); IF(group_role IS NULL OR user_role IS NULL) @@ -75,7 +75,7 @@ $$ LANGUAGE PLPGSQL VOLATILE; -- Removes a user from a group CREATE OR REPLACE -FUNCTION cartodb.CDB_Group_RemoveUsers(group_name text, usernames text) +FUNCTION cartodb.CDB_Group_RemoveUsers(group_name text, usernames text[]) RETURNS VOID AS $$ DECLARE group_role TEXT; @@ -83,7 +83,7 @@ DECLARE username TEXT; BEGIN group_role := cartodb._CDB_Group_GroupRole(group_name); - foreach username in array string_to_array(usernames, ',') + foreach username in array usernames loop user_role := cartodb._CDB_User_RoleFromUsername(username); EXECUTE format('REVOKE %I FROM %I', group_role, user_role); diff --git a/scripts-available/CDB_Groups_API.sql b/scripts-available/CDB_Groups_API.sql index ed5447f..136a969 100644 --- a/scripts-available/CDB_Groups_API.sql +++ b/scripts-available/CDB_Groups_API.sql @@ -51,27 +51,27 @@ $$ $$ LANGUAGE 'plpythonu' VOLATILE SECURITY DEFINER; CREATE OR REPLACE -FUNCTION cartodb._CDB_Group_AddUsers_API(group_name text, usernames text) +FUNCTION cartodb._CDB_Group_AddUsers_API(group_name text, usernames text[]) RETURNS VOID AS $$ import string import urllib url = '/api/v1/databases/{0}/groups/%s/users' % (urllib.pathname2url(group_name)) - body = "{ \"users\": [\"%s\"] }" % "\",\"".join(usernames.split(',')) + body = "{ \"users\": [\"%s\"] }" % "\",\"".join(usernames) query = "select cartodb._CDB_Group_API_Request('POST', '%s', '%s', '{200, 409}') as response_status" % (url, body) plpy.execute(query) $$ LANGUAGE 'plpythonu' VOLATILE SECURITY DEFINER; CREATE OR REPLACE -FUNCTION cartodb._CDB_Group_RemoveUsers_API(group_name text, usernames text) +FUNCTION cartodb._CDB_Group_RemoveUsers_API(group_name text, usernames text[]) RETURNS VOID AS $$ import string import urllib url = '/api/v1/databases/{0}/groups/%s/users' % (urllib.pathname2url(group_name)) - body = "{ \"users\": [\"%s\"] }" % "\",\"".join(usernames.split(',')) + body = "{ \"users\": [\"%s\"] }" % "\",\"".join(usernames) query = "select cartodb._CDB_Group_API_Request('DELETE', '%s', '%s', '{200, 404}') as response_status" % (url, body) plpy.execute(query) $$ LANGUAGE 'plpythonu' VOLATILE SECURITY DEFINER; From 4405ecb46644ec78cc717f8310e8b67cd3311e56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Ignacio=20S=C3=A1nchez=20Lara?= Date: Mon, 7 Sep 2015 11:43:57 +0200 Subject: [PATCH 5/6] Multiple users test --- test/organization/test.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/organization/test.sh b/test/organization/test.sh index 17ec967..7e54307 100644 --- a/test/organization/test.sh +++ b/test/organization/test.sh @@ -187,7 +187,7 @@ function setup() { 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_AddUsers('group_a', 'cdb_testmember_1')" + sql "SELECT cartodb.CDB_Group_AddUsers('group_a', ARRAY['cdb_testmember_1'])" 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_RemoveUsers('group_a', 'cdb_testmember_1')" + sql "SELECT cartodb.CDB_Group_RemoveUsers('group_a', ARRAY['cdb_testmember_1'])" sql "select cartodb.CDB_Group_DropGroup('group_a')" 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_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_AddUsers('group_a', 'cdb_testmember_2');" fails - sql cdb_testmember_1 "SELECT cartodb.CDB_Group_RemoveUsers('group_a', 'cdb_testmember_1');" fails + sql cdb_testmember_1 "SELECT cartodb.CDB_Group_AddUsers('group_a', ARRAY['cdb_testmember_2']);" fails + sql cdb_testmember_1 "SELECT cartodb.CDB_Group_RemoveUsers('group_a', ARRAY['cdb_testmember_1']);" fails } 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() { 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_AddUsers('group_x', 'cdb_testmember_1');" - sql cdb_org_admin "SELECT cartodb.CDB_Group_RemoveUsers('group_x', 'cdb_testmember_1');" + sql cdb_org_admin "SELECT cartodb.CDB_Group_AddUsers('group_x', ARRAY['cdb_testmember_1', 'cdb_testmember_2']);" + sql cdb_org_admin "SELECT cartodb.CDB_Group_RemoveUsers('group_x', ARRAY['cdb_testmember_1', 'cdb_testmember_2']);" # TODO: workaround superadmin limitation sql "SELECT cartodb.CDB_Group_DropGroup('group_x');" } From 275e5154fd09e18a31da1b06d01c479cd67c086c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Ignacio=20S=C3=A1nchez=20Lara?= Date: Mon, 7 Sep 2015 11:48:18 +0200 Subject: [PATCH 6/6] Fixed comment --- scripts-available/CDB_Groups.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts-available/CDB_Groups.sql b/scripts-available/CDB_Groups.sql index 716032e..cdc771a 100644 --- a/scripts-available/CDB_Groups.sql +++ b/scripts-available/CDB_Groups.sql @@ -50,7 +50,7 @@ BEGIN END $$ LANGUAGE PLPGSQL VOLATILE; --- Adds users to a group, comma-separated +-- Adds users to a group CREATE OR REPLACE FUNCTION cartodb.CDB_Group_AddUsers(group_name text, usernames text[]) RETURNS VOID AS $$ @@ -73,7 +73,7 @@ BEGIN END $$ LANGUAGE PLPGSQL VOLATILE; --- Removes a user from a group +-- Removes users from a group CREATE OR REPLACE FUNCTION cartodb.CDB_Group_RemoveUsers(group_name text, usernames text[]) RETURNS VOID AS $$