[gvfs] Update to 1.12.2

Tomas Bzatek tbzatek at fedoraproject.org
Fri Apr 27 10:05:31 UTC 2012


commit c5063823eed4ddc727cdbbd8b9f653d55d9c4ee3
Author: Tomas Bzatek <tbzatek at redhat.com>
Date:   Fri Apr 27 12:04:45 2012 +0200

    Update to 1.12.2
    
    - Backport multiseat patches from master

 .gitignore                                         |    1 +
 gvfs-1.13.0-multiseat-LUKS-encryption-pass.patch   |  385 ++++++++++++++++++++
 ...1.13.0-multiseat-dont-automount-if-shared.patch |  115 ++++++
 ....13.0-multiseat-dont-set-should_automount.patch |  240 ++++++++++++
 gvfs-1.13.0-multiseat-dont-show-drives.patch       |  314 ++++++++++++++++
 gvfs.spec                                          |   19 +-
 sources                                            |    2 +-
 7 files changed, 1073 insertions(+), 3 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index d9caff2..bc9b8c5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -23,3 +23,4 @@ gvfs-1.6.3.tar.bz2
 /gvfs-1.11.5.tar.xz
 /gvfs-1.12.0.tar.xz
 /gvfs-1.12.1.tar.xz
+/gvfs-1.12.2.tar.xz
diff --git a/gvfs-1.13.0-multiseat-LUKS-encryption-pass.patch b/gvfs-1.13.0-multiseat-LUKS-encryption-pass.patch
new file mode 100644
index 0000000..f4e8222
--- /dev/null
+++ b/gvfs-1.13.0-multiseat-LUKS-encryption-pass.patch
@@ -0,0 +1,385 @@
+From 79f0ea7c0d5cb39cf1ab40afaea0e485aeb4bc49 Mon Sep 17 00:00:00 2001
+From: David Zeuthen <davidz at redhat.com>
+Date: Thu, 26 Apr 2012 14:35:37 -0400
+Subject: [PATCH 7/9] udisks2: Support getting/storing LUKS encryption passphrase from keyring
+
+Also use a nicer message when asking for the passphrase, e.g. use strings like
+
+ 'SD04G (SD Card Reader)'
+ 'WD 2500JB External (250 GB Hard Disk)'
+
+instead of /dev/mmcblk0p1 or /dev/sdb1. If stored in the keyring, we
+also use the following display name
+
+ 'Encryption passphrase for $DRIVE'
+
+where $DRIVE is of the above form. This makes it easy for the user to
+manage (for example, delete) pass-phrases using seahorse(1).
+
+This was discussed in bug 674161.
+
+ https://bugzilla.gnome.org/show_bug.cgi?id=674161
+
+This commit adds/changes translatable strings but Tomas said he would
+soon branch gvfs for gnome-3-at a point before this patch.
+
+Signed-off-by: David Zeuthen <davidz at redhat.com>
+---
+ monitor/udisks2/Makefile.am         |    2 +
+ monitor/udisks2/gvfsudisks2volume.c |  225 ++++++++++++++++++++++++++++++++++-
+ 2 files changed, 221 insertions(+), 6 deletions(-)
+
+diff --git a/monitor/udisks2/Makefile.am b/monitor/udisks2/Makefile.am
+index 776f670..c5ddd7c 100644
+--- a/monitor/udisks2/Makefile.am
++++ b/monitor/udisks2/Makefile.am
+@@ -20,6 +20,7 @@ gvfs_udisks2_volume_monitor_CFLAGS =		\
+ 	$(UDISKS2_CFLAGS)                       \
+ 	$(GUDEV_CFLAGS)                         \
+ 	$(LIBSYSTEMD_LOGIN_CFLAGS)		\
++	$(KEYRING_CFLAGS)			\
+ 	-DGIO_MODULE_DIR=\"$(GIO_MODULE_DIR)\"	\
+ 	-DGVFS_LOCALEDIR=\""$(localedir)"\"	\
+ 	-DG_DISABLE_DEPRECATED			\
+@@ -34,6 +35,7 @@ gvfs_udisks2_volume_monitor_LDADD  =		     			      	\
+ 	$(UDISKS2_LIBS)                                  			\
+ 	$(GUDEV_LIBS)                                  			      	\
+ 	$(LIBSYSTEMD_LOGIN_LIBS)						\
++	$(KEYRING_LIBS)								\
+ 	$(top_builddir)/common/libgvfscommon.la 			      	\
+ 	$(top_builddir)/monitor/proxy/libgvfsproxyvolumemonitordaemon-noin.la 	\
+ 	$(NULL)
+diff --git a/monitor/udisks2/gvfsudisks2volume.c b/monitor/udisks2/gvfsudisks2volume.c
+index 3ef5895..bb5c687 100644
+--- a/monitor/udisks2/gvfsudisks2volume.c
++++ b/monitor/udisks2/gvfsudisks2volume.c
+@@ -31,6 +31,10 @@
+ #include <glib/gi18n-lib.h>
+ #include <gio/gio.h>
+ 
++#ifdef HAVE_KEYRING
++#include <gnome-keyring.h>
++#endif
++
+ #include "gvfsudisks2drive.h"
+ #include "gvfsudisks2volume.h"
+ #include "gvfsudisks2mount.h"
+@@ -756,6 +760,17 @@ gvfs_udisks2_volume_get_activation_root (GVolume *_volume)
+ 
+ /* ---------------------------------------------------------------------------------------------------- */
+ 
++#ifdef HAVE_KEYRING
++static GnomeKeyringPasswordSchema luks_passphrase_schema =
++{
++  GNOME_KEYRING_ITEM_GENERIC_SECRET,
++  {
++    {"gvfs-luks-uuid", GNOME_KEYRING_ATTRIBUTE_TYPE_STRING},
++    {NULL, 0}
++  }
++};
++#endif
++
+ struct MountData
+ {
+   GSimpleAsyncResult *simple;
+@@ -769,9 +784,15 @@ struct MountData
+ 
+   gchar *passphrase;
+ 
++  gchar *passphrase_from_keyring;
++  GPasswordSave password_save;
++
++  gchar *uuid_of_encrypted_to_unlock;
++  gchar *desc_of_encrypted_to_unlock;
+   UDisksEncrypted *encrypted_to_unlock;
+   UDisksFilesystem *filesystem_to_mount;
+ 
++  gboolean checked_keyring;
+ };
+ 
+ static void
+@@ -795,7 +816,10 @@ mount_data_free (MountData *data)
+     }
+ 
+   g_free (data->passphrase);
++  g_free (data->passphrase_from_keyring);
+ 
++  g_free (data->uuid_of_encrypted_to_unlock);
++  g_free (data->desc_of_encrypted_to_unlock);
+   g_clear_object (&data->encrypted_to_unlock);
+   g_clear_object (&data->filesystem_to_mount);
+   g_free (data);
+@@ -912,6 +936,62 @@ do_mount (MountData *data)
+ 
+ /* ------------------------------ */
+ 
++#ifdef HAVE_KEYRING
++static void
++luks_store_passphrase_cb (GnomeKeyringResult result,
++                          gpointer           user_data)
++{
++  MountData *data = user_data;
++  if (result == GNOME_KEYRING_RESULT_OK)
++    {
++      /* everything is good */
++      do_mount (data);
++    }
++  else
++    {
++      /* report failure */
++      g_simple_async_result_set_error (data->simple,
++                                       G_IO_ERROR,
++                                       G_IO_ERROR_FAILED,
++                                       _("Error storing passphrase in keyring (error code %d)"),
++                                       result);
++      g_simple_async_result_complete (data->simple);
++      mount_data_free (data);
++    }
++}
++#endif
++
++
++static void do_unlock (MountData *data);
++
++
++#ifdef HAVE_KEYRING
++static void
++luks_delete_passphrase_cb (GnomeKeyringResult result,
++                           gpointer           user_data)
++{
++  MountData *data = user_data;
++  if (result == GNOME_KEYRING_RESULT_OK)
++    {
++      /* with the bad passphrase out of the way, try again */
++      g_free (data->passphrase);
++      data->passphrase = NULL;
++      do_unlock (data);
++    }
++  else
++    {
++      /* report failure */
++      g_simple_async_result_set_error (data->simple,
++                                       G_IO_ERROR,
++                                       G_IO_ERROR_FAILED,
++                                       _("Error deleting invalid passphrase from keyring (error code %d)"),
++                                       result);
++      g_simple_async_result_complete (data->simple);
++      mount_data_free (data);
++    }
++}
++#endif
++
+ static void
+ unlock_cb (GObject       *source_object,
+            GAsyncResult  *res,
+@@ -927,6 +1007,26 @@ unlock_cb (GObject       *source_object,
+                                             res,
+                                             &error))
+     {
++#ifdef HAVE_KEYRING
++      /* If this failed with a passphrase read from the keyring, try again
++       * this time prompting the user...
++       *
++       * TODO: ideally check against something like UDISKS_ERROR_PASSPHRASE_INVALID
++       * when such a thing is available in udisks
++       */
++      if (data->passphrase_from_keyring != NULL &&
++          g_strcmp0 (data->passphrase, data->passphrase_from_keyring) == 0)
++        {
++          /* nuke the invalid passphrase from keyring... */
++          gnome_keyring_delete_password (&luks_passphrase_schema,
++                                         luks_delete_passphrase_cb,
++                                         data,
++                                         NULL, /* GDestroyNotify */
++                                         "gvfs-luks-uuid", data->uuid_of_encrypted_to_unlock,
++                                         NULL); /* sentinel */
++          goto out;
++        }
++#endif
+       gvfs_udisks2_utils_udisks_error_to_gio_error (error);
+       g_simple_async_result_take_error (data->simple, error);
+       g_simple_async_result_complete (data->simple);
+@@ -953,6 +1053,42 @@ unlock_cb (GObject       *source_object,
+           goto out;
+         }
+ 
++#ifdef HAVE_KEYRING
++      /* passphrase worked - save it in the keyring if requested */
++      if (data->password_save != G_PASSWORD_SAVE_NEVER)
++        {
++          const gchar *keyring;
++          gchar *display_name;
++
++          switch (data->password_save)
++            {
++            case G_PASSWORD_SAVE_NEVER:
++              g_assert_not_reached ();
++              break;
++            case G_PASSWORD_SAVE_FOR_SESSION:
++              keyring = GNOME_KEYRING_SESSION;
++              break;
++            case G_PASSWORD_SAVE_PERMANENTLY:
++              keyring = GNOME_KEYRING_DEFAULT;
++              break;
++            }
++
++          display_name = g_strdup_printf (_("Encryption passphrase for %s"),
++                                          data->desc_of_encrypted_to_unlock);
++
++          gnome_keyring_store_password (&luks_passphrase_schema,
++                                        keyring,
++                                        display_name,
++                                        data->passphrase,
++                                        luks_store_passphrase_cb,
++                                        data,
++                                        NULL, /* GDestroyNotify */
++                                        "gvfs-luks-uuid", data->uuid_of_encrypted_to_unlock,
++                                        NULL); /* sentinel */
++          goto out;
++        }
++#endif
++
+       /* OK, ready to rock */
+       do_mount (data);
+     }
+@@ -961,8 +1097,6 @@ unlock_cb (GObject       *source_object,
+   g_free (cleartext_device);
+ }
+ 
+-static void do_unlock (MountData *data);
+-
+ static void
+ on_mount_operation_reply (GMountOperation       *mount_operation,
+                           GMountOperationResult result,
+@@ -1005,6 +1139,9 @@ on_mount_operation_reply (GMountOperation       *mount_operation,
+     }
+ 
+   data->passphrase = g_strdup (g_mount_operation_get_password (mount_operation));
++  data->password_save = g_mount_operation_get_password_save (mount_operation);
++
++  /* Don't save password in keyring just yet - check if it works first */
+ 
+   do_unlock (data);
+ 
+@@ -1049,6 +1186,27 @@ has_crypttab_passphrase (MountData *data)
+   return ret;
+ }
+ 
++#ifdef HAVE_KEYRING
++static void
++luks_find_passphrase_cb (GnomeKeyringResult result,
++                         const gchar       *string,
++                         gpointer           user_data)
++{
++  MountData *data = user_data;
++
++  /* Don't fail if a keyring error occured - just continue and request
++   * the passphrase from the user...
++   */
++  if (result == GNOME_KEYRING_RESULT_OK)
++    {
++      data->passphrase = g_strdup (string);
++      data->passphrase_from_keyring = g_strdup (string);
++    }
++  /* try again */
++  do_unlock (data);
++}
++#endif
++
+ static void
+ do_unlock (MountData *data)
+ {
+@@ -1065,6 +1223,21 @@ do_unlock (MountData *data)
+         {
+           gchar *message;
+ 
++#ifdef HAVE_KEYRING
++          /* check if the passphrase is in the user's keyring */
++          if (!data->checked_keyring)
++            {
++              data->checked_keyring = TRUE;
++              gnome_keyring_find_password (&luks_passphrase_schema,
++                                           luks_find_passphrase_cb,
++                                           data,
++                                           NULL, /* GDestroyNotify */
++                                           "gvfs-luks-uuid", data->uuid_of_encrypted_to_unlock,
++                                           NULL); /* sentinel */
++              goto out;
++            }
++#endif
++
+           if (data->mount_operation == NULL)
+             {
+               g_simple_async_result_set_error (data->simple,
+@@ -1084,9 +1257,10 @@ do_unlock (MountData *data)
+                                                                        "aborted",
+                                                                        G_CALLBACK (on_mount_operation_aborted),
+                                                                        data);
+-          message = g_strdup_printf (_("Enter a password to unlock the volume\n"
+-                                       "The device %s contains encrypted data."),
+-                                     udisks_block_get_device (data->volume->block));
++          /* Translators: This is the message shown to users */
++          message = g_strdup_printf (_("Enter a passphrase to unlock the volume\n"
++                                       "The passphrase is needed to access encrypted data on %s."),
++                                     data->desc_of_encrypted_to_unlock);
+ 
+           /* NOTE: We (currently) don't offer the user to save the
+            * passphrase in the keyring or /etc/crypttab - compared to
+@@ -1109,7 +1283,7 @@ do_unlock (MountData *data)
+                                  NULL,
+                                  NULL,
+                                  G_ASK_PASSWORD_NEED_PASSWORD |
+-                                 0/*G_ASK_PASSWORD_SAVING_SUPPORTED*/);
++                                 G_ASK_PASSWORD_SAVING_SUPPORTED);
+           g_free (message);
+           goto out;
+         }
+@@ -1209,6 +1383,45 @@ gvfs_udisks2_volume_mount (GVolume             *_volume,
+       data->encrypted_to_unlock = udisks_object_get_encrypted (UDISKS_OBJECT (object));
+       if (data->encrypted_to_unlock != NULL)
+         {
++          UDisksDrive *udisks_drive;
++
++          /* This description is used in both the prompt and the display-name of
++           * the key stored in the user's keyring ...
++           *
++           * NOTE: we want a little bit more detail than what g_drive_get_name()
++           * gives us, since this is going to be used to refer to the device even
++           * when not plugged in
++           */
++          udisks_drive = udisks_client_get_drive_for_block (gvfs_udisks2_volume_monitor_get_udisks_client (volume->monitor),
++                                                            block);
++          if (udisks_drive != NULL)
++            {
++              gchar *drive_name;
++              gchar *drive_desc;
++              udisks_client_get_drive_info (gvfs_udisks2_volume_monitor_get_udisks_client (volume->monitor),
++                                            udisks_drive,
++                                            &drive_name,
++                                            &drive_desc,
++                                            NULL,  /* drive_icon */
++                                            NULL,  /* media_desc */
++                                            NULL); /* media_icon */
++              /* Translators: this is used to describe the drive the encrypted media
++               * is on - the first %s is the name (such as 'WD 2500JB External'), the
++               * second %s is the description ('250 GB Hard Disk').
++               */
++              data->desc_of_encrypted_to_unlock = g_strdup_printf (_("%s (%s)"),
++                                                                   drive_name,
++                                                                   drive_desc);
++              g_free (drive_desc);
++              g_free (drive_name);
++              g_object_unref (udisks_drive);
++            }
++          else
++            {
++              data->desc_of_encrypted_to_unlock = udisks_block_dup_preferred_device (block);
++            }
++          data->uuid_of_encrypted_to_unlock = udisks_block_dup_id_uuid (block);
++
+           do_unlock (data);
+           goto out;
+         }
+-- 
+1.7.3.4
+
diff --git a/gvfs-1.13.0-multiseat-dont-automount-if-shared.patch b/gvfs-1.13.0-multiseat-dont-automount-if-shared.patch
new file mode 100644
index 0000000..f18b147
--- /dev/null
+++ b/gvfs-1.13.0-multiseat-dont-automount-if-shared.patch
@@ -0,0 +1,115 @@
+From 495bf23f972cb14aa55d15b7c9fe53bd610a0590 Mon Sep 17 00:00:00 2001
+From: David Zeuthen <davidz at redhat.com>
+Date: Mon, 23 Apr 2012 15:46:31 -0400
+Subject: [PATCH 5/9] udisks2: don't automount if drive is shared across all seats
+
+If we automount media in a drive assigned to all seats, then all
+sessions on all seats will be notified of the new media... which is
+definitely going to be annoying. Instead, just disable automounting on
+such drives so the user manually have to mount it.
+
+Of course, this depends on the shell doing the right thing. Which is:
+only notifying the user when successfully auto-mounting in response to
+a hotplug event. This is not currently the case, see
+
+ https://bugzilla.gnome.org/show_bug.cgi?id=660595#c19
+
+for details about this bug.
+
+Signed-off-by: David Zeuthen <davidz at redhat.com>
+---
+ monitor/udisks2/gvfsudisks2utils.c         |    7 ++++++-
+ monitor/udisks2/gvfsudisks2utils.h         |    3 ++-
+ monitor/udisks2/gvfsudisks2volume.c        |    8 ++++++--
+ monitor/udisks2/gvfsudisks2volumemonitor.c |    2 +-
+ 4 files changed, 15 insertions(+), 5 deletions(-)
+
+diff --git a/monitor/udisks2/gvfsudisks2utils.c b/monitor/udisks2/gvfsudisks2utils.c
+index 43d583a..d747a63 100644
+--- a/monitor/udisks2/gvfsudisks2utils.c
++++ b/monitor/udisks2/gvfsudisks2utils.c
+@@ -547,9 +547,11 @@ get_seat (void)
+ #endif
+ 
+ gboolean
+-gvfs_udisks2_utils_is_drive_on_our_seat (UDisksDrive *drive)
++gvfs_udisks2_utils_is_drive_on_our_seat (UDisksDrive *drive,
++                                         gboolean    *out_shared)
+ {
+   gboolean ret = FALSE;
++  gboolean shared = FALSE;
+   const gchar *seat;
+   const gchar *drive_seat = NULL;
+ 
+@@ -584,6 +586,7 @@ gvfs_udisks2_utils_is_drive_on_our_seat (UDisksDrive *drive)
+   if (g_strcmp0 (drive_seat, "all") == 0)
+     {
+       ret = TRUE;
++      shared = TRUE;
+       goto out;
+     }
+ 
+@@ -592,5 +595,7 @@ gvfs_udisks2_utils_is_drive_on_our_seat (UDisksDrive *drive)
+     ret = TRUE;
+ 
+  out:
++  if (out_shared != NULL)
++    *out_shared = shared;
+   return ret;
+ }
+diff --git a/monitor/udisks2/gvfsudisks2utils.h b/monitor/udisks2/gvfsudisks2utils.h
+index 1965883..41ce875 100644
+--- a/monitor/udisks2/gvfsudisks2utils.h
++++ b/monitor/udisks2/gvfsudisks2utils.h
+@@ -50,7 +50,8 @@ gboolean gvfs_udisks2_utils_spawn_finish (GAsyncResult   *res,
+                                           gchar         **out_standard_error,
+                                           GError        **error);
+ 
+-gboolean gvfs_udisks2_utils_is_drive_on_our_seat (UDisksDrive *drive);
++gboolean gvfs_udisks2_utils_is_drive_on_our_seat (UDisksDrive *drive,
++                                                  gboolean    *out_shared);
+ 
+ 
+ G_END_DECLS
+diff --git a/monitor/udisks2/gvfsudisks2volume.c b/monitor/udisks2/gvfsudisks2volume.c
+index a1c7fa4..3ef5895 100644
+--- a/monitor/udisks2/gvfsudisks2volume.c
++++ b/monitor/udisks2/gvfsudisks2volume.c
+@@ -269,6 +269,8 @@ update_volume (GVfsUDisks2Volume *volume)
+           GIcon *drive_icon;
+           gchar *media_desc;
+           GIcon *media_icon;
++          gboolean shared;
++
+           udisks_client_get_drive_info (gvfs_udisks2_volume_monitor_get_udisks_client (volume->monitor),
+                                         udisks_drive,
+                                         NULL, /* drive_name */
+@@ -314,8 +316,10 @@ update_volume (GVfsUDisks2Volume *volume)
+           if (media_icon != NULL)
+             g_object_unref (media_icon);
+ 
+-          /* Only automount drives attached to the same seat as we're running on */
+-          if (gvfs_udisks2_utils_is_drive_on_our_seat (udisks_drive))
++          /* Only automount drives attached to the same seat as we're running on
++           * and if the drive is NOT shared across all seats
++           */
++          if (gvfs_udisks2_utils_is_drive_on_our_seat (udisks_drive, &shared) && !shared)
+             {
+               /* Only automount filesystems from drives of known types/interconnects:
+                *
+diff --git a/monitor/udisks2/gvfsudisks2volumemonitor.c b/monitor/udisks2/gvfsudisks2volumemonitor.c
+index 2826164..002ab3c 100644
+--- a/monitor/udisks2/gvfsudisks2volumemonitor.c
++++ b/monitor/udisks2/gvfsudisks2volumemonitor.c
+@@ -906,7 +906,7 @@ should_include_drive (GVfsUDisks2VolumeMonitor *monitor,
+   gboolean ret = TRUE;
+ 
+   /* Don't include drives on other seats */
+-  if (!gvfs_udisks2_utils_is_drive_on_our_seat (drive))
++  if (!gvfs_udisks2_utils_is_drive_on_our_seat (drive, NULL))
+     {
+       ret = FALSE;
+       goto out;
+-- 
+1.7.3.4
+
diff --git a/gvfs-1.13.0-multiseat-dont-set-should_automount.patch b/gvfs-1.13.0-multiseat-dont-set-should_automount.patch
new file mode 100644
index 0000000..f3f0a5e
--- /dev/null
+++ b/gvfs-1.13.0-multiseat-dont-set-should_automount.patch
@@ -0,0 +1,240 @@
+From 5c9ffd7bf5d08c3fe57e235d8001e0b9c23a2730 Mon Sep 17 00:00:00 2001
+From: David Zeuthen <davidz at redhat.com>
+Date: Sat, 21 Apr 2012 12:28:09 -0400
+Subject: [PATCH 1/9] Don't set should_automount to TRUE for devices on other seats
+
+This change uses the libsystemd-login library to obtain the seat we're
+on and compares it against the Seat property on the D-Bus interface
+org.freedesktop.UDisks2.Drive. This property is available in udisks
+1.95.0, see
+
+ http://cgit.freedesktop.org/udisks/commit/?id=91106cdc7622d9674f6083dcb524407f026a36c7
+
+Also, since we're still on the stable branch and not everyone may be
+using systemd, make this work without hard-requiring either
+libsystemd-login or udisks 1.95.0.
+
+Signed-off-by: David Zeuthen <davidz at redhat.com>
+---
+ configure.ac                        |   22 ++++++
+ monitor/udisks2/Makefile.am         |    2 +
+ monitor/udisks2/gvfsudisks2volume.c |  125 ++++++++++++++++++++++++++++-------
+ 3 files changed, 124 insertions(+), 25 deletions(-)
+
+diff --git a/configure.ac b/configure.ac
+index 3b77b64..361b0d4 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -239,6 +239,27 @@ fi
+ 
+ AM_CONDITIONAL(USE_UDISKS2, [test "$msg_udisks2" = "yes"])
+ 
++dnl **********************************
++dnl *** Check for libsystemd-login ***
++dnl **********************************
++
++AC_ARG_ENABLE(libsystemd_login, AS_HELP_STRING([--disable-libsystemd-login],[build without liblibsystemd-login]))
++msg_libsystemd_login=no
++LIBSYSTEMD_LOGIN_LIBS=
++LIBSYSTEMD_LOGIN_CFLAGS=
++LIBSYSTEMD_LOGIN_REQUIRED=44
++
++if test "x$enable_libsystemd_login" != "xno"; then
++  PKG_CHECK_EXISTS([libsystemd-login >= $LIBSYSTEMD_LOGIN_REQUIRED], msg_libsystemd_login=yes)
++
++  if test "x$msg_libsystemd_login" = "xyes"; then
++    PKG_CHECK_MODULES([LIBSYSTEMD_LOGIN],[libsystemd-login >= $LIBSYSTEMD_LOGIN_REQUIRED])
++    AC_DEFINE(HAVE_LIBSYSTEMD_LOGIN, 1, [Define to 1 if liblibsystemd_login is available])
++  fi
++fi
++
++AM_CONDITIONAL(USE_LIBSYSTEMD_LOGIN, [test "$msg_libsystemd_login" = "yes"])
++
+ dnl **********************
+ dnl *** Check for HAL ***
+ dnl **********************
+@@ -783,6 +804,7 @@ echo "
+ 	Build HAL volume monitor:     $msg_hal (with fast init path: $have_hal_fast_init)
+ 	Build GDU volume monitor:     $msg_gdu
+ 	Build udisks2 volume monitor: $msg_udisks2
++        Use libsystem-login:          $msg_libsystemd_login
+ 	GNOME Keyring support:        $msg_keyring
+ 	Bash-completion support:      $msg_bash_completion
+ "
+diff --git a/monitor/udisks2/Makefile.am b/monitor/udisks2/Makefile.am
+index f919df6..776f670 100644
+--- a/monitor/udisks2/Makefile.am
++++ b/monitor/udisks2/Makefile.am
+@@ -19,6 +19,7 @@ gvfs_udisks2_volume_monitor_CFLAGS =		\
+ 	$(GLIB_CFLAGS)                          \
+ 	$(UDISKS2_CFLAGS)                       \
+ 	$(GUDEV_CFLAGS)                         \
++	$(LIBSYSTEMD_LOGIN_CFLAGS)		\
+ 	-DGIO_MODULE_DIR=\"$(GIO_MODULE_DIR)\"	\
+ 	-DGVFS_LOCALEDIR=\""$(localedir)"\"	\
+ 	-DG_DISABLE_DEPRECATED			\
+@@ -32,6 +33,7 @@ gvfs_udisks2_volume_monitor_LDADD  =		     			      	\
+ 	$(GLIB_LIBS)                                 			      	\
+ 	$(UDISKS2_LIBS)                                  			\
+ 	$(GUDEV_LIBS)                                  			      	\
++	$(LIBSYSTEMD_LOGIN_LIBS)						\
+ 	$(top_builddir)/common/libgvfscommon.la 			      	\
+ 	$(top_builddir)/monitor/proxy/libgvfsproxyvolumemonitordaemon-noin.la 	\
+ 	$(NULL)
+diff --git a/monitor/udisks2/gvfsudisks2volume.c b/monitor/udisks2/gvfsudisks2volume.c
+index 89c2413..243dc14 100644
+--- a/monitor/udisks2/gvfsudisks2volume.c
++++ b/monitor/udisks2/gvfsudisks2volume.c
+@@ -36,6 +36,41 @@
+ #include "gvfsudisks2mount.h"
+ #include "gvfsudisks2utils.h"
+ 
++
++#if defined(HAVE_LIBSYSTEMD_LOGIN)
++#include <systemd/sd-login.h>
++
++static const gchar *
++get_seat (void)
++{
++  static gsize once = 0;
++  static char *seat = NULL;
++
++  if (g_once_init_enter (&once))
++    {
++      char *session = NULL;
++      if (sd_pid_get_session (getpid (), &session) == 0)
++        {
++          sd_session_get_seat (session, &seat);
++          /* we intentionally leak seat here... */
++        }
++      g_once_init_leave (&once, (gsize) 1);
++    }
++  return seat;
++}
++
++#else
++
++static const gchar *
++get_seat (void)
++{
++  return NULL;
++}
++
++#endif
++
++
++
+ typedef struct _GVfsUDisks2VolumeClass GVfsUDisks2VolumeClass;
+ 
+ struct _GVfsUDisks2VolumeClass
+@@ -178,6 +213,43 @@ apply_options_from_fstab (GVfsUDisks2Volume *volume,
+ }
+ 
+ static gboolean
++drive_is_on_our_seat (UDisksDrive *drive)
++{
++  gboolean ret = FALSE;
++  const gchar *seat;
++  const gchar *drive_seat = NULL;
++
++  /* assume our own seat if we don't have seat-support or it doesn't work */
++  seat = get_seat ();
++  if (seat == NULL)
++    {
++      ret = TRUE;
++      goto out;
++    }
++
++  /* Assume seat0 if a) device is not tagged; or b) udisks does not
++   * have seat-support.
++   *
++   * Note that seat support was added in udisks 1.95.0 (and so was the
++   * UDISKS_CHECK_VERSION macro) - for now, be compatible with older
++   * versions instead of bumping requirement in configure.ac
++   */
++#ifdef UDISKS_CHECK_VERSION
++# if UDISKS_CHECK_VERSION(1,95,0)
++  drive_seat = udisks_drive_get_seat (drive);
++# endif
++#endif
++  if (drive_seat == NULL || strlen (drive_seat) == 0)
++    drive_seat = "seat0";
++
++  if (g_strcmp0 (seat, drive_seat) == 0)
++    ret = TRUE;
++
++ out:
++  return ret;
++}
++
++static gboolean
+ update_volume (GVfsUDisks2Volume *volume)
+ {
+   gboolean changed;
+@@ -314,35 +386,38 @@ update_volume (GVfsUDisks2Volume *volume)
+           if (media_icon != NULL)
+             g_object_unref (media_icon);
+ 
+-          /* Only automount filesystems from drives of known types/interconnects:
+-           *
+-           *  - USB
+-           *  - Firewire
+-           *  - sdio
+-           *  - optical discs
+-           *
+-           * The mantra here is "be careful" - we really don't want to
+-           * automount filesystems from all devices in a SAN etc - We
+-           * REALLY need to be CAREFUL here.
+-           *
+-           * Fortunately udisks provides a property just for this.
+-           */
+-          if (udisks_block_get_hint_auto (volume->block))
++          /* Only automount drives attached to the same seat as we're running on */
++          if (drive_is_on_our_seat (udisks_drive))
+             {
+-              gboolean just_plugged_in = FALSE;
+-              /* Also, if a volume (partition) appear _much later_ than when media was inserted it
+-               * can only be because the media was repartitioned. We don't want to automount
+-               * such volumes. So only mark volumes appearing just after their drive.
++              /* Only automount filesystems from drives of known types/interconnects:
+                *
+-               * There's a catch here - if the volume was discovered at coldplug-time (typically
+-               * when the user desktop session started), we can't use this heuristic
++               *  - USB
++               *  - Firewire
++               *  - sdio
++               *  - optical discs
++               *
++               * The mantra here is "be careful" - we really don't want to
++               * automount filesystems from all devices in a SAN etc - We
++               * REALLY need to be CAREFUL here.
++               *
++               * Fortunately udisks provides a property just for this.
+                */
+-              if (g_get_real_time () - udisks_drive_get_time_media_detected (udisks_drive) < 5 * G_USEC_PER_SEC)
+-                just_plugged_in = TRUE;
+-              if (volume->coldplug || just_plugged_in)
+-                volume->should_automount = TRUE;
++              if (udisks_block_get_hint_auto (volume->block))
++                {
++                  gboolean just_plugged_in = FALSE;
++                  /* Also, if a volume (partition) appear _much later_ than when media was inserted it
++                   * can only be because the media was repartitioned. We don't want to automount
++                   * such volumes. So only mark volumes appearing just after their drive.
++                   *
++                   * There's a catch here - if the volume was discovered at coldplug-time (typically
++                   * when the user desktop session started), we can't use this heuristic
++                   */
++                  if (g_get_real_time () - udisks_drive_get_time_media_detected (udisks_drive) < 5 * G_USEC_PER_SEC)
++                    just_plugged_in = TRUE;
++                  if (volume->coldplug || just_plugged_in)
++                    volume->should_automount = TRUE;
++                }
+             }
+-
+           g_object_unref (udisks_drive);
+         }
+ 
+-- 
+1.7.3.4
+
diff --git a/gvfs-1.13.0-multiseat-dont-show-drives.patch b/gvfs-1.13.0-multiseat-dont-show-drives.patch
new file mode 100644
index 0000000..7bff00c
--- /dev/null
+++ b/gvfs-1.13.0-multiseat-dont-show-drives.patch
@@ -0,0 +1,314 @@
+From c241b86cc74ce8ca13d9ee2b8d0b7cf15850cf71 Mon Sep 17 00:00:00 2001
+From: David Zeuthen <davidz at redhat.com>
+Date: Sun, 22 Apr 2012 11:48:19 -0400
+Subject: [PATCH 4/9] udisks2: don't show drives from other seats and special-case seat "all"
+
+If Drive:seat is "all" it means the drive is available on all seats.
+
+Signed-off-by: David Zeuthen <davidz at redhat.com>
+---
+ monitor/udisks2/gvfsudisks2utils.c         |   83 ++++++++++++++++++++++++++++
+ monitor/udisks2/gvfsudisks2utils.h         |    2 +
+ monitor/udisks2/gvfsudisks2volume.c        |   74 +------------------------
+ monitor/udisks2/gvfsudisks2volumemonitor.c |   47 ++++++++++++---
+ 4 files changed, 123 insertions(+), 83 deletions(-)
+
+diff --git a/monitor/udisks2/gvfsudisks2utils.c b/monitor/udisks2/gvfsudisks2utils.c
+index 0dc8abe..43d583a 100644
+--- a/monitor/udisks2/gvfsudisks2utils.c
++++ b/monitor/udisks2/gvfsudisks2utils.c
+@@ -511,3 +511,86 @@ gvfs_udisks2_utils_spawn_finish (GAsyncResult   *res,
+   return ret;
+ }
+ 
++/* ---------------------------------------------------------------------------------------------------- */
++
++#if defined(HAVE_LIBSYSTEMD_LOGIN)
++#include <systemd/sd-login.h>
++
++static const gchar *
++get_seat (void)
++{
++  static gsize once = 0;
++  static char *seat = NULL;
++
++  if (g_once_init_enter (&once))
++    {
++      char *session = NULL;
++      if (sd_pid_get_session (getpid (), &session) == 0)
++        {
++          sd_session_get_seat (session, &seat);
++          free (session);
++          /* we intentionally leak seat here... */
++        }
++      g_once_init_leave (&once, (gsize) 1);
++    }
++  return seat;
++}
++
++#else
++
++static const gchar *
++get_seat (void)
++{
++  return NULL;
++}
++
++#endif
++
++gboolean
++gvfs_udisks2_utils_is_drive_on_our_seat (UDisksDrive *drive)
++{
++  gboolean ret = FALSE;
++  const gchar *seat;
++  const gchar *drive_seat = NULL;
++
++  /* assume our own seat if we don't have seat-support or it doesn't work */
++  seat = get_seat ();
++  if (seat == NULL)
++    {
++      ret = TRUE;
++      goto out;
++    }
++
++  /* If the device is not tagged, assume that udisks does not have
++   * working seat-support... so just assume it's available at our
++   * seat.
++   *
++   * Note that seat support was added in udisks 1.95.0 (and so was the
++   * UDISKS_CHECK_VERSION macro) - for now, be compatible with older
++   * versions instead of bumping requirement in configure.ac
++   */
++#ifdef UDISKS_CHECK_VERSION
++# if UDISKS_CHECK_VERSION(1,95,0)
++  drive_seat = udisks_drive_get_seat (drive);
++# endif
++#endif
++  if (drive_seat == NULL || strlen (drive_seat) == 0)
++    {
++      ret = TRUE;
++      goto out;
++    }
++
++  /* "all" is special, it means the device is available on any seat */
++  if (g_strcmp0 (drive_seat, "all") == 0)
++    {
++      ret = TRUE;
++      goto out;
++    }
++
++  /* Otherwise, check if it's on our seat */
++  if (g_strcmp0 (seat, drive_seat) == 0)
++    ret = TRUE;
++
++ out:
++  return ret;
++}
+diff --git a/monitor/udisks2/gvfsudisks2utils.h b/monitor/udisks2/gvfsudisks2utils.h
+index 2b6dc3c..1965883 100644
+--- a/monitor/udisks2/gvfsudisks2utils.h
++++ b/monitor/udisks2/gvfsudisks2utils.h
+@@ -50,6 +50,8 @@ gboolean gvfs_udisks2_utils_spawn_finish (GAsyncResult   *res,
+                                           gchar         **out_standard_error,
+                                           GError        **error);
+ 
++gboolean gvfs_udisks2_utils_is_drive_on_our_seat (UDisksDrive *drive);
++
+ 
+ G_END_DECLS
+ 
+diff --git a/monitor/udisks2/gvfsudisks2volume.c b/monitor/udisks2/gvfsudisks2volume.c
+index 243dc14..a1c7fa4 100644
+--- a/monitor/udisks2/gvfsudisks2volume.c
++++ b/monitor/udisks2/gvfsudisks2volume.c
+@@ -36,41 +36,6 @@
+ #include "gvfsudisks2mount.h"
+ #include "gvfsudisks2utils.h"
+ 
+-
+-#if defined(HAVE_LIBSYSTEMD_LOGIN)
+-#include <systemd/sd-login.h>
+-
+-static const gchar *
+-get_seat (void)
+-{
+-  static gsize once = 0;
+-  static char *seat = NULL;
+-
+-  if (g_once_init_enter (&once))
+-    {
+-      char *session = NULL;
+-      if (sd_pid_get_session (getpid (), &session) == 0)
+-        {
+-          sd_session_get_seat (session, &seat);
+-          /* we intentionally leak seat here... */
+-        }
+-      g_once_init_leave (&once, (gsize) 1);
+-    }
+-  return seat;
+-}
+-
+-#else
+-
+-static const gchar *
+-get_seat (void)
+-{
+-  return NULL;
+-}
+-
+-#endif
+-
+-
+-
+ typedef struct _GVfsUDisks2VolumeClass GVfsUDisks2VolumeClass;
+ 
+ struct _GVfsUDisks2VolumeClass
+@@ -213,43 +178,6 @@ apply_options_from_fstab (GVfsUDisks2Volume *volume,
+ }
+ 
+ static gboolean
+-drive_is_on_our_seat (UDisksDrive *drive)
+-{
+-  gboolean ret = FALSE;
+-  const gchar *seat;
+-  const gchar *drive_seat = NULL;
+-
+-  /* assume our own seat if we don't have seat-support or it doesn't work */
+-  seat = get_seat ();
+-  if (seat == NULL)
+-    {
+-      ret = TRUE;
+-      goto out;
+-    }
+-
+-  /* Assume seat0 if a) device is not tagged; or b) udisks does not
+-   * have seat-support.
+-   *
+-   * Note that seat support was added in udisks 1.95.0 (and so was the
+-   * UDISKS_CHECK_VERSION macro) - for now, be compatible with older
+-   * versions instead of bumping requirement in configure.ac
+-   */
+-#ifdef UDISKS_CHECK_VERSION
+-# if UDISKS_CHECK_VERSION(1,95,0)
+-  drive_seat = udisks_drive_get_seat (drive);
+-# endif
+-#endif
+-  if (drive_seat == NULL || strlen (drive_seat) == 0)
+-    drive_seat = "seat0";
+-
+-  if (g_strcmp0 (seat, drive_seat) == 0)
+-    ret = TRUE;
+-
+- out:
+-  return ret;
+-}
+-
+-static gboolean
+ update_volume (GVfsUDisks2Volume *volume)
+ {
+   gboolean changed;
+@@ -387,7 +315,7 @@ update_volume (GVfsUDisks2Volume *volume)
+             g_object_unref (media_icon);
+ 
+           /* Only automount drives attached to the same seat as we're running on */
+-          if (drive_is_on_our_seat (udisks_drive))
++          if (gvfs_udisks2_utils_is_drive_on_our_seat (udisks_drive))
+             {
+               /* Only automount filesystems from drives of known types/interconnects:
+                *
+diff --git a/monitor/udisks2/gvfsudisks2volumemonitor.c b/monitor/udisks2/gvfsudisks2volumemonitor.c
+index 1ea86b2..2826164 100644
+--- a/monitor/udisks2/gvfsudisks2volumemonitor.c
++++ b/monitor/udisks2/gvfsudisks2volumemonitor.c
+@@ -805,6 +805,9 @@ should_include_volume_check_configuration (GVfsUDisks2VolumeMonitor *monitor,
+   return ret;
+ }
+ 
++static gboolean should_include_drive (GVfsUDisks2VolumeMonitor *monitor,
++                                      UDisksDrive              *drive);
++
+ static gboolean
+ should_include_volume (GVfsUDisks2VolumeMonitor *monitor,
+                        UDisksBlock              *block,
+@@ -813,12 +816,23 @@ should_include_volume (GVfsUDisks2VolumeMonitor *monitor,
+   gboolean ret = FALSE;
+   GDBusObject *object;
+   UDisksFilesystem *filesystem;
++  UDisksDrive *udisks_drive = NULL;
+   const gchar* const *mount_points;
+ 
+   /* Block:Ignore trumps everything */
+   if (udisks_block_get_hint_ignore (block))
+     goto out;
+ 
++  /* ignore the volume if the drive is ignored */
++  udisks_drive = udisks_client_get_drive_for_block (monitor->client, block);
++  if (udisks_drive != NULL)
++    {
++      if (!should_include_drive (monitor, udisks_drive))
++        {
++          goto out;
++        }
++    }
++
+   /* show encrypted volumes... */
+   if (g_strcmp0 (udisks_block_get_id_type (block), "crypto_LUKS") == 0)
+     {
+@@ -879,6 +893,7 @@ should_include_volume (GVfsUDisks2VolumeMonitor *monitor,
+   ret = TRUE;
+ 
+  out:
++  g_clear_object (&udisks_drive);
+   return ret;
+ }
+ 
+@@ -888,17 +903,26 @@ static gboolean
+ should_include_drive (GVfsUDisks2VolumeMonitor *monitor,
+                       UDisksDrive              *drive)
+ {
+-  /* NOTE: For now, we just include all detected drives. This is
+-   * probably wrong - non-removable drives without anything visible
+-   * (such RAID components) should probably not be shown. Then again,
+-   * the GNOME 3 user interface doesn't really show GDrive instances
+-   * except for in the computer:/// location in Nautilus.
+-   *
+-   * Therefore, if device is non-removable, maybe only show it, if it
+-   * has more visible devices... this is the gdu volume monitor
+-   * behavior.
++  gboolean ret = TRUE;
++
++  /* Don't include drives on other seats */
++  if (!gvfs_udisks2_utils_is_drive_on_our_seat (drive))
++    {
++      ret = FALSE;
++      goto out;
++    }
++
++  /* NOTE: For now, we just include a drive no matter its
++   * content. This may be wrong ... for example non-removable drives
++   * without anything visible (such RAID components) should probably
++   * not be shown. Then again, the GNOME 3 user interface doesn't
++   * really show GDrive instances except for in the computer:///
++   * location in Nautilus....
+    */
+-  return TRUE;
++
++ out:
++
++  return ret;
+ }
+ 
+ /* ---------------------------------------------------------------------------------------------------- */
+@@ -1743,6 +1767,9 @@ update_discs (GVfsUDisks2VolumeMonitor  *monitor,
+       if (udisks_drive == NULL)
+         continue;
+ 
++      if (!should_include_drive (monitor, udisks_drive))
++        continue;
++
+       /* only consider blank and audio discs */
+       if (!(udisks_drive_get_optical_blank (udisks_drive) ||
+             udisks_drive_get_optical_num_audio_tracks (udisks_drive) > 0))
+-- 
+1.7.3.4
+
diff --git a/gvfs.spec b/gvfs.spec
index 0be41a7..a8dc224 100644
--- a/gvfs.spec
+++ b/gvfs.spec
@@ -1,7 +1,7 @@
 Summary: Backends for the gio framework in GLib
 Name: gvfs
-Version: 1.12.1
-Release: 3%{?dist}
+Version: 1.12.2
+Release: 1%{?dist}
 License: LGPLv2+
 Group: System Environment/Libraries
 URL: http://www.gtk.org
@@ -24,6 +24,7 @@ BuildRequires: libudisks2-devel
 Requires: udisks2
 BuildRequires: expat-devel
 BuildRequires: libbluray-devel
+BuildRequires: systemd-devel >= 44
 
 Requires(post): desktop-file-utils
 Requires(postun): desktop-file-utils
@@ -35,6 +36,12 @@ BuildRequires: libtool
 # http://bugzilla.gnome.org/show_bug.cgi?id=567235
 Patch0: gvfs-archive-integration.patch
 
+# from master
+Patch1: gvfs-1.13.0-multiseat-dont-set-should_automount.patch
+Patch2: gvfs-1.13.0-multiseat-dont-show-drives.patch
+Patch3: gvfs-1.13.0-multiseat-dont-automount-if-shared.patch
+Patch4: gvfs-1.13.0-multiseat-LUKS-encryption-pass.patch
+
 Obsoletes: gnome-mount <= 0.8
 Obsoletes: gnome-mount-nautilus-properties <= 0.8
 
@@ -148,6 +155,10 @@ to applications using gvfs.
 %prep
 %setup -q
 %patch0 -p1 -b .archive-integration
+%patch1 -p1 -b .multiseat-dont-set-should_automount
+%patch2 -p1 -b .multiseat-dont-show-drives
+%patch3 -p1 -b .multiseat-dont-automount-if-shared
+%patch4 -p1 -b .multiseat-LUKS-encryption-pass
 
 %build
 
@@ -318,6 +329,10 @@ killall -USR1 gvfsd >&/dev/null || :
 %{_datadir}/gvfs/mounts/afp-browse.mount
 
 %changelog
+* Fri Apr 27 2012 Tomas Bzatek <tbzatek at redhat.com> - 1.12.2-1
+- Update to 1.12.2
+- Backport multiseat patches from master
+
 * Tue Apr 24 2012 Kalev Lember <kalevlember at gmail.com> - 1.12.1-3
 - Silence rpm scriptlet output
 
diff --git a/sources b/sources
index 98f2cca..a29ea2d 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-8fddedf1e6bf66a8228d5476c8ec78ad  gvfs-1.12.1.tar.xz
+fc828681caa5f26a39bfb661c40d29e9  gvfs-1.12.2.tar.xz


More information about the scm-commits mailing list