X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flogin%2Flogind-session-dbus.c;h=4e7edef52d7a8f22f357ff7d3a84d67cfe96f67c;hb=5e07a79e84ab8b045b9df1a2719f14fc84471a1d;hp=7d81500426dc0e7bbc5fed8c153a2f08b6bab719;hpb=19befb2d5fc087f96e40ddc432b2cc9385666209;p=elogind.git diff --git a/src/login/logind-session-dbus.c b/src/login/logind-session-dbus.c index 7d8150042..4e7edef52 100644 --- a/src/login/logind-session-dbus.c +++ b/src/login/logind-session-dbus.c @@ -21,12 +21,11 @@ #include #include -#include #include "util.h" #include "strv.h" #include "bus-util.h" -#include "bus-errors.h" +#include "bus-common-errors.h" #include "bus-label.h" #include "logind.h" @@ -240,16 +239,16 @@ static int method_set_idle_hint(sd_bus *bus, sd_bus_message *message, void *user if (r < 0) return r; - r = sd_bus_query_sender_creds(message, SD_BUS_CREDS_UID, &creds); + r = sd_bus_query_sender_creds(message, SD_BUS_CREDS_EUID, &creds); if (r < 0) return r; - r = sd_bus_creds_get_uid(creds, &uid); + r = sd_bus_creds_get_euid(creds, &uid); if (r < 0) return r; if (uid != 0 && uid != s->user->uid) - return sd_bus_error_setf(error, SD_BUS_ERROR_ACCESS_DENIED, "Only owner of session my set idle hint"); + return sd_bus_error_setf(error, SD_BUS_ERROR_ACCESS_DENIED, "Only owner of session may set idle hint"); session_set_idle_hint(s, b); @@ -303,11 +302,11 @@ static int method_take_control(sd_bus *bus, sd_bus_message *message, void *userd if (r < 0) return r; - r = sd_bus_query_sender_creds(message, SD_BUS_CREDS_UID, &creds); + r = sd_bus_query_sender_creds(message, SD_BUS_CREDS_EUID, &creds); if (r < 0) return r; - r = sd_bus_creds_get_uid(creds, &uid); + r = sd_bus_creds_get_euid(creds, &uid); if (r < 0) return r; @@ -491,23 +490,21 @@ int session_object_find(sd_bus *bus, const char *path, const char *interface, vo if (streq(path, "/org/freedesktop/login1/session/self")) { _cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL; sd_bus_message *message; - pid_t pid; + const char *name; message = sd_bus_get_current_message(bus); if (!message) return 0; - r = sd_bus_query_sender_creds(message, SD_BUS_CREDS_PID, &creds); + r = sd_bus_query_sender_creds(message, SD_BUS_CREDS_SESSION|SD_BUS_CREDS_AUGMENT, &creds); if (r < 0) return r; - r = sd_bus_creds_get_pid(creds, &pid); + r = sd_bus_creds_get_session(creds, &name); if (r < 0) return r; - r = manager_get_session_by_pid(m, pid, &session); - if (r <= 0) - return 0; + session = hashmap_get(m->sessions, name); } else { _cleanup_free_ char *e = NULL; const char *p; @@ -521,10 +518,11 @@ int session_object_find(sd_bus *bus, const char *path, const char *interface, vo return -ENOMEM; session = hashmap_get(m->sessions, e); - if (!session) - return 0; } + if (!session) + return 0; + *found = session; return 1; } @@ -543,6 +541,7 @@ char *session_bus_path(Session *s) { int session_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error) { _cleanup_strv_free_ char **l = NULL; + sd_bus_message *message; Manager *m = userdata; Session *session; Iterator i; @@ -564,6 +563,25 @@ int session_node_enumerator(sd_bus *bus, const char *path, void *userdata, char return r; } + message = sd_bus_get_current_message(bus); + if (message) { + _cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL; + const char *name; + + r = sd_bus_query_sender_creds(message, SD_BUS_CREDS_SESSION|SD_BUS_CREDS_AUGMENT, &creds); + if (r >= 0) { + r = sd_bus_creds_get_session(creds, &name); + if (r >= 0) { + session = hashmap_get(m->sessions, name); + if (session) { + r = strv_extend(&l, "/org/freedesktop/login1/session/self"); + if (r < 0) + return r; + } + } + } + } + *nodes = l; l = NULL;