chiark / gitweb /
pam_systemd: dup the fd received from logind
[elogind.git] / src / login / logind-session-dbus.c
index cda6a0a4827a3e9023e53b5bbbae7d7a2dcc39bf..167d2ab8b4da98b43691e89d604ad6ee56f89d5f 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;
@@ -637,6 +656,15 @@ int session_send_create_reply(Session *s, sd_bus_error *error) {
         if (!p)
                 return -ENOMEM;
 
+        log_debug("Sending reply about created session: "
+                  "id=%s object_path=%s runtime_path=%s session_fd=%d seat=%s vtnr=%u",
+                  s->id,
+                  p,
+                  s->user->runtime_path,
+                  fifo_fd,
+                  s->seat ? s->seat->id : "",
+                  (uint32_t) s->vtnr);
+
         return sd_bus_reply_method_return(
                         s->manager->bus, c,
                         "soshsub",