Re: Get the sender PID from gDBus
Amira S <[email protected]>
| Newsgroups | gmane.comp.freedesktop.dbus |
|---|---|
| Message-ID | <CADTJ9tM4DpV_JQVV3=e1mE1xBo9Yse9hSPwu5GTGLPqyxNZo7g@mail.gmail.com> |
Thanks for the detailed explanation! Calling g_dbus_method_invocation_get_sender() and then GetConnectionUnixProcessID work and I can get the peer's PID now. On Mon, May 23, 2022 at 2:15 PM Simon McVittie <smcv-ZGY8ohtN/[email protected]> wrote: > On Sun, 22 May 2022 at 11:40:35 +0300, Amira S wrote: > > Any idea if/how it is possible to get the peer's PID connecting to a > SYSTEM > > bus? > > g_dbus_method_invocation_get_sender() will tell you the peer's > unique connection name, and then you can look that up with > GetConnectionUnixProcessID or GetConnectionCredentials to get the process > ID (for example you might use g_dbus_connection_call() to call one of > those methods). > > polkit <https://gitlab.freedesktop.org/polkit/polkit/> is an example of a > system service that does this. > > > According to the documentation, it is possible to obtain a GCredentials > from > > the connection by calling [1]g_dbus_connection_get_peer_credentials, > (and from > > there I can get a unix ucred that has the pid), but I always get a NULL > > credentials. > > The documentation for this function says: > > "Gets the credentials of the authenticated peer. This will always > return [2] > > NULL unless connection acted as a server > > You are not the server, so the documentation correctly says that it will > return NULL for you. > > Normal use of D-Bus on the system or session bus is in a "star" topology, > where the message bus (dbus-daemon or dbus-broker) is the middle of the > star, and all clients and services are at the points of the star: > > app 2 } > | } (AF_UNIX socket clients) > app 1 | app 3 } > \ | / > \ | / > message bus (AF_UNIX socket server) > / | \ > / | \ > service A | service C } > | } (also AF_UNIX socket clients) > service B } > > We often talk about services as though they were something special, > but there is not really any fundamental difference between services and > other applications: they're all clients of the message bus. The role of > the message bus is often called a "broker" in other IPC protocols. > > Depending who you ask, a service is either a D-Bus peer that owns a > well-known name like "com.microsoft.mscrypt", or a D-Bus peer that was > started automatically by the message bus to provide the implementation of > a well-known name, or a D-Bus peer that provides methods to be called by > other peers. In practice, most peers that are referred to as "services" > do all of these things. > > > I also tried getting the PID by calling programmatically the following > command: > > > > dbus-send --system --print-reply --dest=org.freedesktop.DBus > /org/freedesktop/ > > DBus org.freedesktop.DBus.GetConnectionUnixProcessID > > ‘string:com.microsoft.mscrypt’ > > > > But I always receive the server's PID, and not the client's. > > No, you receive the process ID of the service that owns the name > "com.microsoft.mscrypt". Don't confuse the service (a high-level concept) > with the AF_UNIX server (a lower-level concept). > > If you are using GDBus, you should call D-Bus methods with something like > g_dbus_connection_call() or g_dbus_connection_call_sync(), > g_dbus_proxy_call() or client code generated by gdbus-codegen, instead of > running dbus-send as a subprocess (which does the same thing, but less > efficiently). > > smcv >