[libreport/f20] bug fixes

Jakub Filak jfilak at fedoraproject.org
Mon Feb 16 10:06:54 UTC 2015


commit 5cd6072f9f23546b660355a2fe284478452c47e6
Author: Jakub Filak <jfilak at redhat.com>
Date:   Mon Feb 16 10:26:30 2015 +0100

    bug fixes
    
    Resolves: #1153760, #1153479, #1168523
    
    Signed-off-by: Jakub Filak <jfilak at redhat.com>

 ...inate-event-chain-after-the-emergency-ana.patch |   38 +
 0022-gui-use-symbolic-icons.patch                  |   91 +++
 0023-gui-Problem-Details-suite.patch               |  751 ++++++++++++++++++++
 0024-gui-port-to-Problem-Details-suite.patch       |  168 +++++
 0026-gui-fix-build-with-older-gtk.patch            |   48 ++
 ...-wizard-don-t-work-with-destroyed-widgets.patch |  111 +++
 ...d-make-report-gtk-s-application-nonunique.patch |   28 +
 ...illa-bug-formating-for-libreport-analyzer.patch |  242 +++++++
 0031-man_page-corrected-man-pages.patch            |   50 ++
 0032-doc-updated-manpages-reporter.patch           |  171 +++++
 0033-anaconda-auto-remove-rootpw-lines.patch       |   40 +
 ...rd-put-rootpw-on-the-forbidden-words-list.patch |   27 +
 0035-problem_data-make-ks.cfg-file-editable.patch  |   45 ++
 ...rk-anaconda-tb-as-editable-file-and-remov.patch |   74 ++
 ...-to-reduce-false-positive-sensitive-words.patch |   65 ++
 libreport.spec                                     |   53 ++-
 16 files changed, 1990 insertions(+), 12 deletions(-)
