Matej Habrnal fa1950
From 739b52102b162209d3add0988e829f4409971a3c Mon Sep 17 00:00:00 2001
Matej Habrnal fa1950
From: Jakub Filak <jfilak@redhat.com>
Matej Habrnal fa1950
Date: Tue, 24 Mar 2015 20:57:34 +0100
Matej Habrnal fa1950
Subject: [PATCH] cli: use the DBus methods for getting problem information
Matej Habrnal fa1950
Matej Habrnal fa1950
The dump directory is no longer accessible by non-root users and we also
Matej Habrnal fa1950
want to get rid of direct access to allow administrators (wheel members)
Matej Habrnal fa1950
see problem data without the need to ChownProblem directory before.
Matej Habrnal fa1950
Matej Habrnal fa1950
Signed-off-by: Jakub Filak <jfilak@redhat.com>
Matej Habrnal fa1950
---
Matej Habrnal fa1950
 src/cli/abrt-cli-core.c | 74 ++++++++++++++++++++++++-------------------------
Matej Habrnal fa1950
 src/cli/abrt-cli-core.h |  4 ++-
Matej Habrnal fa1950
 src/cli/list.c          | 45 +++++++++++-------------------
Matej Habrnal fa1950
 src/cli/process.c       |  6 +---
Matej Habrnal fa1950
 src/cli/status.c        | 66 +++++++++++++------------------------------
Matej Habrnal fa1950
 5 files changed, 77 insertions(+), 118 deletions(-)
Matej Habrnal fa1950
Matej Habrnal fa1950
diff --git a/src/cli/abrt-cli-core.c b/src/cli/abrt-cli-core.c
Matej Habrnal fa1950
index 23a74a8..77a37f7 100644
Matej Habrnal fa1950
--- a/src/cli/abrt-cli-core.c
Matej Habrnal fa1950
+++ b/src/cli/abrt-cli-core.c
Matej Habrnal fa1950
@@ -39,24 +39,22 @@ vector_of_problem_data_t *new_vector_of_problem_data(void)
Matej Habrnal fa1950
     return g_ptr_array_new_with_free_func((void (*)(void*)) &problem_data_free);
Matej Habrnal fa1950
 }
Matej Habrnal fa1950
 
Matej Habrnal fa1950
-static int
Matej Habrnal fa1950
-append_problem_data(struct dump_dir *dd, void *arg)
Matej Habrnal fa1950
+vector_of_problem_data_t *fetch_crash_infos(void)
Matej Habrnal fa1950
 {
Matej Habrnal fa1950
-    vector_of_problem_data_t *vpd = arg;
Matej Habrnal fa1950
-
Matej Habrnal fa1950
-    problem_data_t *problem_data = create_problem_data_from_dump_dir(dd);
Matej Habrnal fa1950
-    problem_data_add(problem_data, CD_DUMPDIR, dd->dd_dirname,
Matej Habrnal fa1950
-                            CD_FLAG_TXT + CD_FLAG_ISNOTEDITABLE + CD_FLAG_LIST);
Matej Habrnal fa1950
-    g_ptr_array_add(vpd, problem_data);
Matej Habrnal fa1950
-    return 0;
Matej Habrnal fa1950
-}
Matej Habrnal fa1950
+    GList *problems = get_problems_over_dbus(/*don't authorize*/false);
Matej Habrnal fa1950
+    if (problems == ERR_PTR)
Matej Habrnal fa1950
+        return NULL;
Matej Habrnal fa1950
 
Matej Habrnal fa1950
-vector_of_problem_data_t *fetch_crash_infos(GList *dir_list)
Matej Habrnal fa1950
-{
Matej Habrnal fa1950
     vector_of_problem_data_t *vpd = new_vector_of_problem_data();
Matej Habrnal fa1950
 
Matej Habrnal fa1950
-    for (GList *li = dir_list; li; li = li->next)
Matej Habrnal fa1950
-        for_each_problem_in_dir(li->data, getuid(), append_problem_data, vpd);
Matej Habrnal fa1950
+    for (GList *iter = problems; iter; iter = g_list_next(iter))
Matej Habrnal fa1950
+    {
Matej Habrnal fa1950
+        problem_data_t *problem_data = get_full_problem_data_over_dbus((const char *)(iter->data));
Matej Habrnal fa1950
+        if (problem_data == ERR_PTR)
Matej Habrnal fa1950
+            continue;
Matej Habrnal fa1950
+
Matej Habrnal fa1950
+        g_ptr_array_add(vpd, problem_data);
Matej Habrnal fa1950
+    }
Matej Habrnal fa1950
 
Matej Habrnal fa1950
     return vpd;
Matej Habrnal fa1950
 }
