From 5b12334d35eadf1f45cc3d631fd1a2e72ffaea0a Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 28 Nov 2013 17:50:02 +0100 Subject: bus: add new sd_bus_creds object to encapsulate process credentials This way we can unify handling of credentials that are attached to messages, or can be queried for bus name owners or connection peers. This also adds the ability to extend incomplete credential information with data from /proc, Also, provide a convenience call that will automatically determine the most appropriate credential object for an incoming message, by using the the attached information if possible, the sending name information if available and otherwise the peer's credentials. --- src/machine/machine-dbus.c | 9 +++++++-- src/machine/machined-dbus.c | 16 ++++++++++++++-- 2 files changed, 21 insertions(+), 4 deletions(-) (limited to 'src/machine') diff --git a/src/machine/machine-dbus.c b/src/machine/machine-dbus.c index c6a794b5e8..1f24b11197 100644 --- a/src/machine/machine-dbus.c +++ b/src/machine/machine-dbus.c @@ -154,6 +154,7 @@ int machine_object_find(sd_bus *bus, const char *path, const char *interface, vo assert(m); if (streq(path, "/org/freedesktop/machine1/machine/self")) { + _cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL; sd_bus_message *message; pid_t pid; @@ -161,9 +162,13 @@ int machine_object_find(sd_bus *bus, const char *path, const char *interface, vo if (!message) return 0; - r = sd_bus_get_owner_pid(bus, sd_bus_message_get_sender(message), &pid); + r = sd_bus_query_sender_creds(message, SD_BUS_CREDS_PID, &creds); if (r < 0) - return 0; + return r; + + r = sd_bus_creds_get_pid(creds, &pid); + if (r < 0) + return r; r = manager_get_machine_by_pid(m, pid, &machine); if (r <= 0) diff --git a/src/machine/machined-dbus.c b/src/machine/machined-dbus.c index 34cd61d667..726cc4cbc7 100644 --- a/src/machine/machined-dbus.c +++ b/src/machine/machined-dbus.c @@ -102,7 +102,13 @@ static int method_get_machine_by_pid(sd_bus *bus, sd_bus_message *message, void return r; if (pid == 0) { - r = sd_bus_get_owner_pid(bus, sd_bus_message_get_sender(message), &pid); + _cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL; + + r = sd_bus_query_sender_creds(message, SD_BUS_CREDS_PID, &creds); + if (r < 0) + return r; + + r = sd_bus_creds_get_pid(creds, &pid); if (r < 0) return r; } @@ -216,9 +222,15 @@ static int method_create_machine(sd_bus *bus, sd_bus_message *message, void *use return r; if (leader == 0) { + _cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL; + + r = sd_bus_query_sender_creds(message, SD_BUS_CREDS_PID, &creds); + if (r < 0) + return r; + assert_cc(sizeof(uint32_t) == sizeof(pid_t)); - r = sd_bus_get_owner_pid(bus, sd_bus_message_get_sender(message), (pid_t*) &leader); + r = sd_bus_creds_get_pid(creds, (pid_t*) &leader); if (r < 0) return r; } -- cgit v1.2.3-54-g00ecf