Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package xdg-desktop-portal for 
openSUSE:Factory checked in at 2023-06-25 21:41:56
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/xdg-desktop-portal (Old)
 and      /work/SRC/openSUSE:Factory/.xdg-desktop-portal.new.15902 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "xdg-desktop-portal"

Sun Jun 25 21:41:56 2023 rev:34 rq:1094962 version:1.16.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/xdg-desktop-portal/xdg-desktop-portal.changes    
2022-12-14 14:11:04.127515014 +0100
+++ 
/work/SRC/openSUSE:Factory/.xdg-desktop-portal.new.15902/xdg-desktop-portal.changes
 2023-06-25 21:41:57.140936925 +0200
@@ -1,0 +2,9 @@
+Fri Jun 23 09:54:14 UTC 2023 - Antonio Larrosa <alarr...@suse.com>
+
+- Add patch from upstream to avoid creating portals with
+  non-functional backends . This was mentioned in bsc#1212037 and
+  since I included this fix in the SP4 update that fixed the issue,
+  I'm fixing this in Factory/SP5 too for consistentcy.
+  * 0001-portal-impl-Only-return-found-implementation-if-it-launched.patch
+
+-------------------------------------------------------------------

New:
----
  0001-portal-impl-Only-return-found-implementation-if-it-launched.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ xdg-desktop-portal.spec ++++++
--- /var/tmp/diff_new_pack.Q67Cd1/_old  2023-06-25 21:42:00.028954273 +0200
+++ /var/tmp/diff_new_pack.Q67Cd1/_new  2023-06-25 21:42:00.032954297 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package xdg-desktop-portal
 #
-# Copyright (c) 2022 SUSE LLC
+# Copyright (c) 2023 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -24,6 +24,8 @@
 Group:          System/Libraries
 URL:            https://github.com/flatpak/xdg-desktop-portal
 Source0:        %{url}/releases/download/%{version}/%{name}-%{version}.tar.xz
+# PATCH-FIX-UPSTREAM
+Patch0:         
0001-portal-impl-Only-return-found-implementation-if-it-launched.patch
 
 BuildRequires:  libtool
 BuildRequires:  pkgconfig

++++++ 0001-portal-impl-Only-return-found-implementation-if-it-launched.patch 
++++++
>From bbcf5110d83147a552ad40841a733b49633e9208 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jad...@gmail.com>
Date: Mon, 13 Mar 2023 12:38:17 +0100
Subject: [PATCH] portal-impl: Only return found implementation if it launched

If no portal backend for a given interface is found, a fallback is
always tried anyway, despite that fallback not being listed as
compatible with the current desktop environment.

Sometimes it's good that a fallback is returned; e.g. the
xdg-desktop-portal-gtk file chooser backend is technically usable
anywhere, however, some backends might be specifically designed to only
work in a specific desktop environment, e.g. xdg-desktop-portal-gnome.

In order to avoid creating portals with non-functional backends, make
sure it's possible to create a proxy object for the interface and D-Bus
name, and that it launched successfully (i.e. has no name owner after
creating the proxy).
---
 src/portal-impl.c        | 67 +++++++++++++++++++++++++++++++++++++---
 src/portal-impl.h        |  5 ++-
 src/xdg-desktop-portal.c | 51 ++++++++++++++++++++----------
 3 files changed, 101 insertions(+), 22 deletions(-)

diff --git a/src/portal-impl.c b/src/portal-impl.c
index a55ba9e55..0b535d1e0 100644
--- a/src/portal-impl.c
+++ b/src/portal-impl.c
@@ -29,9 +29,12 @@
 #include <glib.h>
 #include <gio/gio.h>
 