---
diff --git a/0021-wizard-terminate-event-chain-after-the-emergency-ana.patch b/0021-wizard-terminate-event-chain-after-the-emergency-ana.patch
new file mode 100644
index 0000000..8696671
--- /dev/null
+++ b/0021-wizard-terminate-event-chain-after-the-emergency-ana.patch
@@ -0,0 +1,38 @@
+From ac5caa31a929c3ed9cf2950c95333aa79a979f3b Mon Sep 17 00:00:00 2001
+From: Jakub Filak <jfilak at redhat.com>
+Date: Tue, 26 Aug 2014 12:51:19 +0200
+Subject: [LIBREPORT PATCH] wizard: terminate event chain after the emergency
+ analysis
+
+Resolves rhbz#1133549
+Related to rhbz#1069917
+
+Signed-off-by: Jakub Filak <jfilak at redhat.com>
+---
+ src/gui-wizard-gtk/wizard.c | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+diff --git a/src/gui-wizard-gtk/wizard.c b/src/gui-wizard-gtk/wizard.c
+index e4718bf..5779052 100644
+--- a/src/gui-wizard-gtk/wizard.c
++++ b/src/gui-wizard-gtk/wizard.c
+@@ -1752,6 +1752,16 @@ static bool event_need_review(const char *event_name)
+ 
+ static void on_btn_failed_cb(GtkButton *button)
+ {
++    /* Since the Repeat button has been introduced, the event chain isn't
++     * terminated upon a failure in order to be able to continue in processing
++     * in the retry action.
++     *
++     * Now, user decided to run the emergency analysis instead of trying to
++     * reconfigure libreport, so we have to terminate the event chain.
++     */
++    gtk_widget_hide(g_btn_repeat);
++    terminate_event_chain(TERMINATE_NOFLAGS);
++
+     /* Show detailed log */
+     gtk_expander_set_expanded(g_exp_report_log, TRUE);
+ 
+-- 
+1.8.3.1
+
diff --git a/0022-gui-use-symbolic-icons.patch b/0022-gui-use-symbolic-icons.patch
new file mode 100644
index 0000000..f313f18
--- /dev/null
+++ b/0022-gui-use-symbolic-icons.patch
@@ -0,0 +1,91 @@
+From 0d3bb6e322592ebce330af756593a2a92bae4a8c Mon Sep 17 00:00:00 2001
+From: Jakub Filak <jfilak at redhat.com>
+Date: Tue, 26 Aug 2014 22:36:30 +0200
+Subject: [LIBREPORT PATCH] gui: use -symbolic icons
+
+Related to abrt/gnome-abrt#72
+
+Signed-off-by: Jakub Filak <jfilak at redhat.com>
+---
+ src/gui-wizard-gtk/wizard.c     | 10 +++++-----
+ src/gui-wizard-gtk/wizard.glade |  8 ++++----
+ 2 files changed, 9 insertions(+), 9 deletions(-)
+
+diff --git a/src/gui-wizard-gtk/wizard.c b/src/gui-wizard-gtk/wizard.c
+index 5779052..525d275 100644
+--- a/src/gui-wizard-gtk/wizard.c
++++ b/src/gui-wizard-gtk/wizard.c
+@@ -3494,17 +3494,17 @@ void create_assistant(GtkApplication *app, bool expert_mode)
+     gtk_notebook_set_show_tabs(g_assistant, (g_verbose != 0 && g_expert_mode));
+ 
+     g_btn_close = gtk_button_new_with_mnemonic(_("_Close"));
+-    gtk_button_set_image(GTK_BUTTON(g_btn_close), gtk_image_new_from_icon_name("window-close", GTK_ICON_SIZE_BUTTON));
++    gtk_button_set_image(GTK_BUTTON(g_btn_close), gtk_image_new_from_icon_name("window-close-symbolic", GTK_ICON_SIZE_BUTTON));
+     g_btn_stop = gtk_button_new_with_mnemonic(_("_Stop"));
+-    gtk_button_set_image(GTK_BUTTON(g_btn_stop), gtk_image_new_from_icon_name("process-close", GTK_ICON_SIZE_BUTTON));
++    gtk_button_set_image(GTK_BUTTON(g_btn_stop), gtk_image_new_from_icon_name("process-close-symbolic", GTK_ICON_SIZE_BUTTON));
+     gtk_widget_set_no_show_all(g_btn_stop, true); /* else gtk_widget_hide won't work */
+     g_btn_onfail = gtk_button_new_with_label(_("Upload for analysis"));
+-    gtk_button_set_image(GTK_BUTTON(g_btn_onfail), gtk_image_new_from_icon_name("go-up", GTK_ICON_SIZE_BUTTON));
++    gtk_button_set_image(GTK_BUTTON(g_btn_onfail), gtk_image_new_from_icon_name("go-up-symbolic", GTK_ICON_SIZE_BUTTON));
+     gtk_widget_set_no_show_all(g_btn_onfail, true); /* else gtk_widget_hide won't work */
+     g_btn_repeat = gtk_button_new_with_label(_("Repeat"));
+     gtk_widget_set_no_show_all(g_btn_repeat, true); /* else gtk_widget_hide won't work */
+     g_btn_next = gtk_button_new_with_mnemonic(_("_Forward"));
+-    gtk_button_set_image(GTK_BUTTON(g_btn_next), gtk_image_new_from_icon_name("go-next", GTK_ICON_SIZE_BUTTON));
++    gtk_button_set_image(GTK_BUTTON(g_btn_next), gtk_image_new_from_icon_name("go-next-symbolic", GTK_ICON_SIZE_BUTTON));
+     gtk_widget_set_no_show_all(g_btn_next, true); /* else gtk_widget_hide won't work */
+ 
+     g_box_buttons = GTK_BOX(gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0));
+@@ -3530,7 +3530,7 @@ void create_assistant(GtkApplication *app, bool expert_mode)
+         gtk_widget_set_visible(GTK_WIDGET(vbox), TRUE);
+         gtk_box_pack_start(vbox, GTK_WIDGET(g_box_warning_labels), false, false, 5);
+ 
+-        GtkWidget *image = gtk_image_new_from_icon_name("dialog-warning", GTK_ICON_SIZE_DIALOG);
++        GtkWidget *image = gtk_image_new_from_icon_name("dialog-warning-symbolic", GTK_ICON_SIZE_DIALOG);
+         gtk_widget_set_visible(image, TRUE);
+ 
+         g_widget_warnings_area = GTK_WIDGET(gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0));
+diff --git a/src/gui-wizard-gtk/wizard.glade b/src/gui-wizard-gtk/wizard.glade
+index 854a402..b0953db 100644
+--- a/src/gui-wizard-gtk/wizard.glade
++++ b/src/gui-wizard-gtk/wizard.glade
+@@ -5,7 +5,7 @@
+   <object class="GtkImage" id="image1">
+     <property name="visible">True</property>
+     <property name="can_focus">False</property>
+-    <property name="icon_name">media-record</property>
++    <property name="icon_name">media-record-symbolic</property>
+   </object>
+   <object class="GtkListStore" id="ls_sensitive_words">
+     <columns>
+@@ -133,7 +133,7 @@
+                             <property name="can_focus">True</property>
+                             <property name="has_tooltip">True</property>
+                             <property name="invisible_char">●</property>
+-                            <property name="secondary_icon_name">edit-find</property>
++                            <property name="secondary_icon_name">edit-find-symbolic</property>
+                             <property name="primary_icon_activatable">False</property>
+                             <property name="secondary_icon_tooltip_text" translatable="yes">Clear the search bar to see the list of security sensitive words.</property>
+                             <property name="secondary_icon_tooltip_markup" translatable="yes">Clear the search bar to see the list of security sensitive words.</property>
+@@ -244,7 +244,7 @@
+                 <property name="visible">True</property>
+                 <property name="can_focus">False</property>
+                 <property name="margin_start">4</property>
+-                <property name="icon_name">media-record</property>
++                <property name="icon_name">media-record-symbolic</property>
+                 <property name="icon_size">1</property>
+               </object>
+               <packing>
+@@ -761,7 +761,7 @@
+               <object class="GtkImage" id="img_process_fail">
+                 <property name="can_focus">False</property>
+                 <property name="no_show_all">True</property>
+-                <property name="icon_name">dialog-error</property>
++                <property name="icon_name">dialog-error-symbolic</property>
+                 <property name="icon_size">1</property>
+               </object>
+               <packing>
+-- 
+1.8.3.1
+
diff --git a/0023-gui-Problem-Details-suite.patch b/0023-gui-Problem-Details-suite.patch
new file mode 100644
index 0000000..38a4fa0
--- /dev/null
+++ b/0023-gui-Problem-Details-suite.patch
@@ -0,0 +1,751 @@
+From 136dfd3c7ccf2d3235ec69db4eb9af00b364ba8c Mon Sep 17 00:00:00 2001
+From: Jakub Filak <jfilak at redhat.com>
+Date: Mon, 25 Aug 2014 17:18:02 +0200
+Subject: [LIBREPORT PATCH] gui: Problem Details suite
+
++ ProblemDetailsWidget
++ ProblemDetailsDialog
+
+Related to abrt/gnome-abrt#64
+
+Signed-off-by: Jakub Filak <jfilak at redhat.com>
+---
+ po/POTFILES.in                           |   2 +
+ src/gtk-helpers/Makefile.am              |  10 +-
+ src/gtk-helpers/internal_libreport_gtk.h |   6 +
+ src/gtk-helpers/problem_details_dialog.c |  80 +++++++
+ src/gtk-helpers/problem_details_dialog.h |  37 +++
+ src/gtk-helpers/problem_details_widget.c | 375 +++++++++++++++++++++++++++++++
+ src/gtk-helpers/problem_details_widget.h |  62 +++++
+ src/gtk-helpers/utils.c                  |  25 +++
+ src/gui-wizard-gtk/wizard.c              |  21 +-
+ 9 files changed, 596 insertions(+), 22 deletions(-)
+ create mode 100644 src/gtk-helpers/problem_details_dialog.c
+ create mode 100644 src/gtk-helpers/problem_details_dialog.h
+ create mode 100644 src/gtk-helpers/problem_details_widget.c
+ create mode 100644 src/gtk-helpers/problem_details_widget.h
+ create mode 100644 src/gtk-helpers/utils.c
+
+diff --git a/po/POTFILES.in b/po/POTFILES.in
+index 4a0b565..c599dab 100644
+--- a/po/POTFILES.in
++++ b/po/POTFILES.in
+@@ -10,6 +10,8 @@ src/gtk-helpers/config_dialog.c
+ src/gtk-helpers/event_config_dialog.c
+ src/gtk-helpers/secrets.c
+ src/gtk-helpers/workflow_config_dialog.c
++src/gtk-helpers/problem_details_widget.c
++src/gtk-helpers/problem_details_dialog.c
+ src/gui-wizard-gtk/main.c
+ src/gui-wizard-gtk/wizard.c
+ src/gui-wizard-gtk/wizard.glade
+diff --git a/src/gtk-helpers/Makefile.am b/src/gtk-helpers/Makefile.am
+index 13b9072..a7cc554 100644
+--- a/src/gtk-helpers/Makefile.am
++++ b/src/gtk-helpers/Makefile.am
+@@ -3,12 +3,15 @@ libreport_gtk_includedir = \
+     $(includedir)/libreport
+ 
+ libreport_gtk_include_HEADERS = \
+-    internal_libreport_gtk.h
++    internal_libreport_gtk.h \
++    problem_details_widget.h \
++    problem_details_dialog.h
+ 
+ lib_LTLIBRARIES = \
+     libreport-gtk.la
+ 
+ libreport_gtk_la_SOURCES = \
++    utils.c \
+     event_config_dialog.c \
+     secrets.c \
+     hyperlinks.c \
+@@ -16,11 +19,14 @@ libreport_gtk_la_SOURCES = \
+     workflow_config_dialog.c \
+     config_dialog.c \
+     ask_dialogs.c \
+-    search_item.c search_item.h
++    search_item.c search_item.h \
++    problem_details_widget.c problem_details_widget.h \
++    problem_details_dialog.c problem_details_dialog.h
+ 
+ libreport_gtk_la_CPPFLAGS = \
+     -I$(srcdir)/../include \
+     -I$(srcdir)/../lib \
++    -Wno-error=unused-local-typedefs \
+     $(GTK_CFLAGS) \
+     $(GLIB_CFLAGS) \
+     $(GIO_CFLAGS) \
+diff --git a/src/gtk-helpers/internal_libreport_gtk.h b/src/gtk-helpers/internal_libreport_gtk.h
+index f8f1c13..57f5889 100644
+--- a/src/gtk-helpers/internal_libreport_gtk.h
++++ b/src/gtk-helpers/internal_libreport_gtk.h
+@@ -20,6 +20,8 @@
+ #define INTERNAL_LIBREPORT_GTK_H_
+ 
+ #include <gtk/gtk.h>
++#include "problem_details_dialog.h"
++#include "problem_details_widget.h"
+ #include "report.h"
+ #include "internal_libreport.h"
+ 
+@@ -96,6 +98,10 @@ struct url_token
+ #define find_url_tokens libreport_find_url_tokens
+ GList *find_url_tokens(const char *line);
+ 
++
++#define reload_text_to_text_view libreport_reload_text_to_text_view
++void reload_text_to_text_view(GtkTextView *tv, const char *text);
++
+ /* Ask dialogs */
+ 
+ /*
+diff --git a/src/gtk-helpers/problem_details_dialog.c b/src/gtk-helpers/problem_details_dialog.c
+new file mode 100644
+index 0000000..dc2362e
+--- /dev/null
++++ b/src/gtk-helpers/problem_details_dialog.c
+@@ -0,0 +1,80 @@
++/*
++    Copyright (C) 2014  ABRT Team
++    Copyright (C) 2014  RedHat inc.
++
++    This program is free software; you can redistribute it and/or modify
++    it under the terms of the GNU General Public License as published by
++    the Free Software Foundation; either version 2 of the License, or
++    (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU General Public License for more details.
++
++    You should have received a copy of the GNU General Public License along
++    with this program; if not, write to the Free Software Foundation, Inc.,
++    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++*/
++
++#include "problem_details_dialog.h"
++#include "internal_libreport_gtk.h"
++#include "internal_libreport.h"
++
++GtkWidget *
++problem_details_dialog_new(problem_data_t *problem, GtkWindow *parent)
++{
++    INITIALIZE_LIBREPORT();
++
++    GtkWidget *dialog = gtk_dialog_new_with_buttons(
++            _("Problem details"),
++            parent,
++            GTK_DIALOG_DESTROY_WITH_PARENT,
++            _("OK"),
++            GTK_RESPONSE_NONE,
++            NULL
++            );
++
++    gtk_window_set_default_size(GTK_WINDOW(dialog), 800, 600);
++
++    g_signal_connect_swapped(dialog, "response", G_CALLBACK(gtk_widget_destroy), dialog);
++
++    ProblemDetailsWidget *details = problem_details_widget_new(problem);
++
++    GtkWidget *scrolled = gtk_scrolled_window_new(NULL, NULL);
++    gtk_widget_set_halign(scrolled, GTK_ALIGN_FILL);
++    gtk_widget_set_valign(scrolled, GTK_ALIGN_FILL);
++    gtk_widget_set_hexpand(scrolled, TRUE);
++    gtk_widget_set_vexpand(scrolled, TRUE);
++
++    gtk_container_add(GTK_CONTAINER(scrolled), GTK_WIDGET(details));
++
++    GtkWidget *content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
++    gtk_container_add(GTK_CONTAINER(content_area), GTK_WIDGET(scrolled));
++
++    gtk_widget_show_all(dialog);
++
++    return dialog;
++}
++
++GtkWidget *
++problem_details_dialog_new_for_dir(const char *dir, GtkWindow *parent)
++{
++    INITIALIZE_LIBREPORT();
++
++    struct dump_dir *dd = dd_opendir(dir, DD_OPEN_READONLY);
++    if (!dd)
++        return NULL;
++
++    problem_data_t *problem = create_problem_data_from_dump_dir(dd);
++    problem_data_add_text_noteditable(problem, CD_DUMPDIR, dir);
++
++    dd_close(dd);
++
++    GtkWidget *dialog = problem_details_dialog_new(problem, parent);
++
++    g_signal_connect_swapped(dialog, "destroy", G_CALLBACK(problem_data_free), problem);
++
++    return dialog;
++}
++
+diff --git a/src/gtk-helpers/problem_details_dialog.h b/src/gtk-helpers/problem_details_dialog.h
+new file mode 100644
+index 0000000..e8ba8ad
+--- /dev/null
++++ b/src/gtk-helpers/problem_details_dialog.h
+@@ -0,0 +1,37 @@
++/*
++    Copyright (C) 2014  ABRT Team
++    Copyright (C) 2014  RedHat inc.
++
++    This program is free software; you can redistribute it and/or modify
++    it under the terms of the GNU General Public License as published by
++    the Free Software Foundation; either version 2 of the License, or
++    (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU General Public License for more details.
++
++    You should have received a copy of the GNU General Public License along
++    with this program; if not, write to the Free Software Foundation, Inc.,
++    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++*/
++#ifndef _PROBLEM_DETAILS_DIALOG_H
++#define _PROBLEM_DETAILS_DIALOG_H
++
++#include <gtk/gtk.h>
++#include "problem_data.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif /* __cplusplus */
++
++GtkWidget *problem_details_dialog_new(problem_data_t *problem, GtkWindow *parent);
++GtkWidget *problem_details_dialog_new_for_dir(const char *dir, GtkWindow *parent);
++
++#ifdef __cplusplus
++}
++#endif /* __cplusplus */
++
++#endif /* _PROBLEM_DETAILS_DIALOG_H */
++
+diff --git a/src/gtk-helpers/problem_details_widget.c b/src/gtk-helpers/problem_details_widget.c
+new file mode 100644
+index 0000000..2cb3206
+--- /dev/null
++++ b/src/gtk-helpers/problem_details_widget.c
+@@ -0,0 +1,375 @@
++/*
++    Copyright (C) 2014  ABRT Team
++    Copyright (C) 2014  RedHat inc.
++
++    This program is free software; you can redistribute it and/or modify
++    it under the terms of the GNU General Public License as published by
++    the Free Software Foundation; either version 2 of the License, or
++    (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU General Public License for more details.
++
++    You should have received a copy of the GNU General Public License along
++    with this program; if not, write to the Free Software Foundation, Inc.,
++    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++*/
++
++#include "problem_details_widget.h"
++#include "internal_libreport_gtk.h"
++#include "internal_libreport.h"
++
++#define PROBLEM_DETAILS_WIDGET_GET_PRIVATE(o) \
++    (G_TYPE_INSTANCE_GET_PRIVATE((o), TYPE_PROBLEM_DETAILS_WIDGET, ProblemDetailsWidgetPrivate))
++
++#define EXPLICIT_ITEMS \
++    CD_DUMPDIR, \
++    FILENAME_TIME, \
++    FILENAME_LAST_OCCURRENCE, \
++    FILENAME_UID, \
++    FILENAME_USERNAME, \
++    FILENAME_TYPE, \
++    FILENAME_COMMENT, \
++    FILENAME_ANALYZER
++
++#define ORDERED_ITEMS \
++    FILENAME_EXPLOITABLE, \
++    FILENAME_NOT_REPORTABLE, \
++    FILENAME_REASON, \
++    FILENAME_BACKTRACE, \
++    FILENAME_CRASH_FUNCTION, \
++    FILENAME_CMDLINE, \
++    FILENAME_EXECUTABLE, \
++    FILENAME_PACKAGE, \
++    FILENAME_COMPONENT, \
++    FILENAME_PID, \
++    FILENAME_PWD, \
++    FILENAME_HOSTNAME, \
++    FILENAME_COUNT
++
++static const char *items_orderlist[] = {
++    ORDERED_ITEMS,
++    NULL,
++};
++
++static const char *items_auto_blacklist[] = {
++    EXPLICIT_ITEMS,
++    ORDERED_ITEMS,
++    FILENAME_PKG_NAME,
++    FILENAME_PKG_VERSION,
++    FILENAME_PKG_RELEASE,
++    FILENAME_PKG_ARCH,
++    FILENAME_PKG_EPOCH,
++    NULL,
++};
++
++struct ProblemDetailsWidgetPrivate {
++    PangoFontDescription *font;
++    gulong rows;
++    problem_data_t *problem_data;
++};
++
++G_DEFINE_TYPE(ProblemDetailsWidget, problem_details_widget, GTK_TYPE_GRID)
++
++static void problem_details_widget_finalize(GObject *object);
++
++static void
++problem_details_widget_class_init(ProblemDetailsWidgetClass *klass)
++{
++    GObjectClass *object_class = G_OBJECT_CLASS(klass);
++
++    object_class->finalize = problem_details_widget_finalize;
++
++    g_type_class_add_private(klass, sizeof(ProblemDetailsWidgetPrivate));
++}
++
++static void
++problem_details_widget_finalize(GObject *object)
++{
++    ProblemDetailsWidget *self;
++
++    self = PROBLEM_DETAILS_WIDGET(object);
++
++    self->priv->problem_data = (void *)0xdeadbeaf;
++
++    G_OBJECT_CLASS(problem_details_widget_parent_class)->finalize(object);
++}
++
++static gulong
++problem_details_widget_append_row(ProblemDetailsWidget *self)
++{
++    gtk_grid_insert_row(GTK_GRID(self), self->priv->rows);
++    return self->priv->rows++;
++}
++
++static void
++problem_details_widget_add_single_line(ProblemDetailsWidget *self, const char *name, const char *content)
++{
++    GtkWidget *label = gtk_label_new(name);
++    gtk_widget_set_halign(label, GTK_ALIGN_START);
++    gtk_widget_set_valign(label, GTK_ALIGN_START);
++    gtk_widget_set_margin_start(label, 20);
++    gtk_widget_set_margin_end(label, 20);
++
++    GtkWidget *value = gtk_label_new(content);
++    gtk_label_set_selectable(GTK_LABEL(value), TRUE);
++    gtk_label_set_line_wrap(GTK_LABEL(value), TRUE);
++    gtk_label_set_line_wrap_mode(GTK_LABEL(value), GTK_WRAP_WORD);
++    gtk_widget_set_halign(value, GTK_ALIGN_START);
++    gtk_widget_set_hexpand(value, TRUE);
++    gtk_widget_set_margin_start(value, 5);
++    gtk_widget_override_font(GTK_WIDGET(value), self->priv->font);
++
++    const gulong row = problem_details_widget_append_row(self);
++
++    gtk_grid_attach(GTK_GRID(self), label, 0, row, 1, 1);
++    gtk_grid_attach(GTK_GRID(self), value, 1, row, 1, 1);
++}
++
++static void
++problem_details_widget_add_multi_line(ProblemDetailsWidget *self, const char *name, const char *content)
++{
++#if 0
++    GtkWidget *value = gtk_text_view_new();
++    gtk_text_view_set_editable(GTK_TEXT_VIEW(value), FALSE);
++
++    if (strcmp(name, FILENAME_COMMENT) == 0
++            || strcmp(name, FILENAME_REASON) == 0)
++        gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(value), GTK_WRAP_WORD);
++
++    reload_text_to_text_view(GTK_TEXT_VIEW(value), content);
++#else
++    GtkWidget *value = gtk_label_new(content);
++    gtk_widget_set_halign(value, GTK_ALIGN_START);
++
++    if (strcmp(name, FILENAME_COMMENT) == 0
++            || strcmp(name, FILENAME_REASON) == 0)
++    {
++        gtk_label_set_line_wrap(GTK_LABEL(value), TRUE);
++        gtk_label_set_line_wrap_mode(GTK_LABEL(value), GTK_WRAP_WORD);
++        gtk_widget_set_margin_bottom(value, 12);
++    }
++
++    gtk_label_set_selectable(GTK_LABEL(value), TRUE);
++#endif
++
++    gtk_widget_override_font(GTK_WIDGET(value), self->priv->font);
++
++    GtkWidget *expander = gtk_expander_new(name);
++    gtk_widget_set_hexpand(expander, TRUE);
++    gtk_container_add(GTK_CONTAINER(expander), value);
++
++    const gulong row = problem_details_widget_append_row(self);
++
++    gtk_grid_attach(GTK_GRID(self), expander, 0, row, 2, 1);
++}
++
++static void
++problem_details_widget_add_binary(ProblemDetailsWidget *self, const char *label, const char *path)
++{
++    struct stat statbuf;
++    statbuf.st_size = 0;
++
++    if (stat(path, &statbuf) != 0)
++    {
++        log("File '%s' does not exist", path);
++        return;
++    }
++
++    gchar *size = g_format_size_full((long long)statbuf.st_size, G_FORMAT_SIZE_IEC_UNITS);
++    char *msg = xasprintf(_("$DATA_DIRECTORY/%s (binary file, %s)"), label, size);
++    problem_details_widget_add_single_line(self, label, msg);
++    free(msg);
++    g_free(size);
++}
++
++static void
++problem_details_widget_add_time_stamp(ProblemDetailsWidget *self, const char *label, const char *stamp)
++{
++    struct tm tm;
++    memset(&tm, 0, sizeof(struct tm));
++
++    const char *ret = strptime(stamp, "%s", &tm);
++
++    if (ret == NULL || ret[0] != '\0')
++        return;
++
++    char buf[255];
++    strftime(buf, sizeof(buf), "%F %T", &tm);
++
++    problem_details_widget_add_single_line(self, label, buf);
++}
++
++static void
++problem_details_widget_add_problem_item(ProblemDetailsWidget *self, const char *name, problem_item *item)
++{
++    if (item->flags & CD_FLAG_TXT)
++    {
++        if (strchr(item->content, '\n') == NULL)
++            problem_details_widget_add_single_line(self, name, item->content);
++        else
++            problem_details_widget_add_multi_line(self, name, item->content);
++    }
++    else if (item->flags & CD_FLAG_BIN)
++        problem_details_widget_add_binary(self, name, item->content);
++    else
++        log("Unsupported file type");
++}
++
++/* Callback for GHashTable */
++static void
++problem_data_entry_to_grid_row_one_line(const char *item_name, problem_item *item, ProblemDetailsWidget *self)
++{
++    if (((item->flags & CD_FLAG_TXT) && (strchr(item->content, '\n') == NULL))
++             && !is_in_string_list(item_name, (char **)items_auto_blacklist))
++        problem_details_widget_add_single_line(self, item_name, item->content);
++}
++
++static void
++problem_data_entry_to_grid_row_multi_line(const char *item_name, problem_item *item, ProblemDetailsWidget *self)
++{
++    if (((item->flags & CD_FLAG_TXT) && (strchr(item->content, '\n') != NULL))
++            && !is_in_string_list(item_name, (char **)items_auto_blacklist))
++        problem_details_widget_add_multi_line(self, item_name, item->content);
++}
++
++static void
++problem_data_entry_to_grid_row_binary(const char *item_name, problem_item *item, ProblemDetailsWidget *self)
++{
++    if ((item->flags & CD_FLAG_BIN)
++            && !is_in_string_list(item_name, (char **)items_auto_blacklist))
++        problem_details_widget_add_binary(self, item_name, item->content);
++}
++
++static void
++problem_details_widget_populate(ProblemDetailsWidget *self)
++{
++    {   /* Explicit order */
++        for (const char **iter = items_orderlist; *iter; ++iter)
++        {
++            struct problem_item *item = problem_data_get_item_or_NULL(
++                    self->priv->problem_data, *iter);
++
++            if (item == NULL)
++                continue;
++
++            problem_details_widget_add_problem_item(self, *iter, item);
++        }
++    }
++
++    { /* comment: */
++        const char *dd = problem_data_get_content_or_NULL(
++                self->priv->problem_data, FILENAME_COMMENT);
++        if (dd)
++            problem_details_widget_add_multi_line(self, FILENAME_COMMENT, dd);
++    }
++
++    { /* First occurence: 2014-08-26 11:08 */
++        const char *ts = problem_data_get_content_or_NULL(
++                self->priv->problem_data, FILENAME_TIME);
++        if (ts)
++            problem_details_widget_add_time_stamp(self, "first_occurence", ts);
++    }
++
++    { /* Last occurence: 2014-08-27 11:08 */
++        const char *ts = problem_data_get_content_or_NULL(
++                self->priv->problem_data, FILENAME_LAST_OCCURRENCE);
++        if (ts)
++            problem_details_widget_add_time_stamp(self, "last_occurence", ts);
++    }
++
++    { /* User: login(UID) */
++        const char *uid = problem_data_get_content_or_NULL(
++                self->priv->problem_data, FILENAME_UID);
++
++        const char *username = problem_data_get_content_or_NULL(
++                self->priv->problem_data, "username");
++
++        char *line = NULL;
++        if (uid && username)
++            line = xasprintf("%s (%s)", username, uid);
++        else if (!uid && !username)
++            line = xstrdup("unknown user");
++        else
++            line = xasprintf("%s", uid ? uid : username);
++
++        problem_details_widget_add_single_line(self, "user", line);
++    }
++
++    { /* Type/Analyzer: CCpp */
++        const char *type = problem_data_get_content_or_NULL(
++                self->priv->problem_data, FILENAME_TYPE);
++        const char *analyzer = problem_data_get_content_or_NULL(
++                self->priv->problem_data, FILENAME_ANALYZER);
++
++        char *label = NULL;
++        char *line = NULL;
++        if (type != NULL && analyzer != NULL)
++        {
++            if (strcmp(type, analyzer) != 0)
++            {
++                label = xstrdup("type/analyzer");
++                line = xasprintf("%s/%s", type, analyzer);
++            }
++            else
++            {
++                label = xstrdup("type");
++                line = xstrdup(type);
++            }
++        }
++        else
++        {
++            label = xstrdup(type ? "type" : "anlyzer");
++            line = xstrdup(type ? type : analyzer);
++        }
++
++        problem_details_widget_add_single_line(self, label, line);
++
++        free(line);
++        free(label);
++    }
++
++    g_hash_table_foreach(self->priv->problem_data,
++            (GHFunc)problem_data_entry_to_grid_row_one_line, self);
++
++    { /* data directory: */
++        const char *dd = problem_data_get_content_or_NULL(
++                self->priv->problem_data, CD_DUMPDIR);
++        if (dd)
++            problem_details_widget_add_single_line(self, "data_directory", dd);
++
++        /* show binaries below the data_directory entry */
++        g_hash_table_foreach(self->priv->problem_data,
++            (GHFunc)problem_data_entry_to_grid_row_binary, self);
++    }
++
++    g_hash_table_foreach(self->priv->problem_data,
++            (GHFunc)problem_data_entry_to_grid_row_multi_line, self);
++}
++
++static void
++problem_details_widget_init(ProblemDetailsWidget *self)
++{
++    self->priv = PROBLEM_DETAILS_WIDGET_GET_PRIVATE(self);
++    self->priv->font = pango_font_description_from_string("monospace");
++    self->priv->rows = 0;
++    self->priv->problem_data = NULL;
++}
++
++ProblemDetailsWidget *
++problem_details_widget_new(problem_data_t *problem)
++{
++    INITIALIZE_LIBREPORT();
++
++    GObject *object = g_object_new(TYPE_PROBLEM_DETAILS_WIDGET, NULL);
++    ProblemDetailsWidget *self = PROBLEM_DETAILS_WIDGET(object);
++    self->priv->problem_data = problem;
++
++    problem_details_widget_populate(self);
++    gtk_widget_show_all(GTK_WIDGET(self));
++
++    return self;
++}
++
+diff --git a/src/gtk-helpers/problem_details_widget.h b/src/gtk-helpers/problem_details_widget.h
+new file mode 100644
+index 0000000..c736a5d
+--- /dev/null
++++ b/src/gtk-helpers/problem_details_widget.h
+@@ -0,0 +1,62 @@
++/*
++    Copyright (C) 2014  ABRT Team
++    Copyright (C) 2014  RedHat inc.
++
++    This program is free software; you can redistribute it and/or modify
++    it under the terms of the GNU General Public License as published by
++    the Free Software Foundation; either version 2 of the License, or
++    (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU General Public License for more details.
++
++    You should have received a copy of the GNU General Public License along
++    with this program; if not, write to the Free Software Foundation, Inc.,
++    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++*/
++#ifndef _PROBLEM_DETAILS_WIDGET_H
++#define _PROBLEM_DETAILS_WIDGET_H
++
++#include <gtk/gtk.h>
++#include "problem_data.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif /* __cplusplus */
++
++G_BEGIN_DECLS
++
++#define TYPE_PROBLEM_DETAILS_WIDGET            (problem_details_widget_get_type())
++#define PROBLEM_DETAILS_WIDGET(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_PROBLEM_DETAILS_WIDGET, ProblemDetailsWidget))
++#define PROBLEM_DETAILS_WIDGET_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_PROBLEM_DETAILS_WIDGET, ProblemDetailsWidgetClass))
++#define IS_PROBLEM_DETAILS_WIDGET(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_PROBLEM_DETAILS_WIDGET))
++#define IS_PROBLEM_DETAILS_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_PROBLEM_DETAILS_WIDGET))
++#define PROBLEM_DETAILS_WIDGET_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_PROBLEM_DETAILS_WIDGET, ProblemDetailsWidgetClass))
++
++typedef struct _ProblemDetailsWidget        ProblemDetailsWidget;
++typedef struct _ProblemDetailsWidgetClass   ProblemDetailsWidgetClass;
++typedef struct ProblemDetailsWidgetPrivate  ProblemDetailsWidgetPrivate;
++
++struct _ProblemDetailsWidget {
++   GtkGrid    parent_instance;
++   ProblemDetailsWidgetPrivate *priv;
++};
++
++struct _ProblemDetailsWidgetClass {
++   GtkGridClass parent_class;
++};
++
++GType problem_details_widget_get_type (void) G_GNUC_CONST;
++
++ProblemDetailsWidget *problem_details_widget_new(problem_data_t *problem);
++
++G_END_DECLS
++
++#ifdef __cplusplus
++}
++#endif /* __cplusplus */
++
++#endif /* _PROBLEM_DETAILS_WIDGET_H */
++
+diff --git a/src/gtk-helpers/utils.c b/src/gtk-helpers/utils.c
+new file mode 100644
+index 0000000..4ba2c0e
+--- /dev/null
++++ b/src/gtk-helpers/utils.c
+@@ -0,0 +1,25 @@
++#include "internal_libreport_gtk.h"
++
++void reload_text_to_text_view(GtkTextView *tv, const char *text)
++{
++    GtkTextBuffer *tb = gtk_text_view_get_buffer(tv);
++    GtkTextIter beg_iter, end_iter;
++    gtk_text_buffer_get_iter_at_offset(tb, &beg_iter, 0);
++    gtk_text_buffer_get_iter_at_offset(tb, &end_iter, -1);
++    gtk_text_buffer_delete(tb, &beg_iter, &end_iter);
++
++    if (!text)
++        return;
++
++    const gchar *end;
++    while (!g_utf8_validate(text, -1, &end))
++    {
++        gtk_text_buffer_insert_at_cursor(tb, text, end - text);
++        char buf[8];
++        unsigned len = snprintf(buf, sizeof(buf), "<%02X>", (unsigned char)*end);
++        gtk_text_buffer_insert_at_cursor(tb, buf, len);
++        text = end + 1;
++    }
++
++    gtk_text_buffer_insert_at_cursor(tb, text, strlen(text));
++}
+diff --git a/src/gui-wizard-gtk/wizard.c b/src/gui-wizard-gtk/wizard.c
+index 525d275..54b9b10 100644
+--- a/src/gui-wizard-gtk/wizard.c
++++ b/src/gui-wizard-gtk/wizard.c
+@@ -393,31 +393,12 @@ static void load_text_to_text_view(GtkTextView *tv, const char *name)
+     /* a result of xstrdup() is freed */
+     g_hash_table_insert(g_loaded_texts, (gpointer)xstrdup(name), (gpointer)1);
+ 
+-    GtkTextBuffer *tb = gtk_text_view_get_buffer(tv);
+-
+     const char *str = g_cd ? problem_data_get_content_or_NULL(g_cd, name) : NULL;
+     /* Bad: will choke at any text with non-Unicode parts: */
+     /* gtk_text_buffer_set_text(tb, (str ? str : ""), -1);*/
+     /* Start torturing ourself instead: */
+ 
+-    GtkTextIter beg_iter, end_iter;
+-    gtk_text_buffer_get_iter_at_offset(tb, &beg_iter, 0);
+-    gtk_text_buffer_get_iter_at_offset(tb, &end_iter, -1);
+-    gtk_text_buffer_delete(tb, &beg_iter, &end_iter);
+-
+-    if (!str)
+-        return;
+-
+-    const gchar *end;
+-    while (!g_utf8_validate(str, -1, &end))
+-    {
+-        gtk_text_buffer_insert_at_cursor(tb, str, end - str);
+-        char buf[8];
+-        unsigned len = snprintf(buf, sizeof(buf), "<%02X>", (unsigned char)*end);
+-        gtk_text_buffer_insert_at_cursor(tb, buf, len);
+-        str = end + 1;
+-    }
+-    gtk_text_buffer_insert_at_cursor(tb, str, strlen(str));
++    reload_text_to_text_view(tv, str);
+ }
+ 
+ static gchar *get_malloced_string_from_text_view(GtkTextView *tv)
+-- 
+1.8.3.1
+
diff --git a/0024-gui-port-to-Problem-Details-suite.patch b/0024-gui-port-to-Problem-Details-suite.patch
new file mode 100644
index 0000000..1f9d493
--- /dev/null
+++ b/0024-gui-port-to-Problem-Details-suite.patch
@@ -0,0 +1,168 @@
+From 49791d07c907048de4e36a1fa777ebc3cebd36fd Mon Sep 17 00:00:00 2001
+From: Jakub Filak <jfilak at redhat.com>
+Date: Mon, 25 Aug 2014 17:20:16 +0200
+Subject: [LIBREPORT PATCH] gui: port to Problem Details suite
+
+- show the "Details" button on the comment page
+- use the problem details widget on the summary page
+
+Signed-off-by: Jakub Filak <jfilak at redhat.com>
+---
+ src/gui-wizard-gtk/wizard.c     | 43 ++++++++++++++++++++---------------------
+ src/gui-wizard-gtk/wizard.glade | 16 +++++++--------
+ 2 files changed, 29 insertions(+), 30 deletions(-)
+
+diff --git a/src/gui-wizard-gtk/wizard.c b/src/gui-wizard-gtk/wizard.c
+index 54b9b10..f0445eb 100644
+--- a/src/gui-wizard-gtk/wizard.c
++++ b/src/gui-wizard-gtk/wizard.c
+@@ -69,6 +69,7 @@ static GtkWidget *g_btn_close;
+ static GtkWidget *g_btn_next;
+ static GtkWidget *g_btn_onfail;
+ static GtkWidget *g_btn_repeat;
++static GtkWidget *g_btn_detail;
+ 
+ static GtkBox *g_box_events;
+ static GtkBox *g_box_workflows;
+@@ -2673,6 +2674,7 @@ static void on_page_prepare(GtkNotebook *assistant, GtkWidget *page, gpointer us
+         clear_warnings();
+     }
+ 
++    gtk_widget_hide(g_btn_detail);
+     gtk_widget_hide(g_btn_onfail);
+     if (!g_expert_mode)
+         gtk_widget_hide(g_btn_repeat);
+@@ -2710,31 +2712,12 @@ static void on_page_prepare(GtkNotebook *assistant, GtkWidget *page, gpointer us
+         show_warnings();
+     }
+ 
+-    if (pages[PAGENO_SUMMARY].page_widget == page
+-     || pages[PAGENO_REVIEW_DATA].page_widget == page
+-    ) {
+-        GtkWidget *w = GTK_WIDGET(g_tv_details);
+-        GtkContainer *c = GTK_CONTAINER(gtk_widget_get_parent(w));
+-        if (c)
+-            gtk_container_remove(c, w);
+-        gtk_container_add(pages[PAGENO_SUMMARY].page_widget == page ?
+-                        g_container_details1 : g_container_details2,
+-                w
+-        );
+-        /* Make checkbox column visible only on the last page */
+-        gtk_tree_view_column_set_visible(g_tv_details_col_checkbox,
+-                (pages[PAGENO_REVIEW_DATA].page_widget == page)
+-        );
+-
+-        if (pages[PAGENO_REVIEW_DATA].page_widget == page)
+-        {
+-            gtk_widget_set_sensitive(g_btn_next, gtk_toggle_button_get_active(g_tb_approve_bt));
+-            update_ls_details_checkboxes(g_event_selected);
+-        }
+-    }
++    if (pages[PAGENO_REVIEW_DATA].page_widget == page)
++        update_ls_details_checkboxes(g_event_selected);
+ 
+     if (pages[PAGENO_EDIT_COMMENT].page_widget == page)
+     {
++        gtk_widget_show(g_btn_detail);
+         gtk_widget_set_sensitive(g_btn_next, false);
+         on_comment_changed(gtk_text_view_get_buffer(g_tv_comment), NULL);
+     }
+@@ -3192,6 +3175,12 @@ static void on_btn_add_file(GtkButton *button)
+     }
+ }
+ 
++static void on_btn_detail(GtkButton *button)
++{
++    GtkWidget *pdd = problem_details_dialog_new(g_cd, g_wnd_assistant);
++    gtk_dialog_run(GTK_DIALOG(pdd));
++}
++
+ /* [Del] key handling in item list */
+ static void delete_item(GtkTreeView *treeview)
+ {
+@@ -3317,6 +3306,8 @@ static void add_pages(void)
+ 
+     g_signal_connect(g_tv_details, "key-press-event", G_CALLBACK(on_key_press_event_in_item_list), NULL);
+     g_tv_sensitive_sel_hndlr = g_signal_connect(g_tv_sensitive_sel, "changed", G_CALLBACK(on_sensitive_word_selection_changed), NULL);
++
++
+ }
+ 
+ static void create_details_treeview(void)
+@@ -3487,6 +3478,8 @@ void create_assistant(GtkApplication *app, bool expert_mode)
+     g_btn_next = gtk_button_new_with_mnemonic(_("_Forward"));
+     gtk_button_set_image(GTK_BUTTON(g_btn_next), gtk_image_new_from_icon_name("go-next-symbolic", GTK_ICON_SIZE_BUTTON));
+     gtk_widget_set_no_show_all(g_btn_next, true); /* else gtk_widget_hide won't work */
++    g_btn_detail = gtk_button_new_with_mnemonic(_("Details"));
++    gtk_widget_set_no_show_all(g_btn_detail, true); /* else gtk_widget_hide won't work */
+ 
+     g_box_buttons = GTK_BOX(gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0));
+     gtk_box_pack_start(g_box_buttons, g_btn_close, false, false, 5);
+@@ -3497,10 +3490,12 @@ void create_assistant(GtkApplication *app, bool expert_mode)
+ #if ((GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION < 13) || (GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION == 13 && GTK_MICRO_VERSION < 5))
+     GtkWidget *w = gtk_alignment_new(0.0, 0.0, 1.0, 1.0);
+     gtk_box_pack_start(g_box_buttons, w, true, true, 5);
++    gtk_box_pack_start(g_box_buttons, g_btn_detail, false, false, 5);
+     gtk_box_pack_start(g_box_buttons, g_btn_next, false, false, 5);
+ #else
+     gtk_widget_set_valign(GTK_WIDGET(g_btn_next), GTK_ALIGN_END);
+     gtk_box_pack_end(g_box_buttons, g_btn_next, false, false, 5);
++    gtk_box_pack_end(g_box_buttons, g_btn_detail, false, false, 5);
+ #endif
+ 
+     {   /* Warnings area widget definition start */
+@@ -3564,6 +3559,9 @@ void create_assistant(GtkApplication *app, bool expert_mode)
+ 
+     create_details_treeview();
+ 
++    ProblemDetailsWidget *details = problem_details_widget_new(g_cd);
++    gtk_container_add(GTK_CONTAINER(g_container_details1), GTK_WIDGET(details));
++
+     g_signal_connect(g_btn_close, "clicked", G_CALLBACK(assistant_quit_cb), g_wnd_assistant);
+     g_signal_connect(g_btn_stop, "clicked", G_CALLBACK(on_btn_cancel_event), NULL);
+     g_signal_connect(g_btn_onfail, "clicked", G_CALLBACK(on_btn_failed_cb), NULL);
+@@ -3577,6 +3575,7 @@ void create_assistant(GtkApplication *app, bool expert_mode)
+     g_signal_connect(gtk_text_view_get_buffer(g_tv_comment), "changed", G_CALLBACK(on_comment_changed), NULL);
+ 
+     g_signal_connect(g_btn_add_file, "clicked", G_CALLBACK(on_btn_add_file), NULL);
++    g_signal_connect(g_btn_detail, "clicked", G_CALLBACK(on_btn_detail), NULL);
+ 
+     if (is_screencast_available()) {
+         /* we need to override the activate-link handler, because we use
+diff --git a/src/gui-wizard-gtk/wizard.glade b/src/gui-wizard-gtk/wizard.glade
+index b0953db..5edca64 100644
+--- a/src/gui-wizard-gtk/wizard.glade
++++ b/src/gui-wizard-gtk/wizard.glade
+@@ -405,13 +405,7 @@
+                 <property name="can_focus">True</property>
+                 <property name="shadow_type">out</property>
+                 <child>
+-                  <object class="GtkTreeView" id="tv_details">
+-                    <property name="visible">True</property>
+-                    <property name="can_focus">True</property>
+-                    <child internal-child="selection">
+-                      <object class="GtkTreeSelection" id="treeview-selection1"/>
+-                    </child>
+-                  </object>
++                  <placeholder/>
+                 </child>
+               </object>
+             </child>
+@@ -676,7 +670,13 @@
+             <property name="can_focus">True</property>
+             <property name="shadow_type">out</property>
+             <child>
+-              <placeholder/>
++              <object class="GtkTreeView" id="tv_details">
++                <property name="visible">True</property>
++                <property name="can_focus">True</property>
++                <child internal-child="selection">
++                  <object class="GtkTreeSelection" id="treeview-selection"/>
++                </child>
++              </object>
+             </child>
+           </object>
+           <packing>
+-- 
+1.8.3.1
+
diff --git a/0026-gui-fix-build-with-older-gtk.patch b/0026-gui-fix-build-with-older-gtk.patch
new file mode 100644
index 0000000..5389055
--- /dev/null
+++ b/0026-gui-fix-build-with-older-gtk.patch
@@ -0,0 +1,48 @@
+From ddde221387b5e9f9d9abc7614a671934fdf1e56d Mon Sep 17 00:00:00 2001
+From: Jakub Filak <jfilak at redhat.com>
+Date: Thu, 28 Aug 2014 09:38:16 +0200
+Subject: [LIBREPORT PATCH] gui: fix build with older gtk
+
+Signed-off-by: Jakub Filak <jfilak at redhat.com>
+---
+ src/gtk-helpers/problem_details_widget.c | 15 ++++++++++++---
+ 1 file changed, 12 insertions(+), 3 deletions(-)
+
+diff --git a/src/gtk-helpers/problem_details_widget.c b/src/gtk-helpers/problem_details_widget.c
+index 2cb3206..c314d4d 100644
+--- a/src/gtk-helpers/problem_details_widget.c
++++ b/src/gtk-helpers/problem_details_widget.c
+@@ -110,8 +110,6 @@ problem_details_widget_add_single_line(ProblemDetailsWidget *self, const char *n
+     GtkWidget *label = gtk_label_new(name);
+     gtk_widget_set_halign(label, GTK_ALIGN_START);
+     gtk_widget_set_valign(label, GTK_ALIGN_START);
+-    gtk_widget_set_margin_start(label, 20);
+-    gtk_widget_set_margin_end(label, 20);
+ 
+     GtkWidget *value = gtk_label_new(content);
+     gtk_label_set_selectable(GTK_LABEL(value), TRUE);
+@@ -119,9 +117,20 @@ problem_details_widget_add_single_line(ProblemDetailsWidget *self, const char *n
+     gtk_label_set_line_wrap_mode(GTK_LABEL(value), GTK_WRAP_WORD);
+     gtk_widget_set_halign(value, GTK_ALIGN_START);
+     gtk_widget_set_hexpand(value, TRUE);
+-    gtk_widget_set_margin_start(value, 5);
+     gtk_widget_override_font(GTK_WIDGET(value), self->priv->font);
+ 
++#if ((GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION < 11) || (GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION == 11 && GTK_MICRO_VERSION < 2))
++    gtk_widget_set_margin_left(label, 20);
++    gtk_widget_set_margin_right(label, 20);
++
++    gtk_widget_set_margin_left(value, 5);
++#else
++    gtk_widget_set_margin_start(label, 20);
++    gtk_widget_set_margin_end(label, 20);
++
++    gtk_widget_set_margin_start(value, 5);
++#endif
++
+     const gulong row = problem_details_widget_append_row(self);
+ 
+     gtk_grid_attach(GTK_GRID(self), label, 0, row, 1, 1);
+-- 
+1.8.3.1
+
diff --git a/0027-wizard-don-t-work-with-destroyed-widgets.patch b/0027-wizard-don-t-work-with-destroyed-widgets.patch
new file mode 100644
index 0000000..53ba91c
--- /dev/null
+++ b/0027-wizard-don-t-work-with-destroyed-widgets.patch
@@ -0,0 +1,111 @@
+From 25d6050b2c5b71d1c1bd9e9820429aa1f79e8dd7 Mon Sep 17 00:00:00 2001
+From: Jakub Filak <jfilak at redhat.com>
+Date: Thu, 28 Aug 2014 12:22:39 +0200
+Subject: [LIBREPORT PATCH] wizard: don't work with destroyed widgets
+
+Resolves rhbz#1133055
+Related to rhbz#1069917
+
+Signed-off-by: Jakub Filak <jfilak at redhat.com>
+---
+ src/gui-wizard-gtk/wizard.c | 35 ++++++++++++++++++++++++++++-------
+ 1 file changed, 28 insertions(+), 7 deletions(-)
+
+diff --git a/src/gui-wizard-gtk/wizard.c b/src/gui-wizard-gtk/wizard.c
+index f0445eb..8620823 100644
+--- a/src/gui-wizard-gtk/wizard.c
++++ b/src/gui-wizard-gtk/wizard.c
+@@ -57,6 +57,7 @@ static char *g_event_selected;
+ static unsigned g_black_event_count = 0;
+ 
+ static pid_t g_event_child_pid = 0;
++static guint g_event_source_id = 0;
+ 
+ static bool g_expert_mode;
+ 
+@@ -1529,10 +1530,18 @@ static void update_event_log_on_disk(const char *str)
+     dd_close(dd);
+ }
+ 
++static bool cancel_event_run()
++{
++    if (g_event_child_pid <= 0)
++        return false;
++
++    kill(- g_event_child_pid, SIGTERM);
++    return true;
++}
++
+ static void on_btn_cancel_event(GtkButton *button)
+ {
+-    if (g_event_child_pid > 0)
+-        kill(- g_event_child_pid, SIGTERM);
++    cancel_event_run();
+ }
+ 
+ static bool is_processing_finished()
+@@ -1938,8 +1947,10 @@ static gboolean consume_cmd_output(GIOChannel *source, GIOCondition condition, g
+                                                                          : _("Processing finished, please proceed to the next step."));
+         }
+ 
+-        /*g_source_remove(evd->event_source_id);*/
++        g_source_remove(g_event_source_id);
++        g_event_source_id = 0;
+         close(evd->fd);
++        g_io_channel_unref(evd->channel);
+         free_run_event_state(evd->run_state);
+         strbuf_free(evd->event_log);
+         free(evd->event_name);
+@@ -2108,7 +2119,7 @@ static void start_event_run(const char *event_name)
+ 
+     ndelay_on(evd->fd);
+     evd->channel = g_io_channel_unix_new(evd->fd);
+-    /*evd->event_source_id = */ g_io_add_watch(evd->channel,
++    g_event_source_id = g_io_add_watch(evd->channel,
+             G_IO_IN | G_IO_ERR | G_IO_HUP, /* need HUP to detect EOF w/o any data */
+             consume_cmd_output,
+             evd
+@@ -3385,13 +3396,23 @@ static void init_pages(void)
+ 
+ static void assistant_quit_cb(void *obj, void *data)
+ {
++    /* Suppress execution of consume_cmd_output() */
++    if (g_event_source_id != 0)
++    {
++        g_source_remove(g_event_source_id);
++        g_event_source_id = 0;
++    }
++
++    cancel_event_run();
++
+     if (g_loaded_texts)
+     {
+         g_hash_table_destroy(g_loaded_texts);
+         g_loaded_texts = NULL;
+     }
+ 
+-    gtk_widget_destroy(GTK_WIDGET(data));
++    gtk_widget_destroy(GTK_WIDGET(g_wnd_assistant));
++    g_wnd_assistant = (void *)0xdeadbeaf;
+ }
+ 
+ static void on_btn_startcast(GtkWidget *btn, gpointer user_data)
+@@ -3562,13 +3583,13 @@ void create_assistant(GtkApplication *app, bool expert_mode)
+     ProblemDetailsWidget *details = problem_details_widget_new(g_cd);
+     gtk_container_add(GTK_CONTAINER(g_container_details1), GTK_WIDGET(details));
+ 
+-    g_signal_connect(g_btn_close, "clicked", G_CALLBACK(assistant_quit_cb), g_wnd_assistant);
++    g_signal_connect(g_btn_close, "clicked", G_CALLBACK(assistant_quit_cb), NULL);
+     g_signal_connect(g_btn_stop, "clicked", G_CALLBACK(on_btn_cancel_event), NULL);
+     g_signal_connect(g_btn_onfail, "clicked", G_CALLBACK(on_btn_failed_cb), NULL);
+     g_signal_connect(g_btn_repeat, "clicked", G_CALLBACK(on_btn_repeat_cb), NULL);
+     g_signal_connect(g_btn_next, "clicked", G_CALLBACK(on_next_btn_cb), NULL);
+ 
+-    g_signal_connect(g_wnd_assistant, "destroy", G_CALLBACK(assistant_quit_cb), g_wnd_assistant);
++    g_signal_connect(g_wnd_assistant, "destroy", G_CALLBACK(assistant_quit_cb), NULL);
+     g_signal_connect(g_assistant, "switch-page", G_CALLBACK(on_page_prepare), NULL);
+ 
+     g_signal_connect(g_tb_approve_bt, "toggled", G_CALLBACK(on_bt_approve_toggle), NULL);
+-- 
+1.8.3.1
+
diff --git a/0028-wizard-make-report-gtk-s-application-nonunique.patch b/0028-wizard-make-report-gtk-s-application-nonunique.patch
new file mode 100644
index 0000000..eeecb03
--- /dev/null
+++ b/0028-wizard-make-report-gtk-s-application-nonunique.patch
@@ -0,0 +1,28 @@
+From da84e28b50483e92e1b6a472875af045ded61bfc Mon Sep 17 00:00:00 2001
+From: Jakub Filak <jfilak at redhat.com>
+Date: Tue, 9 Sep 2014 10:55:43 +0200
+Subject: [LIBREPORT PATCH] wizard: make report-gtk's application nonunique
+
+Resolves: rhbz#1135782
+
+Signed-off-by: Jakub Filak <jfilak at redhat.com>
+---
+ src/gui-wizard-gtk/main.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/gui-wizard-gtk/main.c b/src/gui-wizard-gtk/main.c
+index 697b91f..44918ec 100644
+--- a/src/gui-wizard-gtk/main.c
++++ b/src/gui-wizard-gtk/main.c
+@@ -216,7 +216,7 @@ int main(int argc, char **argv)
+     problem_data_reload_from_dump_dir();
+ 
+     g_custom_logger = &show_error_as_msgbox;
+-    GtkApplication *app = gtk_application_new("org.freedesktop.libreport.report", G_APPLICATION_FLAGS_NONE);
++    GtkApplication *app = gtk_application_new("org.freedesktop.libreport.report", G_APPLICATION_NON_UNIQUE);
+     g_signal_connect(app, "activate", G_CALLBACK(activate_wizard), (gpointer)expert_mode);
+     g_signal_connect(app, "startup",  G_CALLBACK(startup_wizard),  NULL);
+     /* Enter main loop */
+-- 
+1.8.3.1
+
diff --git a/0029-Fix-bugzilla-bug-formating-for-libreport-analyzer.patch b/0029-Fix-bugzilla-bug-formating-for-libreport-analyzer.patch
new file mode 100644
index 0000000..2751d89
--- /dev/null
+++ b/0029-Fix-bugzilla-bug-formating-for-libreport-analyzer.patch
@@ -0,0 +1,242 @@
+From add69e68e0990642574d41954fe8fc9d9c892ba7 Mon Sep 17 00:00:00 2001
+From: Matej Habrnal <mhabrnal at redhat.com>
+Date: Wed, 10 Sep 2014 18:34:29 +0200
+Subject: [LIBREPORT PATCH] Fix bugzilla bug formating for libreport analyzer
+
+Name of format for git component collided with name of format for analyzer.
+Signed-off-by: Matej Habrnal <mhabrnal at redhat.com>
+---
+ doc/Makefile.am                                    |  2 +-
+ doc/bugzilla_format_analyzer_libreport.conf.txt    | 19 +++++++
+ doc/bugzilla_format_libreport.conf.txt             | 19 -------
+ src/plugins/Makefile.am                            |  2 +-
+ src/plugins/bugzilla_event.conf                    |  2 +-
+ .../bugzilla_format_analyzer_libreport.conf        | 59 ++++++++++++++++++++++
+ src/plugins/bugzilla_format_libreport.conf         | 59 ----------------------
+ 7 files changed, 81 insertions(+), 81 deletions(-)
+ create mode 100644 doc/bugzilla_format_analyzer_libreport.conf.txt
+ delete mode 100644 doc/bugzilla_format_libreport.conf.txt
+ create mode 100644 src/plugins/bugzilla_format_analyzer_libreport.conf
+ delete mode 100644 src/plugins/bugzilla_format_libreport.conf
+
+diff --git a/doc/Makefile.am b/doc/Makefile.am
+index 7c07991..b319ac5 100644
+--- a/doc/Makefile.am
++++ b/doc/Makefile.am
+@@ -36,7 +36,7 @@ MAN5_TXT += bugzilla_format.conf.txt
+ MAN5_TXT += bugzilla_formatdup_anaconda.conf.txt
+ MAN5_TXT += bugzilla_formatdup.conf.txt
+ MAN5_TXT += bugzilla_format_kernel.conf.txt
+-MAN5_TXT += bugzilla_format_libreport.conf.txt
++MAN5_TXT += bugzilla_format_analyzer_libreport.conf.txt
+ MAN5_TXT += emergencyanalysis_event.conf.txt
+ MAN5_TXT += ignored_words.conf.txt
+ MAN5_TXT += forbidden_words.conf.txt
+diff --git a/doc/bugzilla_format_analyzer_libreport.conf.txt b/doc/bugzilla_format_analyzer_libreport.conf.txt
+new file mode 100644
+index 0000000..9637870
+--- /dev/null
++++ b/doc/bugzilla_format_analyzer_libreport.conf.txt
+@@ -0,0 +1,19 @@
++bugzilla_format_analyzer_libreport.conf(5)
++=========================================
++
++NAME
++----
++bugzilla_format_analyzer_libreport.conf - configuration file for libreport.
++
++DESCRIPTION
++-----------
++This configuration file provides definition of formatting for new Bugzilla bugs
++for arbitrary problems reported over libreport.
++
++SEE ALSO
++--------
++reporter-bugzilla(1), bugzilla_format.conf(5), bugzilla_event.conf(5)
++
++AUTHOR
++------
++* ABRT Team
+diff --git a/doc/bugzilla_format_libreport.conf.txt b/doc/bugzilla_format_libreport.conf.txt
+deleted file mode 100644
+index 80fcb33..0000000
+--- a/doc/bugzilla_format_libreport.conf.txt
++++ /dev/null
+@@ -1,19 +0,0 @@
+-bugzilla_format_libreport.conf(5)
+-================================
+-
+-NAME
+-----
+-bugzilla_format_libreport.conf - configuration file for libreport.
+-
+-DESCRIPTION
+------------
+-This configuration file provides definition of formatting for new Bugzilla bugs
+-for arbitrary problems reported over libreport.
+-
+-SEE ALSO
+---------
+-reporter-bugzilla(1), bugzilla_format.conf(5), bugzilla_event.conf(5)
+-
+-AUTHOR
+-------
+-* ABRT Team
+diff --git a/src/plugins/Makefile.am b/src/plugins/Makefile.am
+index 7e0e753..fcbdc64 100644
+--- a/src/plugins/Makefile.am
++++ b/src/plugins/Makefile.am
+@@ -28,7 +28,7 @@ if BUILD_BUGZILLA
+ reporters_plugin_conf += bugzilla.conf
+ reporters_plugin_format_conf += bugzilla_format.conf \
+     bugzilla_formatdup.conf \
+-    bugzilla_format_libreport.conf \
++    bugzilla_format_analyzer_libreport.conf \
+     bugzilla_format_kernel.conf \
+     bugzilla_format_anaconda.conf \
+     bugzilla_formatdup_anaconda.conf
+diff --git a/src/plugins/bugzilla_event.conf b/src/plugins/bugzilla_event.conf
+index e0556e3..0910d70 100644
+--- a/src/plugins/bugzilla_event.conf
++++ b/src/plugins/bugzilla_event.conf
+@@ -1,6 +1,6 @@
+ EVENT=report_Bugzilla analyzer=libreport
+ 	reporter-bugzilla -b \
+-		-F /etc/libreport/plugins/bugzilla_format_libreport.conf
++		-F /etc/libreport/plugins/bugzilla_format_analyzer_libreport.conf
+ 
+ EVENT=watch_Bugzilla reported_to~=Bugzilla
+     reporter-bugzilla -t -w -d "$DUMP_DIR"
+diff --git a/src/plugins/bugzilla_format_analyzer_libreport.conf b/src/plugins/bugzilla_format_analyzer_libreport.conf
+new file mode 100644
+index 0000000..2ecdf6f
+--- /dev/null
++++ b/src/plugins/bugzilla_format_analyzer_libreport.conf
+@@ -0,0 +1,59 @@
++# Lines starting with # are ignored.
++# Lines can be continued on the next line using trailing backslash.
++#
++# Format:
++# %summary:: summary format
++# section:: element1[,element2]...
++# The literal text line to be added to Bugzilla comment. Can be empty.
++# (IOW: empty lines are NOT ignored!)
++#
++# Summary format is a line of text, where %element% is replaced by
++# text element's content, and [[...%element%...]] block is used only if
++# %element% exists. [[...]] blocks can nest.
++#
++# Sections can be:
++# - %summary: bug summary format string.
++# - %attach: a list of elements to attach.
++# - text, double colon (::) and the list of comma-separated elements.
++#
++# Elements can be:
++# - problem directory element names, which get formatted as
++#   <element_name>: <contents>
++#   or
++#   <element_name>:
++#   :<contents>
++#   :<contents>
++#   :<contents>
++# - problem directory element names prefixed by "%bare_",
++#   which is formatted as-is, without "<element_name>:" and colons
++# - %oneline, %multiline, %text wildcards, which select all corresponding
++#   elements for output or attachment
++# - %binary wildcard, valid only for %attach section, instructs to attach
++#   binary elements
++# - problem directory element names prefixed by "-",
++#   which excludes given element from all wildcards
++#
++#   Nonexistent elements are silently ignored.
++#   If none of elements exists, the section will not be created.
++
++%summary:: %reason%
++
++Description of problem:: %bare_comment, %bare_description
++# (%bare_description is used only by SELinux's AVCs,
++# to be fixed...)
++
++Version-Release number of selected component:: %bare_package
++
++Additional info:: \
++	-pkg_arch,-pkg_epoch,-pkg_name,-pkg_release,-pkg_version,\
++		-component,-architecture,\
++	-analyzer,-count,-duphash,-uuid,-abrt_version,\
++	-username,-hostname,-os_release,-os_info,\
++	-time,-pid,-pwd,-last_occurrence,-ureports_counter,\
++	%reporter,\
++	%oneline
++
++Truncated backtrace:: %bare_%short_backtrace
++
++%attach:: -reported_to,-comment,-reason,-event_log,%multiline,\
++	-coredump,%binary
+diff --git a/src/plugins/bugzilla_format_libreport.conf b/src/plugins/bugzilla_format_libreport.conf
+deleted file mode 100644
+index 2ecdf6f..0000000
+--- a/src/plugins/bugzilla_format_libreport.conf
++++ /dev/null
+@@ -1,59 +0,0 @@
+-# Lines starting with # are ignored.
+-# Lines can be continued on the next line using trailing backslash.
+-#
+-# Format:
+-# %summary:: summary format
+-# section:: element1[,element2]...
+-# The literal text line to be added to Bugzilla comment. Can be empty.
+-# (IOW: empty lines are NOT ignored!)
+-#
+-# Summary format is a line of text, where %element% is replaced by
+-# text element's content, and [[...%element%...]] block is used only if
+-# %element% exists. [[...]] blocks can nest.
+-#
+-# Sections can be:
+-# - %summary: bug summary format string.
+-# - %attach: a list of elements to attach.
+-# - text, double colon (::) and the list of comma-separated elements.
+-#
+-# Elements can be:
+-# - problem directory element names, which get formatted as
+-#   <element_name>: <contents>
+-#   or
+-#   <element_name>:
+-#   :<contents>
+-#   :<contents>
+-#   :<contents>
+-# - problem directory element names prefixed by "%bare_",
+-#   which is formatted as-is, without "<element_name>:" and colons
+-# - %oneline, %multiline, %text wildcards, which select all corresponding
+-#   elements for output or attachment
+-# - %binary wildcard, valid only for %attach section, instructs to attach
+-#   binary elements
+-# - problem directory element names prefixed by "-",
+-#   which excludes given element from all wildcards
+-#
+-#   Nonexistent elements are silently ignored.
+-#   If none of elements exists, the section will not be created.
+-
+-%summary:: %reason%
+-
+-Description of problem:: %bare_comment, %bare_description
+-# (%bare_description is used only by SELinux's AVCs,
+-# to be fixed...)
+-
+-Version-Release number of selected component:: %bare_package
+-
+-Additional info:: \
+-	-pkg_arch,-pkg_epoch,-pkg_name,-pkg_release,-pkg_version,\
+-		-component,-architecture,\
+-	-analyzer,-count,-duphash,-uuid,-abrt_version,\
+-	-username,-hostname,-os_release,-os_info,\
+-	-time,-pid,-pwd,-last_occurrence,-ureports_counter,\
+-	%reporter,\
+-	%oneline
+-
+-Truncated backtrace:: %bare_%short_backtrace
+-
+-%attach:: -reported_to,-comment,-reason,-event_log,%multiline,\
+-	-coredump,%binary
+-- 
+1.8.3.1
+
diff --git a/0031-man_page-corrected-man-pages.patch b/0031-man_page-corrected-man-pages.patch
new file mode 100644
index 0000000..2e61fe8
--- /dev/null
+++ b/0031-man_page-corrected-man-pages.patch
@@ -0,0 +1,50 @@
+From 9bcfdf4cf000a4e262b6c963e6a2a3d63bbc99d9 Mon Sep 17 00:00:00 2001
+From: Matej Habrnal <mhabrnal at redhat.com>
+Date: Thu, 18 Sep 2014 17:32:58 +0200
+Subject: [LIBREPORT PATCH] man_page: corrected man pages
+
+Corrected nonsence in report_rhel.conf and report_fedora.conf.
+
+Fixes #283
+
+Signed-off-by: Matej Habrnal <mhabrnal at redhat.com>
+---
+ doc/report_fedora.conf.txt | 5 +++--
+ doc/report_rhel.conf.txt   | 5 +++--
+ 2 files changed, 6 insertions(+), 4 deletions(-)
+
+diff --git a/doc/report_fedora.conf.txt b/doc/report_fedora.conf.txt
+index 125bd71..1c29080 100644
+--- a/doc/report_fedora.conf.txt
++++ b/doc/report_fedora.conf.txt
+@@ -10,8 +10,9 @@ DESCRIPTION
+ This configuration file specifies which of the reporting work flow definitions
+ are applicable for all problems types on Fedora.
+ 
+-All applicable reporting work flows are presented to users in User Interface as
+-possibilities for processing of particular problem in 'anaconda' package.
++All applicable work flows are presented to users in User Interface as
++possibilities for processing of any problems. A particular work flow becomes
++applicable if its conditions are satisfied.
+ 
+ This configuration file consists from one condition per line.
+ 
+diff --git a/doc/report_rhel.conf.txt b/doc/report_rhel.conf.txt
+index e2e5b0e..251748c 100644
+--- a/doc/report_rhel.conf.txt
++++ b/doc/report_rhel.conf.txt
+@@ -10,8 +10,9 @@ DESCRIPTION
+ This configuration file specifies which of the reporting work flow definitions
+ are applicable for all problems types on Red Hat Enterprise Linux.
+ 
+-All applicable reporting work flows are presented to users in User Interface as
+-possibilities for processing of particular problem in 'anaconda' package.
++All applicable work flows are presented to users in User Interface as
++possibilities for processing of any problems. A particular work flow becomes
++applicable if its conditions are satisfied.
+ 
+ This configuration file consists from one condition per line.
+ 
+-- 
+1.8.3.1
+
diff --git a/0032-doc-updated-manpages-reporter.patch b/0032-doc-updated-manpages-reporter.patch
new file mode 100644
index 0000000..d23d317
--- /dev/null
+++ b/0032-doc-updated-manpages-reporter.patch
@@ -0,0 +1,171 @@
+From 33e348eb0e0e40ed659e9920fce26f6b67971f83 Mon Sep 17 00:00:00 2001
+From: Matej Habrnal <mhabrnal at redhat.com>
+Date: Thu, 18 Sep 2014 23:12:45 +0200
+Subject: [LIBREPORT PATCH] doc: updated manpages reporter-*
+
+Added section FILES to reporter-* manpages and updated section SEE ALSO.
+
+Related to rhbz#1067143
+
+Signed-off-by: Matej Habrnal <mhabrnal at redhat.com>
+
+Conflicts:
+	doc/reporter-ureport.txt
+---
+ doc/reporter-bugzilla.txt   | 13 ++++++++++++-
+ doc/reporter-kerneloops.txt |  4 ++++
+ doc/reporter-mailx.txt      | 12 ++++++++++++
+ doc/reporter-print.txt      |  4 ++++
+ doc/reporter-rhtsupport.txt | 10 +++++++++-
+ doc/reporter-upload.txt     | 12 ++++++++++++
+ doc/reporter-ureport.txt    | 10 +++++++++-
+ 7 files changed, 62 insertions(+), 3 deletions(-)
+
+diff --git a/doc/reporter-bugzilla.txt b/doc/reporter-bugzilla.txt
+index 2feb922..48afb03 100644
+--- a/doc/reporter-bugzilla.txt
++++ b/doc/reporter-bugzilla.txt
+@@ -191,9 +191,20 @@ the configuration file.
+ 'HTTPS_PROXY'::
+ 	the proxy server to use for HTTPS
+ 
++FILES
++-----
++/usr/share/libreport/conf.d/plugins/bugzilla.conf::
++    Readonly default configuration files.
++
++/etc/libreport/plugins/bugzilla.conf::
++    Configuration file.
++
++/etc/libreport/plugins/bugzilla_format.conf::
++    Configure formating for reporting.
++
+ SEE ALSO
+ --------
+-report_event.conf, bugzilla_format.conf
++report_event.conf(5), bugzilla_format.conf(5)
+ 
+ AUTHORS
+ -------
+diff --git a/doc/reporter-kerneloops.txt b/doc/reporter-kerneloops.txt
+index 57b0983..b23d517 100644
+--- a/doc/reporter-kerneloops.txt
++++ b/doc/reporter-kerneloops.txt
+@@ -63,6 +63,10 @@ the configuration file.
+ 'KerneloopsReporter_SubmitURL'::
+         The URL of the kerneloops tracker.
+ 
++SEE ALSO
++--------
++koops_event.conf(5)
++
+ AUTHORS
+ -------
+ * ABRT team
+diff --git a/doc/reporter-mailx.txt b/doc/reporter-mailx.txt
+index f946653..bd0c63e 100644
+--- a/doc/reporter-mailx.txt
++++ b/doc/reporter-mailx.txt
+@@ -86,6 +86,18 @@ the configuration file.
+        Use yes/true/on/1 to attach all binary files from the problem
+        directory to the email.
+ 
++FILES
++-----
++/usr/share/libreport/conf.d/plugins/mailx.conf::
++    Readonly default configuration files.
++
++/etc/libreport/plugins/mailx.conf::
++     Configuration files.
++
++SEE ALSO
++--------
++mailx_event.conf(5), mailx.conf(5), report_mailx.conf(5)
++
+ AUTHORS
+ -------
+ * ABRT team
+diff --git a/doc/reporter-print.txt b/doc/reporter-print.txt
+index 5a39673..6e35000 100644
+--- a/doc/reporter-print.txt
++++ b/doc/reporter-print.txt
+@@ -59,6 +59,10 @@ Elements which have more than one line are printed in the form
+ 
+ Output may contain empty lines for better readability.
+ 
++SEE ALSO
++--------
++print_event.conf(5)
++
+ AUTHORS
+ -------
+ * ABRT team
+diff --git a/doc/reporter-rhtsupport.txt b/doc/reporter-rhtsupport.txt
+index 6ac8eff..b018906 100644
+--- a/doc/reporter-rhtsupport.txt
++++ b/doc/reporter-rhtsupport.txt
+@@ -71,6 +71,14 @@ OPTIONS
+ -t[ID]::
+    Upload FILEs to the already created case on RHTSupport site.
+ 
++FILES
++-----
++/usr/share/libreport/conf.d/plugins/rhtsupport.conf::
++    Readonly default configuration files.
++
++/etc/libreport/plugins/rhtsupport.conf::
++    Configuration file.
++
+ SEE ALSO
+ --------
+-abrt_event.conf
++abrt_event.conf(5), rhtsupport.conf(5), rhtsupport_event.conf(5)
+diff --git a/doc/reporter-upload.txt b/doc/reporter-upload.txt
+index 640d951..acd72e7 100644
+--- a/doc/reporter-upload.txt
++++ b/doc/reporter-upload.txt
+@@ -69,6 +69,18 @@ the configuration file.
+ 'Upload_URL'::
+    The URL where should be the tarball uploaded.
+ 
++FILES
++-----
++/usr/share/libreport/conf.d/plugins/upload.conf::
++    Readonly default configuration files.
++
++/etc/libreport/plugins/upload.conf::
++    Configuration file.
++
++SEE ALSO
++--------
++uploader_event.conf(5), report_uploader.conf(5)
++
+ AUTHORS
+ -------
+ * ABRT team
+diff --git a/doc/reporter-ureport.txt b/doc/reporter-ureport.txt
+index 54823ae..a4040fc 100644
+--- a/doc/reporter-ureport.txt
++++ b/doc/reporter-ureport.txt
+@@ -99,9 +99,17 @@ the configuration file.
+ 'uReport_ContactEmail'::
+    Email address attached to a bthash on the server.
+ 
++FILES
++-----
++/usr/share/libreport/conf.d/plugins/ureport.conf::
++    Readonly default configuration files.
++
++/etc/libreport/plugins/ureport.conf::
++    Configuration file.
++
+ SEE ALSO
+ --------
+-ureport.conf(5)
++ureport.conf(5), report_uploader.conf(5), uploader_event.conf(5)
+ 
+ AUTHORS
+ -------
+-- 
+1.8.3.1
+
diff --git a/0033-anaconda-auto-remove-rootpw-lines.patch b/0033-anaconda-auto-remove-rootpw-lines.patch
new file mode 100644
index 0000000..60eea2e
--- /dev/null
+++ b/0033-anaconda-auto-remove-rootpw-lines.patch
@@ -0,0 +1,40 @@
+From 81fd964b6c9e5952eef8233cf03774ad05a41ad5 Mon Sep 17 00:00:00 2001
+From: Jakub Filak <jfilak at redhat.com>
+Date: Thu, 6 Nov 2014 06:34:35 +0100
+Subject: [LIBREPORT PATCH] anaconda: auto-remove rootpw lines
+
+Replace that lines with:
+<auto-removed line containing rootpw>
+
+in the following files:
+ - backtrace
+ - ks.cfg
+
+Related to #1041558
+
+Signed-off-by: Jakub Filak <jfilak at redhat.com>
+---
+ src/plugins/bugzilla_anaconda_event.conf | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+diff --git a/src/plugins/bugzilla_anaconda_event.conf b/src/plugins/bugzilla_anaconda_event.conf
+index 430e5ee..923dda0 100644
+--- a/src/plugins/bugzilla_anaconda_event.conf
++++ b/src/plugins/bugzilla_anaconda_event.conf
+@@ -1,4 +1,13 @@
+ EVENT=report_Bugzilla component=anaconda
++	# remove sensitive information from the sensitive files
++	for sf in backtrace ks.cfg; do
++		if [ -f $sf ]; then
++			# blindly remove entire line
++			# filing a less usable bug is surely better than publishing passwords
++			sed 's/^.*rootpw.*$/<auto-removed line containing rootpw>/' -i $sf
++		fi
++	done
++	# file a bug in Bugzilla
+ 	reporter-bugzilla -b \
+ 		-F /etc/libreport/plugins/bugzilla_format_anaconda.conf \
+ 		-A /etc/libreport/plugins/bugzilla_formatdup_anaconda.conf
+-- 
+1.8.3.1
+
diff --git a/0034-wizard-put-rootpw-on-the-forbidden-words-list.patch b/0034-wizard-put-rootpw-on-the-forbidden-words-list.patch
new file mode 100644
index 0000000..4f90d65
--- /dev/null
+++ b/0034-wizard-put-rootpw-on-the-forbidden-words-list.patch
@@ -0,0 +1,27 @@
+From f26fab1cd6d41d662ddd4641bff4b68ed8d4edeb Mon Sep 17 00:00:00 2001
+From: Jakub Filak <jfilak at redhat.com>
+Date: Thu, 6 Nov 2014 06:35:53 +0100
+Subject: [LIBREPORT PATCH] wizard: put rootpw on the forbidden words list
+
+Related to #1041558
+
+Signed-off-by: Jakub Filak <jfilak at redhat.com>
+---
+ src/gui-wizard-gtk/forbidden_words.conf | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/src/gui-wizard-gtk/forbidden_words.conf b/src/gui-wizard-gtk/forbidden_words.conf
+index deab04b..1fbc1ca 100644
+--- a/src/gui-wizard-gtk/forbidden_words.conf
++++ b/src/gui-wizard-gtk/forbidden_words.conf
+@@ -23,6 +23,7 @@ PASS
+ password
+ Password
+ PASSWORD
++rootpw
+ secret
+ Secret
+ SECRET
+-- 
+1.8.3.1
+
diff --git a/0035-problem_data-make-ks.cfg-file-editable.patch b/0035-problem_data-make-ks.cfg-file-editable.patch
new file mode 100644
index 0000000..908c883
--- /dev/null
+++ b/0035-problem_data-make-ks.cfg-file-editable.patch
@@ -0,0 +1,45 @@
+From bee6ed83c3ce506bda616f734bc0f13f279a3fe9 Mon Sep 17 00:00:00 2001
+From: Jakub Filak <jfilak at redhat.com>
+Date: Thu, 6 Nov 2014 06:43:42 +0100
+Subject: [LIBREPORT PATCH] problem_data: make ks.cfg file editable
+
+Otherwise the GUI will not highlight the forbidden words in that file.
+
+Related to #1041558
+
+Signed-off-by: Jakub Filak <jfilak at redhat.com>
+---
+ src/include/internal_libreport.h | 4 ++++
+ src/lib/problem_data.c           | 1 +
+ 2 files changed, 5 insertions(+)
+
+diff --git a/src/include/internal_libreport.h b/src/include/internal_libreport.h
+index f9670b0..4bce4ba 100644
+--- a/src/include/internal_libreport.h
++++ b/src/include/internal_libreport.h
+@@ -903,6 +903,10 @@ struct dump_dir *open_directory_for_writing(
+ #define FILENAME_ABRT_VERSION  "abrt_version"
+ #define FILENAME_EXPLOITABLE   "exploitable"
+ 
++/* File names related to Anaconda problems
++ */
++#define FILENAME_KICKSTART_CFG "ks.cfg"
++
+ // Not stored as files, added "on the fly":
+ #define CD_DUMPDIR            "Directory"
+ 
+diff --git a/src/lib/problem_data.c b/src/lib/problem_data.c
+index 18d9541..777afa7 100644
+--- a/src/lib/problem_data.c
++++ b/src/lib/problem_data.c
+@@ -261,6 +261,7 @@ static const char *const editable_files[] = {
+     //FILENAME_COUNT      ,
+     //FILENAME_REPORTED_TO,
+     //FILENAME_EVENT_LOG  ,
++    FILENAME_KICKSTART_CFG,
+     NULL
+ };
+ static bool is_editable_file(const char *file_name)
+-- 
+1.8.3.1
+
diff --git a/0036-anaconda-mark-anaconda-tb-as-editable-file-and-remov.patch b/0036-anaconda-mark-anaconda-tb-as-editable-file-and-remov.patch
new file mode 100644
index 0000000..94a4ce8
--- /dev/null
+++ b/0036-anaconda-mark-anaconda-tb-as-editable-file-and-remov.patch
@@ -0,0 +1,74 @@
+From 8dae4295895e4ebc4f89dd93e4dfe895763e504f Mon Sep 17 00:00:00 2001
+From: Jakub Filak <jfilak at redhat.com>
+Date: Tue, 18 Nov 2014 10:18:32 +0100
+Subject: [LIBREPORT PATCH] anaconda: mark anaconda-tb as editable file and
+ remove rootpw lines
+
+anaconda-tb file contains the main information about Anaconda problems.
+
+report-gtk won't be highlighting forbidden words, because anaconda-tb
+contains many false positives words as the file is mainly composed of
+log outputs.
+
+Related to #1041558
+
+Signed-off-by: Jakub Filak <jfilak at redhat.com>
+---
+ src/gui-wizard-gtk/wizard.c              | 2 +-
+ src/include/internal_libreport.h         | 1 +
+ src/lib/problem_data.c                   | 1 +
+ src/plugins/bugzilla_anaconda_event.conf | 2 +-
+ 4 files changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/src/gui-wizard-gtk/wizard.c b/src/gui-wizard-gtk/wizard.c
+index 8620823..b77756b 100644
+--- a/src/gui-wizard-gtk/wizard.c
++++ b/src/gui-wizard-gtk/wizard.c
+@@ -1185,7 +1185,7 @@ static void append_item_to_ls_details(gpointer name, gpointer value, gpointer da
+     //FIXME: use the human-readable problem_item_format(item) instead of item->content.
+     if (item->flags & CD_FLAG_TXT)
+     {
+-        if (item->flags & CD_FLAG_ISEDITABLE)
++        if (item->flags & CD_FLAG_ISEDITABLE && strcmp(name, FILENAME_ANACONDA_TB) != 0)
+         {
+             GtkWidget *tab_lbl = gtk_label_new((char *)name);
+             GtkWidget *tev = gtk_text_view_new();
+diff --git a/src/include/internal_libreport.h b/src/include/internal_libreport.h
+index 4bce4ba..e3765bf 100644
+--- a/src/include/internal_libreport.h
++++ b/src/include/internal_libreport.h
+@@ -906,6 +906,7 @@ struct dump_dir *open_directory_for_writing(
+ /* File names related to Anaconda problems
+  */
+ #define FILENAME_KICKSTART_CFG "ks.cfg"
++#define FILENAME_ANACONDA_TB   "anaconda-tb"
+ 
+ // Not stored as files, added "on the fly":
+ #define CD_DUMPDIR            "Directory"
+diff --git a/src/lib/problem_data.c b/src/lib/problem_data.c
+index 777afa7..11088ae 100644
+--- a/src/lib/problem_data.c
++++ b/src/lib/problem_data.c
+@@ -262,6 +262,7 @@ static const char *const editable_files[] = {
+     //FILENAME_REPORTED_TO,
+     //FILENAME_EVENT_LOG  ,
+     FILENAME_KICKSTART_CFG,
++    FILENAME_ANACONDA_TB,
+     NULL
+ };
+ static bool is_editable_file(const char *file_name)
+diff --git a/src/plugins/bugzilla_anaconda_event.conf b/src/plugins/bugzilla_anaconda_event.conf
+index 923dda0..e45a10a 100644
+--- a/src/plugins/bugzilla_anaconda_event.conf
++++ b/src/plugins/bugzilla_anaconda_event.conf
+@@ -1,6 +1,6 @@
+ EVENT=report_Bugzilla component=anaconda
+ 	# remove sensitive information from the sensitive files
+-	for sf in backtrace ks.cfg; do
++	for sf in backtrace ks.cfg anaconda-tb; do
+ 		if [ -f $sf ]; then
+ 			# blindly remove entire line
+ 			# filing a less usable bug is surely better than publishing passwords
+-- 
+1.8.3.1
+
diff --git a/0037-gui-try-to-reduce-false-positive-sensitive-words.patch b/0037-gui-try-to-reduce-false-positive-sensitive-words.patch
new file mode 100644
index 0000000..2c3fcda
--- /dev/null
+++ b/0037-gui-try-to-reduce-false-positive-sensitive-words.patch
@@ -0,0 +1,65 @@
+From 34c9ea7039fd2da4250fbbf767d3617b346e1734 Mon Sep 17 00:00:00 2001
+From: Jakub Filak <jfilak at redhat.com>
+Date: Sat, 3 Jan 2015 23:15:27 +0100
+Subject: [LIBREPORT PATCH] gui: try to reduce false positive sensitive words
+
+I used words suggested by Michael Catanzaro < @Catanzaro > and run
+several grep commands to find all variants.
+
+Related: #311
+
+Signed-off-by: Jakub Filak <jfilak at redhat.com>
+---
+ src/gui-wizard-gtk/ignored_words.conf | 32 +++++++++++++++++++++++++++++++-
+ 1 file changed, 31 insertions(+), 1 deletion(-)
+
+diff --git a/src/gui-wizard-gtk/ignored_words.conf b/src/gui-wizard-gtk/ignored_words.conf
+index 600dd55..ff658bd 100644
+--- a/src/gui-wizard-gtk/ignored_words.conf
++++ b/src/gui-wizard-gtk/ignored_words.conf
+@@ -6,11 +6,41 @@ accountsservice
+ account_for_vscrollbar
+ AccountsService
+ Cannot access memory
++EventKey
++event_key
+ gnome-ssh-askpass
++keyboard
++KEYBOARD
++keymap
++KEYMAP
++keyDown
++KeyDown
++KEYDOWN
++KEY_Down
++keyring
++KEYRING
++KeyUp
++KEYUP
++KeyEvent
++key_event
++KEY_EVENT
++keypress
++KeyPress
++key_press
++KEY_PRESS
++key_release
++KEY_RELEASE
++KeyValuePair
++KeyValuePairKeyExtractor
++keyup
++KEYUP
++ksshaskpass
+ libpciaccess.so
+ libsecret
+ login.so
+-ksshaskpass
++libkeyutils
++PassOwnPtr
++PassRefPtr
+ This access was not denied.
+ # not considered sensitive
+ USER=
+-- 
+1.8.3.1
+
diff --git a/libreport.spec b/libreport.spec
index de67d77..06a2ce6 100644
--- a/libreport.spec
+++ b/libreport.spec
@@ -7,22 +7,24 @@
 Summary: Generic library for reporting various problems
 Name: libreport
 Version: 2.2.3
-Release: 2%{?dist}
+Release: 3%{?dist}
 License: GPLv2+
 Group: System Environment/Libraries
 URL: https://fedorahosted.org/abrt/
 Source: https://fedorahosted.org/released/abrt/%{name}-%{version}.tar.gz
 Source1: autogen.sh
 
-Patch1:  0001-ureport-implement-attaching-of-user-comments.patch
-Patch2:  0002-gui-make-preferences-dialogue-modal-for-parents.patch
-Patch3:  0003-gui-select-the-first-in-the-configuration-list.patch
-Patch4:  0004-gui-wrap-lines-for-human-readable-files.patch
-Patch5:  0005-wizard-fix-help-text-for-screencasting.patch
-Patch6:  0006-gui-support-Enter-2Click-in-Preferences-list.patch
-Patch7:  0007-gui-apply-configuration-dialogues-changes-on-Enter-k.patch
-Patch8:  0008-gui-close-ask-dialogues-on-Enter-key.patch
-Patch9:  0009-logging-test-log-level-at-first-step.patch
+# git format-patch -N --topo-order 2.2.3
+# i=0; for p in `ls *patch`; do echo Patch$((i += 1)): $p; done
+Patch1: 0001-ureport-implement-attaching-of-user-comments.patch
+Patch2: 0002-gui-make-preferences-dialogue-modal-for-parents.patch
+Patch3: 0003-gui-select-the-first-in-the-configuration-list.patch
+Patch4: 0004-gui-wrap-lines-for-human-readable-files.patch
+Patch5: 0005-wizard-fix-help-text-for-screencasting.patch
+Patch6: 0006-gui-support-Enter-2Click-in-Preferences-list.patch
+Patch7: 0007-gui-apply-configuration-dialogues-changes-on-Enter-k.patch
+Patch8: 0008-gui-close-ask-dialogues-on-Enter-key.patch
+Patch9: 0009-logging-test-log-level-at-first-step.patch
 Patch10: 0010-json-include-json.h-accordingly-to-json-c-CFLAGS.patch
 Patch11: 0011-ureport-include-json.h-accordingly-to-json-c-CFLAGS.patch
 Patch12: 0012-gui-port-to-gtk-3.13.patch
@@ -34,6 +36,23 @@ Patch17: 0017-gui-clear-the-sensitive-cache-between-two-event-runs.patch
 Patch18: 0018-gui-don-t-remove-already-removed-GTimeoutSource.patch
 Patch19: 0019-gui-reload-destroyed-sensitive-data-warn-widgets-fro.patch
 Patch20: 0020-gui-add-Repeat-button.patch
+Patch21: 0021-wizard-terminate-event-chain-after-the-emergency-ana.patch
+Patch22: 0022-gui-use-symbolic-icons.patch
+Patch23: 0023-gui-Problem-Details-suite.patch
+Patch24: 0024-gui-port-to-Problem-Details-suite.patch
+#Patch25: 0025-spec-install-Problem-Details-stuff.patch
+Patch26: 0026-gui-fix-build-with-older-gtk.patch
+Patch27: 0027-wizard-don-t-work-with-destroyed-widgets.patch
+Patch28: 0028-wizard-make-report-gtk-s-application-nonunique.patch
+Patch29: 0029-Fix-bugzilla-bug-formating-for-libreport-analyzer.patch
+#Patch30: 0030-spec-update-the-spec-file-to-work-with-the-last-comm.patch
+Patch31: 0031-man_page-corrected-man-pages.patch
+Patch32: 0032-doc-updated-manpages-reporter.patch
+Patch33: 0033-anaconda-auto-remove-rootpw-lines.patch
+Patch34: 0034-wizard-put-rootpw-on-the-forbidden-words-list.patch
+Patch35: 0035-problem_data-make-ks.cfg-file-editable.patch
+Patch36: 0036-anaconda-mark-anaconda-tb-as-editable-file-and-remov.patch
+Patch37: 0037-gui-try-to-reduce-false-positive-sensitive-words.patch
 
 # git is need for '%%autosetup -S git' which automatically applies all the
 # patches above. Please, be aware that the patches must be generated
@@ -464,6 +483,8 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
 %{_includedir}/libreport/file_obj.h
 %{_includedir}/libreport/config_item_info.h
 %{_includedir}/libreport/workflow.h
+%{_includedir}/libreport/problem_details_widget.h
+%{_includedir}/libreport/problem_details_dialog.h
 # Private api headers:
 %{_includedir}/libreport/internal_abrt_dbus.h
 %{_includedir}/libreport/internal_libreport.h
@@ -561,7 +582,7 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
 %{_datadir}/%{name}/conf.d/plugins/bugzilla.conf
 %config(noreplace) %{_sysconfdir}/libreport/plugins/bugzilla_format.conf
 %config(noreplace) %{_sysconfdir}/libreport/plugins/bugzilla_formatdup.conf
-%config(noreplace) %{_sysconfdir}/libreport/plugins/bugzilla_format_libreport.conf
+%config(noreplace) %{_sysconfdir}/libreport/plugins/bugzilla_format_analyzer_libreport.conf
 %config(noreplace) %{_sysconfdir}/libreport/plugins/bugzilla_format_kernel.conf
 %{_datadir}/%{name}/events/report_Bugzilla.xml
 %{_datadir}/%{name}/events/watch_Bugzilla.xml
@@ -575,7 +596,7 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
 %{_mandir}/man5/bugzilla.conf.5.*
 %{_mandir}/man5/bugzilla_format.conf.5.*
 %{_mandir}/man5/bugzilla_formatdup.conf.5.*
-%{_mandir}/man5/bugzilla_format_libreport.conf.5.*
+%{_mandir}/man5/bugzilla_format_analyzer_libreport.conf.5.*
 %{_mandir}/man5/bugzilla_format_kernel.conf.5.*
 %{_bindir}/reporter-bugzilla
 
@@ -672,6 +693,14 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
 
 
 %changelog
+* Mon Feb 16 2015 Jakub Filak <jfilak at redhat.com> - 2.2.3-3
+- add problem Details
+- reduce false positive sensitive words
+- anaconda: auto-remove rootpw lines
+- gui: use -symbolic icons
+- allow to have several windows opened at once
+- Resolves: #1153479, #1153760, #1168523
+
 * Wed Aug 20 2014 Jakub Filak <jfilak at redhat.com> 2.2.3-2
 - add the "Repeat" button to the reporting wizard
 - a bunch of GUI improvements


More information about the scm-commits mailing list