From b0549ed41b4e5c82e5a51b69d74e0a7dada76b4e2e0f94e4f42ce50d67813280 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Lie?= Date: Fri, 8 Jan 2021 09:42:43 +0000 Subject: [PATCH] Accepting request 861462 from GNOME:Next New stable release OBS-URL: https://build.opensuse.org/request/show/861462 OBS-URL: https://build.opensuse.org/package/show/GNOME:Factory/xdg-desktop-portal?expand=0&rev=36 --- ...er-free-in-xdg_get_app_info_from_pid.patch | 25 - ...rmorLabel-key-to-D-Bus-service-files.patch | 32 - ...-no-default-handler-for-desired-type.patch | 35 -- xdg-desktop-portal-1.6.0.tar.xz | 3 - xdg-desktop-portal-1.8.0.tar.xz | 3 + xdg-desktop-portal.changes | 39 ++ xdg-desktop-portal.spec | 10 +- xdg-dp-port-pipewire-3-api.patch | 552 ------------------ 8 files changed, 45 insertions(+), 654 deletions(-) delete mode 100644 0001-Fix-use-after-free-in-xdg_get_app_info_from_pid.patch delete mode 100644 0002-add-AssumedAppArmorLabel-key-to-D-Bus-service-files.patch delete mode 100644 0003-Fix-criticals-if-no-default-handler-for-desired-type.patch delete mode 100644 xdg-desktop-portal-1.6.0.tar.xz create mode 100644 xdg-desktop-portal-1.8.0.tar.xz delete mode 100644 xdg-dp-port-pipewire-3-api.patch diff --git a/0001-Fix-use-after-free-in-xdg_get_app_info_from_pid.patch b/0001-Fix-use-after-free-in-xdg_get_app_info_from_pid.patch deleted file mode 100644 index e9092a3..0000000 --- a/0001-Fix-use-after-free-in-xdg_get_app_info_from_pid.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 8fbab8933fc4e0e87dbb263c9414dc349fc3cdb8 Mon Sep 17 00:00:00 2001 -From: Alexander Larsson -Date: Thu, 12 Mar 2020 15:01:26 +0100 -Subject: [PATCH] utils: Fix use-after-free in xdp_get_app_info_from_pid() - -This was freeing the value before returning it. - -This was noticed by jhenstridge in https://github.com/flatpak/xdg-desktop-portal/pull/443 ---- - src/xdp-utils.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/xdp-utils.c b/src/xdp-utils.c -index 2f5be5c..4f72df1 100644 ---- a/src/xdp-utils.c -+++ b/src/xdp-utils.c -@@ -618,7 +618,7 @@ xdp_get_app_info_from_pid (pid_t pid, - if (app_info == NULL) - app_info = xdp_app_info_new_host (); - -- return app_info; -+ return g_steal_pointer (&app_info); - } - - static XdpAppInfo * diff --git a/0002-add-AssumedAppArmorLabel-key-to-D-Bus-service-files.patch b/0002-add-AssumedAppArmorLabel-key-to-D-Bus-service-files.patch deleted file mode 100644 index 2847435..0000000 --- a/0002-add-AssumedAppArmorLabel-key-to-D-Bus-service-files.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 2a3118ce4a9dc144237ebbfc0147fc535cd23c32 Mon Sep 17 00:00:00 2001 -From: James Henstridge -Date: Mon, 2 Mar 2020 16:40:22 +0100 -Subject: [PATCH] src, document-portal: add AssumedAppArmorLabel key to D-Bus - service files - -This allows sandboxed processes to activate the portal services if the -sandbox makes use of AppArmor D-Bus mediation rules that depend on the -service's security label. ---- - document-portal/org.freedesktop.portal.Documents.service.in | 1 + - src/org.freedesktop.portal.Desktop.service.in | 1 + - 2 files changed, 2 insertions(+) - -diff --git a/document-portal/org.freedesktop.portal.Documents.service.in b/document-portal/org.freedesktop.portal.Documents.service.in -index cf0c1ef..4d0881b 100644 ---- a/document-portal/org.freedesktop.portal.Documents.service.in -+++ b/document-portal/org.freedesktop.portal.Documents.service.in -@@ -2,3 +2,4 @@ - Name=org.freedesktop.portal.Documents - Exec=@libexecdir@/xdg-document-portal - SystemdService=xdg-document-portal.service -+AssumedAppArmorLabel=unconfined -diff --git a/src/org.freedesktop.portal.Desktop.service.in b/src/org.freedesktop.portal.Desktop.service.in -index e017386..2b31f32 100644 ---- a/src/org.freedesktop.portal.Desktop.service.in -+++ b/src/org.freedesktop.portal.Desktop.service.in -@@ -2,3 +2,4 @@ - Name=org.freedesktop.portal.Desktop - Exec=@libexecdir@/xdg-desktop-portal - SystemdService=xdg-desktop-portal.service -+AssumedAppArmorLabel=unconfined diff --git a/0003-Fix-criticals-if-no-default-handler-for-desired-type.patch b/0003-Fix-criticals-if-no-default-handler-for-desired-type.patch deleted file mode 100644 index c978365..0000000 --- a/0003-Fix-criticals-if-no-default-handler-for-desired-type.patch +++ /dev/null @@ -1,35 +0,0 @@ -From f8a261b0a56d7eacab79a9086611ba4208fe3842 Mon Sep 17 00:00:00 2001 -From: Simon McVittie -Date: Sun, 22 Dec 2019 15:54:33 +0000 -Subject: [PATCH] open-uri: Fix criticals if no default handler for desired - type - -Signed-off-by: Simon McVittie ---- - src/open-uri.c | 12 ++++++++++-- - 1 file changed, 10 insertions(+), 2 deletions(-) - -diff --git a/src/open-uri.c b/src/open-uri.c -index c876ab6..f032894 100644 ---- a/src/open-uri.c -+++ b/src/open-uri.c -@@ -473,9 +473,17 @@ find_recommended_choices (const char *scheme, - int i; - - info = g_app_info_get_default_for_type (content_type, FALSE); -- *default_app = get_app_id (info); - -- g_debug ("Default handler %s for %s, %s", *default_app, scheme, content_type); -+ if (info != NULL) -+ { -+ *default_app = get_app_id (info); -+ g_debug ("Default handler %s for %s, %s", *default_app, scheme, content_type); -+ } -+ else -+ { -+ *default_app = NULL; -+ g_debug ("No default handler for %s, %s", scheme, content_type); -+ } - - infos = g_app_info_get_recommended_for_type (content_type); - /* Use fallbacks if we have no recommended application for this type */ diff --git a/xdg-desktop-portal-1.6.0.tar.xz b/xdg-desktop-portal-1.6.0.tar.xz deleted file mode 100644 index 371e083..0000000 --- a/xdg-desktop-portal-1.6.0.tar.xz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:883c9c9a925e48af54812b5347f546dd776ec2e27076a83d5a8126af6bafb9da -size 453516 diff --git a/xdg-desktop-portal-1.8.0.tar.xz b/xdg-desktop-portal-1.8.0.tar.xz new file mode 100644 index 0000000..ae65e28 --- /dev/null +++ b/xdg-desktop-portal-1.8.0.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a2fc5681b3a35078239072a98d6435a4c8404016730cab17c9febfd4ecec3610 +size 470692 diff --git a/xdg-desktop-portal.changes b/xdg-desktop-portal.changes index 7cdde82..1b31abc 100644 --- a/xdg-desktop-portal.changes +++ b/xdg-desktop-portal.changes @@ -1,3 +1,42 @@ +------------------------------------------------------------------- +Thu Jan 7 20:11:15 UTC 2021 - Bjørn Lie + +- Update to version 1.8.0: + + openuri: + - Allow skipping the chooser for more URL tyles + - Robustness fixes + + filechooser: Return the current filter + + camera: + - Make the client node visible + - Don't leak pipewire proxy + + Fix file descriptor leaks + + Testsuite improvements + + Updated translations. +- Changes from version 1.7.2: + + document: + - Reduce the use of open fds + - Add more tests and fix issues they found + + Fix the build with musl. +- Changes from version 1.7.1: + + filechooser: + - Add a "directory" option + - Document the "writable" option + + document: Expose directories with their proper name +- Changes from version 1.7.0: + + testsuite improvements + + background: Avoid a segfault + + screencast: Require pipewire 0.3 + + document: + - Support exporting directories + - New fuse implementation + + Better support for snap and toolbox + + Updated translations. +- Drop patches fixed upstream: + + xdg-dp-port-pipewire-3-api.patch + + 0001-Fix-use-after-free-in-xdg_get_app_info_from_pid.patch + + 0002-add-AssumedAppArmorLabel-key-to-D-Bus-service-files.patch + + 0003-Fix-criticals-if-no-default-handler-for-desired-type.patch + ------------------------------------------------------------------- Fri Aug 28 16:27:32 UTC 2020 - Dario Faggioli diff --git a/xdg-desktop-portal.spec b/xdg-desktop-portal.spec index cb20af8..0b9dbf0 100644 --- a/xdg-desktop-portal.spec +++ b/xdg-desktop-portal.spec @@ -1,7 +1,7 @@ # # spec file for package xdg-desktop-portal # -# Copyright (c) 2020 SUSE LLC +# Copyright (c) 2021 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -17,18 +17,14 @@ Name: xdg-desktop-portal -Version: 1.6.0 +Version: 1.8.0 Release: 0 Summary: A portal frontend service for Flatpak License: LGPL-2.1-or-later Group: System/Libraries URL: https://github.com/flatpak/xdg-desktop-portal Source0: %{url}/releases/download/%{version}/%{name}-%{version}.tar.xz -# PATCH-FEATURE-UPSTREAM xdg-dp-port-pipewire-3-api.patch -- Port to use new pipewire-3.0 api -Patch0: xdg-dp-port-pipewire-3-api.patch -Patch1: 0001-Fix-use-after-free-in-xdg_get_app_info_from_pid.patch -Patch2: 0002-add-AssumedAppArmorLabel-key-to-D-Bus-service-files.patch -Patch3: 0003-Fix-criticals-if-no-default-handler-for-desired-type.patch + BuildRequires: libtool BuildRequires: pkgconfig BuildRequires: xmlto diff --git a/xdg-dp-port-pipewire-3-api.patch b/xdg-dp-port-pipewire-3-api.patch deleted file mode 100644 index dec3706..0000000 --- a/xdg-dp-port-pipewire-3-api.patch +++ /dev/null @@ -1,552 +0,0 @@ -From a38901e5e7f835efe7b7a06c55790c8c20bc91a2 Mon Sep 17 00:00:00 2001 -From: Wim Taymans -Date: Tue, 14 Jan 2020 09:37:09 +0100 -Subject: [PATCH] PipeWire: update to 0.3 API - ---- - configure.ac | 2 +- - src/camera.c | 24 ++++---- - src/pipewire.c | 141 +++++++++++++--------------------------------- - src/pipewire.h | 10 ++-- - src/screen-cast.c | 98 ++++++-------------------------- - 5 files changed, 72 insertions(+), 203 deletions(-) - -diff --git a/configure.ac b/configure.ac -index 89902fa..62d7960 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -97,7 +97,7 @@ AC_ARG_ENABLE(pipewire, - [AS_HELP_STRING([--enable-pipewire],[Enable PipeWire support. Needed for screen cast portal])], - enable_pipewire=$enableval, enable_pipewire=yes) - if test x$enable_pipewire = xyes ; then -- PKG_CHECK_MODULES(PIPEWIRE, [libpipewire-0.2 >= 0.2.6]) -+ PKG_CHECK_MODULES(PIPEWIRE, [libpipewire-0.3 >= 0.2.90]) - AC_DEFINE([HAVE_PIPEWIRE],[1], [Define to enable PipeWire support]) - fi - AM_CONDITIONAL([HAVE_PIPEWIRE],[test "$enable_pipewire" = "yes"]) -diff --git a/src/camera.c b/src/camera.c -index c2b392c..20fe3aa 100644 ---- a/src/camera.c -+++ b/src/camera.c -@@ -141,7 +141,7 @@ open_pipewire_camera_remote (const char *app_id, - GError **error) - { - PipeWireRemote *remote; -- struct spa_dict_item permission_items[1]; -+ struct pw_permission permission_items[2]; - struct pw_properties *pipewire_properties; - - pipewire_properties = -@@ -158,12 +158,12 @@ open_pipewire_camera_remote (const char *app_id, - * Hide all existing and future nodes by default. PipeWire will use the - * permission store to set up permissions. - */ -- permission_items[0].key = PW_CORE_PROXY_PERMISSIONS_DEFAULT; -- permission_items[0].value = "---"; -+ permission_items[0] = PW_PERMISSION_INIT (PW_ID_CORE, PW_PERM_RWX); -+ permission_items[1] = PW_PERMISSION_INIT (PW_ID_ANY, 0); - -- pw_core_proxy_permissions (pw_remote_get_core_proxy (remote->remote), -- &SPA_DICT_INIT (permission_items, -- G_N_ELEMENTS (permission_items))); -+ pw_client_update_permissions (pw_core_get_client(remote->core), -+ G_N_ELEMENTS (permission_items), -+ permission_items); - - pipewire_remote_roundtrip (remote); - -@@ -219,7 +219,7 @@ handle_open_pipewire_remote (XdpCamera *object, - } - - out_fd_list = g_unix_fd_list_new (); -- fd = pw_remote_steal_fd (remote->remote); -+ fd = pw_core_steal_fd (remote->core); - fd_id = g_unix_fd_list_append (out_fd_list, fd, &error); - close (fd); - pipewire_remote_destroy (remote); -@@ -250,29 +250,28 @@ camera_iface_init (XdpCameraIface *iface) - static void - global_added_cb (PipeWireRemote *remote, - uint32_t id, -- uint32_t type, -+ const char *type, - const struct spa_dict *props, - gpointer user_data) - { - Camera *camera = user_data; -- struct pw_type *core_type = pw_core_get_type (remote->core); - const struct spa_dict_item *media_class; - const struct spa_dict_item *media_role; - -- if (type != core_type->node) -+ if (strcmp(type, PW_TYPE_INTERFACE_Node) != 0) - return; - - if (!props) - return; - -- media_class = spa_dict_lookup_item (props, "media.class"); -+ media_class = spa_dict_lookup_item (props, PW_KEY_MEDIA_CLASS); - if (!media_class) - return; - - if (g_strcmp0 (media_class->value, "Video/Source") != 0) - return; - -- media_role = spa_dict_lookup_item (props, "media.role"); -+ media_role = spa_dict_lookup_item (props, PW_KEY_MEDIA_ROLE); - if (!media_role) - return; - -@@ -342,6 +341,7 @@ create_pipewire_remote (Camera *camera, - } - - pipewire_properties = pw_properties_new ("pipewire.access.portal.is_portal", "true", -+ "portal.monitor", "Camera", - NULL); - camera->pipewire_remote = pipewire_remote_new_sync (pipewire_properties, - global_added_cb, -diff --git a/src/pipewire.c b/src/pipewire.c -index 793a378..162cd55 100644 ---- a/src/pipewire.c -+++ b/src/pipewire.c -@@ -21,6 +21,7 @@ - #include - #include - #include -+#include - - #include "pipewire.h" - -@@ -36,27 +37,25 @@ static gboolean is_pipewire_initialized = FALSE; - static void - registry_event_global (void *user_data, - uint32_t id, -- uint32_t parent_id, - uint32_t permissions, -- uint32_t type, -+ const char *type, - uint32_t version, - const struct spa_dict *props) - { - PipeWireRemote *remote = user_data; -- struct pw_type *core_type = pw_core_get_type (remote->core); - const struct spa_dict_item *factory_object_type; - PipeWireGlobal *global; - - global = g_new0 (PipeWireGlobal, 1); - *global = (PipeWireGlobal) { -- .parent_id = parent_id, -+ .parent_id = id, - }; - - g_hash_table_insert (remote->globals, GINT_TO_POINTER (id), global); - if (remote->global_added_cb) - remote->global_added_cb (remote, id, type, props, remote->user_data); - -- if (type != core_type->factory) -+ if (strcmp(type, PW_TYPE_INTERFACE_Factory) != 0) - return; - - factory_object_type = spa_dict_lookup_item (props, "factory.type.name"); -@@ -81,8 +80,8 @@ registry_event_global_remove (void *user_data, - g_hash_table_remove (remote->globals, GINT_TO_POINTER (id)); - } - --static const struct pw_registry_proxy_events registry_events = { -- PW_VERSION_REGISTRY_PROXY_EVENTS, -+static const struct pw_registry_events registry_events = { -+ PW_VERSION_REGISTRY_EVENTS, - .global = registry_event_global, - .global_remove = registry_event_global_remove, - }; -@@ -90,7 +89,7 @@ static const struct pw_registry_proxy_events registry_events = { - void - pipewire_remote_roundtrip (PipeWireRemote *remote) - { -- pw_core_proxy_sync (remote->core_proxy, ++remote->sync_seq); -+ remote->sync_seq = pw_core_sync (remote->core, PW_ID_CORE, remote->sync_seq); - pw_main_loop_run (remote->loop); - } - -@@ -98,16 +97,13 @@ static gboolean - discover_node_factory_sync (PipeWireRemote *remote, - GError **error) - { -- struct pw_type *core_type = pw_core_get_type (remote->core); -- struct pw_registry_proxy *registry_proxy; -+ struct pw_registry *registry; - -- registry_proxy = pw_core_proxy_get_registry (remote->core_proxy, -- core_type->registry, -- PW_VERSION_REGISTRY, 0); -- pw_registry_proxy_add_listener (registry_proxy, -- &remote->registry_listener, -- ®istry_events, -- remote); -+ registry = pw_core_get_registry (remote->core, PW_VERSION_REGISTRY, 0); -+ pw_registry_add_listener (registry, -+ &remote->registry_listener, -+ ®istry_events, -+ remote); - - pipewire_remote_roundtrip (remote); - -@@ -122,59 +118,35 @@ discover_node_factory_sync (PipeWireRemote *remote, - } - - static void --on_state_changed (void *user_data, -- enum pw_remote_state old, -- enum pw_remote_state state, -- const char *error) -+core_event_error (void *user_data, -+ uint32_t id, -+ int seq, -+ int res, -+ const char *message) - { - PipeWireRemote *remote = user_data; - -- switch (state) -+ if (id == PW_ID_CORE) - { -- case PW_REMOTE_STATE_ERROR: -- if (!remote->error) -- { -- g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED, -- "%s", error); -- } -+ g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED, -+ "%s", message); - pw_main_loop_quit (remote->loop); -- break; -- case PW_REMOTE_STATE_UNCONNECTED: -- if (!remote->error) -- { -- g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED, -- "Disconnected"); -- } -- pw_main_loop_quit (remote->loop); -- break; -- case PW_REMOTE_STATE_CONNECTING: -- break; -- case PW_REMOTE_STATE_CONNECTED: -- pw_main_loop_quit (remote->loop); -- break; -- default: -- g_warning ("Unknown PipeWire state"); -- break; - } - } - --static const struct pw_remote_events remote_events = { -- PW_VERSION_REMOTE_EVENTS, -- .state_changed = on_state_changed, --}; -- - static void - core_event_done (void *user_data, -- uint32_t seq) -+ uint32_t id, int seq) - { - PipeWireRemote *remote = user_data; - -- if (remote->sync_seq == seq) -+ if (id == PW_ID_CORE && remote->sync_seq == seq) - pw_main_loop_quit (remote->loop); - } - --static const struct pw_core_proxy_events core_events = { -- PW_VERSION_CORE_PROXY_EVENTS, -+static const struct pw_core_events core_events = { -+ PW_VERSION_CORE_EVENTS, -+ .error = core_event_error, - .done = core_event_done, - }; - -@@ -237,8 +209,8 @@ void - pipewire_remote_destroy (PipeWireRemote *remote) - { - g_clear_pointer (&remote->globals, g_hash_table_destroy); -- g_clear_pointer (&remote->remote, pw_remote_destroy); -- g_clear_pointer (&remote->core, pw_core_destroy); -+ g_clear_pointer (&remote->core, pw_core_disconnect); -+ g_clear_pointer (&remote->context, pw_context_destroy); - g_clear_pointer (&remote->loop, pw_main_loop_destroy); - g_clear_error (&remote->error); - -@@ -307,68 +279,31 @@ pipewire_remote_new_sync (struct pw_properties *pipewire_properties, - return NULL; - } - -- remote->core = pw_core_new (pw_main_loop_get_loop (remote->loop), NULL); -- if (!remote->core) -+ remote->context = pw_context_new (pw_main_loop_get_loop (remote->loop), NULL, 0); -+ if (!remote->context) - { - pipewire_remote_destroy (remote); - pw_properties_free (pipewire_properties); - g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, -- "Couldn't create PipeWire core"); -+ "Couldn't create PipeWire context"); - return NULL; - } - -- remote->remote = pw_remote_new (remote->core, pipewire_properties, 0); -- if (!remote->remote) -+ remote->core = pw_context_connect (remote->context, pipewire_properties, 0); -+ if (!remote->core) - { - pipewire_remote_destroy (remote); - g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, -- "Couldn't create PipeWire remote"); -+ "Couldn't connect to PipeWire"); - return NULL; - } - - remote->globals = g_hash_table_new_full (NULL, NULL, NULL, g_free); - -- pw_remote_add_listener (remote->remote, -- &remote->remote_listener, -- &remote_events, -- remote); -- -- if (pw_remote_connect (remote->remote) != 0) -- { -- pipewire_remote_destroy (remote); -- g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, -- "Couldn't connect PipeWire remote"); -- return NULL; -- } -- -- pw_main_loop_run (remote->loop); -- -- switch (pw_remote_get_state (remote->remote, NULL)) -- { -- case PW_REMOTE_STATE_ERROR: -- case PW_REMOTE_STATE_UNCONNECTED: -- *error = g_steal_pointer (&remote->error); -- pipewire_remote_destroy (remote); -- return NULL; -- case PW_REMOTE_STATE_CONNECTING: -- g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, -- "PipeWire loop stopped unexpectedly"); -- pipewire_remote_destroy (remote); -- return NULL; -- case PW_REMOTE_STATE_CONNECTED: -- break; -- default: -- g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, -- "Unexpected PipeWire state"); -- pipewire_remote_destroy (remote); -- return NULL; -- } -- -- remote->core_proxy = pw_remote_get_core_proxy (remote->remote); -- pw_core_proxy_add_listener (remote->core_proxy, -- &remote->core_listener, -- &core_events, -- remote); -+ pw_core_add_listener (remote->core, -+ &remote->core_listener, -+ &core_events, -+ remote); - - if (!discover_node_factory_sync (remote, error)) - { -diff --git a/src/pipewire.h b/src/pipewire.h -index 0f1bf54..bf48d5e 100644 ---- a/src/pipewire.h -+++ b/src/pipewire.h -@@ -32,7 +32,7 @@ typedef struct _PipeWireGlobal - - typedef void (* PipeWireGlobalAddedCallback) (PipeWireRemote *remote, - uint32_t id, -- uint32_t type, -+ const char *type, - const struct spa_dict *props, - gpointer user_data); - -@@ -43,13 +43,11 @@ typedef void (* PipeWireGlobalRemovedCallback) (PipeWireRemote *remote, - struct _PipeWireRemote - { - struct pw_main_loop *loop; -+ struct pw_context *context; - struct pw_core *core; -- struct pw_remote *remote; -- struct spa_hook remote_listener; -- -- struct pw_core_proxy *core_proxy; - struct spa_hook core_listener; -- uint32_t sync_seq; -+ -+ int sync_seq; - - struct spa_hook registry_listener; - -diff --git a/src/screen-cast.c b/src/screen-cast.c -index 7881ddc..1677050 100644 ---- a/src/screen-cast.c -+++ b/src/screen-cast.c -@@ -31,10 +31,10 @@ - #include "xdp-impl-dbus.h" - #include "xdp-utils.h" - --#define PERMISSION_ITEM(item_key, item_value) \ -- ((struct spa_dict_item) { \ -- .key = item_key, \ -- .value = item_value \ -+#define PERMISSION_ITEM(item_id, item_permissions) \ -+ ((struct pw_permission) { \ -+ .id = item_id, \ -+ .permissions = item_permissions \ - }) - - typedef struct _ScreenCast ScreenCast; -@@ -517,42 +517,9 @@ screen_cast_stream_get_pipewire_node_id (ScreenCastStream *stream) - return stream->id; - } - --static void --append_parent_permissions (PipeWireRemote *remote, -- GArray *permission_items, -- GList **string_stash, -- PipeWireGlobal *global, -- const char *permission) --{ -- PipeWireGlobal *parent; -- char *parent_permission_value; -- -- if (global->parent_id == 0) -- return; -- -- parent = g_hash_table_lookup (remote->globals, GINT_TO_POINTER (global->parent_id)); -- -- if (parent->permission_set) -- return; -- parent->permission_set = TRUE; -- -- append_parent_permissions (remote, permission_items, string_stash, -- parent, permission); -- -- parent_permission_value = g_strdup_printf ("%u:%s", -- global->parent_id, -- permission); -- *string_stash = g_list_prepend (*string_stash, parent_permission_value); -- -- g_array_append_val (permission_items, -- PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL, -- parent_permission_value)); --} -- - static void - append_stream_permissions (PipeWireRemote *remote, - GArray *permission_items, -- GList **string_stash, - GList *streams) - { - GList *l; -@@ -561,21 +528,10 @@ append_stream_permissions (PipeWireRemote *remote, - { - ScreenCastStream *stream = l->data; - uint32_t stream_id; -- PipeWireGlobal *stream_global; -- char *stream_permission_value; - - stream_id = screen_cast_stream_get_pipewire_node_id (stream); -- stream_global = g_hash_table_lookup (remote->globals, -- GINT_TO_POINTER (stream_id)); -- -- append_parent_permissions (remote, permission_items, string_stash, -- stream_global, "r--"); -- -- stream_permission_value = g_strdup_printf ("%u:rwx", stream_id); -- *string_stash = g_list_prepend (*string_stash, stream_permission_value); - g_array_append_val (permission_items, -- PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL, -- stream_permission_value)); -+ PERMISSION_ITEM (stream_id, PW_PERM_RWX)); - } - } - -@@ -587,9 +543,6 @@ open_pipewire_screen_cast_remote (const char *app_id, - struct pw_properties *pipewire_properties; - PipeWireRemote *remote; - g_autoptr(GArray) permission_items = NULL; -- char *node_factory_permission_string; -- GList *string_stash = NULL; -- struct spa_dict *permission_dict; - PipeWireGlobal *node_global; - - pipewire_properties = pw_properties_new ("pipewire.access.portal.app_id", app_id, -@@ -603,48 +556,31 @@ open_pipewire_screen_cast_remote (const char *app_id, - - permission_items = g_array_new (FALSE, TRUE, sizeof (struct spa_dict_item)); - -- /* -- * Hide all existing and future nodes (except the ones we explicitly list below. -- */ -- g_array_append_val (permission_items, -- PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_EXISTING, -- "---")); -- g_array_append_val (permission_items, -- PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_DEFAULT, -- "---")); -- - /* - * PipeWire:Interface:Core - * Needs rwx to be able create the sink node using the create-object method - */ - g_array_append_val (permission_items, -- PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL, -- "0:rwx")); -+ PERMISSION_ITEM (PW_ID_CORE, PW_PERM_RWX)); - - /* - * PipeWire:Interface:NodeFactory - * Needs r-- so it can be passed to create-object when creating the sink node. - */ -- node_factory_permission_string = g_strdup_printf ("%d:r--", -- remote->node_factory_id); -- string_stash = g_list_prepend (string_stash, node_factory_permission_string); - g_array_append_val (permission_items, -- PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL, -- node_factory_permission_string)); -- node_global = g_hash_table_lookup (remote->globals, -- GINT_TO_POINTER (remote->node_factory_id)); -- append_parent_permissions (remote, permission_items, &string_stash, -- node_global, "r--"); -+ PERMISSION_ITEM (remote->node_factory_id, PW_PERM_R)); - -- append_stream_permissions (remote, permission_items, &string_stash, streams); -+ append_stream_permissions (remote, permission_items, streams); - -- permission_dict = -- &SPA_DICT_INIT ((struct spa_dict_item *) permission_items->data, -- permission_items->len); -- pw_core_proxy_permissions (pw_remote_get_core_proxy (remote->remote), -- permission_dict); -+ /* -+ * Hide all existing and future nodes (except the ones we explicitly list above). -+ */ -+ g_array_append_val (permission_items, -+ PERMISSION_ITEM (PW_ID_ANY, 0)); - -- g_list_free_full (string_stash, g_free); -+ pw_client_update_permissions (pw_core_get_client(remote->core), -+ permission_items->len, -+ (const struct pw_permission *)permission_items->data); - - pipewire_remote_roundtrip (remote); - -@@ -943,7 +879,7 @@ handle_open_pipewire_remote (XdpScreenCast *object, - } - - out_fd_list = g_unix_fd_list_new (); -- fd = pw_remote_steal_fd (remote->remote); -+ fd = pw_core_steal_fd (remote->core); - fd_id = g_unix_fd_list_append (out_fd_list, fd, &error); - close (fd); - pipewire_remote_destroy (remote); -