Filter privileged commands accordingly

This commit is contained in:
Pierre Pronchery 2015-07-12 22:59:01 +02:00
parent 27e323477a
commit 5c78cad653

View File

@ -70,6 +70,9 @@ typedef enum _SettingsColumn
/* prototypes */
static int _settings(void);
/* accessors */
static GtkTreeModel * _settings_get_model(Settings * settings);
/* useful */
static int _settings_browse(Settings * settings);
@ -81,6 +84,8 @@ static int _settings_usage(void);
/* settings */
/* callbacks */
static gboolean _settings_on_closex(gpointer data);
static gboolean _settings_on_filter_view(GtkTreeModel * model,
GtkTreeIter * iter, gpointer data);
static gboolean _settings_on_idle(gpointer data);
#if GTK_CHECK_VERSION(2, 10, 0)
static void _settings_on_item_activated(GtkWidget * widget, GtkTreePath * path,
@ -92,6 +97,7 @@ static int _settings(void)
Settings settings;
GtkWidget * widget;
GtkListStore * store;
GtkTreeModel * model;
settings.window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW(settings.window), 400, 300);
@ -109,7 +115,10 @@ static int _settings(void)
G_TYPE_STRING, /* name */
G_TYPE_STRING, /* exec */
G_TYPE_BOOLEAN); /* privileged */
settings.view = gtk_icon_view_new_with_model(GTK_TREE_MODEL(store));
model = gtk_tree_model_filter_new(GTK_TREE_MODEL(store), NULL);
gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(model),
_settings_on_filter_view, &settings, NULL);
settings.view = gtk_icon_view_new_with_model(model);
gtk_icon_view_set_item_width(GTK_ICON_VIEW(settings.view), 96);
gtk_icon_view_set_pixbuf_column(GTK_ICON_VIEW(settings.view), SC_ICON);
gtk_icon_view_set_text_column(GTK_ICON_VIEW(settings.view), SC_NAME);
@ -133,6 +142,17 @@ static gboolean _settings_on_closex(gpointer data)
return FALSE;
}
static gboolean _settings_on_filter_view(GtkTreeModel * model,
GtkTreeIter * iter, gpointer data)
{
gboolean privileged;
if(geteuid() == 0)
return TRUE;
gtk_tree_model_get(model, iter, SC_PRIVILEGED, &privileged, -1);
return (SC_PRIVILEGED == TRUE) ? FALSE : TRUE;
}
static gboolean _settings_on_idle(gpointer data)
{
Settings * settings = data;
@ -170,6 +190,17 @@ static void _settings_on_item_activated(GtkWidget * widget, GtkTreePath * path,
#endif
/* accessors */
/* settings_get_model */
static GtkTreeModel * _settings_get_model(Settings * settings)
{
GtkTreeModel * model;
model = gtk_icon_view_get_model(GTK_ICON_VIEW(settings->view));
return gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(model));
}
/* useful */
/* settings_browse */
static int _settings_browse_folder(Settings * settings, Config * config,
@ -192,7 +223,7 @@ static int _settings_browse(Settings * settings)
if((config = config_new()) == NULL)
return -_settings_error(error_get(), 1);
model = gtk_icon_view_get_model(GTK_ICON_VIEW(settings->view));
model = _settings_get_model(settings);
gtk_list_store_clear(GTK_LIST_STORE(model));
/* read through every XDG application folder */
if((path = getenv("XDG_DATA_DIRS")) == NULL || strlen(path) == 0)
@ -263,7 +294,7 @@ static int _settings_browse_folder(Settings * settings, Config * config,
if(dir == NULL)
return -_settings_error(strerror(errno), 1);
theme = gtk_icon_theme_get_default();
model = gtk_icon_view_get_model(GTK_ICON_VIEW(settings->view));
model = _settings_get_model(settings);
store = GTK_LIST_STORE(model);
while((de = readdir(dir)) != NULL)
{