|
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 |
|