Blame SOURCES/goa-Add-support-for-certificate-prompts.patch

292b3d
From bbc95d6716ac491489f059c68a6dd258e38aee79 Mon Sep 17 00:00:00 2001
292b3d
From: Ondrej Holy <oholy@redhat.com>
292b3d
Date: Mon, 25 Nov 2019 16:53:31 +0100
292b3d
Subject: [PATCH] goa: Add support for certificate prompts
292b3d
292b3d
Since commit f5ee590e, it is not possible to access Nextcloud/ownCloud
292b3d
shares with self-signed (or invalid) certificates. This is because
292b3d
the mount operation is handled by GOA volume monitor and the prompt
292b3d
to accept certificate is not shown. Let's update the volume monitor
292b3d
to handle just passwords and show the prompt to the client.
292b3d
292b3d
Fixes: https://gitlab.gnome.org/GNOME/gvfs/issues/251
292b3d
---
292b3d
 monitor/goa/goavolume.c | 98 ++++++++++++++++++++++++++++++++++++++++-
292b3d
 1 file changed, 96 insertions(+), 2 deletions(-)
292b3d
292b3d
diff --git a/monitor/goa/goavolume.c b/monitor/goa/goavolume.c
292b3d
index c077dd94..5e9097c6 100644
292b3d
--- a/monitor/goa/goavolume.c
292b3d
+++ b/monitor/goa/goavolume.c
292b3d
@@ -64,6 +64,7 @@ G_DEFINE_TYPE_EXTENDED (GVfsGoaVolume, g_vfs_goa_volume, G_TYPE_OBJECT, 0,
292b3d
 typedef struct
292b3d
 {
292b3d
   GMountOperation *mount_operation;
292b3d
+  GMountOperation *mount_operation_orig;
292b3d
   gchar *passwd;
292b3d
 } MountOp;
292b3d
 
292b3d
@@ -72,6 +73,13 @@ mount_op_free (MountOp *data)
292b3d
 {
292b3d
   g_clear_object (&data->mount_operation);
292b3d
   g_free (data->passwd);
292b3d
+
292b3d
+  if (data->mount_operation_orig != NULL)
292b3d
+    {
292b3d
+      g_signal_handlers_disconnect_by_data (data->mount_operation_orig, data);
292b3d
+      g_object_unref (data->mount_operation_orig);
292b3d
+    }
292b3d
+
292b3d
   g_slice_free (MountOp, data);
292b3d
 }
292b3d
 
292b3d
@@ -97,6 +105,88 @@ account_attention_needed_cb (GObject *_object, GParamSpec *pspec, gpointer user_
292b3d
 
292b3d
 /* ---------------------------------------------------------------------------------------------------- */
292b3d
 
292b3d
+GType g_vfs_goa_mount_operation_get_type (void) G_GNUC_CONST;
292b3d
+
292b3d
+typedef struct
292b3d
+{
292b3d
+  GMountOperation parent_instance;
292b3d
+} GVfsGoaMountOperation;
292b3d
+
292b3d
+typedef struct
292b3d
+{
292b3d
+  GMountOperationClass parent_class;
292b3d
+} GVfsGoaMountOperationClass;
292b3d
+
292b3d
+static GMountOperation *
292b3d
+g_vfs_goa_mount_operation_new (void)
292b3d
+{
292b3d
+  return G_MOUNT_OPERATION (g_object_new (g_vfs_goa_mount_operation_get_type (), NULL));
292b3d
+}
292b3d
+
292b3d
+G_DEFINE_TYPE (GVfsGoaMountOperation, g_vfs_goa_mount_operation, G_TYPE_MOUNT_OPERATION)
292b3d
+
292b3d
+static void
292b3d
+g_vfs_goa_mount_operation_init (GVfsGoaMountOperation *mount_operation)
292b3d
+{
292b3d
+}
292b3d
+
292b3d
+static void
292b3d
+g_vfs_goa_mount_operation_ask_question (GMountOperation *op,
292b3d
+                                        const char *message,
292b3d
+                                        const char *choices[])
292b3d
+{
292b3d
+  /* This is needed to prevent G_MOUNT_OPERATION_UNHANDLED reply in idle. */
292b3d
+}
292b3d
+
292b3d
+static void
292b3d
+g_vfs_goa_mount_operation_class_init (GVfsGoaMountOperationClass *klass)
292b3d
+{
292b3d
+  GMountOperationClass *mount_op_class;
292b3d
+
292b3d
+  mount_op_class = G_MOUNT_OPERATION_CLASS (klass);
292b3d
+  mount_op_class->ask_question  = g_vfs_goa_mount_operation_ask_question;
292b3d
+}
292b3d
+
292b3d
+/* ---------------------------------------------------------------------------------------------------- */
292b3d
+
292b3d
+static void
292b3d
+ask_question_reply_cb (GMountOperation      *op,
292b3d
+                       GMountOperationResult result,
292b3d
+                       gpointer              user_data)
292b3d
+{
292b3d
+  MountOp *data = g_task_get_task_data (user_data);
292b3d
+
292b3d
+  g_mount_operation_set_choice (data->mount_operation,
292b3d
+                                g_mount_operation_get_choice (op));
292b3d
+  g_mount_operation_reply (data->mount_operation, result);
292b3d
+}
292b3d
+
292b3d
+static void
292b3d
+mount_operation_ask_question_cb (GMountOperation *op,
292b3d
+                                 gchar           *message,
292b3d
+                                 GStrv            choices,
292b3d
+                                 gpointer         user_data)
292b3d
+{
292b3d
+  MountOp *data = g_task_get_task_data (user_data);
292b3d
+
292b3d
+  if (data->mount_operation_orig != NULL)
292b3d
+    {
292b3d
+      g_signal_connect (data->mount_operation_orig,
292b3d
+                        "reply",
292b3d
+                        G_CALLBACK (ask_question_reply_cb),
292b3d
+                        user_data);
292b3d
+      g_signal_emit_by_name (data->mount_operation_orig,
292b3d
+                             "ask-question",
292b3d
+                             message,
292b3d
+                             choices);
292b3d
+    }
292b3d
+  else
292b3d
+    {
292b3d
+      g_mount_operation_reply (data->mount_operation,
292b3d
+                               G_MOUNT_OPERATION_UNHANDLED);
292b3d
+    }
292b3d
+}
292b3d
+
292b3d
 static void
292b3d
 mount_operation_ask_password_cb (GMountOperation   *op,
292b3d
                                  gchar             *message,
292b3d
@@ -412,7 +502,7 @@ g_vfs_goa_volume_get_uuid (GVolume *_self)
292b3d
 static void
292b3d
 g_vfs_goa_volume_mount (GVolume             *_self,
292b3d
                         GMountMountFlags     flags,
292b3d
-                        GMountOperation     *mount_operation,
292b3d
+                        GMountOperation     *mount_operation_orig,
292b3d
                         GCancellable        *cancellable,
292b3d
                         GAsyncReadyCallback  callback,
292b3d
                         gpointer             user_data)
292b3d
@@ -423,6 +513,9 @@ g_vfs_goa_volume_mount (GVolume             *_self,
292b3d
   GoaAccount *account;
292b3d
 
292b3d
   data = g_slice_new0 (MountOp);
292b3d
+  if (mount_operation_orig != NULL)
292b3d
+    data->mount_operation_orig = g_object_ref (mount_operation_orig);
292b3d
+
292b3d
   task = g_task_new (self, cancellable, callback, user_data);
292b3d
   g_task_set_source_tag (task, g_vfs_goa_volume_mount);
292b3d
   g_task_set_task_data (task, data, (GDestroyNotify) mount_op_free);
292b3d
@@ -431,8 +524,9 @@ g_vfs_goa_volume_mount (GVolume             *_self,
292b3d
    * monitor because it is set up to emit MountOpAskPassword on
292b3d
    * ask-password.
292b3d
    */
292b3d
-  data->mount_operation = g_mount_operation_new ();
292b3d
+  data->mount_operation = g_vfs_goa_mount_operation_new ();
292b3d
   g_signal_connect (data->mount_operation, "ask-password", G_CALLBACK (mount_operation_ask_password_cb), task);
292b3d
+  g_signal_connect (data->mount_operation, "ask-question", G_CALLBACK (mount_operation_ask_question_cb), task);
292b3d
 
292b3d
   account = goa_object_peek_account (self->object);
292b3d
   goa_account_call_ensure_credentials (account, cancellable, ensure_credentials_cb, task);
292b3d
-- 
292b3d
2.28.0
292b3d