Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 0 additions & 15 deletions src/manage.h
Original file line number Diff line number Diff line change
Expand Up @@ -2863,21 +2863,6 @@ get_schedule_timeout ();
void
set_schedule_timeout (int);


/* Groups. */

int
init_group_iterator (iterator_t *, get_data_t *);

gchar *
group_users (group_t);

int
group_count (const get_data_t*);

int
modify_group (const char *, const char *, const char *, const char *);


/* Permissions. */

Expand Down
13 changes: 13 additions & 0 deletions src/manage_groups.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,15 @@
#ifndef _GVMD_MANAGE_GROUPS_H
#define _GVMD_MANAGE_GROUPS_H

#include "manage_get.h"
#include "manage_resources.h"

char*
group_uuid (group_t);

gchar *
group_users (group_t);

int
copy_group (const char *, const char *, const char *, group_t *);

Expand All @@ -32,4 +36,13 @@ 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 *);

int
group_count (const get_data_t *);

#endif /* not _GVMD_MANAGE_GROUPS_H */
229 changes: 0 additions & 229 deletions src/manage_sql.c
Original file line number Diff line number Diff line change
Expand Up @@ -33031,235 +33031,6 @@ modify_schedule (const char *schedule_id, const char *name, const char *comment,
return 0;
}


/* 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.
*/
#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.
*
* @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. */

Expand Down
Loading
Loading