]> git.ipfire.org Git - thirdparty/systemd.git/commit - src/login/logind-session.h
logind: add session controllers
authorDavid Herrmann <dh.herrmann@gmail.com>
Tue, 17 Sep 2013 15:39:56 +0000 (17:39 +0200)
committerLennart Poettering <lennart@poettering.net>
Tue, 17 Sep 2013 16:33:18 +0000 (11:33 -0500)
commitae5e06bda24ebbb2ac00741738ad3a872fc577a5
treef4b553d42e7d6197e56bec2704cf28ec222fac26
parente8b212fe56f7f4e1778474777a7a2959244d0047
logind: add session controllers

A session usually has only a single compositor or other application that
controls graphics and input devices on it. To avoid multiple applications
from hijacking each other's devices or even using the devices in parallel,
we add session controllers.

A session controller is an application that manages a session. Specific
API calls may be limited to controllers to avoid others from getting
unprivileged access to restricted resources. A session becomes a
controller by calling the RequestControl() dbus API call. It can drop it
via ReleaseControl().

logind tracks bus-names to release the controller once an application
closes the bus. We use the new bus-name tracking to do that. Note that
during ReleaseControl() we need to check whether some other session also
tracks the name before we remove it from the bus-name tracking list.

Currently, we only allow one controller at a time. However, the public API
does not enforce this restriction. So if it makes sense, we can allow
multiple controllers in parallel later. Or we can add a "scope" parameter,
which allows a different controller for graphics-devices, sound-devices
and whatever you want.
Note that currently you get -EBUSY if there is already a controller. You
can force the RequestControl() call (root-only) to drop the current
controller and recover the session during an emergency. To recover a seat,
this is not needed, though. You can simply create a new session or
force-activate it.

To become a session controller, a dbus caller must either be root or the
same user as the user of the session. This allows us to run a session
compositor as user and we no longer need any CAP_SYS_ADMIN.
src/login/logind-dbus.c
src/login/logind-session-dbus.c
src/login/logind-session.c
src/login/logind-session.h
src/login/logind.c