From: Lennart Poettering Date: Thu, 11 Jan 2024 16:14:48 +0000 (+0100) Subject: logind: allow taking control of devices only in some session types X-Git-Tag: v256-rc1~1186^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=87dc8bbd86305b5d8e17275f91d4d3f056249aa2;p=thirdparty%2Fsystemd.git logind: allow taking control of devices only in some session types Let's restrict the logic a bit, so that "manage" session types are not misused. --- diff --git a/src/login/logind-session-dbus.c b/src/login/logind-session-dbus.c index d4e656ae85d..03a043fe7d8 100644 --- a/src/login/logind-session-dbus.c +++ b/src/login/logind-session-dbus.c @@ -476,6 +476,9 @@ static int method_take_device(sd_bus_message *message, void *userdata, sd_bus_er if (!DEVICE_MAJOR_VALID(major) || !DEVICE_MINOR_VALID(minor)) return sd_bus_error_set(error, SD_BUS_ERROR_INVALID_ARGS, "Device major/minor is not valid."); + if (!SESSION_CLASS_CAN_TAKE_DEVICE(s->class)) + return sd_bus_error_set(error, SD_BUS_ERROR_NOT_SUPPORTED, "Session class doesn't support taking device control."); + if (!session_is_controller(s, sd_bus_message_get_sender(message))) return sd_bus_error_set(error, BUS_ERROR_NOT_IN_CONTROL, "You are not in control of this session"); diff --git a/src/login/logind-session.h b/src/login/logind-session.h index a7d90e997e5..5f3961cf61a 100644 --- a/src/login/logind-session.h +++ b/src/login/logind-session.h @@ -57,6 +57,9 @@ typedef enum SessionClass { /* Which sessions classes should be subject to stop-in-idle */ #define SESSION_CLASS_CAN_STOP_ON_IDLE(class) (IN_SET((class), SESSION_USER, SESSION_USER_EARLY)) +/* Which session classes can take control of devices */ +#define SESSION_CLASS_CAN_TAKE_DEVICE(class) (IN_SET((class), SESSION_USER, SESSION_USER_EARLY, SESSION_GREETER, SESSION_LOCK_SCREEN)) + typedef enum SessionType { SESSION_UNSPECIFIED, SESSION_TTY,