static gboolean
group_exists (const gchar *name)
{
    OobsGroupsConfig *config;
    OobsList *groups_list;
    OobsListIter iter;
    GObject *group;
    gboolean valid;
    const gchar *group_name;

    config = OOBS_GROUPS_CONFIG (GST_USERS_TOOL (tool)->groups_config);
    groups_list = oobs_groups_config_get_groups (config);
    valid = oobs_list_get_iter_first (groups_list, &iter);

    while (valid) {
        group = oobs_list_get (groups_list, &iter);
        group_name = oobs_group_get_name (OOBS_GROUP (group));
        g_object_unref (group);

        if (group_name && strcmp (name, group_name) == 0)
            return TRUE;

        valid = oobs_list_iter_next (groups_list, &iter);
    }

    return FALSE;
}
GtkWidget*
group_settings_dialog_new (OobsGroup *group)
{
    GtkWidget *dialog, *widget;
    const gchar *name;
    gchar *title;

    dialog = gst_dialog_get_widget (tool->main_dialog, "group_settings_dialog");
    name = oobs_group_get_name (group);

    if (!name) {
        g_object_set_data (G_OBJECT (dialog), "is_new", GINT_TO_POINTER (FALSE));
        gtk_window_set_title (GTK_WINDOW (dialog), _("New group"));

        widget = gst_dialog_get_widget (tool->main_dialog, "group_settings_gid");
        gtk_spin_button_set_value (GTK_SPIN_BUTTON (widget),
                                   group_settings_find_new_gid ());
    } else {
        g_object_set_data (G_OBJECT (dialog), "is_new", GINT_TO_POINTER (FALSE));

        title = g_strdup_printf (_("Group '%s' Properties"), name);
        gtk_window_set_title (GTK_WINDOW (dialog), title);
        g_free (title);

        widget = gst_dialog_get_widget (tool->main_dialog, "group_settings_gid");
        gtk_spin_button_set_value (GTK_SPIN_BUTTON (widget), oobs_group_get_gid (group));
    }

    widget = gst_dialog_get_widget (tool->main_dialog, "group_settings_name");
    set_entry_text (widget, name);

    group_members_table_set_from_group (group);

    return dialog;
}
static void
on_user_privilege_toggled (GtkCellRendererToggle *cell, gchar *path_str, gpointer data)
{
	GtkTreeModel *model, *child_model;
	GtkTreePath  *path  = gtk_tree_path_new_from_string (path_str);
	GtkTreeIter   iter, child_iter;
	OobsGroup    *group;
	gboolean      value;

	model = (GtkTreeModel*) data;

	if (gtk_tree_model_get_iter (model, &iter, path)) {
		child_model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (model));
		gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (model),
								  &child_iter, &iter);

		gtk_tree_model_get (child_model, &child_iter,
		                    COL_MEMBER, &value,
		                    COL_GROUP, &group, -1);

		/* check that current user should be allowed to lose admin rights,
		 * possibly showing a warning/error dialog */
		if (!value || strcmp (oobs_group_get_name (group), ADMIN_GROUP) != 0
		           || user_settings_check_revoke_admin_rights ())
			gtk_list_store_set (GTK_LIST_STORE (child_model), &child_iter, COL_MEMBER, !value, -1);

		g_object_unref (group);
	}

	gtk_tree_path_free (path);
}
static gboolean
is_group_root (OobsGroup *group)
{
    const gchar *name = oobs_group_get_name (group);

    if (!name)
        return FALSE;

    return (strcmp (name, "root") == 0);
}
static gboolean
check_group_delete (OobsGroup *group)
{
    GtkWidget *parent;
    GtkWidget *dialog;
    gint reply;

    parent = gst_dialog_get_widget (tool->main_dialog, "group_settings_dialog");

    if (oobs_group_get_gid (group) == 0) {
        dialog = gtk_message_dialog_new (GTK_WINDOW (parent),
                                         GTK_DIALOG_MODAL,
                                         GTK_MESSAGE_ERROR,
                                         GTK_BUTTONS_CLOSE,
                                         _("Administrator group can not be deleted"));

        gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
                _("This would leave the system unusable."));
        gtk_dialog_run (GTK_DIALOG (dialog));
        gtk_widget_destroy (dialog);

        return FALSE;
    }

    /* FIXME: should check that any user of this group is logged in */

    dialog = gtk_message_dialog_new (GTK_WINDOW (parent),
                                     GTK_DIALOG_MODAL,
                                     GTK_MESSAGE_WARNING,
                                     GTK_BUTTONS_NONE,
                                     _("Are you sure you want to delete group \"%s\"?"),
                                     oobs_group_get_name (group));
    gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
            _("This may leave files with invalid group ID in the filesystem."));
    gtk_dialog_add_buttons (GTK_DIALOG (dialog),
                            GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
                            GTK_STOCK_DELETE, GTK_RESPONSE_ACCEPT,
                            NULL);

    reply = gtk_dialog_run (GTK_DIALOG (dialog));
    gtk_widget_destroy (dialog);

    return (reply == GTK_RESPONSE_ACCEPT);
}
static gboolean
find_group_in_profile (OobsGroup      *group,
		       GstUserProfile *profile)
{
	gchar **groups;
	const gchar *name;

	if (!profile->groups)
		return FALSE;

	groups = profile->groups;
	name = oobs_group_get_name (group);

	while (*groups) {
		if (strcmp (*groups, name) == 0)
			return TRUE;

		groups++;
	}

	return FALSE;
}
void
privileges_table_add_group (OobsGroup *group, OobsListIter *list_iter)
{
	const PrivilegeDescription *p;
	GtkWidget *table;
	GtkTreeModel *model;
	GtkListStore *store;
	GtkTreeIter iter;

	p = privilege_search (oobs_group_get_name (group));

	table = gst_dialog_get_widget (tool->main_dialog, "user_privileges");
	model = gtk_tree_view_get_model (GTK_TREE_VIEW (table));
	store = GTK_LIST_STORE (gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (model)));

	gtk_list_store_append (store, &iter);
	gtk_list_store_set (store, &iter,
			    COL_MEMBER, FALSE,
			    COL_DESCRIPTION, (p) ? _(p->privilege) : NULL,
			    COL_GROUP, group,
			    -1);
}