Matej Habrnal fa1950
@@ -74,36 +72,38 @@ static bool isxdigit_str(const char *str)
Matej Habrnal fa1950
     return true;
Matej Habrnal fa1950
 }
Matej Habrnal fa1950
 
Matej Habrnal fa1950
-struct name_resolution_param {
Matej Habrnal fa1950
-    const char *shortcut;
Matej Habrnal fa1950
-    unsigned strlen_shortcut;
Matej Habrnal fa1950
-    char *found_name;
Matej Habrnal fa1950
-};
Matej Habrnal fa1950
-
Matej Habrnal fa1950
-static int find_dir_by_hash(struct dump_dir *dd, void *arg)
Matej Habrnal fa1950
+char *find_problem_by_hash(const char *hash, GList *problems)
Matej Habrnal fa1950
 {
Matej Habrnal fa1950
-    struct name_resolution_param *param = arg;
Matej Habrnal fa1950
-    char hash_str[SHA1_RESULT_LEN*2 + 1];
Matej Habrnal fa1950
-    str_to_sha1str(hash_str, dd->dd_dirname);
Matej Habrnal fa1950
-    if (strncasecmp(param->shortcut, hash_str, param->strlen_shortcut) == 0)
Matej Habrnal fa1950
+    unsigned hash_len = strlen(hash);
Matej Habrnal fa1950
+    if (!isxdigit_str(hash) || hash_len < 5)
Matej Habrnal fa1950
+        return NULL;
Matej Habrnal fa1950
+
Matej Habrnal fa1950
+    char *found_name = NULL;
Matej Habrnal fa1950
+    for (GList *iter = problems; iter; iter = g_list_next(iter))
Matej Habrnal fa1950
     {
Matej Habrnal fa1950
-        if (param->found_name)
Matej Habrnal fa1950
-            error_msg_and_die(_("'%s' identifies more than one problem directory"), param->shortcut);
Matej Habrnal fa1950
-        param->found_name = xstrdup(dd->dd_dirname);
Matej Habrnal fa1950
+        char hash_str[SHA1_RESULT_LEN*2 + 1];
Matej Habrnal fa1950
+        str_to_sha1str(hash_str, (const char *)(iter->data));
Matej Habrnal fa1950
+        if (strncasecmp(hash, hash_str, hash_len) == 0)
Matej Habrnal fa1950
+        {
Matej Habrnal fa1950
+            if (found_name)
Matej Habrnal fa1950
+                error_msg_and_die(_("'%s' identifies more than one problem directory"), hash);
Matej Habrnal fa1950
+            found_name = xstrdup((const char *)(iter->data));
Matej Habrnal fa1950
+        }
Matej Habrnal fa1950
     }
Matej Habrnal fa1950
-    return 0;
Matej Habrnal fa1950
+
Matej Habrnal fa1950
+    return found_name;
Matej Habrnal fa1950
 }
Matej Habrnal fa1950
 
Matej Habrnal fa1950
 char *hash2dirname(const char *hash)
