From cbe3dd9930e68140ca8aeb17e4fb20fce09981df Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Mon, 14 Mar 2011 17:41:12 +0100 Subject: abrtd: do not accept requests to delete directories not in /var/spool/abrt/ Signed-off-by: Denys Vlasenko --- src/daemon/MiddleWare.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/daemon/MiddleWare.cpp b/src/daemon/MiddleWare.cpp index 8d62c697..84400361 100644 --- a/src/daemon/MiddleWare.cpp +++ b/src/daemon/MiddleWare.cpp @@ -744,6 +744,16 @@ int CreateReportThread(const char* crash_id, long caller_uid, int force, const c /* Remove dump dir */ int DeleteDebugDump(const char *dump_dir_name, long caller_uid) { + /* If doesn't start with "DEBUG_DUMPS_DIR/"... */ + if (strncmp(dump_dir_name, DEBUG_DUMPS_DIR"/", strlen(DEBUG_DUMPS_DIR"/")) != 0 + /* or contains "/." anywhere (-> might contain ".." component) */ + || strstr(dump_dir_name + strlen(DEBUG_DUMPS_DIR), "/.") + ) { + /* Then refuse to operate on it (someone is attacking us??) */ + error_msg("Bad dump directory name '%s', not deleting", dump_dir_name); + return MW_ERROR; + } + struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0); if (!dd) return MW_NOENT_ERROR; @@ -760,7 +770,7 @@ int DeleteDebugDump(const char *dump_dir_name, long caller_uid) if (!string_to_bool(inform_all)) { dd_close(dd); - error_msg("crash '%s' can't be accessed by user with uid %ld", dump_dir_name, caller_uid); + error_msg("Dump directory '%s' can't be accessed by user with uid %ld", dump_dir_name, caller_uid); return 1; } } -- cgit From 365baba740b443c38c0e9669300b3f6f532fb057 Mon Sep 17 00:00:00 2001 From: Jiri Moskovcak Date: Mon, 14 Mar 2011 18:09:54 +0100 Subject: put code shared among gui and wizard into libreportgtk --- src/Makefile.am | 2 +- src/gui-gtk/Makefile.am | 7 +- src/gui-gtk/abrt-gtk.c | 25 ++- src/gui-gtk/event_config_dialog.c | 358 -------------------------------------- src/gui-gtk/event_config_dialog.h | 1 - src/include/report/event_config.h | 2 +- 6 files changed, 26 insertions(+), 369 deletions(-) delete mode 100644 src/gui-gtk/event_config_dialog.c delete mode 100644 src/gui-gtk/event_config_dialog.h (limited to 'src') diff --git a/src/Makefile.am b/src/Makefile.am index 066fadf2..7736a7c7 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1 +1 @@ -SUBDIRS = include lib report-python hooks btparser daemon applet gui-gtk cli plugins gui-wizard-gtk retrace +SUBDIRS = include lib report-python hooks btparser daemon applet gtk-helpers gui-gtk cli plugins gui-wizard-gtk retrace diff --git a/src/gui-gtk/Makefile.am b/src/gui-gtk/Makefile.am index 2c525245..978f9428 100644 --- a/src/gui-gtk/Makefile.am +++ b/src/gui-gtk/Makefile.am @@ -2,11 +2,11 @@ bin_PROGRAMS = abrt-gui abrt_gui_SOURCES = \ abrt-gtk.h abrt-gtk.c \ - event_config_dialog.h event_config_dialog.c \ main.c abrt_gui_CFLAGS = \ -I$(srcdir)/../include/report -I$(srcdir)/../include \ -I$(srcdir)/../lib \ + -I$(srcdir)/../gtk-helpers \ -DBIN_DIR=\"$(bindir)\" \ -DVAR_RUN=\"$(VAR_RUN)\" \ -DCONF_DIR=\"$(CONF_DIR)\" \ @@ -16,6 +16,7 @@ abrt_gui_CFLAGS = \ -DICON_DIR=\"${datadir}/abrt/icons/hicolor/48x48/status\" \ $(GTK_CFLAGS) \ $(DBUS_CFLAGS) \ + $(GNOME_KEYRING_CFLAGS) \ -D_GNU_SOURCE \ -Wall -Wwrite-strings -Werror # -I/usr/include/glib-2.0 @@ -25,10 +26,12 @@ abrt_gui_CFLAGS = \ abrt_gui_LDADD = \ ../lib/libreport.la \ ../lib/libabrt_dbus.la \ + ../gtk-helpers/libreportgtk.la \ -lglib-2.0 \ -lgthread-2.0 \ $(GTK_LIBS) \ - $(DBUS_LIBS) + $(DBUS_LIBS) \ + $(GNOME_KEYRING_LIBS) # $(LIBNOTIFY_LIBS) #test_report_SOURCES = \ diff --git a/src/gui-gtk/abrt-gtk.c b/src/gui-gtk/abrt-gtk.c index 680c2209..ea85b0b6 100644 --- a/src/gui-gtk/abrt-gtk.c +++ b/src/gui-gtk/abrt-gtk.c @@ -3,7 +3,7 @@ #include "abrtlib.h" #include "abrt_dbus.h" #include "abrt-gtk.h" -#include "event_config_dialog.h" +#include "libreport-gtk.h" static const char * const help_uri ="http://docs.fedoraproject.org/en-US/" "Fedora/14/html/Deployment_Guide/ch-abrt.html"; @@ -20,6 +20,7 @@ enum COLUMN_LATEST_CRASH_STR, COLUMN_LATEST_CRASH, COLUMN_DUMP_DIR, + COLUMN_BG, NUM_COLUMNS }; @@ -44,6 +45,8 @@ void add_directory_to_dirlist(const char *dirname) free(msg); char *reason = dd_load_text(dd, FILENAME_REASON); + static bool grey_bg = false; + GtkTreeIter iter; gtk_list_store_append(s_dumps_list_store, &iter); gtk_list_store_set(s_dumps_list_store, &iter, @@ -54,8 +57,9 @@ void add_directory_to_dirlist(const char *dirname) COLUMN_LATEST_CRASH_STR, time_buf, COLUMN_LATEST_CRASH, (int)time, COLUMN_DUMP_DIR, dirname, + COLUMN_BG, grey_bg ? "#EEEEEE" : "#FFFFFF", -1); - + grey_bg = !grey_bg; free(reason); dd_close(dd); @@ -226,6 +230,8 @@ static void add_columns(GtkTreeView *treeview) renderer, "stock_id", COLUMN_REPORTED, + "cell-background", + COLUMN_BG, NULL); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_sort_column_id(column, COLUMN_REPORTED); @@ -236,11 +242,14 @@ static void add_columns(GtkTreeView *treeview) renderer, "text", COLUMN_REASON, + "cell-background", + COLUMN_BG, NULL); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_sort_column_id(column, COLUMN_REASON); gtk_tree_view_append_column(treeview, column); + /* renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("Stored in"), renderer, @@ -250,12 +259,14 @@ static void add_columns(GtkTreeView *treeview) gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_sort_column_id(column, COLUMN_DIRNAME); gtk_tree_view_append_column(treeview, column); - + */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("Last occurrence"), renderer, "text", COLUMN_LATEST_CRASH_STR, + "cell-background", + COLUMN_BG, NULL); gtk_tree_view_column_set_sort_column_id(column, COLUMN_LATEST_CRASH); gtk_tree_view_append_column(treeview, column); @@ -310,7 +321,7 @@ GtkWidget *create_main_window(void) { /* main window */ g_main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_window_set_default_size(GTK_WINDOW(g_main_window), 600, 700); + gtk_window_set_default_size(GTK_WINDOW(g_main_window), 700, 700); gtk_window_set_title(GTK_WINDOW(g_main_window), _("Automatic Bug Reporting Tool")); gtk_window_set_icon_name(GTK_WINDOW(g_main_window), "abrt"); @@ -339,12 +350,14 @@ GtkWidget *create_main_window(void) G_TYPE_STRING, /* hostname */ G_TYPE_STRING, /* time */ G_TYPE_INT, /* unix time - used for sort */ - G_TYPE_STRING);/* dump dir path */ + G_TYPE_STRING, /* dump dir path */ + G_TYPE_STRING);/* row background */ + gtk_tree_view_set_model(GTK_TREE_VIEW(s_treeview), GTK_TREE_MODEL(s_dumps_list_store)); /* buttons are homogenous so set size only for one button and it will * work for the rest buttons in same gtk_hbox_new() */ - GtkWidget *btn_report = gtk_button_new_with_mnemonic(_("O_pen")); + GtkWidget *btn_report = gtk_button_new_from_stock(GTK_STOCK_OPEN); gtk_widget_set_size_request(btn_report, 200, 30); GtkWidget *btn_delete = gtk_button_new_from_stock(GTK_STOCK_DELETE); diff --git a/src/gui-gtk/event_config_dialog.c b/src/gui-gtk/event_config_dialog.c deleted file mode 100644 index b773c8ad..00000000 --- a/src/gui-gtk/event_config_dialog.c +++ /dev/null @@ -1,358 +0,0 @@ -#include "abrtlib.h" -#include - -static GtkWidget *option_table; -static GtkWidget *parent_dialog; -static GList *option_widget_list; -static int last_row = 0; - -enum -{ - COLUMN_EVENT_NAME, - COLUMN_EVENT, - NUM_COLUMNS -}; - -typedef struct -{ - event_option_t *option; - GtkWidget *widget; -} option_widget_t; - -static void show_event_config_dialog(event_config_t* event); - -static void show_error_message(const char* message) -{ - GtkWidget *dialog = gtk_message_dialog_new(NULL, - GTK_DIALOG_MODAL, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_CLOSE, - message - ); - gtk_dialog_run(GTK_DIALOG(dialog)); - gtk_widget_destroy(dialog); -} - -GtkWidget *gtk_label_new_justify_left(const gchar *label_str) -{ - GtkWidget *label = gtk_label_new(label_str); - gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT); - gtk_misc_set_alignment(GTK_MISC(label), /*xalign:*/ 0, /*yalign:*/ 0.5); - return label; -} - -static void add_option_widget(GtkWidget *widget, event_option_t *option) -{ - option_widget_t *ow = (option_widget_t *)xmalloc(sizeof(option_widget_t)); - ow->widget = widget; - ow->option = option; - option_widget_list = g_list_prepend(option_widget_list, ow); -} - -static void on_show_pass_cb(GtkToggleButton *tb, gpointer user_data) -{ - GtkEntry *entry = (GtkEntry *)user_data; - gtk_entry_set_visibility(entry, gtk_toggle_button_get_active(tb)); -} - -static void add_option_to_dialog(event_option_t *option) -{ - GtkWidget *label; - GtkWidget *option_input; - GtkWidget *option_hbox = gtk_hbox_new(FALSE, 0); - char *option_label; - if(option->label != NULL) - option_label = option->label; - else - option_label = option->name; - - switch(option->type) - { - case OPTION_TYPE_TEXT: - case OPTION_TYPE_NUMBER: - label = gtk_label_new_justify_left(option_label); - gtk_table_attach(GTK_TABLE(option_table), label, - 0, 1, - last_row, last_row+1, - GTK_FILL, GTK_FILL, - 0,0); - option_input = gtk_entry_new(); - if(option->value != NULL) - gtk_entry_set_text(GTK_ENTRY(option_input), option->value); - gtk_table_attach(GTK_TABLE(option_table), option_input, - 1, 2, - last_row, last_row+1, - GTK_FILL, GTK_FILL, - 0,0); - add_option_widget(option_input, option); - break; - case OPTION_TYPE_BOOL: - option_input = gtk_check_button_new_with_label(option_label); - gtk_table_attach(GTK_TABLE(option_table), option_input, - 0, 2, - last_row, last_row+1, - GTK_FILL, GTK_FILL, - 0,0); - if(option->value != NULL) - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(option_input), - (strcmp("yes",option->value)==0)); - add_option_widget(option_input, option); - break; - case OPTION_TYPE_PASSWORD: - label = gtk_label_new_justify_left(option_label); - gtk_table_attach(GTK_TABLE(option_table), label, - 0, 1, - last_row, last_row+1, - GTK_FILL, GTK_FILL, - 0,0); - option_input = gtk_entry_new(); - if(option->value != NULL) - gtk_entry_set_text(GTK_ENTRY(option_input), option->value); - gtk_table_attach(GTK_TABLE(option_table), option_input, - 1, 2, - last_row, last_row+1, - GTK_FILL, GTK_FILL, - 0,0); - gtk_entry_set_visibility(GTK_ENTRY(option_input), 0); - add_option_widget(option_input, option); - last_row++; - GtkWidget *pass_cb = gtk_check_button_new_with_label(_("Show password")); - gtk_table_attach(GTK_TABLE(option_table), pass_cb, - 1, 2, - last_row, last_row+1, - GTK_FILL, GTK_FILL, - 0,0); - g_signal_connect(pass_cb, "toggled", G_CALLBACK(on_show_pass_cb), option_input); - break; - default: - //option_input = gtk_label_new_justify_left("WTF?"); - g_print("unsupported option type\n"); - } - last_row++; - - gtk_widget_show_all(GTK_WIDGET(option_hbox)); -} - -static void add_option(gpointer data, gpointer user_data) -{ - event_option_t * option = (event_option_t *)data; - add_option_to_dialog(option); -} - -static void on_close_event_list_cb(GtkWidget *button, gpointer user_data) -{ - GtkWidget *window = (GtkWidget *)user_data; - gtk_widget_destroy(window); -} - -static event_config_t *get_event_config_from_row(GtkTreeView *treeview) -{ - GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview); - event_config_t *event_config = NULL; - if (selection) - { - GtkTreeIter iter; - GtkTreeModel *store = gtk_tree_view_get_model(treeview); - if (gtk_tree_selection_get_selected(selection, &store, &iter) == TRUE) - { - GValue value = { 0 }; - gtk_tree_model_get_value(store, &iter, COLUMN_EVENT, &value); - event_config = (event_config_t*)g_value_get_pointer(&value); - } - } - return event_config; -} - -static void on_configure_event_cb(GtkWidget *button, gpointer user_data) -{ - GtkTreeView *events_tv = (GtkTreeView *)user_data; - event_config_t *ec = get_event_config_from_row(events_tv); - if(ec != NULL) - show_event_config_dialog(ec); - else - show_error_message(_("Please select a plugin from the list to edit its options.")); -} - -static void on_event_row_activated_cb(GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data) -{ - event_config_t *ec = get_event_config_from_row(treeview); - if(ec->options != NULL) - show_event_config_dialog(ec); -} - -static void on_event_row_changed_cb(GtkTreeView *treeview, gpointer user_data) -{ - event_config_t *ec = get_event_config_from_row(treeview); - gtk_widget_set_sensitive(GTK_WIDGET(user_data), ec->options != NULL); -} - -static void add_event_to_liststore(gpointer key, gpointer value, gpointer user_data) -{ - GtkListStore *events_list_store = (GtkListStore *)user_data; - event_config_t *ec = (event_config_t *)value; - char *event_label = NULL; - if(ec->screen_name != NULL && ec->description != NULL) - event_label = xasprintf("%s\n%s", ec->screen_name, ec->description); - else - //if event has no xml description - event_label = xasprintf("%s\nNo description available", key); - - GtkTreeIter iter; - gtk_list_store_append(events_list_store, &iter); - gtk_list_store_set(events_list_store, &iter, - COLUMN_EVENT_NAME, event_label, - COLUMN_EVENT, value, - -1); -} - -static void save_value_from_widget(gpointer data, gpointer user_data) -{ - option_widget_t *ow = (option_widget_t *)data; - switch(ow->option->type) - { - case OPTION_TYPE_TEXT: - case OPTION_TYPE_NUMBER: - case OPTION_TYPE_PASSWORD: - ow->option->value = xstrdup((char *)gtk_entry_get_text(GTK_ENTRY(ow->widget))); - break; - case OPTION_TYPE_BOOL: - ow->option->value = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ow->widget)) ? xstrdup("yes") : xstrdup("no"); - break; - default: - g_print("unsupported option type\n"); - } - VERB1 log("saved: %s:%s", ow->option->name, ow->option->value); -} - -static void dehydrate_config_dialog() -{ - if(option_widget_list != NULL) - g_list_foreach(option_widget_list, &save_value_from_widget, NULL); -} - -static void show_event_config_dialog(event_config_t* event) -{ - if(option_widget_list != NULL) - { - g_list_free(option_widget_list); - option_widget_list = NULL; - } - - char *title; - if(event->screen_name != NULL) - title = event->screen_name; - else - title = _("Event Configuration"); - - GtkWidget *dialog = gtk_dialog_new_with_buttons( - title, - GTK_WINDOW(parent_dialog), - GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_STOCK_OK, - GTK_RESPONSE_APPLY, - GTK_STOCK_CANCEL, - GTK_RESPONSE_CANCEL, - NULL); - if(parent_dialog != NULL) - { - gtk_window_set_icon_name(GTK_WINDOW(dialog), - gtk_window_get_icon_name(GTK_WINDOW(parent_dialog))); - } - int length = g_list_length(event->options); - option_table = gtk_table_new(length, 2, 0); - g_list_foreach(event->options, &add_option, NULL); - - GtkWidget *content = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); - gtk_box_pack_start(GTK_BOX(content), option_table, false, false, 20); - gtk_widget_show_all(option_table); - int result = gtk_dialog_run(GTK_DIALOG(dialog)); - if(result == GTK_RESPONSE_APPLY) - dehydrate_config_dialog(); - else if(result == GTK_RESPONSE_CANCEL) - g_print("cancel\n"); - gtk_widget_destroy(GTK_WIDGET(dialog)); -} - -void show_events_list_dialog(GtkWindow *parent) -{ - /*remove this line if we want to reload the config - *everytime we show the config dialog - */ - if(g_event_config_list == NULL) - load_event_config_data(); - if(g_event_config_list == NULL) - { - VERB1 log("can't load event's config\n"); - show_error_message(_("Can't load event descriptions")); - return; - } - parent_dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_window_set_title(GTK_WINDOW(parent_dialog), _("Events")); - gtk_window_set_default_size(GTK_WINDOW(parent_dialog), 450, 400); - if(parent != NULL) - { - gtk_window_set_transient_for(GTK_WINDOW(parent_dialog), parent); - // modal = parent window can't steal focus - gtk_window_set_modal(GTK_WINDOW(parent_dialog), true); - gtk_window_set_icon_name(GTK_WINDOW(parent_dialog), - gtk_window_get_icon_name(parent)); - } - - GtkWidget *main_vbox = gtk_vbox_new(0, 0); - GtkWidget *events_scroll = gtk_scrolled_window_new(NULL, NULL); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(events_scroll), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - /* event list treeview */ - GtkWidget *events_tv = gtk_tree_view_new(); - /* column with event name and description */ - GtkCellRenderer *renderer; - GtkTreeViewColumn *column; - - /* add column to tree view */ - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes(_("Event"), - renderer, - "markup", - COLUMN_EVENT_NAME, - NULL); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_sort_column_id(column, COLUMN_EVENT_NAME); - gtk_tree_view_append_column(GTK_TREE_VIEW(events_tv), column); - - /* Create data store for the list and attach it - * COLUMN_EVENT_NAME -> name+description - * COLUMN_EVENT -> event_conf_t* so we can retrieve the event_config from the row - */ - GtkListStore *events_list_store = gtk_list_store_new(NUM_COLUMNS, - G_TYPE_STRING, /* Event name + description */ - G_TYPE_POINTER); - gtk_tree_view_set_model(GTK_TREE_VIEW(events_tv), GTK_TREE_MODEL(events_list_store)); - - g_hash_table_foreach(g_event_config_list, - &add_event_to_liststore, - events_list_store); - - /* Double click/Enter handler */ - g_signal_connect(events_tv, "row-activated", G_CALLBACK(on_event_row_activated_cb), NULL); - - gtk_container_add(GTK_CONTAINER(events_scroll), events_tv); - - GtkWidget *configure_event_btn = gtk_button_new_with_mnemonic(_("Configure E_vent")); - gtk_widget_set_sensitive(configure_event_btn, false); - g_signal_connect(configure_event_btn, "clicked", G_CALLBACK(on_configure_event_cb), events_tv); - g_signal_connect(events_tv, "cursor-changed", G_CALLBACK(on_event_row_changed_cb), configure_event_btn); - - GtkWidget *close_btn = gtk_button_new_from_stock(GTK_STOCK_CLOSE); - g_signal_connect(close_btn, "clicked", G_CALLBACK(on_close_event_list_cb), parent_dialog); - - GtkWidget *btnbox = gtk_hbutton_box_new(); - gtk_box_pack_end(GTK_BOX(btnbox), configure_event_btn, false, false, 0); - gtk_box_pack_end(GTK_BOX(btnbox), close_btn, false, false, 0); - - gtk_box_pack_start(GTK_BOX(main_vbox), events_scroll, true, true, 10); - gtk_box_pack_start(GTK_BOX(main_vbox), btnbox, false, false, 0); - gtk_container_add(GTK_CONTAINER(parent_dialog), main_vbox); - - gtk_widget_show_all(parent_dialog); -} diff --git a/src/gui-gtk/event_config_dialog.h b/src/gui-gtk/event_config_dialog.h deleted file mode 100644 index 1e70e549..00000000 --- a/src/gui-gtk/event_config_dialog.h +++ /dev/null @@ -1 +0,0 @@ -void show_events_list_dialog(GtkWindow *parent); diff --git a/src/include/report/event_config.h b/src/include/report/event_config.h index 75fb0c78..64407b7f 100644 --- a/src/include/report/event_config.h +++ b/src/include/report/event_config.h @@ -58,7 +58,7 @@ void free_event_option(event_option_t *p); //structure to hold the option data typedef struct { - char *screen_name; //name of the event "Bugzilla" "RedHat Support Uploader" + char *screen_name; //ui friendly name of the event "Bugzilla" "RedHat Support Uploader" //char *title; //window title - not used right now, maybe the "name" is enough? //char *action;//action description to show in gui like: Upload report to the Red Hat bugzilla" char *description; // "Report to ...."/"Save to file" -- cgit From 3763e47fe054d46e5b217b4c0704930b3707ffcd Mon Sep 17 00:00:00 2001 From: Jiri Moskovcak Date: Mon, 14 Mar 2011 18:10:23 +0100 Subject: set the default values in report_Bugzilla.xml --- src/plugins/report_Bugzilla.xml | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src') diff --git a/src/plugins/report_Bugzilla.xml b/src/plugins/report_Bugzilla.xml index 0cd1891a..bf1dd82a 100644 --- a/src/plugins/report_Bugzilla.xml +++ b/src/plugins/report_Bugzilla.xml @@ -7,6 +7,7 @@ no Address of the bugzilla server + https://bugzilla.redhat.com Address of the bugzilla server blahblahblah @@ -23,6 +24,7 @@ -- cgit From 1147945856ed4431ab3b49f88c8c0aa11c6ad8e1 Mon Sep 17 00:00:00 2001 From: Jiri Moskovcak Date: Mon, 14 Mar 2011 18:14:07 +0100 Subject: forgot to push the libreportgtk --- src/gtk-helpers/Makefile.am | 23 +++ src/gtk-helpers/abrt-keyring.c | 108 ++++++++++ src/gtk-helpers/event_config_dialog.c | 374 ++++++++++++++++++++++++++++++++++ src/gtk-helpers/libreport-gtk.h | 5 + 4 files changed, 510 insertions(+) create mode 100644 src/gtk-helpers/Makefile.am create mode 100644 src/gtk-helpers/abrt-keyring.c create mode 100644 src/gtk-helpers/event_config_dialog.c create mode 100644 src/gtk-helpers/libreport-gtk.h (limited to 'src') diff --git a/src/gtk-helpers/Makefile.am b/src/gtk-helpers/Makefile.am new file mode 100644 index 00000000..de35d39b --- /dev/null +++ b/src/gtk-helpers/Makefile.am @@ -0,0 +1,23 @@ +# libreportgtk - the stuff shared among gtk clients (abrt-gui, wizard) +lib_LTLIBRARIES = \ + libreportgtk.la + +libreportgtk_la_SOURCES = \ + libreport-gtk.h \ + event_config_dialog.c \ + abrt-keyring.c + +libreportgtk_la_CPPFLAGS = \ + -Wall -Wwrite-strings -Werror \ + -I$(srcdir)/../include/report -I$(srcdir)/../include \ + -I$(srcdir)/../lib \ + $(GTK_CFLAGS) \ + $(GLIB_CFLAGS) \ + $(GNOME_KEYRING_CFLAGS) \ + -D_GNU_SOURCE +libreportgtk_la_LDFLAGS = \ + -version-info 0:1:0 +libreportgtk_la_LIBADD = \ + $(GTK_LIBS) \ + $(GLIB_LIBS) \ + $(GNOME_KEYRING_CFLAGS) diff --git a/src/gtk-helpers/abrt-keyring.c b/src/gtk-helpers/abrt-keyring.c new file mode 100644 index 00000000..6ced7a9d --- /dev/null +++ b/src/gtk-helpers/abrt-keyring.c @@ -0,0 +1,108 @@ +#include +#include +#include +#include "abrtlib.h" + +static char *keyring; + +static guint32 search_item_id(const char *event_name) +{ + GnomeKeyringAttributeList *attrs = gnome_keyring_attribute_list_new(); + GList *found; + //let's hope 0 is not valid item_id + guint32 item_id = 0; + gnome_keyring_attribute_list_append_string(attrs, "libreportEventConfig", event_name); + GnomeKeyringResult result = gnome_keyring_find_items_sync( + GNOME_KEYRING_ITEM_GENERIC_SECRET, + attrs, + &found); + if(result != GNOME_KEYRING_RESULT_OK) + return item_id; + if(found) + { + item_id = ((GnomeKeyringFound *)found->data)->item_id; + gnome_keyring_found_list_free(found); + } + return item_id; +} + +void abrt_keyring_save_settings(const char *event_name, event_config_t *ec) +{ + GList *l; + GnomeKeyringAttributeList *attrs = gnome_keyring_attribute_list_new(); + guint32 item_id; + /* add string id which we use to search for items */ + gnome_keyring_attribute_list_append_string(attrs, "libreportEventConfig", event_name); + for(l = g_list_first(ec->options); l != NULL; l = g_list_next(l)) + { + event_option_t *op = (event_option_t *)l->data; + gnome_keyring_attribute_list_append_string(attrs, op->name, op->value); + } + + GnomeKeyringResult result; + item_id = search_item_id(event_name); + if(item_id) + { + VERB2 log("updating item with id: %i", item_id); + /* found existing item, so just update the values */ + result = gnome_keyring_item_set_attributes_sync(keyring, item_id, attrs); + } + else + { + /* did't find existing item, so create a new one */ + result = gnome_keyring_item_create_sync(keyring, + GNOME_KEYRING_ITEM_GENERIC_SECRET, /* type */ + event_name, /* display name */ + attrs, /* attributes */ + NULL, /* secret - no special handling for password it's stored in attrs */ + 1, /* update if exist */ + &item_id); + VERB2 log("created new item with id: %i", item_id); + } + + if(result != GNOME_KEYRING_RESULT_OK) + { + VERB2 log("error occured, settings is not saved!"); + return; + } + VERB2 log("saved"); +} + +void abrt_keyring_load_settings(const char *event_name, event_config_t *ec) +{ + GnomeKeyringAttributeList *attrs = gnome_keyring_attribute_list_new(); + guint item_id = search_item_id(event_name); + if(!item_id) + return; + GnomeKeyringResult result = gnome_keyring_item_get_attributes_sync( + keyring, + item_id, + &attrs); + VERB2 log("num attrs %i", attrs->len); + if(result != GNOME_KEYRING_RESULT_OK) + return; + guint index; + for(index = 0; index < attrs->len; index++) + { + VERB2 log("load %s", g_array_index(attrs, GnomeKeyringAttribute, index).name); + //VERB2 log("load %s", g_array_index(attrs, GnomeKeyringAttribute, index).value); + } +} + +void init_gnome_keyring() +{ + if(!gnome_keyring_is_available()) + { + VERB2 log("Cannot connect to the Gnome Keyring daemon."); + return; + } + GnomeKeyringResult result = gnome_keyring_get_default_keyring_sync(&keyring); + if(result != GNOME_KEYRING_RESULT_OK || keyring == NULL) + VERB2 log("can't get the default kerying"); + /* + The default keyring might not be set - in that case result = OK, but the + keyring = NULL + use gnome_keyring_list_keyring_names () to list all and pick the first one? + */ + VERB2 log("%s", keyring); +} \ No newline at end of file diff --git a/src/gtk-helpers/event_config_dialog.c b/src/gtk-helpers/event_config_dialog.c new file mode 100644 index 00000000..fa1cfcf6 --- /dev/null +++ b/src/gtk-helpers/event_config_dialog.c @@ -0,0 +1,374 @@ +#include "abrtlib.h" +#include +#include "libreport-gtk.h" + +static GtkWidget *option_table; +static GtkWidget *parent_dialog; +static GList *option_widget_list; +static int last_row = 0; + +enum +{ + COLUMN_EVENT_NAME, + COLUMN_EVENT, + COLUMN_EVENT_BG, + NUM_COLUMNS +}; + +typedef struct +{ + event_option_t *option; + GtkWidget *widget; +} option_widget_t; + +static void show_event_config_dialog(event_config_t* event); + +static void show_error_message(const char* message) +{ + GtkWidget *dialog = gtk_message_dialog_new(NULL, + GTK_DIALOG_MODAL, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_CLOSE, + message + ); + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); +} + +GtkWidget *gtk_label_new_justify_left(const gchar *label_str) +{ + GtkWidget *label = gtk_label_new(label_str); + gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment(GTK_MISC(label), /*xalign:*/ 0, /*yalign:*/ 0.5); + return label; +} + +static void add_option_widget(GtkWidget *widget, event_option_t *option) +{ + option_widget_t *ow = (option_widget_t *)xmalloc(sizeof(option_widget_t)); + ow->widget = widget; + ow->option = option; + option_widget_list = g_list_prepend(option_widget_list, ow); +} + +static void on_show_pass_cb(GtkToggleButton *tb, gpointer user_data) +{ + GtkEntry *entry = (GtkEntry *)user_data; + gtk_entry_set_visibility(entry, gtk_toggle_button_get_active(tb)); +} + +static void add_option_to_dialog(event_option_t *option) +{ + GtkWidget *label; + GtkWidget *option_input; + GtkWidget *option_hbox = gtk_hbox_new(FALSE, 0); + char *option_label; + if(option->label != NULL) + option_label = option->label; + else + option_label = option->name; + + switch(option->type) + { + case OPTION_TYPE_TEXT: + case OPTION_TYPE_NUMBER: + label = gtk_label_new_justify_left(option_label); + gtk_table_attach(GTK_TABLE(option_table), label, + 0, 1, + last_row, last_row+1, + GTK_FILL, GTK_FILL, + 0,0); + option_input = gtk_entry_new(); + if(option->value != NULL) + gtk_entry_set_text(GTK_ENTRY(option_input), option->value); + gtk_table_attach(GTK_TABLE(option_table), option_input, + 1, 2, + last_row, last_row+1, + GTK_FILL, GTK_FILL, + 0,0); + add_option_widget(option_input, option); + break; + case OPTION_TYPE_BOOL: + option_input = gtk_check_button_new_with_label(option_label); + gtk_table_attach(GTK_TABLE(option_table), option_input, + 0, 2, + last_row, last_row+1, + GTK_FILL, GTK_FILL, + 0,0); + if(option->value != NULL) + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(option_input), + (strcmp("yes",option->value)==0)); + add_option_widget(option_input, option); + break; + case OPTION_TYPE_PASSWORD: + label = gtk_label_new_justify_left(option_label); + gtk_table_attach(GTK_TABLE(option_table), label, + 0, 1, + last_row, last_row+1, + GTK_FILL, GTK_FILL, + 0,0); + option_input = gtk_entry_new(); + if(option->value != NULL) + gtk_entry_set_text(GTK_ENTRY(option_input), option->value); + gtk_table_attach(GTK_TABLE(option_table), option_input, + 1, 2, + last_row, last_row+1, + GTK_FILL, GTK_FILL, + 0,0); + gtk_entry_set_visibility(GTK_ENTRY(option_input), 0); + add_option_widget(option_input, option); + last_row++; + GtkWidget *pass_cb = gtk_check_button_new_with_label(_("Show password")); + gtk_table_attach(GTK_TABLE(option_table), pass_cb, + 1, 2, + last_row, last_row+1, + GTK_FILL, GTK_FILL, + 0,0); + g_signal_connect(pass_cb, "toggled", G_CALLBACK(on_show_pass_cb), option_input); + break; + default: + //option_input = gtk_label_new_justify_left("WTF?"); + g_print("unsupported option type\n"); + } + last_row++; + + gtk_widget_show_all(GTK_WIDGET(option_hbox)); +} + +static void add_option(gpointer data, gpointer user_data) +{ + event_option_t * option = (event_option_t *)data; + add_option_to_dialog(option); +} + +static void on_close_event_list_cb(GtkWidget *button, gpointer user_data) +{ + GtkWidget *window = (GtkWidget *)user_data; + gtk_widget_destroy(window); +} + +static event_config_t *get_event_config_from_row(GtkTreeView *treeview) +{ + GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview); + event_config_t *event_config = NULL; + if (selection) + { + GtkTreeIter iter; + GtkTreeModel *store = gtk_tree_view_get_model(treeview); + if (gtk_tree_selection_get_selected(selection, &store, &iter) == TRUE) + { + GValue value = { 0 }; + gtk_tree_model_get_value(store, &iter, COLUMN_EVENT, &value); + event_config = (event_config_t*)g_value_get_pointer(&value); + } + } + return event_config; +} + +static void on_configure_event_cb(GtkWidget *button, gpointer user_data) +{ + GtkTreeView *events_tv = (GtkTreeView *)user_data; + event_config_t *ec = get_event_config_from_row(events_tv); + if(ec != NULL) + show_event_config_dialog(ec); + else + show_error_message(_("Please select a plugin from the list to edit its options.")); +} + +static void on_event_row_activated_cb(GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data) +{ + event_config_t *ec = get_event_config_from_row(treeview); + if(ec->options != NULL) + show_event_config_dialog(ec); +} + +static void on_event_row_changed_cb(GtkTreeView *treeview, gpointer user_data) +{ + event_config_t *ec = get_event_config_from_row(treeview); + gtk_widget_set_sensitive(GTK_WIDGET(user_data), ec->options != NULL); +} + +static void add_event_to_liststore(gpointer key, gpointer value, gpointer user_data) +{ + static bool grey_bg = false; + GtkListStore *events_list_store = (GtkListStore *)user_data; + event_config_t *ec = (event_config_t *)value; + char *event_label = NULL; + if(ec->screen_name != NULL && ec->description != NULL) + event_label = xasprintf("%s\n%s", ec->screen_name, ec->description); + else + //if event has no xml description + event_label = xasprintf("%s\nNo description available", key); + + GtkTreeIter iter; + gtk_list_store_append(events_list_store, &iter); + gtk_list_store_set(events_list_store, &iter, + COLUMN_EVENT_NAME, event_label, + COLUMN_EVENT, value, + COLUMN_EVENT_BG, grey_bg ? "#EEEEEE" : "#FFFFFF", + -1); + grey_bg = !grey_bg; +} + +static void save_value_from_widget(gpointer data, gpointer user_data) +{ + option_widget_t *ow = (option_widget_t *)data; + switch(ow->option->type) + { + case OPTION_TYPE_TEXT: + case OPTION_TYPE_NUMBER: + case OPTION_TYPE_PASSWORD: + ow->option->value = xstrdup((char *)gtk_entry_get_text(GTK_ENTRY(ow->widget))); + break; + case OPTION_TYPE_BOOL: + ow->option->value = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ow->widget)) ? xstrdup("yes") : xstrdup("no"); + break; + default: + g_print("unsupported option type\n"); + } + VERB1 log("saved: %s:%s", ow->option->name, ow->option->value); +} + +static void dehydrate_config_dialog() +{ + if(option_widget_list != NULL) + g_list_foreach(option_widget_list, &save_value_from_widget, NULL); +} + +static void show_event_config_dialog(event_config_t* event) +{ + if(option_widget_list != NULL) + { + g_list_free(option_widget_list); + option_widget_list = NULL; + } + + char *title; + if(event->screen_name != NULL) + title = event->screen_name; + else + title = _("Event Configuration"); + + GtkWidget *dialog = gtk_dialog_new_with_buttons( + title, + GTK_WINDOW(parent_dialog), + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_OK, + GTK_RESPONSE_APPLY, + GTK_STOCK_CANCEL, + GTK_RESPONSE_CANCEL, + NULL); + if(parent_dialog != NULL) + { + gtk_window_set_icon_name(GTK_WINDOW(dialog), + gtk_window_get_icon_name(GTK_WINDOW(parent_dialog))); + } + int length = g_list_length(event->options); + option_table = gtk_table_new(length, 2, 0); + g_list_foreach(event->options, &add_option, NULL); + + GtkWidget *content = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); + gtk_box_pack_start(GTK_BOX(content), option_table, false, false, 20); + gtk_widget_show_all(option_table); + int result = gtk_dialog_run(GTK_DIALOG(dialog)); + if(result == GTK_RESPONSE_APPLY) + { + dehydrate_config_dialog(); + abrt_keyring_save_settings(event); + } + else if(result == GTK_RESPONSE_CANCEL) + g_print("cancel\n"); + gtk_widget_destroy(GTK_WIDGET(dialog)); +} + +void show_events_list_dialog(GtkWindow *parent) +{ + /*remove this line if we want to reload the config + *everytime we show the config dialog + */ + if(g_event_config_list == NULL) + { + load_event_config_data(); + //load_event_config_data_from_keyring(); + } + if(g_event_config_list == NULL) + { + VERB1 log("can't load event's config\n"); + show_error_message(_("Can't load event descriptions")); + return; + } + parent_dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_title(GTK_WINDOW(parent_dialog), _("Events")); + gtk_window_set_default_size(GTK_WINDOW(parent_dialog), 450, 400); + if(parent != NULL) + { + gtk_window_set_transient_for(GTK_WINDOW(parent_dialog), parent); + // modal = parent window can't steal focus + gtk_window_set_modal(GTK_WINDOW(parent_dialog), true); + gtk_window_set_icon_name(GTK_WINDOW(parent_dialog), + gtk_window_get_icon_name(parent)); + } + + GtkWidget *main_vbox = gtk_vbox_new(0, 0); + GtkWidget *events_scroll = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(events_scroll), + GTK_POLICY_NEVER, + GTK_POLICY_AUTOMATIC); + /* event list treeview */ + GtkWidget *events_tv = gtk_tree_view_new(); + /* column with event name and description */ + GtkCellRenderer *renderer; + GtkTreeViewColumn *column; + + /* add column to tree view */ + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes(_("Event"), + renderer, + "markup", + COLUMN_EVENT_NAME, + "background", + COLUMN_EVENT_BG, + NULL); + gtk_tree_view_column_set_resizable(column, TRUE); + g_object_set(G_OBJECT(renderer), "wrap-mode", PANGO_WRAP_WORD, NULL); + g_object_set(G_OBJECT(renderer), "wrap-width", 440, NULL); + gtk_tree_view_column_set_sort_column_id(column, COLUMN_EVENT_NAME); + gtk_tree_view_append_column(GTK_TREE_VIEW(events_tv), column); + + /* Create data store for the list and attach it + * COLUMN_EVENT_NAME -> name+description + * COLUMN_EVENT -> event_conf_t* so we can retrieve the event_config from the row + */ + GtkListStore *events_list_store = gtk_list_store_new(NUM_COLUMNS, + G_TYPE_STRING, /* Event name + description */ + G_TYPE_POINTER, + G_TYPE_STRING); + gtk_tree_view_set_model(GTK_TREE_VIEW(events_tv), GTK_TREE_MODEL(events_list_store)); + + g_hash_table_foreach(g_event_config_list, + &add_event_to_liststore, + events_list_store); + + /* Double click/Enter handler */ + g_signal_connect(events_tv, "row-activated", G_CALLBACK(on_event_row_activated_cb), NULL); + + gtk_container_add(GTK_CONTAINER(events_scroll), events_tv); + + GtkWidget *configure_event_btn = gtk_button_new_with_mnemonic(_("Configure E_vent")); + gtk_widget_set_sensitive(configure_event_btn, false); + g_signal_connect(configure_event_btn, "clicked", G_CALLBACK(on_configure_event_cb), events_tv); + g_signal_connect(events_tv, "cursor-changed", G_CALLBACK(on_event_row_changed_cb), configure_event_btn); + + GtkWidget *close_btn = gtk_button_new_from_stock(GTK_STOCK_CLOSE); + g_signal_connect(close_btn, "clicked", G_CALLBACK(on_close_event_list_cb), parent_dialog); + + GtkWidget *btnbox = gtk_hbutton_box_new(); + gtk_box_pack_end(GTK_BOX(btnbox), configure_event_btn, false, false, 0); + gtk_box_pack_end(GTK_BOX(btnbox), close_btn, false, false, 0); + + gtk_box_pack_start(GTK_BOX(main_vbox), events_scroll, true, true, 10); + gtk_box_pack_start(GTK_BOX(main_vbox), btnbox, false, false, 0); + gtk_container_add(GTK_CONTAINER(parent_dialog), main_vbox); + + gtk_widget_show_all(parent_dialog); +} diff --git a/src/gtk-helpers/libreport-gtk.h b/src/gtk-helpers/libreport-gtk.h new file mode 100644 index 00000000..776e84e3 --- /dev/null +++ b/src/gtk-helpers/libreport-gtk.h @@ -0,0 +1,5 @@ +void show_events_list_dialog(GtkWindow *parent); +void load_event_config_data_from_keyring(); +void abrt_keyring_save_settings(event_config_t *ec); +void abrt_keyring_load_settings(event_config_t *ec); +void init_gnome_keyring(); -- cgit From c3295e8741d5f35e30301933bd853bf6c9369588 Mon Sep 17 00:00:00 2001 From: Jiri Moskovcak Date: Mon, 14 Mar 2011 21:42:44 +0100 Subject: abrt-gui: save event settings in gnome keyring --- src/gtk-helpers/abrt-keyring.c | 39 ++++++++++++++++++++--- src/gtk-helpers/event_config_dialog.c | 59 ++++++++++++++++++----------------- src/gtk-helpers/libreport-gtk.h | 4 +-- src/include/report/event_config.h | 1 + src/lib/event_config.c | 8 +++++ 5 files changed, 76 insertions(+), 35 deletions(-) (limited to 'src') diff --git a/src/gtk-helpers/abrt-keyring.c b/src/gtk-helpers/abrt-keyring.c index 6ced7a9d..50bfa7e3 100644 --- a/src/gtk-helpers/abrt-keyring.c +++ b/src/gtk-helpers/abrt-keyring.c @@ -26,11 +26,12 @@ static guint32 search_item_id(const char *event_name) return item_id; } -void abrt_keyring_save_settings(const char *event_name, event_config_t *ec) +void abrt_keyring_save_settings(const char *event_name) { GList *l; GnomeKeyringAttributeList *attrs = gnome_keyring_attribute_list_new(); guint32 item_id; + event_config_t *ec = get_event_config(event_name); /* add string id which we use to search for items */ gnome_keyring_attribute_list_append_string(attrs, "libreportEventConfig", event_name); for(l = g_list_first(ec->options); l != NULL; l = g_list_next(l)) @@ -68,7 +69,7 @@ void abrt_keyring_save_settings(const char *event_name, event_config_t *ec) VERB2 log("saved"); } -void abrt_keyring_load_settings(const char *event_name, event_config_t *ec) +static void abrt_keyring_load_settings(const char *event_name, event_config_t *ec) { GnomeKeyringAttributeList *attrs = gnome_keyring_attribute_list_new(); guint item_id = search_item_id(event_name); @@ -82,15 +83,25 @@ void abrt_keyring_load_settings(const char *event_name, event_config_t *ec) if(result != GNOME_KEYRING_RESULT_OK) return; guint index; + for(index = 0; index < attrs->len; index++) { - VERB2 log("load %s", g_array_index(attrs, GnomeKeyringAttribute, index).name); + char *name = g_array_index(attrs, GnomeKeyringAttribute, index).name; +VERB2 log("load %s", name); + event_option_t *option = get_event_option_from_list(name, ec->options); + if(option) + option->value = g_array_index(attrs, GnomeKeyringAttribute, index).value.string; +VERB2 log("loaded %s", name); //VERB2 log("load %s", g_array_index(attrs, GnomeKeyringAttribute, index).value); + } } -void init_gnome_keyring() +static void init_keyring() { + //called again? + if(keyring) + return; if(!gnome_keyring_is_available()) { VERB2 log("Cannot connect to the Gnome Keyring daemon."); @@ -105,4 +116,24 @@ void init_gnome_keyring() use gnome_keyring_list_keyring_names () to list all and pick the first one? */ VERB2 log("%s", keyring); +} + +void load_event_config(gpointer key, gpointer value, gpointer user_data) +{ + char* event_name = (char*)key; + event_config_t *ec = (event_config_t *)value; +VERB2 log("from keyring loading: %s\n", event_name); + abrt_keyring_load_settings(event_name, ec); + +} + +/* + * Tries to load settings for all events in g_event_config_list +*/ +void load_event_config_data_from_keyring() +{ + init_keyring(); + if(!keyring) + return; + g_hash_table_foreach(g_event_config_list, &load_event_config, NULL); } \ No newline at end of file diff --git a/src/gtk-helpers/event_config_dialog.c b/src/gtk-helpers/event_config_dialog.c index fa1cfcf6..cdfcb844 100644 --- a/src/gtk-helpers/event_config_dialog.c +++ b/src/gtk-helpers/event_config_dialog.c @@ -9,8 +9,8 @@ static int last_row = 0; enum { + COLUMN_EVENT_UINAME, COLUMN_EVENT_NAME, - COLUMN_EVENT, COLUMN_EVENT_BG, NUM_COLUMNS }; @@ -21,16 +21,17 @@ typedef struct GtkWidget *widget; } option_widget_t; -static void show_event_config_dialog(event_config_t* event); +static void show_event_config_dialog(const char *event_name); -static void show_error_message(const char* message) +static void show_error_message(const char* message, GtkWindow *parent) { - GtkWidget *dialog = gtk_message_dialog_new(NULL, + GtkWidget *dialog = gtk_message_dialog_new(parent, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, message ); + gtk_window_set_icon_name(GTK_WINDOW(dialog), "abrt"); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); } @@ -147,10 +148,10 @@ static void on_close_event_list_cb(GtkWidget *button, gpointer user_data) gtk_widget_destroy(window); } -static event_config_t *get_event_config_from_row(GtkTreeView *treeview) +static char *get_event_name_from_row(GtkTreeView *treeview) { GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview); - event_config_t *event_config = NULL; + char *event_name = NULL; if (selection) { GtkTreeIter iter; @@ -158,33 +159,34 @@ static event_config_t *get_event_config_from_row(GtkTreeView *treeview) if (gtk_tree_selection_get_selected(selection, &store, &iter) == TRUE) { GValue value = { 0 }; - gtk_tree_model_get_value(store, &iter, COLUMN_EVENT, &value); - event_config = (event_config_t*)g_value_get_pointer(&value); + gtk_tree_model_get_value(store, &iter, COLUMN_EVENT_NAME, &value); + event_name = (char *)g_value_get_string(&value); } } - return event_config; + return event_name; } static void on_configure_event_cb(GtkWidget *button, gpointer user_data) { GtkTreeView *events_tv = (GtkTreeView *)user_data; - event_config_t *ec = get_event_config_from_row(events_tv); - if(ec != NULL) - show_event_config_dialog(ec); + char *event_name = get_event_name_from_row(events_tv); + if(event_name != NULL) + show_event_config_dialog(event_name); else - show_error_message(_("Please select a plugin from the list to edit its options.")); + show_error_message(_("Please select a plugin from the list to edit its options."), NULL); } static void on_event_row_activated_cb(GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data) { - event_config_t *ec = get_event_config_from_row(treeview); - if(ec->options != NULL) - show_event_config_dialog(ec); + char *event_name = get_event_name_from_row(treeview); + event_config_t *ec = get_event_config(event_name); + if(ec->options != NULL) //We need to have some options to show + show_event_config_dialog(event_name); } static void on_event_row_changed_cb(GtkTreeView *treeview, gpointer user_data) { - event_config_t *ec = get_event_config_from_row(treeview); + event_config_t *ec = get_event_config(get_event_name_from_row(treeview)); gtk_widget_set_sensitive(GTK_WIDGET(user_data), ec->options != NULL); } @@ -203,8 +205,8 @@ static void add_event_to_liststore(gpointer key, gpointer value, gpointer user_d GtkTreeIter iter; gtk_list_store_append(events_list_store, &iter); gtk_list_store_set(events_list_store, &iter, - COLUMN_EVENT_NAME, event_label, - COLUMN_EVENT, value, + COLUMN_EVENT_UINAME, event_label, + COLUMN_EVENT_NAME, key, COLUMN_EVENT_BG, grey_bg ? "#EEEEEE" : "#FFFFFF", -1); grey_bg = !grey_bg; @@ -235,7 +237,7 @@ static void dehydrate_config_dialog() g_list_foreach(option_widget_list, &save_value_from_widget, NULL); } -static void show_event_config_dialog(event_config_t* event) +static void show_event_config_dialog(const char *event_name) { if(option_widget_list != NULL) { @@ -243,6 +245,7 @@ static void show_event_config_dialog(event_config_t* event) option_widget_list = NULL; } + event_config_t *event = get_event_config(event_name); char *title; if(event->screen_name != NULL) title = event->screen_name; @@ -274,7 +277,7 @@ static void show_event_config_dialog(event_config_t* event) if(result == GTK_RESPONSE_APPLY) { dehydrate_config_dialog(); - abrt_keyring_save_settings(event); + abrt_keyring_save_settings(event_name); } else if(result == GTK_RESPONSE_CANCEL) g_print("cancel\n"); @@ -289,12 +292,12 @@ void show_events_list_dialog(GtkWindow *parent) if(g_event_config_list == NULL) { load_event_config_data(); - //load_event_config_data_from_keyring(); + load_event_config_data_from_keyring(); } if(g_event_config_list == NULL) { VERB1 log("can't load event's config\n"); - show_error_message(_("Can't load event descriptions")); + show_error_message(_("Can't load event descriptions"), parent); return; } parent_dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL); @@ -325,7 +328,7 @@ void show_events_list_dialog(GtkWindow *parent) column = gtk_tree_view_column_new_with_attributes(_("Event"), renderer, "markup", - COLUMN_EVENT_NAME, + COLUMN_EVENT_UINAME, "background", COLUMN_EVENT_BG, NULL); @@ -336,13 +339,13 @@ void show_events_list_dialog(GtkWindow *parent) gtk_tree_view_append_column(GTK_TREE_VIEW(events_tv), column); /* Create data store for the list and attach it - * COLUMN_EVENT_NAME -> name+description - * COLUMN_EVENT -> event_conf_t* so we can retrieve the event_config from the row + * COLUMN_EVENT_UINAME -> name+description + * COLUMN_EVENT_NAME -> event name so we can retrieve it from the row */ GtkListStore *events_list_store = gtk_list_store_new(NUM_COLUMNS, G_TYPE_STRING, /* Event name + description */ - G_TYPE_POINTER, - G_TYPE_STRING); + G_TYPE_STRING, /* event name */ + G_TYPE_STRING);/* bg color */ gtk_tree_view_set_model(GTK_TREE_VIEW(events_tv), GTK_TREE_MODEL(events_list_store)); g_hash_table_foreach(g_event_config_list, diff --git a/src/gtk-helpers/libreport-gtk.h b/src/gtk-helpers/libreport-gtk.h index 776e84e3..a916113e 100644 --- a/src/gtk-helpers/libreport-gtk.h +++ b/src/gtk-helpers/libreport-gtk.h @@ -1,5 +1,3 @@ void show_events_list_dialog(GtkWindow *parent); +void abrt_keyring_save_settings(const char *event_name); void load_event_config_data_from_keyring(); -void abrt_keyring_save_settings(event_config_t *ec); -void abrt_keyring_load_settings(event_config_t *ec); -void init_gnome_keyring(); diff --git a/src/include/report/event_config.h b/src/include/report/event_config.h index 64407b7f..75f357dc 100644 --- a/src/include/report/event_config.h +++ b/src/include/report/event_config.h @@ -76,6 +76,7 @@ void load_event_config_data(void); /* Frees all loaded data */ void free_event_config_data(void); event_config_t *get_event_config(const char *event_name); +event_option_t *get_event_option_from_list(const char *option_name, GList *event_options); extern GHashTable *g_event_config_list; // for iterating through entire list of all loaded configs diff --git a/src/lib/event_config.c b/src/lib/event_config.c index 0f5c0f62..313c0f6a 100644 --- a/src/lib/event_config.c +++ b/src/lib/event_config.c @@ -44,6 +44,14 @@ static int cmp_event_option_name_with_string(gconstpointer a, gconstpointer b) return strcmp(((event_option_t *)a)->name, (char *)b); } +event_option_t *get_event_option_from_list(const char *name, GList *options) +{ + GList *elem = g_list_find_custom(options, name, &cmp_event_option_name_with_string); + if(elem) + return (event_option_t *)elem->data; + return NULL; +} + /* (Re)loads data from /etc/abrt/events/foo.{xml,conf} */ void load_event_config_data(void) { -- cgit