chiark / gitweb /
logind: add virtual object paths that always can be used to refer to the callers...
[elogind.git] / src / login / logind-session-dbus.c
index cda6a0a4827a3e9023e53b5bbbae7d7a2dcc39bf..a559e6045b5fe9903fb76cc4ece660487eff28e5 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;