+#include "xdp-utils.h"
+
 static void
 portal_implementation_free (PortalImplementation *impl)
 {
+  g_clear_pointer (&impl->dummy_proxies, g_hash_table_unref);
   g_free (impl->source);
   g_free (impl->dbus_name);
   g_strfreev (impl->interfaces);
@@ -55,6 +58,10 @@ register_portal (const char *path, gboolean opt_verbose, 
GError **error)
   if (!g_key_file_load_from_file (keyfile, path, G_KEY_FILE_NONE, error))
     return FALSE;
 
+  impl->dummy_proxies = g_hash_table_new_full (g_str_hash,
+                                               g_str_equal,
+                                               g_free,
+                                               g_object_unref);
   impl->source = g_path_get_basename (path);
   impl->dbus_name = g_key_file_get_string (keyfile, "portal", "DBusName", 
error);
   if (impl->dbus_name == NULL)
@@ -198,8 +205,44 @@ load_installed_portals (gboolean opt_verbose)
   implementations = g_list_sort (implementations, 
sort_impl_by_use_in_and_name);
 }
 
+static gboolean
+create_dummy_proxy (PortalImplementation  *impl,
+                    GDBusConnection       *connection,
+                    const char            *interface,
+                    GError               **error)
+{
+  g_autoptr(GDBusProxy) proxy = NULL;
+
+  g_debug ("Creating dummy proxy for %s on %s", interface, impl->dbus_name);
+  proxy = g_dbus_proxy_new_sync (connection,
+                                 G_DBUS_PROXY_FLAGS_NONE,
+                                 NULL,
+                                 impl->dbus_name,
+                                 DESKTOP_PORTAL_OBJECT_PATH,
+                                 interface,
+                                 NULL,
+                                 error);
+  if (!proxy)
+    return FALSE;
+
+  if (!g_dbus_proxy_get_name_owner (proxy))
+    {
+      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+                   "Proxy has no owner");
+      return FALSE;
+    }
+
+  g_debug ("Dummy proxy created");
+
+  g_hash_table_insert (impl->dummy_proxies,
+                       g_strdup (interface),
+                       g_steal_pointer (&proxy));
+  return TRUE;
+}
+
 PortalImplementation *
-find_portal_implementation (const char *interface)
+find_portal_implementation (GDBusConnection *connection,
+                            const char      *interface)
 {
   const char *desktops_str = g_getenv ("XDG_CURRENT_DESKTOP");
   g_auto(GStrv) desktops = NULL;
@@ -216,15 +259,23 @@ find_portal_implementation (const char *interface)
      for (l = implementations; l != NULL; l = l->next)
         {
           PortalImplementation *impl = l->data;
+          g_autoptr(GError) error = NULL;
 
           if (!g_strv_contains ((const char **)impl->interfaces, interface))
             continue;
 
-          if (g_strv_case_contains ((const char **)impl->use_in, desktops[i]))
+          if (!g_strv_case_contains ((const char **)impl->use_in, desktops[i]))
+            continue;
+
+          if (!create_dummy_proxy (impl, connection, interface, &error))
             {
-              g_debug ("Using %s for %s in %s", impl->source, interface, 
desktops[i]);
-              return impl;
+              g_debug ("Failed to create dummy proxy on %s for %s: %s",
+                       impl->dbus_name, interface, error->message);
+              continue;
             }
+
+          g_debug ("Using %s for %s in %s", impl->source, interface, 
desktops[i]);
+          return impl;
         }
     }
 
@@ -232,10 +283,18 @@ find_portal_implementation (const char *interface)
   for (l = implementations; l != NULL; l = l->next)
     {
       PortalImplementation *impl = l->data;
+      g_autoptr(GError) error = NULL;
 
       if (!g_strv_contains ((const char **)impl->interfaces, interface))
         continue;
 
+      if (!create_dummy_proxy (impl, connection, interface, &error))
+        {
+          g_debug ("Failed to create dummy fallback proxy on %s for %s: %s",
+                   impl->dbus_name, interface, error->message);
+          continue;
+        }
+
       g_debug ("Falling back to %s for %s", impl->source, interface);
       return impl;
     }