Matej Habrnal fa1950
 {
Matej Habrnal fa1950
-    unsigned hash_len = strlen(hash);
Matej Habrnal fa1950
-    if (!isxdigit_str(hash) || hash_len < 5)
Matej Habrnal fa1950
+    /* Try loading by dirname hash */
Matej Habrnal fa1950
+    GList *problems = get_problems_over_dbus(/*don't authorize*/false);
Matej Habrnal fa1950
+    if (problems == ERR_PTR)
Matej Habrnal fa1950
         return NULL;
Matej Habrnal fa1950
 
Matej Habrnal fa1950
-    /* Try loading by dirname hash */
Matej Habrnal fa1950
-    struct name_resolution_param param = { hash, hash_len, NULL };
Matej Habrnal fa1950
-    GList *dir_list = get_problem_storages();
Matej Habrnal fa1950
-    for (GList *li = dir_list; li; li = li->next)
Matej Habrnal fa1950
-        for_each_problem_in_dir(li->data, getuid(), find_dir_by_hash, ¶m;;
Matej Habrnal fa1950
-    return param.found_name;
Matej Habrnal fa1950
+    char *found_name = find_problem_by_hash(hash, problems);
Matej Habrnal fa1950
+
Matej Habrnal fa1950
+    g_list_free_full(problems, free);
Matej Habrnal fa1950
+
Matej Habrnal fa1950
+    return found_name;
Matej Habrnal fa1950
 }
Matej Habrnal fa1950
diff --git a/src/cli/abrt-cli-core.h b/src/cli/abrt-cli-core.h
Matej Habrnal fa1950
index 83d0b5d..33b2ea6 100644
Matej Habrnal fa1950
--- a/src/cli/abrt-cli-core.h
Matej Habrnal fa1950
+++ b/src/cli/abrt-cli-core.h
Matej Habrnal fa1950
@@ -28,9 +28,11 @@ problem_data_t *get_problem_data(vector_of_problem_data_t *vector, unsigned i);
Matej Habrnal fa1950
 
Matej Habrnal fa1950
 void free_vector_of_problem_data(vector_of_problem_data_t *vector);
Matej Habrnal fa1950
 vector_of_problem_data_t *new_vector_of_problem_data(void);
Matej Habrnal fa1950
-vector_of_problem_data_t *fetch_crash_infos(GList *dir_list);
Matej Habrnal fa1950
+vector_of_problem_data_t *fetch_crash_infos(void);
Matej Habrnal fa1950
 
Matej Habrnal fa1950
 /* Returns malloced string, or NULL if not found: */
Matej Habrnal fa1950
+char *find_problem_by_hash(const char *hash, GList *problems);
Matej Habrnal fa1950
+/* Returns malloced string, or NULL if not found: */
Matej Habrnal fa1950
 char *hash2dirname(const char *hash);
Matej Habrnal fa1950
 
Matej Habrnal fa1950
 
Matej Habrnal fa1950
diff --git a/src/cli/list.c b/src/cli/list.c
Matej Habrnal fa1950
index 2eefcfe..c0c819d 100644
Matej Habrnal fa1950
--- a/src/cli/list.c
Matej Habrnal fa1950
+++ b/src/cli/list.c
Matej Habrnal fa1950
@@ -30,33 +30,28 @@
Matej Habrnal fa1950
  *       ~/.abrt/spool and /var/tmp/abrt? needs more _meditation_.
Matej Habrnal fa1950
  */
Matej Habrnal fa1950
 
Matej Habrnal fa1950
-static problem_data_t *load_problem_data(const char *dump_dir_name)
Matej Habrnal fa1950
+static problem_data_t *load_problem_data(const char *problem_id)
Matej Habrnal fa1950
 {
Matej Habrnal fa1950
-    /* First, try loading by dirname */
Matej Habrnal fa1950
-    int sv_logmode = logmode;
Matej Habrnal fa1950
-    logmode = 0; /* suppress EPERM/EACCES errors in opendir */
Matej Habrnal fa1950
-    struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ DD_OPEN_READONLY);
Matej Habrnal fa1950
-    logmode = sv_logmode;
Matej Habrnal fa1950
+    char *name2 = NULL;
Matej Habrnal fa1950
+
Matej Habrnal fa1950
+    /* First, check if there is a problem with the passed id */
Matej Habrnal fa1950
+    GList *problems = get_problems_over_dbus(/*don't authorize*/false);
Matej Habrnal fa1950
+    GList *item = g_list_find_custom(problems, problem_id, (GCompareFunc)strcmp);
Matej Habrnal fa1950
 
Matej Habrnal fa1950
     /* (git requires at least 5 char hash prefix, we do the same) */
Matej Habrnal fa1950
-    if (!dd && errno == ENOENT)
Matej Habrnal fa1950
+    if (item == NULL)
Matej Habrnal fa1950
     {
Matej Habrnal fa1950
         /* Try loading by dirname hash */
Matej Habrnal fa1950
-        char *name2 = hash2dirname(dump_dir_name);
Matej Habrnal fa1950
-        if (name2)
Matej Habrnal fa1950
-            dd = dd_opendir(name2, /*flags:*/ DD_OPEN_READONLY);
Matej Habrnal fa1950
-        free(name2);
Matej Habrnal fa1950
-    }
Matej Habrnal fa1950
+        name2 = find_problem_by_hash(problem_id, problems);
Matej Habrnal fa1950
+        if (name2 == NULL)
Matej Habrnal fa1950
+            return NULL;
Matej Habrnal fa1950
 
Matej Habrnal fa1950
-    if (!dd)
Matej Habrnal fa1950
-        return NULL;
Matej Habrnal fa1950
+        problem_id = name2;
Matej Habrnal fa1950
+    }
Matej Habrnal fa1950
 
