From 6fbdb9080a3e8ea500fd57407e0800796f4bf204 Mon Sep 17 00:00:00 2001 From: Matt Mundell Date: Tue, 23 Dec 2025 12:00:43 +0200 Subject: [PATCH 1/3] Change: move group_users to group files --- src/manage.h | 3 --- src/manage_groups.h | 3 +++ src/manage_sql.c | 19 ------------------- src/manage_sql_groups.c | 19 +++++++++++++++++++ 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/manage.h b/src/manage.h index 40b0df34e..030f3aa2e 100644 --- a/src/manage.h +++ b/src/manage.h @@ -2869,9 +2869,6 @@ set_schedule_timeout (int); int init_group_iterator (iterator_t *, get_data_t *); -gchar * -group_users (group_t); - int group_count (const get_data_t*); diff --git a/src/manage_groups.h b/src/manage_groups.h index d81119bc1..2de969f03 100644 --- a/src/manage_groups.h +++ b/src/manage_groups.h @@ -11,6 +11,9 @@ char* group_uuid (group_t); +gchar * +group_users (group_t); + int copy_group (const char *, const char *, const char *, group_t *); diff --git a/src/manage_sql.c b/src/manage_sql.c index 93e671dac..b1c22c90c 100644 --- a/src/manage_sql.c +++ b/src/manage_sql.c @@ -33034,25 +33034,6 @@ modify_schedule (const char *schedule_id, const char *name, const char *comment, /* Groups. */ -/** - * @brief Gets users of group as a string. - * - * @param[in] group Group. - * - * @return Users. - */ -gchar * -group_users (group_t group) -{ - return sql_string ("SELECT group_concat (name, ', ')" - " FROM (SELECT users.name FROM users, group_users" - " WHERE group_users.\"group\" = %llu" - " AND group_users.user = users.id" - " GROUP BY users.name)" - " AS sub;", - group); -} - /** * @brief Filter columns for group iterator. */ diff --git a/src/manage_sql_groups.c b/src/manage_sql_groups.c index b367953a4..f0840fb9e 100644 --- a/src/manage_sql_groups.c +++ b/src/manage_sql_groups.c @@ -29,6 +29,25 @@ group_uuid (group_t group) group); } +/** + * @brief Gets users of group as a string. + * + * @param[in] group Group. + * + * @return Users. + */ +gchar * +group_users (group_t group) +{ + return sql_string ("SELECT group_concat (name, ', ')" + " FROM (SELECT users.name FROM users, group_users" + " WHERE group_users.\"group\" = %llu" + " AND group_users.user = users.id" + " GROUP BY users.name)" + " AS sub;", + group); +} + /** * @brief Create a group from an existing group. * From 37591d2895a17f10fe9ebc21f66bfb1710a8c6e4 Mon Sep 17 00:00:00 2001 From: Matt Mundell Date: Tue, 23 Dec 2025 12:15:48 +0200 Subject: [PATCH 2/3] Change: move group iteration to group files --- src/manage.h | 6 ---- src/manage_groups.h | 7 +++++ src/manage_sql.c | 69 ----------------------------------------- src/manage_sql_groups.c | 46 +++++++++++++++++++++++++++ src/manage_sql_groups.h | 24 ++++++++++++++ 5 files changed, 77 insertions(+), 75 deletions(-) diff --git a/src/manage.h b/src/manage.h index 030f3aa2e..09d6fd15a 100644 --- a/src/manage.h +++ b/src/manage.h @@ -2866,12 +2866,6 @@ set_schedule_timeout (int); /* Groups. */ -int -init_group_iterator (iterator_t *, get_data_t *); - -int -group_count (const get_data_t*); - int modify_group (const char *, const char *, const char *, const char *); diff --git a/src/manage_groups.h b/src/manage_groups.h index 2de969f03..5dd1a0a1a 100644 --- a/src/manage_groups.h +++ b/src/manage_groups.h @@ -6,6 +6,7 @@ #ifndef _GVMD_MANAGE_GROUPS_H #define _GVMD_MANAGE_GROUPS_H +#include "manage_get.h" #include "manage_resources.h" char* @@ -35,4 +36,10 @@ create_group (const char *, const char *, const char *, int, group_t *); int delete_group (const char *, int); +int +init_group_iterator (iterator_t *, get_data_t *); + +int +group_count (const get_data_t *); + #endif /* not _GVMD_MANAGE_GROUPS_H */ diff --git a/src/manage_sql.c b/src/manage_sql.c index b1c22c90c..1071c4c70 100644 --- a/src/manage_sql.c +++ b/src/manage_sql.c @@ -33034,75 +33034,6 @@ modify_schedule (const char *schedule_id, const char *name, const char *comment, /* Groups. */ -/** - * @brief Filter columns for group iterator. - */ -#define GROUP_ITERATOR_FILTER_COLUMNS \ - { GET_ITERATOR_FILTER_COLUMNS, NULL } - -/** - * @brief Group iterator columns. - */ -#define GROUP_ITERATOR_COLUMNS \ - { \ - GET_ITERATOR_COLUMNS (groups), \ - { NULL, NULL, KEYWORD_TYPE_UNKNOWN } \ - } - -/** - * @brief Group iterator columns for trash case. - */ -#define GROUP_ITERATOR_TRASH_COLUMNS \ - { \ - GET_ITERATOR_COLUMNS (groups_trash), \ - { NULL, NULL, KEYWORD_TYPE_UNKNOWN } \ - } - -/** - * @brief Count number of groups. - * - * @param[in] get GET params. - * - * @return Total number of groups in grouped set. - */ -int -group_count (const get_data_t *get) -{ - static const char *filter_columns[] = GROUP_ITERATOR_FILTER_COLUMNS; - static column_t columns[] = GROUP_ITERATOR_COLUMNS; - static column_t trash_columns[] = GROUP_ITERATOR_TRASH_COLUMNS; - return count ("group", get, columns, trash_columns, filter_columns, - 0, 0, 0, TRUE); -} - -/** - * @brief Initialise a group iterator, including observed groups. - * - * @param[in] iterator Iterator. - * @param[in] get GET data. - * - * @return 0 success, 1 failed to find group, 2 failed to find group (filt_id), - * -1 error. - */ -int -init_group_iterator (iterator_t* iterator, get_data_t *get) -{ - static const char *filter_columns[] = GROUP_ITERATOR_FILTER_COLUMNS; - static column_t columns[] = GROUP_ITERATOR_COLUMNS; - static column_t trash_columns[] = GROUP_ITERATOR_TRASH_COLUMNS; - - return init_get_iterator (iterator, - "group", - get, - columns, - trash_columns, - filter_columns, - 0, - NULL, - NULL, - TRUE); -} - /** * @brief Modify a group. * diff --git a/src/manage_sql_groups.c b/src/manage_sql_groups.c index f0840fb9e..8c2ab8c55 100644 --- a/src/manage_sql_groups.c +++ b/src/manage_sql_groups.c @@ -4,6 +4,7 @@ */ #include "manage_groups.h" +#include "manage_sql_groups.h" #include "manage_acl.h" #include "manage_sql.h" #include "sql.h" @@ -343,3 +344,48 @@ delete_group (const char *group_id, int ultimate) sql_commit (); return 0; } + +/** + * @brief Count number of groups. + * + * @param[in] get GET params. + * + * @return Total number of groups in grouped set. + */ +int +group_count (const get_data_t *get) +{ + static const char *filter_columns[] = GROUP_ITERATOR_FILTER_COLUMNS; + static column_t columns[] = GROUP_ITERATOR_COLUMNS; + static column_t trash_columns[] = GROUP_ITERATOR_TRASH_COLUMNS; + return count ("group", get, columns, trash_columns, filter_columns, + 0, 0, 0, TRUE); +} + +/** + * @brief Initialise a group iterator, including observed groups. + * + * @param[in] iterator Iterator. + * @param[in] get GET data. + * + * @return 0 success, 1 failed to find group, 2 failed to find group (filt_id), + * -1 error. + */ +int +init_group_iterator (iterator_t* iterator, get_data_t *get) +{ + static const char *filter_columns[] = GROUP_ITERATOR_FILTER_COLUMNS; + static column_t columns[] = GROUP_ITERATOR_COLUMNS; + static column_t trash_columns[] = GROUP_ITERATOR_TRASH_COLUMNS; + + return init_get_iterator (iterator, + "group", + get, + columns, + trash_columns, + filter_columns, + 0, + NULL, + NULL, + TRUE); +} diff --git a/src/manage_sql_groups.h b/src/manage_sql_groups.h index 3d6d53583..4b91a25f3 100644 --- a/src/manage_sql_groups.h +++ b/src/manage_sql_groups.h @@ -6,6 +6,30 @@ #ifndef _GVMD_MANAGE_SQL_GROUPS_H #define _GVMD_MANAGE_SQL_GROUPS_H +/** + * @brief Filter columns for group iterator. + */ +#define GROUP_ITERATOR_FILTER_COLUMNS \ + { GET_ITERATOR_FILTER_COLUMNS, NULL } + +/** + * @brief Group iterator columns. + */ +#define GROUP_ITERATOR_COLUMNS \ + { \ + GET_ITERATOR_COLUMNS (groups), \ + { NULL, NULL, KEYWORD_TYPE_UNKNOWN } \ + } + +/** + * @brief Group iterator columns for trash case. + */ +#define GROUP_ITERATOR_TRASH_COLUMNS \ + { \ + GET_ITERATOR_COLUMNS (groups_trash), \ + { NULL, NULL, KEYWORD_TYPE_UNKNOWN } \ + } + gboolean find_group_with_permission (const char *, group_t *, const char *); From 05fc5a9246479136fe3f5c2e915dc51f0dfe5b20 Mon Sep 17 00:00:00 2001 From: Matt Mundell Date: Tue, 23 Dec 2025 12:18:24 +0200 Subject: [PATCH 3/3] Change: move modify_group to group files --- src/manage.h | 6 -- src/manage_groups.h | 3 + src/manage_sql.c | 141 ---------------------------------------- src/manage_sql_groups.c | 138 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 141 insertions(+), 147 deletions(-) diff --git a/src/manage.h b/src/manage.h index 09d6fd15a..3f015fb7e 100644 --- a/src/manage.h +++ b/src/manage.h @@ -2863,12 +2863,6 @@ get_schedule_timeout (); void set_schedule_timeout (int); - -/* Groups. */ - -int -modify_group (const char *, const char *, const char *, const char *); - /* Permissions. */ diff --git a/src/manage_groups.h b/src/manage_groups.h index 5dd1a0a1a..85ca6889a 100644 --- a/src/manage_groups.h +++ b/src/manage_groups.h @@ -36,6 +36,9 @@ create_group (const char *, const char *, const char *, int, group_t *); int delete_group (const char *, int); +int +modify_group (const char *, const char *, const char *, const char *); + int init_group_iterator (iterator_t *, get_data_t *); diff --git a/src/manage_sql.c b/src/manage_sql.c index 1071c4c70..8333f5a2a 100644 --- a/src/manage_sql.c +++ b/src/manage_sql.c @@ -33031,147 +33031,6 @@ modify_schedule (const char *schedule_id, const char *name, const char *comment, return 0; } - -/* Groups. */ - -/** - * @brief Modify a group. - * - * @param[in] group_id UUID of group. - * @param[in] name Name of group. - * @param[in] comment Comment on group. - * @param[in] users Group users. - * - * @return 0 success, 1 failed to find group, 2 failed to find user, 3 group_id - * required, 4 user name validation failed, 5 group with new name - * exists, 99 permission denied, -1 internal error. - */ -int -modify_group (const char *group_id, const char *name, const char *comment, - const char *users) -{ - int ret; - gchar *quoted_name, *quoted_comment; - group_t group; - GArray *affected_users; - iterator_t users_iter; - - assert (current_credentials.uuid); - - if (group_id == NULL) - return 3; - - sql_begin_immediate (); - - if (acl_user_may ("modify_group") == 0) - { - sql_rollback (); - return 99; - } - - group = 0; - - if (find_group_with_permission (group_id, &group, "modify_group")) - { - sql_rollback (); - return -1; - } - - if (group == 0) - { - sql_rollback (); - return 1; - } - - /* Check whether a group with the same name exists already. */ - if (name) - { - if (resource_with_name_exists (name, "group", group)) - { - sql_rollback (); - return 5; - } - } - - quoted_name = sql_quote(name ?: ""); - quoted_comment = sql_quote (comment ? comment : ""); - - sql ("UPDATE groups SET" - " name = '%s'," - " comment = '%s'," - " modification_time = m_now ()" - " WHERE id = %llu;", - quoted_name, - quoted_comment, - group); - - g_free (quoted_comment); - g_free (quoted_name); - - affected_users = g_array_new (TRUE, TRUE, sizeof (user_t)); - init_iterator (&users_iter, - "SELECT \"user\" FROM group_users" - " WHERE \"group\" = %llu", - group); - while (next (&users_iter)) - { - user_t user = iterator_int64 (&users_iter, 0); - g_array_append_val (affected_users, user); - } - cleanup_iterator (&users_iter); - - sql ("DELETE FROM group_users WHERE \"group\" = %llu;", group); - - ret = add_users ("group", group, users); - - init_iterator (&users_iter, - "SELECT \"user\" FROM group_users" - " WHERE \"group\" = %llu", - group); - - // users not looked for in this above loop were removed - // -> possible permissions change - while (next (&users_iter)) - { - int index, found_user; - user_t user = iterator_int64 (&users_iter, 0); - - found_user = 0; - for (index = 0; index < affected_users->len && found_user == 0; index++) - { - if (g_array_index (affected_users, user_t, index) == user) - { - found_user = 1; - break; - } - } - - if (found_user) - { - // users found here stay in the group -> no change in permissions - g_array_remove_index_fast (affected_users, index); - } - else - { - // user added to group -> possible permissions change - g_array_append_val (affected_users, user); - } - } - - cleanup_iterator (&users_iter); - - cache_all_permissions_for_users (affected_users); - - g_array_free (affected_users, TRUE); - - if (ret) - sql_rollback (); - else - sql_commit (); - - return ret; -} - /* Permissions. */ diff --git a/src/manage_sql_groups.c b/src/manage_sql_groups.c index 8c2ab8c55..213bac8b9 100644 --- a/src/manage_sql_groups.c +++ b/src/manage_sql_groups.c @@ -345,6 +345,144 @@ delete_group (const char *group_id, int ultimate) return 0; } +/** + * @brief Modify a group. + * + * @param[in] group_id UUID of group. + * @param[in] name Name of group. + * @param[in] comment Comment on group. + * @param[in] users Group users. + * + * @return 0 success, 1 failed to find group, 2 failed to find user, 3 group_id + * required, 4 user name validation failed, 5 group with new name + * exists, 99 permission denied, -1 internal error. + */ +int +modify_group (const char *group_id, const char *name, const char *comment, + const char *users) +{ + int ret; + gchar *quoted_name, *quoted_comment; + group_t group; + GArray *affected_users; + iterator_t users_iter; + + assert (current_credentials.uuid); + + if (group_id == NULL) + return 3; + + sql_begin_immediate (); + + if (acl_user_may ("modify_group") == 0) + { + sql_rollback (); + return 99; + } + + group = 0; + + if (find_group_with_permission (group_id, &group, "modify_group")) + { + sql_rollback (); + return -1; + } + + if (group == 0) + { + sql_rollback (); + return 1; + } + + /* Check whether a group with the same name exists already. */ + if (name) + { + if (resource_with_name_exists (name, "group", group)) + { + sql_rollback (); + return 5; + } + } + + quoted_name = sql_quote(name ?: ""); + quoted_comment = sql_quote (comment ? comment : ""); + + sql ("UPDATE groups SET" + " name = '%s'," + " comment = '%s'," + " modification_time = m_now ()" + " WHERE id = %llu;", + quoted_name, + quoted_comment, + group); + + g_free (quoted_comment); + g_free (quoted_name); + + affected_users = g_array_new (TRUE, TRUE, sizeof (user_t)); + init_iterator (&users_iter, + "SELECT \"user\" FROM group_users" + " WHERE \"group\" = %llu", + group); + while (next (&users_iter)) + { + user_t user = iterator_int64 (&users_iter, 0); + g_array_append_val (affected_users, user); + } + cleanup_iterator (&users_iter); + + sql ("DELETE FROM group_users WHERE \"group\" = %llu;", group); + + ret = add_users ("group", group, users); + + init_iterator (&users_iter, + "SELECT \"user\" FROM group_users" + " WHERE \"group\" = %llu", + group); + + // users not looked for in this above loop were removed + // -> possible permissions change + while (next (&users_iter)) + { + int index, found_user; + user_t user = iterator_int64 (&users_iter, 0); + + found_user = 0; + for (index = 0; index < affected_users->len && found_user == 0; index++) + { + if (g_array_index (affected_users, user_t, index) == user) + { + found_user = 1; + break; + } + } + + if (found_user) + { + // users found here stay in the group -> no change in permissions + g_array_remove_index_fast (affected_users, index); + } + else + { + // user added to group -> possible permissions change + g_array_append_val (affected_users, user); + } + } + + cleanup_iterator (&users_iter); + + cache_all_permissions_for_users (affected_users); + + g_array_free (affected_users, TRUE); + + if (ret) + sql_rollback (); + else + sql_commit (); + + return ret; +} + /** * @brief Count number of groups. *