mhabrnal pushed to abrt (f22). "Automatic reporting from GSettings, Spelling/grammar fixes and another fixes (..more)"

notifications at fedoraproject.org notifications at fedoraproject.org
Thu May 21 06:54:31 UTC 2015


From 30183d630877dace6b482c33d8fa783d6cdddce2 Mon Sep 17 00:00:00 2001
From: Matej Habrnal <mhabrnal at redhat.com>
Date: Wed, 20 May 2015 16:16:58 +0200
Subject: Automatic reporting from GSettings, Spelling/grammar fixes and
 another fixes

Resolves #1211644

Signed-off-by: Matej Habrnal <mhabrnal at redhat.com>

diff --git a/0004-applet-switch-to-D-Bus-methods.patch b/0004-applet-switch-to-D-Bus-methods.patch
new file mode 100644
index 0000000..ee6d7c5
--- /dev/null
+++ b/0004-applet-switch-to-D-Bus-methods.patch
@@ -0,0 +1,427 @@
+From a2977b0fe023a896c3006f27ee2b148690dff24a Mon Sep 17 00:00:00 2001
+From: Jakub Filak <jfilak at redhat.com>
+Date: Wed, 8 Apr 2015 08:23:03 +0200
+Subject: [PATCH] applet: switch to D-Bus methods
+
+This patch is a part of our efforts to make abrt-applet independent on
+the backend.
+
+This patch converts all data manipulation functions to D-Bus calls, so
+the notifications are made of data obtained through D-Bus.
+
+The reporting still relies on file system access, though.
+
+Signed-off-by: Jakub Filak <jfilak at redhat.com>
+---
+ src/applet/applet.c        | 181 ++++++++++++++++++++++++++++-----------------
+ src/include/libabrt.h      |  16 ++++
+ src/lib/problem_api_dbus.c |  61 +++++++++++----
+ 3 files changed, 174 insertions(+), 84 deletions(-)
+
+diff --git a/src/applet/applet.c b/src/applet/applet.c
+index 7b58f6e..4df69fc 100644
+--- a/src/applet/applet.c
++++ b/src/applet/applet.c
+@@ -120,6 +120,7 @@ typedef struct problem_info {
+     bool reported;
+     bool was_announced;
+     bool is_writable;
++    int time;
+ } problem_info_t;
+ 
+ static void push_to_deferred_queue(problem_info_t *pi)
+@@ -137,6 +138,59 @@ static const char *problem_info_get_command_line(problem_info_t *pi)
+     return problem_data_get_content_or_NULL(pi->problem_data, FILENAME_CMDLINE);
+ }
+ 
++static int problem_info_get_time(problem_info_t *pi)
++{
++    if (pi->time == -1)
++    {
++        const char *time_str = problem_data_get_content_or_NULL(pi->problem_data, FILENAME_TIME);
++
++        if (time_str == NULL)
++            error_msg_and_die("BUG: Problem info has data without the element time");
++
++        pi->time = atoi(time_str);
++    }
++
++    return pi->time;
++}
++
++static const char **problem_info_get_env(problem_info_t *pi)
++{
++    if (pi->envp == NULL)
++    {
++        const char *env_str = problem_data_get_content_or_NULL(pi->problem_data, FILENAME_ENVIRON);
++        pi->envp = (env_str != NULL) ? g_strsplit (env_str, "\n", -1) : NULL;
++    }
++
++    return (const char **)pi->envp;
++}
++
++static int problem_info_get_pid(problem_info_t *pi)
++{
++    if (pi->pid == -1)
++    {
++        const char *pid_str = problem_data_get_content_or_NULL(pi->problem_data, FILENAME_PID);
++        pi->pid = (pid_str != NULL) ? atoi (pid_str) : -1;
++    }
++
++    return pi->pid;
++}
++
++static int problem_info_get_count(problem_info_t *pi)
++{
++    if (pi->count == -1)
++    {
++        const char *count_str = problem_data_get_content_or_NULL(pi->problem_data, FILENAME_COUNT);
++        pi->count = count_str ? atoi(count_str) : 1;
++    }
++
++    return pi->count;
++}
++
++static bool problem_info_is_reported(problem_info_t *pi)
++{
++    return problem_data_get_content_or_NULL(pi->problem_data, FILENAME_REPORTED_TO) != NULL;
++}
++
+ static void problem_info_set_dir(problem_info_t *pi, const char *dir)
+ {
+     problem_data_add_text_noteditable(pi->problem_data, CD_DUMPDIR, dir);
+@@ -176,6 +230,9 @@ static problem_info_t *problem_info_new(const char *dir)
+ {
+     problem_info_t *pi = g_new0(problem_info_t, 1);
+     pi->refcount = 1;
++    pi->time = -1;
++    pi->pid = -1;
++    pi->count = -1;
+     pi->problem_data = problem_data_new();
+     problem_info_set_dir(pi, dir);
+     return pi;
+@@ -194,8 +251,6 @@ static void problem_info_unref(gpointer data)
+         return;
+ 
+     problem_data_free(pi->problem_data);
+-    if (pi->envp)
+-        g_strfreev(pi->envp);
+     g_free(pi);
+ }
+ 
+@@ -556,7 +611,7 @@ static void notify_problem_list(GList *problems)
+             continue;
+         }
+ 
+-        app = problem_create_app_from_env ((const char **)pi->envp, pi->pid);
++        app = problem_create_app_from_env (problem_info_get_env(pi), problem_info_get_pid(pi));
+ 
+         if (!app)
+             app = problem_create_app_from_cmdline (problem_info_get_command_line(pi));
+@@ -572,7 +627,7 @@ static void notify_problem_list(GList *problems)
+         gboolean is_packaged = pi->is_packaged;
+         gboolean is_running_again = is_app_running(app);
+         gboolean is_current_user = !pi->foreign;
+-        gboolean already_reported = (pi->count > 1);
++        gboolean already_reported = problem_info_get_count(pi) > 1;
+ 
+         gboolean report_button = FALSE;
+         gboolean restart_button = FALSE;
+@@ -914,14 +969,22 @@ static void Crash(GVariant *parameters)
+     if (foreign_problem && !g_user_is_admin)
+         return;
+ 
+-    struct dump_dir *dd = dd_opendir(dir, DD_OPEN_READONLY);
+-    char *command_line = dd_load_text_ext(dd, FILENAME_CMDLINE, DD_FAIL_QUIETLY_ENOENT | DD_LOAD_TEXT_RETURN_NULL_ON_FAILURE);
+-    char *count_str = dd_load_text_ext(dd, FILENAME_COUNT, DD_FAIL_QUIETLY_ENOENT | DD_LOAD_TEXT_RETURN_NULL_ON_FAILURE);
+-    guint count = count_str ? atoi(count_str) : 1;
+-    g_free(count_str);
+-    char *env = dd_load_text_ext(dd, FILENAME_ENVIRON, DD_FAIL_QUIETLY_ENOENT | DD_LOAD_TEXT_RETURN_NULL_ON_FAILURE);
+-    char *pid = dd_load_text_ext(dd, FILENAME_PID, DD_FAIL_QUIETLY_ENOENT | DD_LOAD_TEXT_RETURN_NULL_ON_FAILURE);
+-    dd_close(dd);
++    static const char *elements[] = {
++        FILENAME_CMDLINE,
++        FILENAME_COUNT,
++        FILENAME_UUID,
++        FILENAME_DUPHASH,
++        FILENAME_COMPONENT,
++        FILENAME_ENVIRON,
++        FILENAME_PID,
++        NULL,
++    };
++
++    problem_info_t *pi = problem_info_new(dir);
++    fill_problem_data_over_dbus(dir, elements, pi->problem_data);
++
++    pi->foreign = foreign_problem;
++    pi->is_packaged = (package_name != NULL);
+ 
+     /*
+      * Can't append dir to the seen list because of directory stealing
+@@ -929,24 +992,6 @@ static void Crash(GVariant *parameters)
+      * append_dirlist(dir);
+      *
+      */
+-
+-    problem_info_t *pi = problem_info_new(dir);
+-    if (uuid != NULL && uuid[0] != '\0')
+-        problem_data_add_text_noteditable(pi->problem_data, FILENAME_UUID, uuid);
+-    if (duphash != NULL && duphash[0] != '\0')
+-        problem_data_add_text_noteditable(pi->problem_data, FILENAME_DUPHASH, duphash);
+-    if (package_name != NULL && package_name[0] != '\0')
+-        problem_data_add_text_noteditable(pi->problem_data, FILENAME_COMPONENT, package_name);
+-    if (command_line != NULL)
+-        problem_data_add_text_noteditable(pi->problem_data, FILENAME_CMDLINE, command_line);
+-    pi->foreign = foreign_problem;
+-    pi->count = count;
+-    pi->is_packaged = (package_name != NULL);
+-    pi->envp = (env != NULL) ? g_strsplit (env, "\n", -1) : NULL;
+-    pi->pid = (pid != NULL) ? atoi (pid) : -1;
+-    free(command_line);
+-    free(env);
+-    free(pid);
+     show_problem_notification(pi);
+ }
+ 
+@@ -970,6 +1015,19 @@ name_acquired_handler (GDBusConnection *connection,
+                        const gchar *name,
+                        gpointer user_data)
+ {
++    static const char *elements[] = {
++        FILENAME_CMDLINE,
++        FILENAME_COUNT,
++        FILENAME_UUID,
++        FILENAME_DUPHASH,
++        FILENAME_COMPONENT,
++        FILENAME_UID,
++        FILENAME_TIME,
++        FILENAME_REPORTED_TO,
++        FILENAME_NOT_REPORTABLE,
++        NULL
++    };
++
+     /* If some new dirs appeared since our last run, let user know it */
+     GList *new_dirs = NULL;
+     GList *notify_list = NULL;
+@@ -980,58 +1038,45 @@ name_acquired_handler (GDBusConnection *connection,
+     /* Age limit = now - 3 days */
+     const unsigned long min_born_time = (unsigned long)(time_before_ndays(3));
+ 
+-    while (new_dirs)
++    for ( ; new_dirs != NULL; new_dirs = g_list_next(new_dirs))
+     {
+-        struct dump_dir *dd = dd_opendir((char *)new_dirs->data, DD_OPEN_READONLY);
+-        if (dd == NULL)
++        const char *problem_id = (const char *)new_dirs->data;
++        problem_info_t *pi = problem_info_new(problem_id);
++
++        if (fill_problem_data_over_dbus(problem_id, elements, pi->problem_data) != 0)
+         {
+-            log_notice("'%s' is not a dump dir - ignoring\n", (char *)new_dirs->data);
+-            new_dirs = g_list_next(new_dirs);
++            log_notice("'%s' is not a dump dir - ignoring\n", problem_id);
++            problem_info_unref(pi);
+             continue;
+         }
+ 
+-        if (dd->dd_time < min_born_time)
++        /* TODO: add a filter for only complete problems to GetProblems D-Bus method */
++        if (!dbus_problem_is_complete(problem_id))
+         {
+-            log_notice("Ignoring outdated problem '%s'", (char *)new_dirs->data);
+-            goto next;
++            log_notice("Ignoring incomplete problem '%s'", problem_id);
++            problem_info_unref(pi);
++            continue;
+         }
+ 
+-        if (!problem_dump_dir_is_complete(dd))
++        /* TODO: add a filter for max-old reported problems to GetProblems D-Bus method */
++        if (problem_info_get_time(pi) < min_born_time)
+         {
+-            log_notice("Ignoring incomplete problem '%s'", (char *)new_dirs->data);
+-            goto next;
++            log_notice("Ignoring outdated problem '%s'", problem_id);
++            problem_info_unref(pi);
++            continue;
+         }
+ 
+-        if (!dd_exist(dd, FILENAME_REPORTED_TO))
++        /* TODO: add a filter for not-yet reported problems to GetProblems D-Bus method */
++        if (problem_info_is_reported(pi))
+         {
+-            problem_info_t *pi = problem_info_new(new_dirs->data);
+-            const char *elements[] = {FILENAME_UUID, FILENAME_DUPHASH, FILENAME_COMPONENT, FILENAME_NOT_REPORTABLE, FILENAME_CMDLINE};
+-
+-            for (size_t i = 0; i < sizeof(elements)/sizeof(*elements); ++i)
+-            {
+-                char * const value = dd_load_text_ext(dd, elements[i],
+-                        DD_FAIL_QUIETLY_ENOENT | DD_LOAD_TEXT_RETURN_NULL_ON_FAILURE);
+-                if (value)
+-                    problem_data_add_text_noteditable(pi->problem_data, elements[i], value);
+-                free(value);
+-            }
+-
+-            /* Can't be foreign because if the problem is foreign then the
+-             * dd_opendir() call failed few lines above and the problem is ignored.
+-             * */
+-            pi->foreign = false;
+-
+-            notify_list = g_list_prepend(notify_list, pi);
+-        }
+-        else
+-        {
+-            log_notice("Ignoring already reported problem '%s'", (char *)new_dirs->data);
++            log_notice("Ignoring already reported problem '%s'", problem_id);
++            problem_info_unref(pi);
++            continue;
+         }
+ 
+-next:
+-        dd_close(dd);
+-
+-        new_dirs = g_list_next(new_dirs);
++        /* Can't be foreig because new_dir_exists() returns only own problems */
++        pi->foreign = false;
++        notify_list = g_list_prepend(notify_list, pi);
+     }
+ 
+     if (notify_list)
+diff --git a/src/include/libabrt.h b/src/include/libabrt.h
+index 19ad4a8..07dc172 100644
+--- a/src/include/libabrt.h
++++ b/src/include/libabrt.h
+@@ -164,6 +164,15 @@ int chown_dir_over_dbus(const char *problem_dir_path);
+ int test_exist_over_dbus(const char *problem_id, const char *element_name);
+ 
+ /**
++  @brief Checks whether the problem corresponding to the given ID is complete
++
++  Might require authorization
++
++  @return Positive number if such the proble is complete, 0 if doesn't and negative number if an error occurs.
++ */
++int dbus_problem_is_complete(const char *problem_id);
++
++/**
+   @ Returns value of the given element name
+ 
+   Might require authorization
+@@ -182,6 +191,13 @@ char *load_text_over_dbus(const char *problem_id, const char *element_name);
+ int delete_problem_dirs_over_dbus(const GList *problem_dir_paths);
+ 
+ /**
++  @brief Fetches given problem elements for specified problem id
++
++  @return on failures returns non zero value and emits error message
++*/
++int fill_problem_data_over_dbus(const char *problem_dir_path, const char **elements, problem_data_t *problem_data);
++
++/**
+   @brief Fetches problem information for specified problem id
+ 
+   @return problem_data_t or NULL on failure
+diff --git a/src/lib/problem_api_dbus.c b/src/lib/problem_api_dbus.c
+index 5148932..ce5c47b 100644
+--- a/src/lib/problem_api_dbus.c
++++ b/src/lib/problem_api_dbus.c
+@@ -101,23 +101,21 @@ int delete_problem_dirs_over_dbus(const GList *problem_dir_paths)
+     return 0;
+ }
+ 
+-problem_data_t *get_problem_data_dbus(const char *problem_dir_path)
++int fill_problem_data_over_dbus(const char *problem_id, const char **elements, problem_data_t *problem_data)
+ {
+     INITIALIZE_LIBABRT();
+ 
+     GDBusProxy *proxy = get_dbus_proxy();
+     if (!proxy)
+-        return NULL;
++        return -1;
+ 
+-    GVariantBuilder *builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
+-    g_variant_builder_add(builder, "s", FILENAME_TIME          );
+-    g_variant_builder_add(builder, "s", FILENAME_REASON        );
+-    g_variant_builder_add(builder, "s", FILENAME_NOT_REPORTABLE);
+-    g_variant_builder_add(builder, "s", FILENAME_COMPONENT     );
+-    g_variant_builder_add(builder, "s", FILENAME_EXECUTABLE    );
+-    g_variant_builder_add(builder, "s", FILENAME_REPORTED_TO   );
+-    GVariant *params = g_variant_new("(sas)", problem_dir_path, builder);
+-    g_variant_builder_unref(builder);
++    GVariantBuilder *args_builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
++
++    for (const char **iter = elements; *iter; ++iter)
++        g_variant_builder_add(args_builder, "s", *iter);
++
++    GVariant *params = g_variant_new("(sas)", problem_id, args_builder);
++    g_variant_builder_unref(args_builder);
+ 
+     GError *error = NULL;
+     GVariant *result = g_dbus_proxy_call_sync(proxy,
+@@ -130,20 +128,46 @@ problem_data_t *get_problem_data_dbus(const char *problem_dir_path)
+ 
+     if (error)
+     {
+-        error_msg(_("Can't get problem data from abrt-dbus: %s"), error->message);
++        error_msg(_("D-Bus GetInfo method call failed: %s"), error->message);
+         g_error_free(error);
+-        return NULL;
++        return -2;
+     }
+ 
+-    problem_data_t *pd = problem_data_new();
++
+     char *key, *val;
+     GVariantIter *iter;
+     g_variant_get(result, "(a{ss})", &iter);
+     while (g_variant_iter_loop(iter, "{ss}", &key, &val))
++        problem_data_add_text_noteditable(problem_data, key, val);
++
++    g_variant_unref(result);
++
++    return 0;
++}
++
++problem_data_t *get_problem_data_dbus(const char *problem_dir_path)
++{
++    INITIALIZE_LIBABRT();
++
++    static const char *elements[] = {
++        FILENAME_TIME,
++        FILENAME_REASON,
++        FILENAME_NOT_REPORTABLE,
++        FILENAME_COMPONENT,
++        FILENAME_EXECUTABLE,
++        FILENAME_REPORTED_TO,
++        NULL,
++    };
++
++    problem_data_t *pd = problem_data_new();
++
++    if (fill_problem_data_over_dbus(problem_dir_path, elements, pd) != 0)
+     {
+-        problem_data_add_text_noteditable(pd, key, val);
++        error_msg(_("Can't get problem data from abrt-dbus"));
++        problem_data_free(pd);
++        return NULL;
+     }
+-    g_variant_unref(result);
++
+     return pd;
+ }
+ 
+@@ -259,6 +283,11 @@ int test_exist_over_dbus(const char *problem_id, const char *element_name)
+     return retval;
+ }
+ 
++int dbus_problem_is_complete(const char *problem_id)
++{
++    return test_exist_over_dbus(problem_id, FILENAME_COUNT);
++}
++
+ char *load_text_over_dbus(const char *problem_id, const char *element_name)
+ {
+     INITIALIZE_LIBABRT();
+-- 
+2.4.1
+
diff --git a/0005-lib-add-new-kernel-taint-flags.patch b/0005-lib-add-new-kernel-taint-flags.patch
new file mode 100644
index 0000000..555c5a5
--- /dev/null
+++ b/0005-lib-add-new-kernel-taint-flags.patch
@@ -0,0 +1,60 @@
+From e52d14214bd356f31856a5ab63ef14a60d318364 Mon Sep 17 00:00:00 2001
+From: Jakub Filak <jfilak at redhat.com>
+Date: Tue, 5 May 2015 10:46:06 +0200
+Subject: [PATCH] lib: add new kernel taint flags
+
+Signed-off-by: Jakub Filak <jfilak at redhat.com>
+---
+ src/lib/kernel.c | 16 +++++++++++-----
+ 1 file changed, 11 insertions(+), 5 deletions(-)
+
+diff --git a/src/lib/kernel.c b/src/lib/kernel.c
+index af43ae0..dde3d28 100644
+--- a/src/lib/kernel.c
++++ b/src/lib/kernel.c
+@@ -632,8 +632,14 @@ char *koops_extract_version(const char *linepointer)
+  *  'W' - Taint on warning.
+  *  'C' - modules from drivers/staging are loaded.
+  *  'I' - Working around severe firmware bug.
++ *  'O' - Out-of-tree module has been loaded.
++ *  'E' - Unsigned module has been loaded.
++ *  'L' - A soft lockup has previously occurred.
++ *  'K' - Kernel has been live patched.
++ *
++ * Compatibility flags from older versions and downstream sources:
+  *  'H' - Hardware is unsupported.
+- *   T  - Tech_preview
++ *  'T' - Tech_preview
+  */
+ 
+ #if 0 /* unused */
+@@ -658,7 +664,7 @@ char *kernel_tainted_short(const char *kernel_bt)
+         return NULL;
+ 
+     tainted += strlen("Tainted: ");
+-    /* 13 == current count of known flags */
++    /* 17 + 2 == current count of known flags */
+     /* http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=blob_plain;f=kernel/panic.c;hb=HEAD */
+     /* 26 the maximal sane count of flags because of alphabet limits */
+     unsigned sz = 26 + 1;
+@@ -701,14 +707,14 @@ static const char *const tnts_long[] = {
+     /* B */ "System has hit bad_page.",
+     /* C */ "Modules from drivers/staging are loaded.",
+     /* D */ "Kernel has oopsed before",
+-    /* E */ NULL,
++    /* E */ "Unsigned module has been loaded."
+     /* F */ "Module has been forcibly loaded.",
+     /* G */ "Proprietary module has not been loaded.",
+     /* H */ NULL,
+     /* I */ "Working around severe firmware bug.",
+     /* J */ NULL,
+-    /* K */ NULL,
+-    /* L */ NULL,
++    /* K */ "Kernel has been live patched.",
++    /* L */ "A soft lockup has previously occurred.",
+     /* M */ "System experienced a machine check exception.",
+     /* N */ NULL,
+     /* O */ "Out-of-tree module has been loaded.",
+-- 
+2.4.1
+
diff --git a/0006-upload-validate-and-sanitize-uploaded-dump-directori.patch b/0006-upload-validate-and-sanitize-uploaded-dump-directori.patch
new file mode 100644
index 0000000..6823b33
--- /dev/null
+++ b/0006-upload-validate-and-sanitize-uploaded-dump-directori.patch
@@ -0,0 +1,142 @@
+From 3746b7627218438ae7d781fc8b18a221454e9091 Mon Sep 17 00:00:00 2001
+From: Jakub Filak <jfilak at redhat.com>
+Date: Mon, 20 Apr 2015 15:15:40 +0200
+Subject: [PATCH] upload: validate and sanitize uploaded dump directories
+
+It was discovered that, when moving problem reports from
+/var/spool/abrt-upload to /var/spool/abrt or /var/tmp/abrt,
+abrt-handle-upload does not verify that the new problem directory
+has appropriate permissions and does not contain symbolic links.  A
+crafted problem report exposes other parts of abrt to attack, and
+the abrt-handle-upload script allows to overwrite arbitrary files.
+
+Acknowledgement:
+
+This issue was discovered by Florian Weimer of Red Hat Product Security.
+
+Related: #1212953
+
+Signed-off-by: Jakub Filak <jfilak at redhat.com>
+---
+ src/daemon/abrt-handle-upload.in | 78 +++++++++++++++++++++++++++++++++++-----
+ 1 file changed, 70 insertions(+), 8 deletions(-)
+
+diff --git a/src/daemon/abrt-handle-upload.in b/src/daemon/abrt-handle-upload.in
+index 45ba72d..e812ef0 100755
+--- a/src/daemon/abrt-handle-upload.in
++++ b/src/daemon/abrt-handle-upload.in
+@@ -10,6 +10,7 @@ import getopt
+ import tempfile
+ import shutil
+ import datetime
++import grp
+ 
+ from reportclient import set_verbosity, error_msg_and_die, error_msg, log
+ 
+@@ -36,12 +37,77 @@ def init_gettext():
+ 
+ import problem
+ 
+-def write_str_to(filename, s):
+-    fd = os.open(filename, os.O_WRONLY | os.O_CREAT | os.O_TRUNC, @DEFAULT_DUMP_DIR_MODE@ | stat.S_IROTH)
++def write_str_to(filename, s, uid, gid, mode):
++    fd = os.open(filename, os.O_WRONLY | os.O_CREAT | os.O_TRUNC, mode)
+     if fd >= 0:
++        os.fchown(fd, uid, gid)
+         os.write(fd, s)
+         os.close(fd)
+ 
++
++def validate_transform_move_and_notify(uploaded_dir_path, problem_dir_path, dest=None):
++    fsuid = 0
++    fsgid = 0
++
++    try:
++        gabrt = grp.getgrnam("abrt")
++        fsgid = gabrt.gr_gid
++    except KeyError as ex:
++        error_msg("Failed to get GID of 'abrt' (using 0 instead): {0}'".format(str(ex)))
++
++    try:
++        # give the uploaded directory to 'root:abrt' or 'root:root'
++        os.chown(uploaded_dir_path, fsuid, fsgid)
++        # set the right permissions for this machine
++        # (allow the owner and the group to access problem elements,
++        #  the default dump dir mode lacks x bit for both)
++        os.chmod(uploaded_dir_path, @DEFAULT_DUMP_DIR_MODE@ | stat.S_IXUSR | stat.S_IXGRP)
++
++        # sanitize problem elements
++        for item in os.listdir(uploaded_dir_path):
++            apath = os.path.join(uploaded_dir_path, item)
++            if os.path.islink(apath):
++                # remove symbolic links
++                os.remove(apath)
++            elif os.path.isdir(apath):
++                # remove directories
++                shutil.rmtree(apath)
++            elif os.path.isfile(apath):
++                # set file ownership to 'root:abrt' or 'root:root'
++                os.chown(apath, fsuid, fsgid)
++                # set the right file permissions for this machine
++                os.chmod(apath, @DEFAULT_DUMP_DIR_MODE@)
++            else:
++                # remove things that are neither files, symlinks nor directories
++                os.remove(apath)
++    except OSError as ex:
++        error_msg("Removing uploaded dir '{0}': '{1}'".format(uploaded_dir_path, str(ex)))
++        try:
++            shutil.rmtree(uploaded_dir_path)
++        except OSError as ex2:
++            error_msg_and_die("Failed to clean up dir '{0}': '{1}'".format(uploaded_dir_path, str(ex2)))
++        return
++
++    # overwrite remote if it exists
++    remote_path = os.path.join(uploaded_dir_path, "remote")
++    write_str_to(remote_path, "1", fsuid, fsgid, @DEFAULT_DUMP_DIR_MODE@)
++
++    # abrtd would increment count value and abrt-server refuses to process
++    # problem directories containing 'count' element when PrivateReports is on.
++    count_path = os.path.join(uploaded_dir_path, "count")
++    if os.path.exists(count_path):
++        # overwrite remote_count if it exists
++        remote_count_path = os.path.join(uploaded_dir_path, "remote_count")
++        os.rename(count_path, remote_count_path)
++
++    if not dest:
++        dest = problem_dir_path
++
++    shutil.move(uploaded_dir_path, dest)
++
++    problem.notify_new_path(problem_dir_path)
++
++
+ if __name__ == "__main__":
+ 
+     # Helper: exit with cleanup
+@@ -177,21 +243,17 @@ if __name__ == "__main__":
+         # or one or more complete problem data directories.
+         # Checking second possibility first.
+         if (os.path.exists(tempdir+"/analyzer") or os.path.exists(tempdir+"/type")) and os.path.exists(tempdir+"/time"):
+-            write_str_to(tempdir+"/remote", "1")
+-            shutil.move(tempdir, abrt_dir)
+-            problem.notify_new_path(abrt_dir+"/"+os.path.basename(tempdir))
++            validate_transform_move_and_notify(tempdir, abrt_dir+"/"+os.path.basename(tempdir), dest=abrt_dir)
+         else:
+             for d in os.listdir(tempdir):
+                 if not os.path.isdir(tempdir+"/"+d):
+                     continue
+-                write_str_to(tempdir+"/"+d+"/remote", "1")
+                 dst = abrt_dir+"/"+d
+                 if os.path.exists(dst):
+                     dst += "."+str(os.getpid())
+                 if os.path.exists(dst):
+                     continue
+-                shutil.move(tempdir+"/"+d, dst)
+-                problem.notify_new_path(dst)
++                validate_transform_move_and_notify(tempdir+"/"+d, dst)
+ 
+         die_exitcode = 0
+         # This deletes working_dir (== delete_on_exit)
+-- 
+2.4.1
+
diff --git a/0008-a-a-s-p-d-add-new-known-interpreter-to-conf-file.patch b/0008-a-a-s-p-d-add-new-known-interpreter-to-conf-file.patch
new file mode 100644
index 0000000..7a254b7
--- /dev/null
+++ b/0008-a-a-s-p-d-add-new-known-interpreter-to-conf-file.patch
@@ -0,0 +1,29 @@
+From 7d5be427e208e565ee16a7f34be64acb781fb2f9 Mon Sep 17 00:00:00 2001
+From: Matej Habrnal <mhabrnal at redhat.com>
+Date: Mon, 18 May 2015 08:45:48 +0200
+Subject: [PATCH] a-a-s-p-d: add new known interpreter to conf file
+
+There were new bugzillas opened with wrong component 'python3' because of a new
+version of python (3.4). We don't want to blame the interpreters but the
+running scripts.
+
+close #965
+
+Signed-off-by: Matej Habrnal <mhabrnal at redhat.com>
+---
+ src/daemon/abrt-action-save-package-data.conf | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/daemon/abrt-action-save-package-data.conf b/src/daemon/abrt-action-save-package-data.conf
+index 33cef8f..27b9607 100644
+--- a/src/daemon/abrt-action-save-package-data.conf
++++ b/src/daemon/abrt-action-save-package-data.conf
+@@ -18,4 +18,4 @@ ProcessUnpackaged = yes
+ BlackListedPaths = /usr/share/doc/*, */example*, /usr/bin/nspluginviewer
+ 
+ # interpreters names
+-Interpreters = python2, python2.7, python, python3, python3.3, perl, perl5.16.2
++Interpreters = python2, python2.7, python, python3, python3.3, python3.4, python3.5, perl, perl5.16.2
+-- 
+2.4.1
+
diff --git a/0010-applet-fix-problem-info-double-free.patch b/0010-applet-fix-problem-info-double-free.patch
new file mode 100644
index 0000000..256ba04
--- /dev/null
+++ b/0010-applet-fix-problem-info-double-free.patch
@@ -0,0 +1,41 @@
+From 65c24bb248b9b7b2e33e8b0ba9e3e06ffde4b291 Mon Sep 17 00:00:00 2001
+From: Matej Habrnal <mhabrnal at redhat.com>
+Date: Mon, 18 May 2015 15:46:59 +0200
+Subject: [PATCH] applet: fix problem info double free
+
+There was a double free when an action function was called.
+Problem info is freed when the notification is destroyed because the free
+function is registred when the action is added
+(notify_notification_add_action()). So the problem_info_unref() function in the
+action function is moreover and causes the double free problem.
+
+Related to rhbz#1211644
+
+Signed-off-by: Matej Habrnal <mhabrnal at redhat.com>
+---
+ src/applet/applet.c | 2 --
+ 1 file changed, 2 deletions(-)
+
+diff --git a/src/applet/applet.c b/src/applet/applet.c
+index 4df69fc..c00f7e3 100644
+--- a/src/applet/applet.c
++++ b/src/applet/applet.c
+@@ -501,7 +501,6 @@ static void action_report(NotifyNotification *notification, gchar *action, gpoin
+     problem_info_t *pi = (problem_info_t *)user_data;
+     if (problem_info_get_dir(pi))
+         fork_exec_gui(problem_info_get_dir(pi));
+-    problem_info_unref(pi);
+ }
+ 
+ static void action_restart(NotifyNotification *notification, gchar *action, gpointer user_data)
+@@ -528,7 +527,6 @@ static void action_restart(NotifyNotification *notification, gchar *action, gpoi
+                    err->message);
+     }
+     g_object_unref (app);
+-    problem_info_unref(pi);
+ }
+ 
+ static void on_notify_close(NotifyNotification *notification, gpointer user_data)
+-- 
+2.4.1
+
diff --git a/0011-cli-do-not-exit-with-segfault-if-dbus-fails.patch b/0011-cli-do-not-exit-with-segfault-if-dbus-fails.patch
new file mode 100644
index 0000000..c17e33e
--- /dev/null
+++ b/0011-cli-do-not-exit-with-segfault-if-dbus-fails.patch
@@ -0,0 +1,30 @@
+From 82957a3390188509921ec16bddc27f2aeeb01b8d Mon Sep 17 00:00:00 2001
+From: Matej Habrnal <mhabrnal at redhat.com>
+Date: Mon, 4 May 2015 10:35:25 +0200
+Subject: [PATCH] cli: do not exit with segfault if dbus fails
+
+There was a segfault when we ran 'abrt-cli list' and dbus failed.
+
+Related to rhbz#1217901
+
+Signed-off-by: Matej Habrnal <mhabrnal at redhat.com>
+---
+ src/cli/list.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/src/cli/list.c b/src/cli/list.c
+index c0c819d..31d1835 100644
+--- a/src/cli/list.c
++++ b/src/cli/list.c
+@@ -142,6 +142,8 @@ int cmd_list(int argc, const char **argv)
+     parse_opts(argc, (char **)argv, program_options, program_usage_string);
+ 
+     vector_of_problem_data_t *ci = fetch_crash_infos();
++    if (ci == NULL)
++        return 1;
+ 
+     g_ptr_array_sort_with_data(ci, &cmp_problem_data, (char *) FILENAME_LAST_OCCURRENCE);
+ 
+-- 
+2.4.1
+
diff --git a/0013-abrt-auto-reporting-require-rhtsupport.conf-file-onl.patch b/0013-abrt-auto-reporting-require-rhtsupport.conf-file-onl.patch
new file mode 100644
index 0000000..5fec7d9
--- /dev/null
+++ b/0013-abrt-auto-reporting-require-rhtsupport.conf-file-onl.patch
@@ -0,0 +1,589 @@
+From 0b8955a845f7a28a090bfe07d33a0acf161526e2 Mon Sep 17 00:00:00 2001
+From: Matej Habrnal <mhabrnal at redhat.com>
+Date: Fri, 24 Apr 2015 15:37:15 +0200
+Subject: [PATCH] abrt-auto-reporting: require rhtsupport.conf file only on
+ RHEL
+
+abrt-auto-reporting required the rhtsupport.conf on Fedora and CentOS but the conf
+file do not exists in those systems.
+
+Resolves abrt/abrt#957
+
+Signed-off-by: Matej Habrnal <mhabrnal at redhat.com>
+---
+ configure.ac                                |  11 +++
+ doc/Makefile.am                             |  13 +++-
+ doc/abrt-auto-reporting-authenticated.txt   | 106 ++++++++++++++++++++++++++++
+ doc/abrt-auto-reporting-unauthenticated.txt |  71 +++++++++++++++++++
+ doc/abrt-auto-reporting.txt                 | 106 ----------------------------
+ src/daemon/abrt-auto-reporting.c            |  71 ++++++++++++++-----
+ 6 files changed, 254 insertions(+), 124 deletions(-)
+ create mode 100644 doc/abrt-auto-reporting-authenticated.txt
+ create mode 100644 doc/abrt-auto-reporting-unauthenticated.txt
+ delete mode 100644 doc/abrt-auto-reporting.txt
+
+diff --git a/configure.ac b/configure.ac
+index acd0d32..6962d2c 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -296,6 +296,17 @@ AC_ARG_ENABLE(suggest-autoreporting,
+ 
+ AM_CONDITIONAL(SUGGEST_AUTOREPORTING, test "$enable_suggest_autoreporting" = "yes")
+ 
++# Authenticated autoreporting
++
++AC_ARG_ENABLE(authenticated-autoreporting,
++    AS_HELP_STRING([--enable-authenticated-autoreporting],
++    [enable authenticated autoreporting]),
++    [enable_authenticated_autoreporting=$enableval],
++    [enable_authenticated_autoreporting=no]
++)
++
++AM_CONDITIONAL(AUTHENTICATED_AUTOREPORTING, test "$enable_authenticated_autoreporting" = "yes")
++
+ # Make satyr use GDB or elfutils/libunwind for unwinding?
+ 
+ AC_ARG_ENABLE([native-unwinder],
+diff --git a/doc/Makefile.am b/doc/Makefile.am
+index 6efd6d6..3e7499c 100644
+--- a/doc/Makefile.am
++++ b/doc/Makefile.am
+@@ -78,6 +78,17 @@ man1_MANS = ${MAN1_TXT:%.txt=%.1}
+ man5_MANS = ${MAN5_TXT:%.txt=%.5} ${MAN5_PREFORMATTED}
+ man8_MANS = ${MAN8_TXT:%.txt=%.8}
+ 
++MAN_SOURCE =
++MAN_SOURCE = abrt-auto-reporting-authenticated.txt
++MAN_SOURCE = abrt-auto-reporting-unauthenticated.txt
++
++if AUTHENTICATED_AUTOREPORTING
++abrt-auto-reporting.txt: abrt-auto-reporting-authenticated.txt
++else
++abrt-auto-reporting.txt: abrt-auto-reporting-unauthenticated.txt
++endif
++	cp $< $@
++
+ %.1 %.5 %.8: %.xml
+ 	$(XMLTO_SILENT) xmlto man $< 2>&1 | sed '/Note/d'
+ 
+@@ -86,6 +97,6 @@ man8_MANS = ${MAN8_TXT:%.txt=%.8}
+                            --conf-file ../asciidoc.conf \
+                            -aabrt_version=$(PACKAGE_VERSION) -o $@ $<
+ 
+-EXTRA_DIST = $(MAN1_TXT) $(MAN5_TXT) $(MAN8_TXT) $(MAN5_PREFORMATTED)
++EXTRA_DIST = $(MAN1_TXT) $(MAN5_TXT) $(MAN8_TXT) $(MAN5_PREFORMATTED) $(MAN_SOURCE)
+ 
+ CLEANFILES = ${MAN1_TXT:%.txt=%.1} ${MAN5_TXT:%.txt=%.5} ${MAN8_TXT:%.txt=%.8}
+diff --git a/doc/abrt-auto-reporting-authenticated.txt b/doc/abrt-auto-reporting-authenticated.txt
+new file mode 100644
+index 0000000..2a27945
+--- /dev/null
++++ b/doc/abrt-auto-reporting-authenticated.txt
+@@ -0,0 +1,106 @@
++abrt-auto-reporting(1)
++======================
++
++NAME
++----
++abrt-auto-reporting - Get or modify the auto reporting option values
++
++SYNOPSIS
++--------
++'abrt-auto-reporting' [-v] [ enabled | yes | 1 | on | disabled | no | 0 | off ]
++                      [ [--anonymous] |
++                        [--username USERNAME [--password PASSWORD] ] |
++                        [--certificate SOURCE] ]
++
++DESCRIPTION
++-----------
++Reads the configuration from abrt.conf and saves the changes to the same file.
++
++The changes will take effect immediately without necessity to restart any ABRT
++process and will be persistent.
++
++'disabled'::
++   User have to report the detect problems manually
++
++'enabled'::
++   ABRT uploads an uReport which was generated for a detected problem
++   immediately after the detection phase.
++
++Reads and saves the authentication configuration options in
++/etc/libreport/plugins/ureport.conf and /etc/libreport/plugins/rhtsupport.conf
++
++uReport description
++~~~~~~~~~~~~~~~~~~~
++ABRT supports uReports for four types of crashes: crashes of C/C++ programs
++that result in a core dump, uncaught Python exceptions, uncaught Java
++exceptions and kernel oopses.
++
++Each uReport generally contains a stack trace, or multiple stack traces in the
++case of multi-threaded C/C++ and Java programs. The stack trace only describes
++the call stack of the program at the time of the crash and does not contain
++contents of any variables.
++
++Every uReport also contains identification of the operating system, versions of
++the RPM packages involved in the crash, and whether the program ran under a
++root user.
++
++There are also items specific to each crash type:
++
++C/C++ crashes::
++    these are path to the executable and signal delivered to the program,
++
++Python exceptions::
++    there is the type of the exception (without the error message, which may
++    contain sensitive data),
++
++for kernel oopses::
++    these are list of loaded kernel modules, list of taint flags, and full text
++    of the kernel oops.
++
++The authenticated uReports also contains *hostname* and *machineid* to enable a
++server side filtering at https://access.redhat.com/.
++
++The authenticated uReports have the benefit of rich server replies which may
++include a solution for the submitted crash. The authentication is done using
++either Red Hat Subscription Certificates or Red Hat Customer Portal
++credentials.
++
++'Warning':
++The full text of a kernel oops might contain information like the
++identification of the host hardware type. You should disable the autoreporting
++feature if you do not want to share this information with Red Hat.
++
++
++OPTIONS
++-------
++-v, --verbose::
++   Be more verbose. Can be given multiple times.
++
++-a, --anonymous::
++   Turns the authentication off by clearing both 'SSLClientAuth' and 'HTTPAuth'
++   configuration options in /etc/libreport/plugins/ureport.conf
++
++-u, --username USERNAME::
++   Turns HTTP Authentication on by setting 'HTTPAuth' configuration option to
++   *rhts-credentials* in /etc/libreport/plugins/ureport.conf and storing
++   USERNAME and PASSWORD in /etc/libreport/plugins/rhtsupport.conf
++   Also turns the SSL Client Authentication off, because these methods cannot
++   be used together.
++
++-p, --password PASSWORD::
++   Password for HTTP Authentication. If not provided, a prompt asking for it
++   will be issued.
++
++-c, --certificate SOURCE::
++   Turns SSL Client Authentication on by setting 'SSLClientAuth' configuration
++   option to SOURCE in /etc/libreport/plugins/ureport.conf.
++   Also turns the HTTP Authentication off, because these methods cannot
++   be used together.
++
++SEE ALSO
++--------
++abrt.conf(5), ureport.conf(5), rhtsupport.conf(5)
++
++AUTHORS
++-------
++* ABRT team
+diff --git a/doc/abrt-auto-reporting-unauthenticated.txt b/doc/abrt-auto-reporting-unauthenticated.txt
+new file mode 100644
+index 0000000..320c803
+--- /dev/null
++++ b/doc/abrt-auto-reporting-unauthenticated.txt
+@@ -0,0 +1,71 @@
++abrt-auto-reporting(1)
++======================
++
++NAME
++----
++abrt-auto-reporting - Get or modify the auto reporting option values
++
++SYNOPSIS
++--------
++'abrt-auto-reporting' [-v] [ enabled | yes | 1 | on | disabled | no | 0 | off ]
++
++DESCRIPTION
++-----------
++Reads the configuration from abrt.conf and saves the changes to the same file.
++
++The changes will take effect immediately without necessity to restart any ABRT
++process and will be persistent.
++
++'disabled'::
++   User have to report the detect problems manually
++
++'enabled'::
++   ABRT uploads an uReport which was generated for a detected problem
++   immediately after the detection phase.
++
++uReport description
++~~~~~~~~~~~~~~~~~~~
++ABRT supports uReports for four types of crashes: crashes of C/C++ programs
++that result in a core dump, uncaught Python exceptions, uncaught Java
++exceptions and kernel oopses.
++
++Each uReport generally contains a stack trace, or multiple stack traces in the
++case of multi-threaded C/C++ and Java programs. The stack trace only describes
++the call stack of the program at the time of the crash and does not contain
++contents of any variables.
++
++Every uReport also contains identification of the operating system, versions of
++the RPM packages involved in the crash, and whether the program ran under a
++root user.
++
++There are also items specific to each crash type:
++
++C/C++ crashes::
++    these are path to the executable and signal delivered to the program,
++
++Python exceptions::
++    there is the type of the exception (without the error message, which may
++    contain sensitive data),
++
++for kernel oopses::
++    these are list of loaded kernel modules, list of taint flags, and full text
++    of the kernel oops.
++
++'Warning':
++The full text of a kernel oops might contain information like the
++identification of the host hardware type. You should disable the autoreporting
++feature if you do not want to share this information with Red Hat.
++
++
++OPTIONS
++-------
++-v, --verbose::
++   Be more verbose. Can be given multiple times.
++
++SEE ALSO
++--------
++abrt.conf(5)
++
++AUTHORS
++-------
++* ABRT team
+diff --git a/doc/abrt-auto-reporting.txt b/doc/abrt-auto-reporting.txt
+deleted file mode 100644
+index 2a27945..0000000
+--- a/doc/abrt-auto-reporting.txt
++++ /dev/null
+@@ -1,106 +0,0 @@
+-abrt-auto-reporting(1)
+-======================
+-
+-NAME
+-----
+-abrt-auto-reporting - Get or modify the auto reporting option values
+-
+-SYNOPSIS
+---------
+-'abrt-auto-reporting' [-v] [ enabled | yes | 1 | on | disabled | no | 0 | off ]
+-                      [ [--anonymous] |
+-                        [--username USERNAME [--password PASSWORD] ] |
+-                        [--certificate SOURCE] ]
+-
+-DESCRIPTION
+------------
+-Reads the configuration from abrt.conf and saves the changes to the same file.
+-
+-The changes will take effect immediately without necessity to restart any ABRT
+-process and will be persistent.
+-
+-'disabled'::
+-   User have to report the detect problems manually
+-
+-'enabled'::
+-   ABRT uploads an uReport which was generated for a detected problem
+-   immediately after the detection phase.
+-
+-Reads and saves the authentication configuration options in
+-/etc/libreport/plugins/ureport.conf and /etc/libreport/plugins/rhtsupport.conf
+-
+-uReport description
+-~~~~~~~~~~~~~~~~~~~
+-ABRT supports uReports for four types of crashes: crashes of C/C++ programs
+-that result in a core dump, uncaught Python exceptions, uncaught Java
+-exceptions and kernel oopses.
+-
+-Each uReport generally contains a stack trace, or multiple stack traces in the
+-case of multi-threaded C/C++ and Java programs. The stack trace only describes
+-the call stack of the program at the time of the crash and does not contain
+-contents of any variables.
+-
+-Every uReport also contains identification of the operating system, versions of
+-the RPM packages involved in the crash, and whether the program ran under a
+-root user.
+-
+-There are also items specific to each crash type:
+-
+-C/C++ crashes::
+-    these are path to the executable and signal delivered to the program,
+-
+-Python exceptions::
+-    there is the type of the exception (without the error message, which may
+-    contain sensitive data),
+-
+-for kernel oopses::
+-    these are list of loaded kernel modules, list of taint flags, and full text
+-    of the kernel oops.
+-
+-The authenticated uReports also contains *hostname* and *machineid* to enable a
+-server side filtering at https://access.redhat.com/.
+-
+-The authenticated uReports have the benefit of rich server replies which may
+-include a solution for the submitted crash. The authentication is done using
+-either Red Hat Subscription Certificates or Red Hat Customer Portal
+-credentials.
+-
+-'Warning':
+-The full text of a kernel oops might contain information like the
+-identification of the host hardware type. You should disable the autoreporting
+-feature if you do not want to share this information with Red Hat.
+-
+-
+-OPTIONS
+--------
+--v, --verbose::
+-   Be more verbose. Can be given multiple times.
+-
+--a, --anonymous::
+-   Turns the authentication off by clearing both 'SSLClientAuth' and 'HTTPAuth'
+-   configuration options in /etc/libreport/plugins/ureport.conf
+-
+--u, --username USERNAME::
+-   Turns HTTP Authentication on by setting 'HTTPAuth' configuration option to
+-   *rhts-credentials* in /etc/libreport/plugins/ureport.conf and storing
+-   USERNAME and PASSWORD in /etc/libreport/plugins/rhtsupport.conf
+-   Also turns the SSL Client Authentication off, because these methods cannot
+-   be used together.
+-
+--p, --password PASSWORD::
+-   Password for HTTP Authentication. If not provided, a prompt asking for it
+-   will be issued.
+-
+--c, --certificate SOURCE::
+-   Turns SSL Client Authentication on by setting 'SSLClientAuth' configuration
+-   option to SOURCE in /etc/libreport/plugins/ureport.conf.
+-   Also turns the HTTP Authentication off, because these methods cannot
+-   be used together.
+-
+-SEE ALSO
+---------
+-abrt.conf(5), ureport.conf(5), rhtsupport.conf(5)
+-
+-AUTHORS
+--------
+-* ABRT team
+diff --git a/src/daemon/abrt-auto-reporting.c b/src/daemon/abrt-auto-reporting.c
+index 0fffeb6..b608c9b 100644
+--- a/src/daemon/abrt-auto-reporting.c
++++ b/src/daemon/abrt-auto-reporting.c
+@@ -64,6 +64,7 @@ set_abrt_reporting(map_string_t *conf, const char *opt_value)
+     return 1;
+ }
+ 
++#if AUTHENTICATED_AUTOREPORTING != 0
+ static int
+ set_ureport_http_auth(map_string_t *conf, const char *opt_value)
+ {
+@@ -134,6 +135,7 @@ set_rhts_credentials(map_string_t *conf, const char *username, const char *passw
+     /* No changes needed -> success */
+     return 1;
+ }
++#endif
+ 
+ static const char *
+ get_abrt_reporting(map_string_t *conf)
+@@ -143,6 +145,7 @@ get_abrt_reporting(map_string_t *conf)
+     return REPORTING_STATES[index][0];
+ }
+ 
++#if AUTHENTICATED_AUTOREPORTING != 0
+ static const char *
+ get_ureport_http_auth(map_string_t *conf)
+ {
+@@ -154,6 +157,7 @@ get_ureport_client_auth(map_string_t *conf)
+ {
+     return get_map_string_item_or_NULL(conf, UREPORT_CLIENT_AUTH_OPTION);
+ }
++#endif
+ 
+ int main(int argc, char *argv[])
+ {
+@@ -171,57 +175,78 @@ int main(int argc, char *argv[])
+     textdomain(PACKAGE);
+ #endif
+ 
++#define PROGRAM_USAGE_MIDDLE_PART \
++            "\n" \
++            "Get or modify a value of the auto-reporting option. The changes will take\n" \
++            "effect immediately and will be persistent.\n" \
++            "\n" \
++            ""STATE_MANUAL":\n" \
++            "User have to report the detect problems manually\n" \
++            "\n" \
++            ""STATE_AUTO":\n" \
++            "ABRT uploads an uReport which was generated for a detected problem\n" \
++            "immediately after the detection phase. uReport generally contains a stack\n" \
++            "trace which only describes the call stack of the program at the time of the\n" \
++            "crash and does not contain contents of any variables.  Every uReport also\n" \
++            "contains identification of the operating system, versions of the RPM packages\n" \
++            "involved in the crash, and whether the program ran under a root user.\n" \
++            "\n"
++
+     abrt_init(argv);
++#if AUTHENTICATED_AUTOREPORTING != 0
+     const char *program_usage_string = _(
+             "& [ "STATE_MANUAL" | "STATE_AUTO" | yes | no | 1 | 0 ] \\\n"
+             "  [[--anonymous] | [--username USERNAME [--password PASSWORD]] | [--certificate SOURCE]]\n"
+-            "\n"
+-            "Get or modify a value of the auto-reporting option. The changes will take\n"
+-            "effect immediately and will be persistent.\n"
+-            "\n"
+-            ""STATE_MANUAL":\n"
+-            "User have to report the detect problems manually\n"
+-            "\n"
+-            ""STATE_AUTO":\n"
+-            "ABRT uploads an uReport which was generated for a detected problem\n"
+-            "immediately after the detection phase. uReport generally contains a stack\n"
+-            "trace which only describes the call stack of the program at the time of the\n"
+-            "crash and does not contain contents of any variables.  Every uReport also\n"
+-            "contains identification of the operating system, versions of the RPM packages\n"
+-            "involved in the crash, and whether the program ran under a root user.\n"
+-            "\n"
++            PROGRAM_USAGE_MIDDLE_PART
+             "See abrt-auto-reporting(1), reporter-ureport(1) and reporter-rhtsupport(1)\n"
+             "for more details.\n"
+     );
++#else
++    const char *program_usage_string = _(
++            "& [ "STATE_MANUAL" | "STATE_AUTO" | yes | no | 1 | 0 ]\n"
++            PROGRAM_USAGE_MIDDLE_PART
++            "See abrt-auto-reporting(1) and reporter-ureport(1) for more details.\n"
++    );
++#endif
+ 
+     enum {
+         OPT_v = 1 << 0,
++#if AUTHENTICATED_AUTOREPORTING != 0
+         OPT_a = 1 << 1,
+         OPT_u = 1 << 2,
+         OPT_p = 1 << 3,
+         OPT_c = 1 << 4,
++#endif
+     };
+ 
++#if AUTHENTICATED_AUTOREPORTING != 0
+     int anonymous = 0;
+     const char *username = NULL;
+     const char *password = NULL;
+     const char *certificate = NULL;
++#endif
+ 
+     /* Keep enum above and order of options below in sync! */
+     struct options program_options[] = {
+         OPT__VERBOSE(&g_verbose),
++#if AUTHENTICATED_AUTOREPORTING != 0
+         OPT_BOOL  (  'a', "anonymous",   &anonymous,               _("Turns the authentication off")),
+         OPT_STRING(  'u', "username",    &username,    "USERNAME", _("Red Hat Support user name")),
+         OPT_STRING(  'p', "password",    &password,    "PASSWORD", _("Red Hat Support password, if not given, a prompt for it will be issued")),
+         OPT_STRING(  'c', "certificate", &certificate, "SOURCE",   _("uReport SSL certificate paths or certificate type")),
++#endif
+         OPT_END()
+     };
+ 
+-    const unsigned opts = parse_opts(argc, argv, program_options, program_usage_string);
++#if AUTHENTICATED_AUTOREPORTING != 0
++    const unsigned opts =
++#endif
++    parse_opts(argc, argv, program_options, program_usage_string);
+ 
+     argv += optind;
+     argc -= optind;
+ 
++#if AUTHENTICATED_AUTOREPORTING != 0
+     if ((opts & OPT_p) && !(opts & OPT_u))
+     {
+         error_msg(_("You also need to specify --username for --password"));
+@@ -246,6 +271,7 @@ int main(int argc, char *argv[])
+         show_usage_and_die(program_usage_string, program_options);
+     }
+ 
++#endif
+     if (argc > 1)
+     {
+         error_msg(_("Invalid number of arguments"));
+@@ -275,20 +301,25 @@ int main(int argc, char *argv[])
+     int exit_code = EXIT_FAILURE;
+ 
+     map_string_t *conf = new_map_string();
++#if AUTHENTICATED_AUTOREPORTING != 0
+     map_string_t *rhts_conf = new_map_string();
+     map_string_t *rhts_conf_bck = NULL;
++#endif
+     map_string_t *ureport_conf = new_map_string();
+     map_string_t *ureport_conf_bck = NULL;
+ 
+     if (!load_abrt_conf_file(CONF_NAME, conf))
+         goto finito;
+ 
++#if AUTHENTICATED_AUTOREPORTING != 0
+     if (!load_plugin_conf_file(RHTS_NAME, rhts_conf, false))
+         goto finito;
++#endif
+ 
+     if (!load_plugin_conf_file(UREPORT_NAME, ureport_conf, false))
+         goto finito;
+ 
++#if AUTHENTICATED_AUTOREPORTING != 0
+     if ((opts & OPT_a))
+     {
+         ureport_conf_bck = clone_map_string(ureport_conf);
+@@ -334,11 +365,13 @@ int main(int argc, char *argv[])
+             goto finito;
+     }
+ 
++#endif
+     if (argc == 0)
+     {
+         printf("%s", get_abrt_reporting(conf));
+         exit_code = EXIT_SUCCESS;
+ 
++#if AUTHENTICATED_AUTOREPORTING != 0
+         if (g_verbose >= 1)
+         {
+             const char *tmp = get_ureport_http_auth(ureport_conf);
+@@ -350,7 +383,7 @@ int main(int argc, char *argv[])
+             else
+                 printf(" %s", _("anonymous auto reporting"));
+         }
+-
++#endif
+         putchar('\n');
+ 
+         goto finito;
+@@ -363,16 +396,20 @@ int main(int argc, char *argv[])
+         if (ureport_conf_bck != NULL)
+             save_plugin_conf_file(UREPORT_NAME, ureport_conf_bck);
+ 
++#if AUTHENTICATED_AUTOREPORTING != 0
+         if (rhts_conf_bck != NULL)
+             save_plugin_conf_file(RHTS_NAME, rhts_conf_bck);
++#endif
+     }
+ 
+ 
+ finito:
+     free_map_string(ureport_conf);
+     free_map_string(ureport_conf_bck);
++#if AUTHENTICATED_AUTOREPORTING != 0
+     free_map_string(rhts_conf);
+     free_map_string(rhts_conf_bck);
++#endif
+     free_map_string(conf);
+     return exit_code;
+ }
+-- 
+2.4.1
+
diff --git a/0015-abrt-action-list-dsos-do-not-decode-not-existing-obj.patch b/0015-abrt-action-list-dsos-do-not-decode-not-existing-obj.patch
new file mode 100644
index 0000000..c1a15f4
--- /dev/null
+++ b/0015-abrt-action-list-dsos-do-not-decode-not-existing-obj.patch
@@ -0,0 +1,37 @@
+From c17cb1999357d9be51b8118661a8f35569c66dd0 Mon Sep 17 00:00:00 2001
+From: Matej Habrnal <mhabrnal at redhat.com>
+Date: Thu, 14 May 2015 16:27:02 +0200
+Subject: [PATCH] abrt-action-list-dsos: do not decode not existing object
+
+If you build a package using 'make rpm', there is no vendor param in it.
+So this is the reason why the Decode method was called on None object.
+
+Signed-off-by: Matej Habrnal <mhabrnal at redhat.com>
+---
+ src/plugins/abrt-action-list-dsos | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+diff --git a/src/plugins/abrt-action-list-dsos b/src/plugins/abrt-action-list-dsos
+index f4a1536..a3078a5 100644
+--- a/src/plugins/abrt-action-list-dsos
++++ b/src/plugins/abrt-action-list-dsos
+@@ -82,10 +82,15 @@ if __name__ == "__main__":
+                         if outname:
+                             outfile = xopen(outname, "w")
+                             outname = None
++
++                        vendor = h[rpm.RPMTAG_VENDOR]
++                        if vendor != None:
++                            verdor = vendor.decode('utf-8')
++
+                         outfile.write("%s %s (%s) %s\n" %
+                                     (path,
+                                      h[rpm.RPMTAG_NEVRA].decode('utf-8'),
+-                                     h[rpm.RPMTAG_VENDOR].decode('utf-8'),
++                                     verdor,
+                                      h[rpm.RPMTAG_INSTALLTIME])
+                                     )
+ 
+-- 
+2.4.1
+
diff --git a/0016-doc-polkit-Spelling-grammar-fixes.patch b/0016-doc-polkit-Spelling-grammar-fixes.patch
new file mode 100644
index 0000000..ef8b8a4
--- /dev/null
+++ b/0016-doc-polkit-Spelling-grammar-fixes.patch
@@ -0,0 +1,143 @@
+From e3df315b18f833bb44eb8aadeefc2ad932f39f97 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Ville=20Skytt=C3=A4?= <ville.skytta at iki.fi>
+Date: Tue, 19 May 2015 09:29:28 +0300
+Subject: [PATCH] doc, polkit: Spelling/grammar fixes
+
+---
+ doc/design                                           |  6 +++---
+ doc/problems-service/org.freedesktop.Problems.xml.in |  4 ++--
+ doc/project/abrt.tex                                 | 14 +++++++-------
+ src/dbus/abrt_polkit.policy                          |  4 ++--
+ 4 files changed, 14 insertions(+), 14 deletions(-)
+
+diff --git a/doc/design b/doc/design
+index a9ce040..f214caf 100644
+--- a/doc/design
++++ b/doc/design
+@@ -37,7 +37,7 @@ to a dedicated server(s) for processing (backtrace, etc).
+ 
+ 	Design
+ 
+-Abrt design should be flexible enough to accomodate all
++Abrt design should be flexible enough to accommodate all
+ of the above usage scenarios.
+ 
+ Since currently we do not know how to dump oops on demand,
+@@ -70,7 +70,7 @@ uses inotify to watch for crashes. Instead the programs which create crashes
+ can trigger their initial ("post-create") processing themselves]
+ 
+ Crashes conceptually go through "events" in their lives.
+-Apart from "post-create" event decribed above, they may have
++Apart from "post-create" event described above, they may have
+ "analyze" event, "report[_FOO]" events,
+ and arbitrarily-named other events.
+ abrt-handle-crashdump tool can be used to "run" an event on a directory,
+@@ -124,7 +124,7 @@ Done:
+ * Make abrt-gui start abrtd on demand, so that abrt-gui can be started
+   even if abrtd does not run at the moment.
+ * make kerneloops plugin into separate daemon (convert it to a hook
+-  and get rid of "cron plugins" which are wrong idea since the begining)
++  and get rid of "cron plugins" which are wrong idea since the beginning)
+ * make C/C++ hook to be started by init script
+ * add "include FILE" feature to abrt_event.conf
+ 
+diff --git a/doc/problems-service/org.freedesktop.Problems.xml.in b/doc/problems-service/org.freedesktop.Problems.xml.in
+index 118d4b2..b791bdb 100644
+--- a/doc/problems-service/org.freedesktop.Problems.xml.in
++++ b/doc/problems-service/org.freedesktop.Problems.xml.in
+@@ -53,7 +53,7 @@
+                             <varlistentry>
+                                 <term>uid</term>
+                                 <listitem>
+-                                    <para>Only a user with root priviledges can pass this field. For all other users the field is filled by caller's uid.</para>
++                                    <para>Only a user with root privileges can pass this field. For all other users the field is filled by caller's uid.</para>
+                                 </listitem>
+                             </varlistentry>
+                             <varlistentry>
+@@ -309,7 +309,7 @@ for prblmid in problems.GetProblems():
+                 </arg>
+ 
+                 <arg type='x' name='timestamp_from' direction='in'>
+-                    <tp:docstring>Beginnig of required time range.</tp:docstring>
++                    <tp:docstring>Beginning of required time range.</tp:docstring>
+                 </arg>
+ 
+                 <arg type='x' name='timestamp_to' direction='in'>
+diff --git a/doc/project/abrt.tex b/doc/project/abrt.tex
+index 9e7724e..03b5705 100644
+--- a/doc/project/abrt.tex
++++ b/doc/project/abrt.tex
+@@ -194,7 +194,7 @@ information regarding their interests, involvement.
+ {\textbf{Package Maintainers}
+   \nodepart{second} \vspace{-5mm}
+   \begin{itemize} \itemsep1pt \parskip0pt \parsep0pt
+-  \item Fixing most frequently occured bugs
++  \item Fixing most frequently occurred bugs
+   \item Fixing bugs where the bug is well described
+   \end{itemize}
+ };
+@@ -265,7 +265,7 @@ Highlight important reports
+ In-depth bug fixing
+ -------------------
+ 
+-Collect core-dump for frequently occured reports
++Collect core-dump for frequently occurred reports
+ 
+ Retrace coredumps on demand
+ 
+@@ -570,7 +570,7 @@ components.
+     Red Hat Bugzilla.
+   \end{description}
+ \item[Data Storage] Database and file storage for data required for
+-  the analysis, evaluation, adn processing of reports and problems.
++  the analysis, evaluation, and processing of reports and problems.
+   \begin{description}
+   \item[LLVM bitcode] We store LLVM bitcode of every binary and
+     dynamic library compiled from C/C++ source code.
+@@ -582,8 +582,8 @@ components.
+ \begin{tikzpicture}
+ \umlclass[x=-4,y=0]{problem}{
+ id : PRIMARY KEY \\
+-first occurence : TIMESTAMP NOT NULL \\
+-last occurence : TIMESTAMP NOT NULL \\
++first occurrence : TIMESTAMP NOT NULL \\
++last occurrence : TIMESTAMP NOT NULL \\
+ }{}
+ 
+ \umlclass[x=4,y=-2]{problem report}{
+@@ -616,8 +616,8 @@ Part of reports is populated from $\mu$reports.
+ \umlclass[x=-4,y=0]{report}{
+ id : PRIMARY KEY AUTOINCREMENT \\
+ type : ENUM (USERSPACE, KERNEL, PYTHON, SELINUX) \\
+-first occurence : TIMESTAMP \\
+-last occurence : TIMESTAMP \\
++first occurrence : TIMESTAMP \\
++last occurrence : TIMESTAMP \\
+ count : INT \\
+ component id : FOREIGN KEY \\
+ problem id : FOREIGN KEY
+diff --git a/src/dbus/abrt_polkit.policy b/src/dbus/abrt_polkit.policy
+index a3425d9..2c75233 100644
+--- a/src/dbus/abrt_polkit.policy
++++ b/src/dbus/abrt_polkit.policy
+@@ -17,7 +17,7 @@ Copyright (c) 2012 ABRT Team <crash-catcher at fedorahosted.com>
+   <!-- by default only root can see other users problems -->
+   <action id="org.freedesktop.problems.getall">
+     <description>Get problems from all users</description>
+-    <message>Reading others problems requires authentication</message>
++    <message>Reading other users' problems requires authentication</message>
+     <defaults>
+       <allow_any>auth_admin</allow_any>
+       <allow_active>auth_admin_keep</allow_active>
+@@ -28,7 +28,7 @@ Copyright (c) 2012 ABRT Team <crash-catcher at fedorahosted.com>
+   <!-- by default only root can access configuration  -->
+   <action id="com.redhat.problems.configuration.update">
+     <description>Set value of configuration properties</description>
+-    <message>Update configuration values reuquires authentication</message>
++    <message>Updating configuration values requires authentication</message>
+     <defaults>
+       <allow_any>auth_admin</allow_any>
+       <allow_active>auth_admin_keep</allow_active>
+-- 
+2.4.1
+
diff --git a/0018-applet-migrate-Autoreporting-options-to-GSettings.patch b/0018-applet-migrate-Autoreporting-options-to-GSettings.patch
new file mode 100644
index 0000000..db67e55
--- /dev/null
+++ b/0018-applet-migrate-Autoreporting-options-to-GSettings.patch
@@ -0,0 +1,123 @@
+From 70b2e6981b667d5cfb31f894527e16f3eeed14c9 Mon Sep 17 00:00:00 2001
+From: Jakub Filak <jfilak at redhat.com>
+Date: Fri, 15 May 2015 14:45:40 +0200
+Subject: [PATCH] applet: migrate Autoreporting options to GSettings
+
+Read the option's value from the app's configuration file, update the
+gnome setting if needed and remove the option from the app's
+configuration file in order to skip the migration at next start.
+
+Related to #966
+
+Signed-off-by: Jakub Filak <jfilak at redhat.com>
+---
+ src/applet/applet.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++-----
+ 1 file changed, 55 insertions(+), 5 deletions(-)
+
+diff --git a/src/applet/applet.c b/src/applet/applet.c
+index 4df69fc..b534839 100644
+--- a/src/applet/applet.c
++++ b/src/applet/applet.c
+@@ -36,6 +36,10 @@
+ #include "libabrt.h"
+ #include "problem_api.h"
+ 
++#define APP_NAME "abrt-applet"
++#define GS_SCHEMA_ID_PRIVACY "org.gnome.desktop.privacy"
++#define GS_PRIVACY_OPT_AUTO_REPORTING "report-technical-problems"
++
+ /* libnotify action keys */
+ #define A_REPORT_REPORT "REPORT"
+ #define A_RESTART_APPLICATION "RESTART"
+@@ -55,15 +59,60 @@ static bool is_autoreporting_enabled(void)
+     GSettings *settings;
+     gboolean ret;
+ 
+-    settings = g_settings_new ("org.gnome.desktop.privacy");
+-    ret = g_settings_get_boolean (settings, "report-technical-problems");
++    settings = g_settings_new (GS_SCHEMA_ID_PRIVACY);
++    ret = g_settings_get_boolean (settings, GS_PRIVACY_OPT_AUTO_REPORTING);
+     g_object_unref (settings);
+     return ret;
+ }
+ 
++static void migrate_auto_reporting_to_gsettings(void)
++{
++#define OPT_NAME "AutoreportingEnabled"
++    map_string_t *settings = new_map_string();
++    if (!load_app_conf_file(APP_NAME, settings))
++        goto finito;
++
++    /* Silently ignore not configured options */
++    int sv_logmode = logmode;
++    /* but only if we run in silent mode (no -v on command line) */
++    logmode = g_verbose == 0 ? 0 : sv_logmode;
++
++    int auto_reporting = 0;
++    int configured = try_get_map_string_item_as_bool(settings, OPT_NAME, &auto_reporting);
++
++    logmode = sv_logmode;
++
++    if (!configured)
++        goto finito;
++
++    /* Enable the GS option if AutoreportingEnabled is true because the user
++     * turned the Autoreporting in abrt-applet in a before GS.
++     *
++     * Do not disable the GS option if AutoreportingEvent is false because the
++     * GS option is false by default, thus disabling would revert the user's
++     * decision to  automatically report technical problems.
++     */
++    if (auto_reporting)
++    {
++        GSettings *settings = g_settings_new(GS_SCHEMA_ID_PRIVACY);
++        g_settings_set_boolean(settings, GS_PRIVACY_OPT_AUTO_REPORTING, TRUE);
++        g_object_unref(settings);
++    }
++
++    remove_map_string_item(settings, OPT_NAME);
++    save_app_conf_file(APP_NAME, settings);
++
++    log("Successfully migrated "APP_NAME":"OPT_NAME" to "GS_SCHEMA_ID_PRIVACY":"GS_PRIVACY_OPT_AUTO_REPORTING);
++
++#undef OPT_NAME
++finito:
++    free_map_string(settings);
++    return;
++}
++
+ static const char *get_autoreport_event_name(void)
+ {
+-    load_user_settings("abrt-applet");
++    load_user_settings(APP_NAME);
+     const char *configured = get_user_setting("AutoreportingEvent");
+     return configured ? configured : g_settings_autoreporting_event;
+ }
+@@ -554,7 +603,7 @@ static NotifyNotification *new_warn_notification(const char *body)
+ 
+     notify_notification_set_urgency(notification, NOTIFY_URGENCY_NORMAL);
+     notify_notification_set_timeout(notification, NOTIFY_EXPIRES_DEFAULT);
+-    notify_notification_set_hint(notification, "desktop-entry", g_variant_new_string("abrt-applet"));
++    notify_notification_set_hint(notification, "desktop-entry", g_variant_new_string(APP_NAME));
+ 
+     return notification;
+ }
+@@ -1147,13 +1196,14 @@ int main(int argc, char** argv)
+     /*unsigned opts =*/ parse_opts(argc, argv, program_options, program_usage_string);
+ 
+     migrate_to_xdg_dirs();
++    migrate_auto_reporting_to_gsettings();
+ 
+     export_abrt_envvars(0);
+     msg_prefix = g_progname;
+ 
+     load_abrt_conf();
+     load_event_config_data();
+-    load_user_settings("abrt-applet");
++    load_user_settings(APP_NAME);
+ 
+     /* Initialize our (dbus_abrt) machinery by filtering
+      * for signals:
+-- 
+2.4.1
+
diff --git a/0019-config-UI-read-glade-from-a-local-file-first.patch b/0019-config-UI-read-glade-from-a-local-file-first.patch
new file mode 100644
index 0000000..4381744
--- /dev/null
+++ b/0019-config-UI-read-glade-from-a-local-file-first.patch
@@ -0,0 +1,39 @@
+From eb1e45a1e8070bee6ba44f325f7dd0ca8900dc77 Mon Sep 17 00:00:00 2001
+From: Jakub Filak <jfilak at redhat.com>
+Date: Sat, 16 May 2015 06:46:17 +0200
+Subject: [PATCH] config UI: read glade from a local file first
+
+If you read the system file first, you won't be able to the application
+from a development directory.
+
+Signed-off-by: Jakub Filak <jfilak at redhat.com>
+---
+ src/configuration-gui/abrt-config-widget.c | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/src/configuration-gui/abrt-config-widget.c b/src/configuration-gui/abrt-config-widget.c
+index 664180d..2c75429 100644
+--- a/src/configuration-gui/abrt-config-widget.c
++++ b/src/configuration-gui/abrt-config-widget.c
+@@ -221,14 +221,14 @@ abrt_config_widget_init(AbrtConfigWidget *self)
+     self->priv->builder = gtk_builder_new();
+     gtk_builder_set_translation_domain(self->priv->builder, GETTEXT_PACKAGE);
+ 
+-    gtk_builder_add_from_file(self->priv->builder, ABRT_UI_DIR "/" UI_FILE_NAME, &error);
++    gtk_builder_add_from_file(self->priv->builder, UI_FILE_NAME, &error);
+     if(error != NULL) {
+-        g_warning("Failed to load '%s': %s", ABRT_UI_DIR "/" UI_FILE_NAME, error->message);
++        log_debug("Failed to load '%s': %s", UI_FILE_NAME, error->message);
+         g_error_free(error);
+         error = NULL;
+-        gtk_builder_add_from_file(self->priv->builder, UI_FILE_NAME, &error);
++        gtk_builder_add_from_file(self->priv->builder, ABRT_UI_DIR "/" UI_FILE_NAME, &error);
+         if(error != NULL) {
+-            g_warning("Failed to load '%s': %s", UI_FILE_NAME, error->message);
++            g_warning("Failed to load '%s': %s", ABRT_UI_DIR "/" UI_FILE_NAME, error->message);
+             g_error_free(error);
+             return;
+         }
+-- 
+2.4.1
+
diff --git a/0020-config-UI-enable-options-without-config-files.patch b/0020-config-UI-enable-options-without-config-files.patch
new file mode 100644
index 0000000..5dd83fd
--- /dev/null
+++ b/0020-config-UI-enable-options-without-config-files.patch
@@ -0,0 +1,55 @@
+From 5d544028c3dd3f4af9d4da83a4c57d2c05c09014 Mon Sep 17 00:00:00 2001
+From: Jakub Filak <jfilak at redhat.com>
+Date: Sat, 16 May 2015 06:51:09 +0200
+Subject: [PATCH] config UI: enable options without config files
+
+Signed-off-by: Jakub Filak <jfilak at redhat.com>
+---
+ src/configuration-gui/abrt-config-widget.c | 14 ++++++++++++--
+ 1 file changed, 12 insertions(+), 2 deletions(-)
+
+diff --git a/src/configuration-gui/abrt-config-widget.c b/src/configuration-gui/abrt-config-widget.c
+index 2c75429..8bfc269 100644
+--- a/src/configuration-gui/abrt-config-widget.c
++++ b/src/configuration-gui/abrt-config-widget.c
+@@ -175,10 +175,13 @@ on_switch_activate(GObject       *object,
+         GParamSpec     *spec,
+         AbrtConfigWidget *config)
+ {
++    AbrtConfigWidgetOption *option = g_object_get_data(G_OBJECT(object), "abrt-option");
++    if (option->config == NULL)
++        return;
++
+     const gboolean state = gtk_switch_get_active(GTK_SWITCH(object));
+     const char *const val = state ? "yes" : "no";
+ 
+-    AbrtConfigWidgetOption *option = g_object_get_data(G_OBJECT(object), "abrt-option");
+     log_debug("%s : %s", option->name, val);
+     abrt_app_configuration_set_value(option->config, option->name, val);
+     abrt_app_configuration_save(option->config);
+@@ -191,7 +194,11 @@ update_option_current_value(AbrtConfigWidget *self, enum AbrtOptions opid)
+     assert((opid >= _ABRT_OPT_BEGIN_ && opid < _ABRT_OPT_END_) || !"Out of range Option ID value");
+ 
+     AbrtConfigWidgetOption *option = &(self->priv->options[opid]);
+-    const char *val = abrt_app_configuration_get_value(option->config, option->name);
++
++    const char *val = NULL;
++    if (option->config != NULL)
++        val = abrt_app_configuration_get_value(option->config, option->name);
++
+     option->current_value = val ? string_to_bool(val) : option->default_value;
+ }
+ 
+@@ -209,6 +216,9 @@ connect_switch_with_option(AbrtConfigWidget *self, enum AbrtOptions opid, const
+     g_object_set_data(G_OBJECT(gsw), "abrt-option", option);
+     g_signal_connect(G_OBJECT(gsw), "notify::active",
+             G_CALLBACK(on_switch_activate), self);
++
++    if (option->config == NULL)
++        gtk_widget_set_sensitive(GTK_WIDGET(gsw), FALSE);
+ }
+ 
+ static void
+-- 
+2.4.1
+
diff --git a/0021-config-UI-Automatic-reporting-from-GSettings.patch b/0021-config-UI-Automatic-reporting-from-GSettings.patch
new file mode 100644
index 0000000..29a8abd
--- /dev/null
+++ b/0021-config-UI-Automatic-reporting-from-GSettings.patch
@@ -0,0 +1,602 @@
+From abdedafd3a530ad4baa992010a3cfc87645d98d1 Mon Sep 17 00:00:00 2001
+From: Jakub Filak <jfilak at redhat.com>
+Date: Sat, 16 May 2015 06:51:37 +0200
+Subject: [PATCH] config UI: Automatic reporting from GSettings
+
+If Privacy panels exists:
+  Make the widget insensitive because the user can only read its value.
+  Add a button launching Privacy panel.
+Else:
+  Read/write the GSettings and show a warning about modifying the
+  GSettings.
+
+Signed-off-by: Jakub Filak <jfilak at redhat.com>
+---
+ po/POTFILES.in                                 |   1 +
+ src/configuration-gui/abrt-config-widget.c     | 201 +++++++++++++++++++++++--
+ src/configuration-gui/abrt-config-widget.glade |  82 ++++------
+ 3 files changed, 217 insertions(+), 67 deletions(-)
+
+diff --git a/po/POTFILES.in b/po/POTFILES.in
+index 0da1396..8c31438 100644
+--- a/po/POTFILES.in
++++ b/po/POTFILES.in
+@@ -3,6 +3,7 @@
+ # Please keep this file sorted alphabetically.
+ src/applet/abrt-applet.desktop.in
+ src/applet/applet.c
++src/configuration-gui/abrt-config-widget.c
+ src/configuration-gui/abrt-config-widget.glade
+ src/configuration-gui/system-config-abrt.c
+ src/configuration-gui/main.c
+diff --git a/src/configuration-gui/abrt-config-widget.c b/src/configuration-gui/abrt-config-widget.c
+index 8bfc269..c9b0b02 100644
+--- a/src/configuration-gui/abrt-config-widget.c
++++ b/src/configuration-gui/abrt-config-widget.c
+@@ -21,6 +21,8 @@
+ #endif
+ 
+ #include "abrt-config-widget.h"
++#include <satyr/utils.h>
++#include <gio/gdesktopappinfo.h>
+ 
+ #include "libabrt.h"
+ #include <assert.h>
+@@ -32,19 +34,36 @@
+ 
+ #define UI_FILE_NAME "abrt-config-widget.glade"
+ 
++/* AbrtConfigWidgetPrivate:
++ *     + AbrtConfigWidgetOption == "abrt-option" of GtkSwitch
++ *     + AbrtConfigWidgetOption == "abrt-option" of GtkSwitch
++ *     + ...
++ *
++ *     + AbrtAppConfiguration == config of AbrtConfigWidgetOption
++ *     + AbrtAppConfiguration == config of AbrtConfigWidgetOption
++ *     + ...
++ */
++
++/* This structure represents either an ABRT configuration file or a GSettings
++ * schema.
++ */
+ typedef struct {
+-    char *app_name;
+-    map_string_t *settings;
++    char *app_name;             ///< e.g abrt-applet, org.gnome.desktop.privacy
++    map_string_t *settings;     ///< ABRT configuration file
++    GSettings *glib_settings;   ///< GSettings
+ } AbrtAppConfiguration;
+ 
++/* This structure represents a single switch.
++ */
+ typedef struct {
+-    const char *name;
++    const char *name;           ///< e.g. ask_steal_dir, report-technical-problems
+     GtkSwitch *widget;
+     gboolean default_value;
+     gboolean current_value;
+     AbrtAppConfiguration *config;
+ } AbrtConfigWidgetOption;
+ 
++/* Each configuration option has its own number. */
+ enum AbrtOptions
+ {
+     _ABRT_OPT_BEGIN_,
+@@ -60,11 +79,15 @@ enum AbrtOptions
+     _ABRT_OPT_END_,
+ };
+ 
++/* This structure holds private data of AbrtConfigWidget
++ */
+ struct AbrtConfigWidgetPrivate {
+     GtkBuilder   *builder;
+     AbrtAppConfiguration *report_gtk_conf;
+     AbrtAppConfiguration *abrt_applet_conf;
++    AbrtAppConfiguration *privacy_gsettings;
+ 
++    /* Static array for all switches */
+     AbrtConfigWidgetOption options[_ABRT_OPT_END_];
+ };
+ 
+@@ -79,6 +102,8 @@ static guint s_signals[SN_LAST_SIGNAL] = { 0 };
+ 
+ static void abrt_config_widget_finalize(GObject *object);
+ 
++/* New ABRT configuration file wrapper
++ */
+ static AbrtAppConfiguration *
+ abrt_app_configuration_new(const char *app_name)
+ {
+@@ -86,6 +111,7 @@ abrt_app_configuration_new(const char *app_name)
+ 
+     conf->app_name = xstrdup(app_name);
+     conf->settings = new_map_string();
++    conf->glib_settings = NULL;
+ 
+     if(!load_app_conf_file(conf->app_name, conf->settings)) {
+         g_warning("Failed to load config for '%s'", conf->app_name);
+@@ -94,22 +120,50 @@ abrt_app_configuration_new(const char *app_name)
+     return conf;
+ }
+ 
++/* New GSettings wrapper
++ */
++static AbrtAppConfiguration *
++abrt_app_configuration_new_glib(const char *schema)
++{
++    AbrtAppConfiguration *conf = xmalloc(sizeof(*conf));
++
++    conf->app_name = xstrdup(schema);
++    conf->settings = NULL;
++    conf->glib_settings = g_settings_new(conf->app_name);
++
++    return conf;
++}
++
+ static void
+ abrt_app_configuration_set_value(AbrtAppConfiguration *conf, const char *name, const char *value)
+ {
+-    set_app_user_setting(conf->settings, name, value);
++    if (conf->settings)
++        set_app_user_setting(conf->settings, name, value);
++    else if (conf->glib_settings)
++        g_settings_set_boolean(conf->glib_settings, name, string_to_bool(value));
++    else
++        assert(!"BUG: not properly initialized AbrtAppConfiguration");
+ }
+ 
+ static const char *
+ abrt_app_configuration_get_value(AbrtAppConfiguration *conf, const char *name)
+ {
+-    return get_app_user_setting(conf->settings, name);
++    if (conf->settings)
++        return get_app_user_setting(conf->settings, name);
++
++    if (conf->glib_settings)
++        return g_settings_get_boolean(conf->glib_settings, name) ? "yes" : "no";
++
++    assert(!"BUG: not properly initialized AbrtAppConfiguration");
+ }
+ 
+ static void
+ abrt_app_configuration_save(AbrtAppConfiguration *conf)
+ {
+-    save_app_conf_file(conf->app_name, conf->settings);
++    if (conf->settings)
++        save_app_conf_file(conf->app_name, conf->settings);
++
++    /* No need to save GSettings because changes are applied instantly */
+ }
+ 
+ static void
+@@ -121,8 +175,17 @@ abrt_app_configuration_free(AbrtAppConfiguration *conf)
+     free(conf->app_name);
+     conf->app_name = (void *)0xDEADBEAF;
+ 
+-    free_map_string(conf->settings);
+-    conf->settings = (void *)0xDEADBEAF;
++    if (conf->settings)
++    {
++        free_map_string(conf->settings);
++        conf->settings = (void *)0xDEADBEAF;
++    }
++
++    if (conf->glib_settings)
++    {
++        g_object_unref(conf->glib_settings);
++        conf->glib_settings = (void *)0xDEADBEAF;
++    }
+ }
+ 
+ static void
+@@ -161,6 +224,9 @@ abrt_config_widget_finalize(GObject *object)
+     abrt_app_configuration_free(self->priv->abrt_applet_conf);
+     self->priv->abrt_applet_conf = NULL;
+ 
++    abrt_app_configuration_free(self->priv->privacy_gsettings);
++    self->priv->privacy_gsettings = NULL;
++
+     G_OBJECT_CLASS(abrt_config_widget_parent_class)->finalize(object);
+ }
+ 
+@@ -217,8 +283,31 @@ connect_switch_with_option(AbrtConfigWidget *self, enum AbrtOptions opid, const
+     g_signal_connect(G_OBJECT(gsw), "notify::active",
+             G_CALLBACK(on_switch_activate), self);
+ 
+-    if (option->config == NULL)
+-        gtk_widget_set_sensitive(GTK_WIDGET(gsw), FALSE);
++    /* If the option has no config, make the corresponding insensitive. */
++    gtk_widget_set_sensitive(GTK_WIDGET(gsw), option->config != NULL);
++}
++
++static void
++pp_launcher_clicked(GtkButton *launcher, gpointer *unused_data)
++{
++    GDesktopAppInfo *app = g_object_get_data(G_OBJECT(launcher), "launched-app");
++    GError *err = NULL;
++    if (!g_app_info_launch(G_APP_INFO(app), NULL, NULL, &err))
++    {
++        perror_msg("Could not launch '%s': %s",
++                g_desktop_app_info_get_filename(G_DESKTOP_APP_INFO (app)),
++                err->message);
++    }
++}
++
++static void
++os_release_callback(char *key, char *value, void *data)
++{
++    if (strcmp(key, "PRIVACY_POLICY") == 0)
++        *(char **)data = value;
++    else
++        free(value);
++    free(key);
+ }
+ 
+ static void
+@@ -249,6 +338,7 @@ abrt_config_widget_init(AbrtConfigWidget *self)
+ 
+     self->priv->report_gtk_conf = abrt_app_configuration_new("report-gtk");
+     self->priv->abrt_applet_conf = abrt_app_configuration_new("abrt-applet");
++    self->priv->privacy_gsettings = abrt_app_configuration_new_glib("org.gnome.desktop.privacy");
+ 
+     /* Initialize options */
+     /* report-gtk */
+@@ -259,15 +349,98 @@ abrt_config_widget_init(AbrtConfigWidget *self)
+     self->priv->options[ABRT_OPT_UPLOAD_COREDUMP].name = "abrt_analyze_smart_ask_upload_coredump";
+     self->priv->options[ABRT_OPT_UPLOAD_COREDUMP].default_value = TRUE;
+     self->priv->options[ABRT_OPT_UPLOAD_COREDUMP].config = self->priv->report_gtk_conf;
+-
+     self->priv->options[ABRT_OPT_PRIVATE_TICKET].name = CREATE_PRIVATE_TICKET;
+     self->priv->options[ABRT_OPT_PRIVATE_TICKET].default_value = FALSE;
+     self->priv->options[ABRT_OPT_PRIVATE_TICKET].config = self->priv->report_gtk_conf;
+ 
+     /* abrt-applet */
+-    self->priv->options[ABRT_OPT_SEND_UREPORT].name = "AutoreportingEnabled";
+-    self->priv->options[ABRT_OPT_SEND_UREPORT].default_value = g_settings_autoreporting;
+-    self->priv->options[ABRT_OPT_SEND_UREPORT].config = self->priv->abrt_applet_conf;
++    self->priv->options[ABRT_OPT_SEND_UREPORT].name = "report-technical-problems";
++    self->priv->options[ABRT_OPT_SEND_UREPORT].default_value =
++            string_to_bool(abrt_app_configuration_get_value(self->priv->privacy_gsettings,
++                                                            "report-technical-problems"));
++    {
++        /* Get the container widget for the lauch button and warnings */
++        GtkWidget *hbox_auto_reporting = WID("hbox_auto_reporting");
++        assert(hbox_auto_reporting);
++
++        /* Be able to use another desktop file while debugging */
++        const char *gpp_app = getenv("ABRT_PRIVACY_APP_DESKTOP");
++        if (gpp_app == NULL)
++            gpp_app = "gnome-privacy-panel.desktop";
++
++        GDesktopAppInfo *app = g_desktop_app_info_new(gpp_app);
++        char *message = NULL;
++        char *markup = NULL;
++        if (!app)
++        {
++            /* Make the switch editable */
++            self->priv->options[ABRT_OPT_SEND_UREPORT].config = self->priv->privacy_gsettings;
++
++            char *os_release = xmalloc_open_read_close("/etc/os-release", /*no size limit*/NULL);
++            char *privacy_policy = NULL;
++
++            /* Try to get the value of PRIVACY_POLICY from /etc/os-release */
++            sr_parse_os_release(os_release, os_release_callback, (void *)&privacy_policy);
++
++            message = xasprintf(_("The configuration option above has been moved to GSettings and "
++                                  "the switch is linked to the value of the setting 'report-technical-problems' "
++                                  "from the schema 'org.gnome.desktop.privacy'."));
++
++            /* Do not add Privacy Policy link if /etc/os-release does not contain PRIVACY_POLICY */
++            if (privacy_policy != NULL)
++                markup = xasprintf("<i>%s</i>\n\n<a href=\"%s\">Privacy Policy</a>", message, privacy_policy);
++            else
++                markup = xasprintf("<i>%s</i>", message);
++
++            free(privacy_policy);
++            free(os_release);
++        }
++        else
++        {
++            /* Make the switch read-only */
++            self->priv->options[ABRT_OPT_SEND_UREPORT].config = NULL;
++
++            message = xasprintf(_("The configuration option above can be configured in"));
++            markup = xasprintf("<i>%s</i>", message);
++
++            GtkWidget *launcher = gtk_button_new_with_label(g_app_info_get_display_name(G_APP_INFO(app)));
++
++            /* Here we could pass the launcher to pp_launcher_clicked() as the
++             * 4th argument of g_signal_connect() but we would leek the
++             * launcher's memory. Therefore we need to find a way how to free
++             * the launcher when it is not needed anymore. GtkWidget inherits
++             * from GObject which offers a functionality for attaching an
++             * arbitrary data to its instances. The last argument is a function
++             * called to destroy the arbirarty data when the instance is being
++             * destoryed. */
++            g_object_set_data_full(G_OBJECT(launcher), "launched-app", app, g_object_unref);
++            g_signal_connect(launcher, "clicked", G_CALLBACK(pp_launcher_clicked), NULL);
++
++            /* Make the launcher button narrow, otherwise it would expand to
++             * the width of the warninig. */
++            gtk_widget_set_hexpand(launcher, FALSE);
++            gtk_widget_set_vexpand(launcher, FALSE);
++
++            /* Make the launcher button alligned on center of the warning. */
++            gtk_widget_set_halign(launcher, GTK_ALIGN_CENTER);
++            gtk_widget_set_valign(launcher, GTK_ALIGN_CENTER);
++
++            gtk_box_pack_end(GTK_BOX(hbox_auto_reporting), launcher, false, false, 0);
++        }
++
++
++        GtkWidget *lbl = gtk_label_new(message);
++        gtk_label_set_markup(GTK_LABEL(lbl), markup);
++        /* Do not expand the window by too long warning. */
++        gtk_label_set_line_wrap(GTK_LABEL(lbl), TRUE);
++        /* Let users to copy the warning. */
++        gtk_label_set_selectable(GTK_LABEL(lbl), TRUE);
++
++        free(markup);
++        free(message);
++
++        gtk_box_pack_start(GTK_BOX(hbox_auto_reporting), lbl, false, false, 0);
++    }
+ 
+     self->priv->options[ABRT_OPT_SHORTENED_REPORTING].name = "ShortenedReporting";
+     self->priv->options[ABRT_OPT_SHORTENED_REPORTING].default_value = g_settings_shortenedreporting;
+diff --git a/src/configuration-gui/abrt-config-widget.glade b/src/configuration-gui/abrt-config-widget.glade
+index 3aa566c..7f613c7 100644
+--- a/src/configuration-gui/abrt-config-widget.glade
++++ b/src/configuration-gui/abrt-config-widget.glade
+@@ -1,6 +1,7 @@
+ <?xml version="1.0" encoding="UTF-8"?>
++<!-- Generated with glade 3.18.3 -->
+ <interface>
+-  <!-- interface-requires gtk+ 3.0 -->
++  <requires lib="gtk+" version="3.0"/>
+   <object class="GtkWindow" id="window1">
+     <property name="can_focus">False</property>
+     <child>
+@@ -11,7 +12,6 @@
+         <property name="margin_right">10</property>
+         <property name="margin_top">10</property>
+         <property name="margin_bottom">10</property>
+-        <property name="row_homogeneous">True</property>
+         <child>
+           <object class="GtkLabel" id="label2">
+             <property name="visible">True</property>
+@@ -26,8 +26,6 @@
+           <packing>
+             <property name="left_attach">0</property>
+             <property name="top_attach">1</property>
+-            <property name="width">1</property>
+-            <property name="height">1</property>
+           </packing>
+         </child>
+         <child>
+@@ -44,8 +42,6 @@
+           <packing>
+             <property name="left_attach">0</property>
+             <property name="top_attach">3</property>
+-            <property name="width">1</property>
+-            <property name="height">1</property>
+           </packing>
+         </child>
+         <child>
+@@ -59,8 +55,6 @@
+           <packing>
+             <property name="left_attach">1</property>
+             <property name="top_attach">0</property>
+-            <property name="width">1</property>
+-            <property name="height">1</property>
+           </packing>
+         </child>
+         <child>
+@@ -74,13 +68,12 @@
+           <packing>
+             <property name="left_attach">1</property>
+             <property name="top_attach">1</property>
+-            <property name="width">1</property>
+-            <property name="height">1</property>
+           </packing>
+         </child>
+         <child>
+           <object class="GtkSwitch" id="switch_send_ureport">
+             <property name="visible">True</property>
++            <property name="sensitive">False</property>
+             <property name="can_focus">True</property>
+             <property name="halign">end</property>
+             <property name="valign">center</property>
+@@ -89,8 +82,6 @@
+           <packing>
+             <property name="left_attach">1</property>
+             <property name="top_attach">3</property>
+-            <property name="width">1</property>
+-            <property name="height">1</property>
+           </packing>
+         </child>
+         <child>
+@@ -106,9 +97,7 @@
+           </object>
+           <packing>
+             <property name="left_attach">0</property>
+-            <property name="top_attach">4</property>
+-            <property name="width">1</property>
+-            <property name="height">1</property>
++            <property name="top_attach">5</property>
+           </packing>
+         </child>
+         <child>
+@@ -121,9 +110,7 @@
+           </object>
+           <packing>
+             <property name="left_attach">1</property>
+-            <property name="top_attach">4</property>
+-            <property name="width">1</property>
+-            <property name="height">1</property>
++            <property name="top_attach">5</property>
+           </packing>
+         </child>
+         <child>
+@@ -136,9 +123,7 @@
+           </object>
+           <packing>
+             <property name="left_attach">1</property>
+-            <property name="top_attach">5</property>
+-            <property name="width">1</property>
+-            <property name="height">1</property>
++            <property name="top_attach">6</property>
+           </packing>
+         </child>
+         <child>
+@@ -154,9 +139,7 @@
+           </object>
+           <packing>
+             <property name="left_attach">0</property>
+-            <property name="top_attach">5</property>
+-            <property name="width">1</property>
+-            <property name="height">1</property>
++            <property name="top_attach">6</property>
+           </packing>
+         </child>
+         <child>
+@@ -172,8 +155,6 @@
+           <packing>
+             <property name="left_attach">2</property>
+             <property name="top_attach">0</property>
+-            <property name="width">1</property>
+-            <property name="height">1</property>
+           </packing>
+         </child>
+         <child>
+@@ -188,8 +169,6 @@
+           <packing>
+             <property name="left_attach">2</property>
+             <property name="top_attach">1</property>
+-            <property name="width">1</property>
+-            <property name="height">1</property>
+           </packing>
+         </child>
+         <child>
+@@ -204,8 +183,6 @@
+           <packing>
+             <property name="left_attach">2</property>
+             <property name="top_attach">3</property>
+-            <property name="width">1</property>
+-            <property name="height">1</property>
+           </packing>
+         </child>
+         <child>
+@@ -219,9 +196,7 @@
+           </object>
+           <packing>
+             <property name="left_attach">2</property>
+-            <property name="top_attach">4</property>
+-            <property name="width">1</property>
+-            <property name="height">1</property>
++            <property name="top_attach">5</property>
+           </packing>
+         </child>
+         <child>
+@@ -235,9 +210,7 @@
+           </object>
+           <packing>
+             <property name="left_attach">2</property>
+-            <property name="top_attach">5</property>
+-            <property name="width">1</property>
+-            <property name="height">1</property>
++            <property name="top_attach">6</property>
+           </packing>
+         </child>
+         <child>
+@@ -254,8 +227,6 @@
+           <packing>
+             <property name="left_attach">0</property>
+             <property name="top_attach">0</property>
+-            <property name="width">1</property>
+-            <property name="height">1</property>
+           </packing>
+         </child>
+         <child>
+@@ -270,8 +241,6 @@
+           <packing>
+             <property name="left_attach">2</property>
+             <property name="top_attach">2</property>
+-            <property name="width">1</property>
+-            <property name="height">1</property>
+           </packing>
+         </child>
+         <child>
+@@ -286,8 +255,6 @@
+           <packing>
+             <property name="left_attach">0</property>
+             <property name="top_attach">2</property>
+-            <property name="width">1</property>
+-            <property name="height">1</property>
+           </packing>
+         </child>
+         <child>
+@@ -301,8 +268,6 @@
+           <packing>
+             <property name="left_attach">1</property>
+             <property name="top_attach">2</property>
+-            <property name="width">1</property>
+-            <property name="height">1</property>
+           </packing>
+         </child>
+         <child>
+@@ -316,9 +281,7 @@
+           </object>
+           <packing>
+             <property name="left_attach">0</property>
+-            <property name="top_attach">6</property>
+-            <property name="width">1</property>
+-            <property name="height">1</property>
++            <property name="top_attach">7</property>
+           </packing>
+         </child>
+         <child>
+@@ -331,9 +294,7 @@
+           </object>
+           <packing>
+             <property name="left_attach">1</property>
+-            <property name="top_attach">6</property>
+-            <property name="width">1</property>
+-            <property name="height">1</property>
++            <property name="top_attach">7</property>
+           </packing>
+         </child>
+         <child>
+@@ -347,11 +308,26 @@
+           </object>
+           <packing>
+             <property name="left_attach">2</property>
+-            <property name="top_attach">6</property>
+-            <property name="width">1</property>
+-            <property name="height">1</property>
++            <property name="top_attach">7</property>
+           </packing>
+         </child>
++        <child>
++          <object class="GtkBox" id="hbox_auto_reporting">
++            <property name="visible">True</property>
++            <property name="can_focus">False</property>
++            <child>
++              <placeholder/>
++            </child>
++          </object>
++          <packing>
++            <property name="left_attach">0</property>
++            <property name="top_attach">4</property>
++            <property name="width">2</property>
++          </packing>
++        </child>
++        <child>
++          <placeholder/>
++        </child>
+       </object>
+     </child>
+   </object>
+-- 
+2.4.1
+
diff --git a/abrt.spec b/abrt.spec
index 5ba41bd..97c8cb8 100644
--- a/abrt.spec
+++ b/abrt.spec
@@ -46,7 +46,7 @@
 Summary: Automatic bug detection and reporting tool
 Name: abrt
 Version: 2.5.1
-Release: 2%{?dist}
+Release: 3%{?dist}
 License: GPLv2+
 Group: Applications/System
 URL: https://github.com/abrt/abrt/wiki/ABRT-Project
@@ -56,6 +56,28 @@ Patch0: disable-OpenGPGCheck-in-Fedora-Rawhide.patch
 
 # git format-patch %%{Version} --topo-order -N -M;
 # i=1; for p in `ls 0*.patch`; do printf "Patch%04d: %s\n" $i $p; ((i++)); done
+#Patch0001: 0001-testsuite-grab-beakerlib-stored-log-files-from-var-t.patch
+#Patch0002: 0002-testsuite-add-the-machineid-test-case-to-rhel6.patch
+#Patch0003: 0003-testsuite-add-test-for-abrt-cli-report-via-reporter-.patch
+Patch0004: 0004-applet-switch-to-D-Bus-methods.patch
+Patch0005: 0005-lib-add-new-kernel-taint-flags.patch
+Patch0006: 0006-upload-validate-and-sanitize-uploaded-dump-directori.patch
+#Patch0007: 0007-testsuite-don-t-run-whole-test-if-reporter-mantisbt-.patch
+Patch0008: 0008-a-a-s-p-d-add-new-known-interpreter-to-conf-file.patch
+#Patch0009: 0009-abrt-detect-DumpLocation-from-abrt.conf-instead-of-u.patch
+Patch0010: 0010-applet-fix-problem-info-double-free.patch
+Patch0011: 0011-cli-do-not-exit-with-segfault-if-dbus-fails.patch
+#Patch0012: 0012-spec-add-a-dependency-on-abrt-dbus-to-abrt-cli.patch
+Patch0013: 0013-abrt-auto-reporting-require-rhtsupport.conf-file-onl.patch
+#Patch0014: 0014-spec-add-AUTHENTICATED_AUTOREPORTING-conditional.patch
+Patch0015: 0015-abrt-action-list-dsos-do-not-decode-not-existing-obj.patch
+Patch0016: 0016-doc-polkit-Spelling-grammar-fixes.patch
+#Patch0017: 0017-testsuite-add-new-version-of-python-interpreters.patch
+Patch0018: 0018-applet-migrate-Autoreporting-options-to-GSettings.patch
+Patch0019: 0019-config-UI-read-glade-from-a-local-file-first.patch
+Patch0020: 0020-config-UI-enable-options-without-config-files.patch
+Patch0021: 0021-config-UI-Automatic-reporting-from-GSettings.patch
+#Patch0022: 0022-testsuite-test-safeness-of-creating-user-cores.patch
 
 # '%%autosetup -S git' -> git
 BuildRequires: git
@@ -459,8 +481,8 @@ to the shell
 # Default '__scm_apply_git' is 'git apply && git commit' but this workflow
 # doesn't allow us to create a new file within a patch, so we have to use
 # 'git am' (see /usr/lib/rpm/macros for more details)
-%define __scm_apply_git(qp:m:) %{__git} am
-#%%define __scm_apply_git(qp:m:) %%{__git} am --exclude libreport.spec.in --exclude .gitignore
+#%%define __scm_apply_git(qp:m:) %%{__git} am
+%define __scm_apply_git(qp:m:) %{__git} am --exclude doc/design --exclude doc/project/abrt.tex
 %autosetup -S git
 
 %build
@@ -1022,6 +1044,18 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
 %config(noreplace) %{_sysconfdir}/profile.d/abrt-console-notification.sh
 
 %changelog
+* Wed May 20 2015 Matej Habrnal <mhabrnal at redhat.com> 2.5.1-3
+- applet: switch to D-Bus methods
+- upload: validate and sanitize uploaded dump directories
+- applet: switch to D-Bus methods
+- lib: add new kernel taint flags
+- abrt-auto-reporting: require rhtsupport.conf file only on RHEL
+- doc, polkit: Spelling/grammar fixes
+- applet: migrate Autoreporting options to GSettings
+- config UI: read glade from a local file first
+- config UI: Automatic reporting from GSettings
+- Resolves: #1211644
+
 * Mon Apr 13 2015 Jakub Filak <jfilak at redhat.com> 2.5.1-2
 - Remove no longer needed posttrans scriptlet copying analyzer to type
 
-- 
cgit v0.10.2


	http://pkgs.fedoraproject.org/cgit/abrt.git/commit/?h=f22&id=30183d630877dace6b482c33d8fa783d6cdddce2


More information about the scm-commits mailing list