Matej Habrnal fa1950
From b68f8ea31526275127a9f6ae5c8a24fc24b6d664 Mon Sep 17 00:00:00 2001
Matej Habrnal fa1950
From: Jakub Filak <jfilak@redhat.com>
Matej Habrnal fa1950
Date: Wed, 3 Jun 2015 05:40:41 +0200
Matej Habrnal fa1950
Subject: [PATCH] cli: chown before reporting
Matej Habrnal fa1950
Matej Habrnal fa1950
User must have write access to the reported directory to be able to
Matej Habrnal fa1950
report it but abrt-dbus allows the user to read data of problems that
Matej Habrnal fa1950
belongs to him which may not be accessible in file system.
Matej Habrnal fa1950
Matej Habrnal fa1950
The GUI does the same and make sures the user can write to the reported
Matej Habrnal fa1950
directory by chowning it before reporting.
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 |  5 +++++
Matej Habrnal fa1950
 src/cli/abrt-cli-core.h |  3 +++
Matej Habrnal fa1950
 src/cli/report.c        | 24 +++++++++++++++---------
Matej Habrnal fa1950
 3 files changed, 23 insertions(+), 9 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 77a37f7..46acd01 100644
Matej Habrnal fa1950
--- a/src/cli/abrt-cli-core.c
Matej Habrnal fa1950
+++ b/src/cli/abrt-cli-core.c
Matej Habrnal fa1950
@@ -107,3 +107,8 @@ char *hash2dirname(const char *hash)
Matej Habrnal fa1950
 
Matej Habrnal fa1950
     return found_name;
Matej Habrnal fa1950
 }
Matej Habrnal fa1950
+
Matej Habrnal fa1950
+char *hash2dirname_if_necessary(const char *input)
Matej Habrnal fa1950
+{
Matej Habrnal fa1950
+    return isxdigit_str(input) ? hash2dirname(input) : xstrdup(input);
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 33b2ea6..d69d463 100644
Matej Habrnal fa1950
--- a/src/cli/abrt-cli-core.h
Matej Habrnal fa1950
+++ b/src/cli/abrt-cli-core.h
Matej Habrnal fa1950
@@ -34,6 +34,9 @@ vector_of_problem_data_t *fetch_crash_infos(void);
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
+/* If input looks like a hash, returns malloced string, or NULL if not found.
Matej Habrnal fa1950
+ * Otherwise returns a copy of the input. */
Matej Habrnal fa1950
+char *hash2dirname_if_necessary(const char *input);
Matej Habrnal fa1950
 
Matej Habrnal fa1950
 
Matej Habrnal fa1950
 #endif /* ABRT_CLI_CORE_H_ */
Matej Habrnal fa1950
diff --git a/src/cli/report.c b/src/cli/report.c
Matej Habrnal fa1950
index 33d8b44..6af9769 100644
Matej Habrnal fa1950
--- a/src/cli/report.c
Matej Habrnal fa1950
+++ b/src/cli/report.c
Matej Habrnal fa1950
@@ -53,26 +53,32 @@ int cmd_report(int argc, const char **argv)
Matej Habrnal fa1950
     while (*argv)
Matej Habrnal fa1950
     {
Matej Habrnal fa1950
         const char *dir_name = *argv++;
Matej Habrnal fa1950
+        char *const real_problem_id = hash2dirname_if_necessary(dir_name);
Matej Habrnal fa1950
+        if (real_problem_id == NULL)
Matej Habrnal fa1950
+        {
Matej Habrnal fa1950
+            error_msg(_("Can't find problem '%s'"), dir_name);
Matej Habrnal fa1950
+            continue;
Matej Habrnal fa1950
+        }
Matej Habrnal fa1950
 
Matej Habrnal fa1950
-        char *free_me = NULL;
Matej Habrnal fa1950
-        if (access(dir_name, F_OK) != 0 && errno == ENOENT)
Matej Habrnal fa1950
+        const int res = chown_dir_over_dbus(real_problem_id);
Matej Habrnal fa1950
+        if (res != 0)
Matej Habrnal fa1950
         {
Matej Habrnal fa1950
-            free_me = hash2dirname(dir_name);
Matej Habrnal fa1950
-            if (free_me)
Matej Habrnal fa1950
-                dir_name = free_me;
Matej Habrnal fa1950
+            error_msg(_("Can't take ownership of '%s'"), real_problem_id);
Matej Habrnal fa1950
+            free(real_problem_id);
Matej Habrnal fa1950
+            continue;
Matej Habrnal fa1950
         }
Matej Habrnal fa1950
-        int status = report_problem_in_dir(dir_name,
Matej Habrnal fa1950
+        int status = report_problem_in_dir(real_problem_id,
Matej Habrnal fa1950
                                              LIBREPORT_WAIT
Matej Habrnal fa1950
                                            | LIBREPORT_RUN_CLI);
Matej Habrnal fa1950
 
Matej Habrnal fa1950
         /* the problem was successfully reported and option is -d */
Matej Habrnal fa1950
         if((opts & OPT_d) && (status == 0 || status == EXIT_STOP_EVENT_RUN))
Matej Habrnal fa1950
         {
Matej Habrnal fa1950
-            log(_("Deleting '%s'"), dir_name);
Matej Habrnal fa1950
-            delete_dump_dir_possibly_using_abrtd(dir_name);
Matej Habrnal fa1950
+            log(_("Deleting '%s'"), real_problem_id);
Matej Habrnal fa1950
+            delete_dump_dir_possibly_using_abrtd(real_problem_id);
Matej Habrnal fa1950
         }
Matej Habrnal fa1950
 
Matej Habrnal fa1950
-        free(free_me);
Matej Habrnal fa1950
+        free(real_problem_id);
Matej Habrnal fa1950
 
Matej Habrnal fa1950
         if (status)
Matej Habrnal fa1950
             exit(status);
Matej Habrnal fa1950
-- 
Matej Habrnal fa1950
2.1.0
Matej Habrnal fa1950