Matej Habrnal fa1950
-    problem_data_t *problem_data = create_problem_data_from_dump_dir(dd);
Matej Habrnal fa1950
-    problem_data_add(problem_data, CD_DUMPDIR, dd->dd_dirname,
Matej Habrnal fa1950
-                            CD_FLAG_TXT + CD_FLAG_ISNOTEDITABLE + CD_FLAG_LIST);
Matej Habrnal fa1950
-    dd_close(dd);
Matej Habrnal fa1950
+    problem_data_t *problem_data = get_full_problem_data_over_dbus(problem_id);
Matej Habrnal fa1950
 
Matej Habrnal fa1950
-    return problem_data;
Matej Habrnal fa1950
+    return (problem_data == ERR_PTR ? NULL : problem_data);
Matej Habrnal fa1950
 }
Matej Habrnal fa1950
 
Matej Habrnal fa1950
 /** Prints basic information about a crash to stdout. */
Matej Habrnal fa1950
@@ -127,7 +122,7 @@ static bool print_crash_list(vector_of_problem_data_t *crash_list, int detailed,
Matej Habrnal fa1950
 int cmd_list(int argc, const char **argv)
Matej Habrnal fa1950
 {
Matej Habrnal fa1950
     const char *program_usage_string = _(
Matej Habrnal fa1950
-        "& list [options] [DIR]..."
Matej Habrnal fa1950
+        "& list [options]"
Matej Habrnal fa1950
         );
Matej Habrnal fa1950
 
Matej Habrnal fa1950
     int opt_not_reported = 0;
Matej Habrnal fa1950
@@ -145,15 +140,8 @@ int cmd_list(int argc, const char **argv)
Matej Habrnal fa1950
     };
Matej Habrnal fa1950
 
Matej Habrnal fa1950
     parse_opts(argc, (char **)argv, program_options, program_usage_string);
Matej Habrnal fa1950
-    argv += optind;
Matej Habrnal fa1950
-
Matej Habrnal fa1950
-    GList *D_list = NULL;
Matej Habrnal fa1950
-    while (*argv)
Matej Habrnal fa1950
-        D_list = g_list_append(D_list, xstrdup(*argv++));
Matej Habrnal fa1950
-    if (!D_list)
Matej Habrnal fa1950
-        D_list = get_problem_storages();
Matej Habrnal fa1950
 
Matej Habrnal fa1950
-    vector_of_problem_data_t *ci = fetch_crash_infos(D_list);
Matej Habrnal fa1950
+    vector_of_problem_data_t *ci = fetch_crash_infos();
Matej Habrnal fa1950
 
Matej Habrnal fa1950
     g_ptr_array_sort_with_data(ci, &cmp_problem_data, (char *) FILENAME_LAST_OCCURRENCE);
Matej Habrnal fa1950
 
Matej Habrnal fa1950
@@ -163,7 +151,6 @@ int cmd_list(int argc, const char **argv)
Matej Habrnal fa1950
     print_crash_list(ci, opt_detailed, opt_not_reported, opt_since, opt_until, CD_TEXT_ATT_SIZE_BZ);
Matej Habrnal fa1950
 
Matej Habrnal fa1950
     free_vector_of_problem_data(ci);
Matej Habrnal fa1950
-    list_free_with_free(D_list);
Matej Habrnal fa1950
 
Matej Habrnal fa1950
 #if SUGGEST_AUTOREPORTING != 0
Matej Habrnal fa1950
     load_abrt_conf();
Matej Habrnal fa1950
diff --git a/src/cli/process.c b/src/cli/process.c
Matej Habrnal fa1950
index 7f4fff5..39462f9 100644
Matej Habrnal fa1950
--- a/src/cli/process.c
Matej Habrnal fa1950
+++ b/src/cli/process.c
Matej Habrnal fa1950
@@ -152,18 +152,14 @@ int cmd_process(int argc, const char **argv)
Matej Habrnal fa1950
     };
