Matej Habrnal fa1950
From 502491485b3c1c69120c1413b18f7fd55f6a94c7 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:48:33 +0100
Matej Habrnal fa1950
Subject: [PATCH] dbus: add new method to test existence of an element
Matej Habrnal fa1950
Matej Habrnal fa1950
It is sometimes necessary to check if some elemen exist, so this method
Matej Habrnal fa1950
should be fast as much as it is possible to do this task over DBus.
Matej Habrnal fa1950
Matej Habrnal fa1950
I was thinking about calling the GetInfo method with a single element
Matej Habrnal fa1950
but I refused this idea as it is inherently overcomplicated and error
Matej Habrnal fa1950
prone.
Matej Habrnal fa1950
Matej Habrnal fa1950
Signed-off-by: Jakub Filak <jfilak@redhat.com>
Matej Habrnal fa1950
---
Matej Habrnal fa1950
 .../org.freedesktop.Problems.xml.in                | 16 ++++++++
Matej Habrnal fa1950
 src/dbus/abrt-dbus.c                               | 44 ++++++++++++++++++++++
Matej Habrnal fa1950
 2 files changed, 60 insertions(+)
Matej Habrnal fa1950
Matej Habrnal fa1950
diff --git a/doc/problems-service/org.freedesktop.Problems.xml.in b/doc/problems-service/org.freedesktop.Problems.xml.in
Matej Habrnal fa1950
index 6fcd990..2bf8c32 100644
Matej Habrnal fa1950
--- a/doc/problems-service/org.freedesktop.Problems.xml.in
Matej Habrnal fa1950
+++ b/doc/problems-service/org.freedesktop.Problems.xml.in
Matej Habrnal fa1950
@@ -253,6 +253,22 @@ for prblmid in problems.GetProblems():
Matej Habrnal fa1950
                 </arg>
Matej Habrnal fa1950
             </method>
Matej Habrnal fa1950
 
Matej Habrnal fa1950
+            <method name='TestElementExists'>
Matej Habrnal fa1950
+                <tp:docstring>Checks whether the element exists.</tp:docstring>
Matej Habrnal fa1950
+
Matej Habrnal fa1950
+                <arg type='s' name='problem_dir' direction='in'>
Matej Habrnal fa1950
+                    <tp:docstring>An identifier of problem.</tp:docstring>
Matej Habrnal fa1950
+                </arg>
Matej Habrnal fa1950
+
Matej Habrnal fa1950
+                <arg type='s' name='name' direction='in'>
Matej Habrnal fa1950
+                    <tp:docstring>A name of checked element.</tp:docstring>
Matej Habrnal fa1950
+                </arg>
Matej Habrnal fa1950
+
Matej Habrnal fa1950
+                <arg type='b' name='response' direction='out'>
Matej Habrnal fa1950
+                    <tp:docstring>True if the element exists; otherwise false.</tp:docstring>
Matej Habrnal fa1950
+                </arg>
Matej Habrnal fa1950
+            </method>
Matej Habrnal fa1950
+
Matej Habrnal fa1950
             <method name='GetProblemData'>"
Matej Habrnal fa1950
                 <tp:docstring>Returns problem's data.</tp:docstring>
Matej Habrnal fa1950
 
Matej Habrnal fa1950
diff --git a/src/dbus/abrt-dbus.c b/src/dbus/abrt-dbus.c
Matej Habrnal fa1950
index cf7785d..4eeff41 100644
Matej Habrnal fa1950
--- a/src/dbus/abrt-dbus.c
Matej Habrnal fa1950
+++ b/src/dbus/abrt-dbus.c
Matej Habrnal fa1950
@@ -49,6 +49,11 @@ static const gchar introspection_xml[] =
Matej Habrnal fa1950
   "      <arg type='s' name='problem_dir' direction='in'/>"
Matej Habrnal fa1950
   "      <arg type='s' name='name' direction='in'/>"
Matej Habrnal fa1950
   "    </method>"
