X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flogin%2Flogind-user-dbus.c;h=5cfaac0d4f0ddcca0d170a7f3630b1d1fe33fecc;hb=2ac7c17f9d8eeb403b91ee5a389562edaf47fb87;hp=b5d27e74dea8b588e8d7643aba00098f51bd2e93;hpb=6e18964d3a365567954fe10ddcfad74babdc427c;p=elogind.git diff --git a/src/login/logind-user-dbus.c b/src/login/logind-user-dbus.c index b5d27e74d..5cfaac0d4 100644 --- a/src/login/logind-user-dbus.c +++ b/src/login/logind-user-dbus.c @@ -21,7 +21,6 @@ #include #include -#include #include "strv.h" #include "bus-util.h" @@ -220,7 +219,7 @@ const sd_bus_vtable user_vtable[] = { SD_BUS_PROPERTY("RuntimePath", "s", NULL, offsetof(User, runtime_path), SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_PROPERTY("Service", "s", NULL, offsetof(User, service), SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_PROPERTY("Slice", "s", NULL, offsetof(User, slice), SD_BUS_VTABLE_PROPERTY_CONST), - SD_BUS_PROPERTY("Display", "(so)", property_get_display, 0, SD_BUS_VTABLE_PROPERTY_CONST), + SD_BUS_PROPERTY("Display", "(so)", property_get_display, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), SD_BUS_PROPERTY("State", "s", property_get_state, 0, 0), SD_BUS_PROPERTY("Sessions", "a(so)", property_get_sessions, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), SD_BUS_PROPERTY("IdleHint", "b", property_get_idle_hint, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), @@ -236,6 +235,7 @@ const sd_bus_vtable user_vtable[] = { int user_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error) { Manager *m = userdata; + uid_t uid; User *user; int r; @@ -248,39 +248,31 @@ int user_object_find(sd_bus *bus, const char *path, const char *interface, void if (streq(path, "/org/freedesktop/login1/user/self")) { _cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL; sd_bus_message *message; - pid_t pid; - message = sd_bus_get_current(bus); + 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_OWNER_UID|SD_BUS_CREDS_AUGMENT, &creds); if (r < 0) return r; - r = sd_bus_creds_get_pid(creds, &pid); - if (r < 0) - return r; - - r = manager_get_user_by_pid(m, pid, &user); - if (r <= 0) - return 0; + r = sd_bus_creds_get_owner_uid(creds, &uid); } else { - unsigned long lu; const char *p; p = startswith(path, "/org/freedesktop/login1/user/_"); if (!p) return 0; - r = safe_atolu(p, &lu); - if (r < 0) - return 0; - - user = hashmap_get(m->users, ULONG_TO_PTR(lu)); - if (!user) - return 0; + r = parse_uid(p, &uid); } + if (r < 0) + return 0; + + user = hashmap_get(m->users, UID_TO_PTR(uid)); + if (!user) + return 0; *found = user; return 1; @@ -291,7 +283,7 @@ char *user_bus_path(User *u) { assert(u); - if (asprintf(&s, "/org/freedesktop/login1/user/_%llu", (unsigned long long) u->uid) < 0) + if (asprintf(&s, "/org/freedesktop/login1/user/_"UID_FMT, u->uid) < 0) return NULL; return s; @@ -299,6 +291,7 @@ char *user_bus_path(User *u) { int user_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; User *user; Iterator i; @@ -320,6 +313,25 @@ int user_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; + uid_t uid; + + r = sd_bus_query_sender_creds(message, SD_BUS_CREDS_OWNER_UID|SD_BUS_CREDS_AUGMENT, &creds); + if (r >= 0) { + r = sd_bus_creds_get_owner_uid(creds, &uid); + if (r >= 0) { + user = hashmap_get(m->users, UID_TO_PTR(uid)); + if (user) { + r = strv_extend(&l, "/org/freedesktop/login1/user/self"); + if (r < 0) + return r; + } + } + } + } + *nodes = l; l = NULL;