diff --git a/src/portal-impl.h b/src/portal-impl.h
index a5d792d38..63705a7b3 100644
--- a/src/portal-impl.h
+++ b/src/portal-impl.h
@@ -23,6 +23,7 @@
 #define __PORTAL_IMPL_H__
 
 #include <glib.h>
+#include <gio/gio.h>
 
 typedef struct {
   char *source;
@@ -30,10 +31,12 @@ typedef struct {
   char **interfaces;
   char **use_in;
   int priority;
+  GHashTable *dummy_proxies;
 } PortalImplementation;
 
 void                  load_installed_portals          (gboolean opt_verbose);
-PortalImplementation *find_portal_implementation      (const char *interface);
+PortalImplementation *find_portal_implementation      (GDBusConnection 
*connection,
+                                                       const char *interface);
 GPtrArray            *find_all_portal_implementations (const char *interface);
 
 #endif  /* __PORTAL_IMPL_H__ */
diff --git a/src/xdg-desktop-portal.c b/src/xdg-desktop-portal.c
index 065ce502c..04f4081ea 100644
--- a/src/xdg-desktop-portal.c
+++ b/src/xdg-desktop-portal.c
@@ -237,7 +237,8 @@ on_bus_acquired (GDBusConnection *connection,
   init_document_proxy (connection);
   init_permission_store (connection);
 
-  implementation = find_portal_implementation 
("org.freedesktop.impl.portal.Lockdown");
+  implementation = find_portal_implementation (connection,
+                                               
"org.freedesktop.impl.portal.Lockdown");
   if (implementation != NULL)
     lockdown = xdp_dbus_impl_lockdown_proxy_new_sync (connection,
                                                       G_DBUS_PROXY_FLAGS_NONE,
@@ -259,40 +260,48 @@ on_bus_acquired (GDBusConnection *connection,
   export_portal_implementation (connection, settings_create (connection, 
impls));
   g_ptr_array_free (impls, TRUE);
 
-  implementation = find_portal_implementation 
("org.freedesktop.impl.portal.FileChooser");
+  implementation = find_portal_implementation (connection,
+                                               
"org.freedesktop.impl.portal.FileChooser");
   if (implementation != NULL)
     export_portal_implementation (connection,
                                   file_chooser_create (connection, 
implementation->dbus_name, lockdown));
 
-  implementation = find_portal_implementation 
("org.freedesktop.impl.portal.AppChooser");
+  implementation = find_portal_implementation (connection,
+                                               
"org.freedesktop.impl.portal.AppChooser");
   if (implementation != NULL)
     export_portal_implementation (connection,
                                   open_uri_create (connection, 
implementation->dbus_name, lockdown));
 
-  implementation = find_portal_implementation 
("org.freedesktop.impl.portal.Print");
+  implementation = find_portal_implementation (connection,
+                                               
"org.freedesktop.impl.portal.Print");
   if (implementation != NULL)
     export_portal_implementation (connection,
                                   print_create (connection, 
implementation->dbus_name, lockdown));
 
-  implementation = find_portal_implementation 
("org.freedesktop.impl.portal.Notification");
+  implementation = find_portal_implementation (connection,
+                                               
"org.freedesktop.impl.portal.Notification");
   if (implementation != NULL)
     export_portal_implementation (connection,
                                   notification_create (connection, 
implementation->dbus_name));
 
-  implementation = find_portal_implementation 
("org.freedesktop.impl.portal.Inhibit");
+  implementation = find_portal_implementation (connection,
+                                               
"org.freedesktop.impl.portal.Inhibit");
   if (implementation != NULL)
     export_portal_implementation (connection,
                                   inhibit_create (connection, 
implementation->dbus_name));
 
-  implementation = find_portal_implementation 
("org.freedesktop.impl.portal.Access");
-  implementation2 = find_portal_implementation 
("org.freedesktop.impl.portal.Screenshot");
+  implementation = find_portal_implementation (connection,
+                                               
"org.freedesktop.impl.portal.Access");
+  implementation2 = find_portal_implementation (connection,
+                                                
"org.freedesktop.impl.portal.Screenshot");
   if (implementation != NULL && implementation2 != NULL)
     export_portal_implementation (connection,
                                   screenshot_create (connection,
                                                      implementation->dbus_name,
                                                      
implementation2->dbus_name));
 
-  implementation2 = find_portal_implementation 
("org.freedesktop.impl.portal.Background");
+  implementation2 = find_portal_implementation (connection,
+                                                
"org.freedesktop.impl.portal.Background");
   if (implementation != NULL)
     {
       export_portal_implementation (connection,
@@ -313,47 +322,55 @@ on_bus_acquired (GDBusConnection *connection,
                                                      implementation->dbus_name,
                                                      
implementation2->dbus_name));
 
-  implementation2 = find_portal_implementation 
("org.freedesktop.impl.portal.Wallpaper");
+  implementation2 = find_portal_implementation (connection,
+                                                
"org.freedesktop.impl.portal.Wallpaper");
   if (implementation != NULL && implementation2 != NULL)
     export_portal_implementation (connection,
                                   wallpaper_create (connection,
                                                     implementation->dbus_name,
                                                     
implementation2->dbus_name));
 
-  implementation = find_portal_implementation 
("org.freedesktop.impl.portal.Account");
+  implementation = find_portal_implementation (connection,
+                                               
"org.freedesktop.impl.portal.Account");
   if (implementation != NULL)
     export_portal_implementation (connection,
                                   account_create (connection, 
implementation->dbus_name));
 
-  implementation = find_portal_implementation 
("org.freedesktop.impl.portal.Email");
+  implementation = find_portal_implementation (connection,
+                                               
"org.freedesktop.impl.portal.Email");
   if (implementation != NULL)
     export_portal_implementation (connection,
                                   email_create (connection, 
implementation->dbus_name));
 
-  implementation = find_portal_implementation 
("org.freedesktop.impl.portal.Secret");
+  implementation = find_portal_implementation (connection,
+                                               
"org.freedesktop.impl.portal.Secret");
   if (implementation != NULL)
     export_portal_implementation (connection,
                                   secret_create (connection, 
implementation->dbus_name));
 
-  implementation = find_portal_implementation 
("org.freedesktop.impl.portal.GlobalShortcuts");
+  implementation = find_portal_implementation (connection,
+                                               
"org.freedesktop.impl.portal.GlobalShortcuts");
   if (implementation != NULL)
     export_portal_implementation (connection,
                                   global_shortcuts_create (connection, 
implementation->dbus_name));
 
 #ifdef HAVE_GLIB_2_66
-  implementation = find_portal_implementation 
("org.freedesktop.impl.portal.DynamicLauncher");
+  implementation = find_portal_implementation (connection,
+                                               
"org.freedesktop.impl.portal.DynamicLauncher");
   if (implementation != NULL)
     export_portal_implementation (connection,
                                   dynamic_launcher_create (connection, 
implementation->dbus_name));
 #endif
 
 #ifdef HAVE_PIPEWIRE
-  implementation = find_portal_implementation 
("org.freedesktop.impl.portal.ScreenCast");
+  implementation = find_portal_implementation (connection,
+                                               
"org.freedesktop.impl.portal.ScreenCast");
   if (implementation != NULL)
     export_portal_implementation (connection,
                                   screen_cast_create (connection, 
implementation->dbus_name));
 
-  implementation = find_portal_implementation 
("org.freedesktop.impl.portal.RemoteDesktop");
+  implementation = find_portal_implementation (connection,
+                                               
"org.freedesktop.impl.portal.RemoteDesktop");
   if (implementation != NULL)
     export_portal_implementation (connection,
                                   remote_desktop_create (connection, 
implementation->dbus_name));

Reply via email to