Matej Habrnal fa1950
 
Matej Habrnal fa1950
     parse_opts(argc, (char **)argv, program_options, program_usage_string);
Matej Habrnal fa1950
-    argv += optind;
Matej Habrnal fa1950
 
Matej Habrnal fa1950
-    GList *D_list = get_problem_storages();
Matej Habrnal fa1950
-
Matej Habrnal fa1950
-    vector_of_problem_data_t *ci = fetch_crash_infos(D_list);
Matej Habrnal fa1950
+    vector_of_problem_data_t *ci = fetch_crash_infos();
Matej Habrnal fa1950
 
Matej Habrnal fa1950
     g_ptr_array_sort_with_data(ci, &cmp_problem_data, (char *) FILENAME_LAST_OCCURRENCE);
Matej Habrnal fa1950
 
Matej Habrnal fa1950
     process_crashes(ci, opt_since);
Matej Habrnal fa1950
 
Matej Habrnal fa1950
     free_vector_of_problem_data(ci);
Matej Habrnal fa1950
-    list_free_with_free(D_list);
Matej Habrnal fa1950
 
Matej Habrnal fa1950
     return 0;
Matej Habrnal fa1950
 }
Matej Habrnal fa1950
diff --git a/src/cli/status.c b/src/cli/status.c
Matej Habrnal fa1950
index 1de2d41..68bdd0e 100644
Matej Habrnal fa1950
--- a/src/cli/status.c
Matej Habrnal fa1950
+++ b/src/cli/status.c
Matej Habrnal fa1950
@@ -21,53 +21,36 @@
Matej Habrnal fa1950
 #include <sys/types.h>
Matej Habrnal fa1950
 #include "problem_api.h"
Matej Habrnal fa1950
 
