<check send_destination="org.tizen.resourced"
send_interface="org.tizen.resourced.process"
send_member="ProcSweep"
- privilege="http://tizen.org/privilege/systemmonitor"/>
+ privilege="http://tizen.org/privilege/systemsettings.admin"/>
<check send_destination="org.tizen.resourced"
send_interface="org.tizen.resourced.process"
send_member="ProcWatchdog"
#include "resourced.h"
#include "util.h"
#include "fd-handler.h"
+#include "procfs.h"
#define D_BUS_INIT_RETRY_COUNT 5
static const GDBusInterfaceVTable vtable = { d_bus_method_handler, NULL, NULL };
+static gboolean d_bus_is_privileged(const gchar *name)
+{
+ int ret;
+ pid_t pid;
+ GVariant *reply;
+ char label[PROC_NAME_MAX];
+
+ reply = g_dbus_connection_call_sync(d_bus_get_connection(),
+ "org.freedesktop.DBus", "/org/freedesktop/DBus",
+ "org.freedesktop.DBus", "GetConnectionUnixProcessID",
+ g_variant_new("(s)", name), NULL, G_DBUS_CALL_FLAGS_NONE,
+ -1, NULL, NULL);
+
+ if (!reply) {
+ _E("Failed to get the PID of sender %s", name);
+ return FALSE;
+ }
+
+ g_variant_get(reply, "(u)", &pid);
+
+ ret = proc_get_label(pid, label);
+ if (ret < 0) {
+ _E("Failed to get SMACK label for PID %u (%d)", pid, ret);
+ return FALSE;
+ }
+
+ if (!strncmp(label, "System", 7) || !strncmp(label, "System::Privileged", 19))
+ return TRUE;
+
+ return FALSE;
+}
+
static void d_bus_signal_handler(GDBusConnection *connection,
const gchar *sender, const gchar *object_path,
const gchar *interface_name, const gchar *signal_name,
if (!signal || !signal->callback)
return;
+ if (!d_bus_is_privileged(sender)) {
+ _E("This sender doesn't have privilege to run %s", signal_name);
+ return;
+ }
+
signal->callback(parameters);
}