chiark / gitweb /
logind: add virtual object paths that always can be used to refer to the callers...
authorLennart Poettering <lennart@poettering.net>
Tue, 5 Nov 2013 19:52:39 +0000 (20:52 +0100)
committerLennart Poettering <lennart@poettering.net>
Tue, 5 Nov 2013 19:52:39 +0000 (20:52 +0100)
This way clients can skip invoking GetSessionByPID() for their own PID
or a similar call to access these objects.

src/login/logind-seat-dbus.c
src/login/logind-session-dbus.c
src/login/logind-user-dbus.c
src/machine/machine-dbus.c
src/machine/machined-dbus.c

index e9f8d26..c59dfd9 100644 (file)
@@ -254,10 +254,9 @@ const sd_bus_vtable seat_vtable[] = {
 };
 
 int seat_object_find(sd_bus *bus, const char *path, const char *interface, void **found, void *userdata) {
-        _cleanup_free_ char *e = NULL;
         Manager *m = userdata;
         Seat *seat;
-        const char *p;
+        int r;
 
         assert(bus);
         assert(path);
@@ -265,17 +264,43 @@ int seat_object_find(sd_bus *bus, const char *path, const char *interface, void
         assert(found);
         assert(m);
 
-        p = startswith(path, "/org/freedesktop/login1/seat/");
-        if (!p)
-                return 0;
+        if (streq(path, "/org/freedesktop/login1/seat/self")) {
+                sd_bus_message *message;
+                Session *session;
+                pid_t pid;
 
-        e = bus_path_unescape(p);
-        if (!e)
-                return -ENOMEM;
+                message = sd_bus_get_current(bus);
+                if (!message)
+                        return 0;
 
-        seat = hashmap_get(m->seats, e);
-        if (!seat)
-                return 0;
+                r = sd_bus_get_owner_pid(bus, sd_bus_message_get_sender(message), &pid);
+                if (r < 0)
+                        return 0;
+
+                r = manager_get_session_by_pid(m, pid, &session);
+                if (r <= 0)
+                        return 0;
+
+                if (!session->seat)
+                        return 0;
+
+                seat = session->seat;
+        } else {
+                _cleanup_free_ char *e = NULL;
+                const char *p;
+
+                p = startswith(path, "/org/freedesktop/login1/seat/");
+                if (!p)
+                        return 0;
+
+                e = bus_path_unescape(p);
+                if (!e)
+                        return -ENOMEM;
+
+                seat = hashmap_get(m->seats, e);
+                if (!seat)
+                        return 0;
+        }
 
         *found = seat;
         return 1;
index cda6a0a..a559e60 100644 (file)
@@ -465,10 +465,9 @@ const sd_bus_vtable session_vtable[] = {
 };
 
 int session_object_find(sd_bus *bus, const char *path, const char *interface, void **found, void *userdata) {
-        _cleanup_free_ char *e = NULL;
         Manager *m = userdata;
         Session *session;
-        const char *p;
+        int r;
 
         assert(bus);
         assert(path);
@@ -476,17 +475,37 @@ int session_object_find(sd_bus *bus, const char *path, const char *interface, vo
         assert(found);
         assert(m);
 
-        p = startswith(path, "/org/freedesktop/login1/session/");
-        if (!p)
-                return 0;
+        if (streq(path, "/org/freedesktop/login1/session/self")) {
+                sd_bus_message *message;
+                pid_t pid;
 
-        e = bus_path_unescape(p);
-        if (!e)
-                return -ENOMEM;
+                message = sd_bus_get_current(bus);
+                if (!message)
+                        return 0;
 
-        session = hashmap_get(m->sessions, e);
-        if (!session)
-                return 0;
+                r = sd_bus_get_owner_pid(bus, sd_bus_message_get_sender(message), &pid);
+                if (r < 0)
+                        return 0;
+
+                r = manager_get_session_by_pid(m, pid, &session);
+                if (r <= 0)
+                        return 0;
+        } else {
+                _cleanup_free_ char *e = NULL;
+                const char *p;
+
+                p = startswith(path, "/org/freedesktop/login1/session/");
+                if (!p)
+                        return 0;
+
+                e = bus_path_unescape(p);
+                if (!e)
+                        return -ENOMEM;
+
+                session = hashmap_get(m->sessions, e);
+                if (!session)
+                        return 0;
+        }
 
         *found = session;
         return 1;
index dbd617f..563c7ef 100644 (file)
@@ -236,11 +236,7 @@ const sd_bus_vtable user_vtable[] = {
 };
 
 int user_object_find(sd_bus *bus, const char *path, const char *interface, void **found, void *userdata) {
-
-        _cleanup_free_ char *e = NULL;
         Manager *m = userdata;
-        unsigned long lu;
-        const char *p;
         User *user;
         int r;
 
@@ -250,17 +246,37 @@ int user_object_find(sd_bus *bus, const char *path, const char *interface, void
         assert(found);
         assert(m);
 
-        p = startswith(path, "/org/freedesktop/login1/user/_");
-        if (!p)
-                return 0;
+        if (streq(path, "/org/freedesktop/login1/user/self")) {
+                sd_bus_message *message;
+                pid_t pid;
 
-        r = safe_atolu(p, &lu);
-        if (r < 0)
-                return 0;
+                message = sd_bus_get_current(bus);
+                if (!message)
+                        return 0;
 
-        user = hashmap_get(m->users, ULONG_TO_PTR(lu));
-        if (!user)
-                return 0;
+                r = sd_bus_get_owner_pid(bus, sd_bus_message_get_sender(message), &pid);
+                if (r < 0)
+                        return 0;
+
+                r = manager_get_user_by_pid(m, pid, &user);
+                if (r <= 0)
+                        return 0;
+        } 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;
+        }
 
         *found = user;
         return 1;
index ddd6b4b..db379d2 100644 (file)
@@ -23,6 +23,7 @@
 #include <string.h>
 
 #include "bus-util.h"
+#include "strv.h"
 #include "machine.h"
 
 static int property_get_id(
@@ -142,10 +143,9 @@ const sd_bus_vtable machine_vtable[] = {
 };
 
 int machine_object_find(sd_bus *bus, const char *path, const char *interface, void **found, void *userdata) {
-        _cleanup_free_ char *e = NULL;
         Manager *m = userdata;
         Machine *machine;
-        const char *p;
+        int r;
 
         assert(bus);
         assert(path);
@@ -153,17 +153,37 @@ int machine_object_find(sd_bus *bus, const char *path, const char *interface, vo
         assert(found);
         assert(m);
 
-        p = startswith(path, "/org/freedesktop/machine1/machine/");
-        if (!p)
-                return 0;
+        if (streq(path, "/org/freedesktop/machine1/machine/self")) {
+                sd_bus_message *message;
+                pid_t pid;
 
-        e = bus_path_unescape(p);
-        if (!e)
-                return -ENOMEM;
+                message = sd_bus_get_current(bus);
+                if (!message)
+                        return 0;
 
-        machine = hashmap_get(m->machines, e);
-        if (!machine)
-                return 0;
+                r = sd_bus_get_owner_pid(bus, sd_bus_message_get_sender(message), &pid);
+                if (r < 0)
+                        return 0;
+
+                r = manager_get_machine_by_pid(m, pid, &machine);
+                if (r <= 0)
+                        return 0;
+        } else {
+                _cleanup_free_ char *e = NULL;
+                const char *p;
+
+                p = startswith(path, "/org/freedesktop/machine1/machine/");
+                if (!p)
+                        return 0;
+
+                e = bus_path_unescape(p);
+                if (!e)
+                        return -ENOMEM;
+
+                machine = hashmap_get(m->machines, e);
+                if (!machine)
+                        return 0;
+        }
 
         *found = machine;
         return 1;
@@ -181,6 +201,37 @@ char *machine_bus_path(Machine *m) {
         return strappend("/org/freedesktop/machine1/machine/", e);
 }
 
+int machine_node_enumerator(sd_bus *bus, const char *path, char ***nodes, void *userdata) {
+        _cleanup_strv_free_ char **l = NULL;
+        Machine *machine = NULL;
+        Manager *m = userdata;
+        Iterator i;
+        int r;
+
+        assert(bus);
+        assert(path);
+        assert(nodes);
+
+        HASHMAP_FOREACH(machine, m->machines, i) {
+                char *p;
+
+                p = machine_bus_path(machine);
+                if (!p)
+                        return -ENOMEM;
+
+                r = strv_push(&l, p);
+                if (r < 0) {
+                        free(p);
+                        return r;
+                }
+        }
+
+        *nodes = l;
+        l = NULL;
+
+        return 1;
+}
+
 int machine_send_signal(Machine *m, bool new_machine) {
         _cleanup_free_ char *p = NULL;
 
index 505bc17..11256da 100644 (file)
@@ -342,37 +342,6 @@ const sd_bus_vtable manager_vtable[] = {
         SD_BUS_VTABLE_END
 };
 
-int machine_node_enumerator(sd_bus *bus, const char *path, char ***nodes, void *userdata) {
-        _cleanup_strv_free_ char **l = NULL;
-        Machine *machine = NULL;
-        Manager *m = userdata;
-        Iterator i;
-        int r;
-
-        assert(bus);
-        assert(path);
-        assert(nodes);
-
-        HASHMAP_FOREACH(machine, m->machines, i) {
-                char *p;
-
-                p = machine_bus_path(machine);
-                if (!p)
-                        return -ENOMEM;
-
-                r = strv_push(&l, p);
-                if (r < 0) {
-                        free(p);
-                        return r;
-                }
-        }
-
-        *nodes = l;
-        l = NULL;
-
-        return 1;
-}
-
 int match_job_removed(sd_bus *bus, sd_bus_message *message, void *userdata) {
         const char *path, *result, *unit;
         Manager *m = userdata;