Matej Habrnal fa1950
-struct time_range {
Matej Habrnal fa1950
-    unsigned count;
Matej Habrnal fa1950
-    unsigned long since;
Matej Habrnal fa1950
-};
Matej Habrnal fa1950
-
Matej Habrnal fa1950
-static int count_dir_if_newer_than(struct dump_dir *dd, void *arg)
Matej Habrnal fa1950
-{
Matej Habrnal fa1950
-    struct time_range *me = arg;
Matej Habrnal fa1950
-
Matej Habrnal fa1950
-    if (dd_exist(dd, FILENAME_REPORTED_TO))
Matej Habrnal fa1950
-        return 0;
Matej Habrnal fa1950
-
Matej Habrnal fa1950
-    char *time_str = dd_load_text(dd, FILENAME_LAST_OCCURRENCE);
Matej Habrnal fa1950
-    long val = atol(time_str);
Matej Habrnal fa1950
-    free(time_str);
Matej Habrnal fa1950
-    if (val < me->since)
Matej Habrnal fa1950
-        return 0;
Matej Habrnal fa1950
-
Matej Habrnal fa1950
-    me->count++;
Matej Habrnal fa1950
-    return 0;
Matej Habrnal fa1950
-}
Matej Habrnal fa1950
-
Matej Habrnal fa1950
-static void count_problems_in_dir(gpointer data, gpointer arg)
Matej Habrnal fa1950
+static unsigned int count_problem_dirs(unsigned long since)
Matej Habrnal fa1950
 {
Matej Habrnal fa1950
-    char *path = data;
Matej Habrnal fa1950
-    struct time_range *me = arg;
Matej Habrnal fa1950
+    unsigned count = 0;
Matej Habrnal fa1950
 
Matej Habrnal fa1950
-    log_info("scanning '%s' for problems since %lu", path, me->since);
Matej Habrnal fa1950
+    GList *problems = get_problems_over_dbus(/*don't authorize*/false);
Matej Habrnal fa1950
+    for (GList *iter = problems; iter != NULL; iter = g_list_next(iter))
Matej Habrnal fa1950
+    {
Matej Habrnal fa1950
+        const char *problem_id = (const char *)iter->data;
Matej Habrnal fa1950
+        if (test_exist_over_dbus(problem_id, FILENAME_REPORTED_TO))
Matej Habrnal fa1950
+            continue;
Matej Habrnal fa1950
 
Matej Habrnal fa1950
-    for_each_problem_in_dir(path, getuid(), count_dir_if_newer_than, me);
Matej Habrnal fa1950
-}
Matej Habrnal fa1950
+        char *time_str = load_text_over_dbus(problem_id, FILENAME_LAST_OCCURRENCE);
Matej Habrnal fa1950
+        if (time_str == NULL)
Matej Habrnal fa1950
+            continue;
Matej Habrnal fa1950
 
Matej Habrnal fa1950
-static unsigned int count_problem_dirs(GList *paths, unsigned long since)
Matej Habrnal fa1950
-{
Matej Habrnal fa1950
-    struct time_range me;
Matej Habrnal fa1950
-    me.count = 0;
Matej Habrnal fa1950
-    me.since = since;
Matej Habrnal fa1950
+        long val = atol(time_str);
Matej Habrnal fa1950
+        free(time_str);
Matej Habrnal fa1950
+        if (val < since)
Matej Habrnal fa1950
+            return 0;
Matej Habrnal fa1950
 
Matej Habrnal fa1950
-    g_list_foreach(paths, count_problems_in_dir, &me);
Matej Habrnal fa1950
+        count++;
Matej Habrnal fa1950
+    }
Matej Habrnal fa1950
 
Matej Habrnal fa1950
-    return me.count;
Matej Habrnal fa1950
+    return count;
Matej Habrnal fa1950
 }
Matej Habrnal fa1950
 
Matej Habrnal fa1950
 int cmd_status(int argc, const char **argv)
Matej Habrnal fa1950
 {
Matej Habrnal fa1950
     const char *program_usage_string = _(
Matej Habrnal fa1950
-        "& status [DIR]..."
Matej Habrnal fa1950
+        "& status"
Matej Habrnal fa1950
         );
Matej Habrnal fa1950
 
Matej Habrnal fa1950
     int opt_bare = 0; /* must be _int_, OPT_BOOL expects that! */
Matej Habrnal fa1950
@@ -81,17 +64,8 @@ int cmd_status(int argc, const char **argv)
Matej Habrnal fa1950
     };
Matej Habrnal fa1950
 
Matej Habrnal fa1950
     parse_opts(argc, (char **)argv, program_options, program_usage_string);
Matej Habrnal fa1950
-    argv += optind;
Matej Habrnal fa1950
-
Matej Habrnal fa1950
-    GList *problem_dir_list = NULL;
Matej Habrnal fa1950
-    while (*argv)
Matej Habrnal fa1950
-        problem_dir_list = g_list_append(problem_dir_list, xstrdup(*argv++));
Matej Habrnal fa1950
-    if (!problem_dir_list)
Matej Habrnal fa1950
-        problem_dir_list = get_problem_storages();
Matej Habrnal fa1950
-
Matej Habrnal fa1950
-    unsigned int problem_count = count_problem_dirs(problem_dir_list, opt_since);
Matej Habrnal fa1950
 
Matej Habrnal fa1950
-    list_free_with_free(problem_dir_list);
Matej Habrnal fa1950
+    unsigned int problem_count = count_problem_dirs(opt_since);
Matej Habrnal fa1950
 
Matej Habrnal fa1950
     /* show only if there is at least 1 problem or user set the -v */
Matej Habrnal fa1950
     if (problem_count > 0 || g_verbose > 0)
Matej Habrnal fa1950
-- 
Matej Habrnal fa1950
2.1.0
Matej Habrnal fa1950