Matej Habrnal fa1950
+  "    <method name='TestElementExists'>"
Matej Habrnal fa1950
+  "      <arg type='s' name='problem_dir' direction='in'/>"
Matej Habrnal fa1950
+  "      <arg type='s' name='name' direction='in'/>"
Matej Habrnal fa1950
+  "      <arg type='b' name='response' direction='out'/>"
Matej Habrnal fa1950
+  "    </method>"
Matej Habrnal fa1950
   "    <method name='GetProblemData'>"
Matej Habrnal fa1950
   "      <arg type='s' name='problem_dir' direction='in'/>"
Matej Habrnal fa1950
   "      <arg type='a{s(its)}' name='problem_data' direction='out'/>"
Matej Habrnal fa1950
@@ -703,6 +708,45 @@ static void handle_method_call(GDBusConnection *connection,
Matej Habrnal fa1950
         return;
Matej Habrnal fa1950
     }
Matej Habrnal fa1950
 
Matej Habrnal fa1950
+    if (g_strcmp0(method_name, "TestElementExists") == 0)
Matej Habrnal fa1950
+    {
Matej Habrnal fa1950
+        const char *problem_id;
Matej Habrnal fa1950
+        const char *element;
Matej Habrnal fa1950
+
Matej Habrnal fa1950
+        g_variant_get(parameters, "(&s&s)", &problem_id, &element);
Matej Habrnal fa1950
+
Matej Habrnal fa1950
+
Matej Habrnal fa1950
+        struct dump_dir *dd = dd_opendir(problem_id, DD_OPEN_READONLY);
Matej Habrnal fa1950
+        if (!dd)
Matej Habrnal fa1950
+        {
Matej Habrnal fa1950
+            log_notice("Can't access the problem '%s'", problem_id);
Matej Habrnal fa1950
+            g_dbus_method_invocation_return_dbus_error(invocation,
Matej Habrnal fa1950
+                                    "org.freedesktop.problems.Failure",
Matej Habrnal fa1950
+                                    _("Can't access the problem"));
Matej Habrnal fa1950
+            return;
Matej Habrnal fa1950
+        }
Matej Habrnal fa1950
+
Matej Habrnal fa1950
+        int ddstat = dump_dir_stat_for_uid(problem_id, caller_uid);
Matej Habrnal fa1950
+        if ((ddstat & DD_STAT_ACCESSIBLE_BY_UID) == 0 &&
Matej Habrnal fa1950
+                polkit_check_authorization_dname(caller, "org.freedesktop.problems.getall") != PolkitYes)
Matej Habrnal fa1950
+        {
Matej Habrnal fa1950
+            dd_close(dd);
Matej Habrnal fa1950
+            log_notice("Unauthorized access : '%s'", problem_id);
Matej Habrnal fa1950
+            g_dbus_method_invocation_return_dbus_error(invocation,
Matej Habrnal fa1950
+                                              "org.freedesktop.problems.AuthFailure",
Matej Habrnal fa1950
+                                              _("Not Authorized"));
Matej Habrnal fa1950
+            return;
Matej Habrnal fa1950
+        }
Matej Habrnal fa1950
+
Matej Habrnal fa1950
+        int ret = dd_exist(dd, element);
Matej Habrnal fa1950
+        dd_close(dd);
Matej Habrnal fa1950
+
Matej Habrnal fa1950
+        GVariant *response = g_variant_new("(b)", ret);
Matej Habrnal fa1950
+        g_dbus_method_invocation_return_value(invocation, response);
Matej Habrnal fa1950
+
Matej Habrnal fa1950
+        return;
Matej Habrnal fa1950
+    }
Matej Habrnal fa1950
+
Matej Habrnal fa1950
     if (g_strcmp0(method_name, "DeleteProblem") == 0)
Matej Habrnal fa1950
     {
Matej Habrnal fa1950
         /* Dbus parameters are always tuples.
Matej Habrnal fa1950
-- 
Matej Habrnal fa1950
2.1.0
Matej Habrnal fa1950