From 2eda81aadfae572972ac22b31a5921e1c34e232f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Mon, 28 Aug 2023 17:21:35 +0200 Subject: [PATCH] remote-desktop/session: Limit device type access when using libei The portal could limit access to certain device types, but this was not forwarded to the EIS context. Add a way to do this, and make use of it. Part-of: --- .../org.gnome.Mutter.RemoteDesktop.xml | 4 +++ src/backends/meta-eis-client.c | 18 +++++++--- src/backends/meta-eis.c | 12 ++++++- src/backends/meta-eis.h | 14 ++++++-- src/backends/meta-remote-desktop-session.c | 36 ++++++++++++++++++- src/backends/meta-remote-desktop.c | 8 ----- src/backends/meta-remote-desktop.h | 8 +++++ 7 files changed, 83 insertions(+), 17 deletions(-) diff --git a/data/dbus-interfaces/org.gnome.Mutter.RemoteDesktop.xml b/data/dbus-interfaces/org.gnome.Mutter.RemoteDesktop.xml index 64f8f82d9..c309beb0c 100644 --- a/data/dbus-interfaces/org.gnome.Mutter.RemoteDesktop.xml +++ b/data/dbus-interfaces/org.gnome.Mutter.RemoteDesktop.xml @@ -352,6 +352,10 @@ ConnectToEIS: Request a connection to an EIS implementation. + + Available @options include: + + * "device-types" u: Bitmask of device types to expose (see SupportedDeviceTypes) --> diff --git a/src/backends/meta-eis-client.c b/src/backends/meta-eis-client.c index 90b24201c..56fe613d3 100644 --- a/src/backends/meta-eis-client.c +++ b/src/backends/meta-eis-client.c @@ -696,11 +696,19 @@ meta_eis_client_new (MetaEis *eis, * of the seat in the process. */ eis_seat = eis_client_new_seat (eis_client, "mutter default seat"); - eis_seat_configure_capability (eis_seat, EIS_DEVICE_CAP_KEYBOARD); - eis_seat_configure_capability (eis_seat, EIS_DEVICE_CAP_POINTER); - eis_seat_configure_capability (eis_seat, EIS_DEVICE_CAP_POINTER_ABSOLUTE); - eis_seat_configure_capability (eis_seat, EIS_DEVICE_CAP_BUTTON); - eis_seat_configure_capability (eis_seat, EIS_DEVICE_CAP_SCROLL); + + if (meta_eis_get_device_types (eis) & META_EIS_DEVICE_TYPE_KEYBOARD) + { + eis_seat_configure_capability (eis_seat, EIS_DEVICE_CAP_KEYBOARD); + } + + if (meta_eis_get_device_types (eis) & META_EIS_DEVICE_TYPE_POINTER) + { + eis_seat_configure_capability (eis_seat, EIS_DEVICE_CAP_POINTER); + eis_seat_configure_capability (eis_seat, EIS_DEVICE_CAP_POINTER_ABSOLUTE); + eis_seat_configure_capability (eis_seat, EIS_DEVICE_CAP_BUTTON); + eis_seat_configure_capability (eis_seat, EIS_DEVICE_CAP_SCROLL); + } eis_seat_add (eis_seat); eis_seat_unref (eis_seat); diff --git a/src/backends/meta-eis.c b/src/backends/meta-eis.c index 45a11a6e1..9086f70b6 100644 --- a/src/backends/meta-eis.c +++ b/src/backends/meta-eis.c @@ -45,6 +45,8 @@ struct _MetaEis struct eis *eis; MetaEventSource *event_source; + MetaEisDeviceTypes device_types; + GHashTable *eis_clients; /* eis_client => MetaEisClient */ }; @@ -238,13 +240,15 @@ meta_eis_add_client_get_fd (MetaEis *eis) } MetaEis * -meta_eis_new (MetaBackend *backend) +meta_eis_new (MetaBackend *backend, + MetaEisDeviceTypes device_types) { MetaEis *eis; int fd; eis = g_object_new (META_TYPE_EIS, NULL); eis->backend = backend; + eis->device_types = device_types; eis->eis = eis_new (eis); eis_log_set_handler (eis->eis, eis_logger); @@ -284,3 +288,9 @@ meta_eis_class_init (MetaEisClass *klass) object_class->finalize = meta_eis_finalize; } + +MetaEisDeviceTypes +meta_eis_get_device_types (MetaEis *eis) +{ + return eis->device_types; +} diff --git a/src/backends/meta-eis.h b/src/backends/meta-eis.h index 5b2f1c4fc..d1b54f35a 100644 --- a/src/backends/meta-eis.h +++ b/src/backends/meta-eis.h @@ -23,12 +23,22 @@ #include #include "backends/meta-backend-types.h" -#include "backends/meta-viewport-info.h" + +typedef enum _MetaEisDeviceTypes +{ + META_EIS_DEVICE_TYPE_NONE = 0, + META_EIS_DEVICE_TYPE_KEYBOARD = 1 << 0, + META_EIS_DEVICE_TYPE_POINTER = 1 << 1, + META_EIS_DEVICE_TYPE_TOUCHSCREEN = 1 << 2, +} MetaEisDeviceTypes; #define META_TYPE_EIS (meta_eis_get_type ()) G_DECLARE_FINAL_TYPE (MetaEis, meta_eis, META, EIS, GObject) -MetaEis * meta_eis_new (MetaBackend *backend); +MetaEis * meta_eis_new (MetaBackend *backend, + MetaEisDeviceTypes device_types); MetaBackend * meta_eis_get_backend (MetaEis *eis); int meta_eis_add_client_get_fd (MetaEis *eis); + +MetaEisDeviceTypes meta_eis_get_device_types (MetaEis *eis); diff --git a/src/backends/meta-remote-desktop-session.c b/src/backends/meta-remote-desktop-session.c index 90b4f6cd4..7cd374fea 100644 --- a/src/backends/meta-remote-desktop-session.c +++ b/src/backends/meta-remote-desktop-session.c @@ -1626,6 +1626,21 @@ handle_selection_read (MetaDBusRemoteDesktopSession *skeleton, return TRUE; } +static MetaEisDeviceTypes +device_types_to_eis_device_types (MetaRemoteDesktopDeviceTypes device_types) +{ + MetaEisDeviceTypes eis_device_types = META_EIS_DEVICE_TYPE_NONE; + + if (device_types & META_REMOTE_DESKTOP_DEVICE_TYPE_KEYBOARD) + eis_device_types |= META_EIS_DEVICE_TYPE_KEYBOARD; + if (device_types & META_REMOTE_DESKTOP_DEVICE_TYPE_POINTER) + eis_device_types |= META_EIS_DEVICE_TYPE_POINTER; + if (device_types & META_REMOTE_DESKTOP_DEVICE_TYPE_TOUCHSCREEN) + eis_device_types |= META_EIS_DEVICE_TYPE_TOUCHSCREEN; + + return eis_device_types; +} + static gboolean handle_connect_to_eis (MetaDBusRemoteDesktopSession *skeleton, GDBusMethodInvocation *invocation, @@ -1641,7 +1656,26 @@ handle_connect_to_eis (MetaDBusRemoteDesktopSession *skeleton, int fd; if (!session->eis) - session->eis = meta_eis_new (backend); + { + uint32_t device_types_bitmask; + MetaRemoteDesktopDeviceTypes device_types; + MetaEisDeviceTypes eis_device_types; + + if (g_variant_lookup (arg_options, "device-types", "u", + &device_types_bitmask)) + { + device_types = device_types_bitmask; + } + else + { + device_types = (META_REMOTE_DESKTOP_DEVICE_TYPE_KEYBOARD | + META_REMOTE_DESKTOP_DEVICE_TYPE_POINTER | + META_REMOTE_DESKTOP_DEVICE_TYPE_TOUCHSCREEN); + } + + eis_device_types = device_types_to_eis_device_types (device_types); + session->eis = meta_eis_new (backend, eis_device_types); + } fd = meta_eis_add_client_get_fd (session->eis); if (fd < 0) diff --git a/src/backends/meta-remote-desktop.c b/src/backends/meta-remote-desktop.c index 44e51c555..3f6a7dc99 100644 --- a/src/backends/meta-remote-desktop.c +++ b/src/backends/meta-remote-desktop.c @@ -40,14 +40,6 @@ #define META_REMOTE_DESKTOP_DBUS_PATH "/org/gnome/Mutter/RemoteDesktop" #define META_REMOTE_DESKTOP_API_VERSION 1 -typedef enum _MetaRemoteDesktopDeviceTypes -{ - META_REMOTE_DESKTOP_DEVICE_TYPE_NONE = 0, - META_REMOTE_DESKTOP_DEVICE_TYPE_KEYBOARD = 1 << 0, - META_REMOTE_DESKTOP_DEVICE_TYPE_POINTER = 1 << 1, - META_REMOTE_DESKTOP_DEVICE_TYPE_TOUCHSCREEN = 1 << 2, -} MetaRemoteDesktopDeviceTypes; - struct _MetaRemoteDesktop { MetaDbusSessionManager parent; diff --git a/src/backends/meta-remote-desktop.h b/src/backends/meta-remote-desktop.h index 5bb8de15d..9a6e33a41 100644 --- a/src/backends/meta-remote-desktop.h +++ b/src/backends/meta-remote-desktop.h @@ -28,6 +28,14 @@ #include "meta-dbus-remote-desktop.h" +typedef enum _MetaRemoteDesktopDeviceTypes +{ + META_REMOTE_DESKTOP_DEVICE_TYPE_NONE = 0, + META_REMOTE_DESKTOP_DEVICE_TYPE_KEYBOARD = 1 << 0, + META_REMOTE_DESKTOP_DEVICE_TYPE_POINTER = 1 << 1, + META_REMOTE_DESKTOP_DEVICE_TYPE_TOUCHSCREEN = 1 << 2, +} MetaRemoteDesktopDeviceTypes; + typedef struct _MetaRemoteDesktopSession MetaRemoteDesktopSession; #define META_TYPE_REMOTE_DESKTOP (meta_remote_desktop_get_type ())