summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--daemon/admin.mount.in4
-rw-r--r--daemon/gvfsbackendadmin.c22
-rw-r--r--daemon/mount.c37
3 files changed, 54 insertions, 9 deletions
diff --git a/daemon/admin.mount.in b/daemon/admin.mount.in
index cbdb164e..4fb97701 100644
--- a/daemon/admin.mount.in
+++ b/daemon/admin.mount.in
@@ -2,4 +2,6 @@
Type=admin
# Add a dummy argument after pkexec, or '/bin/sh -c' will eat the first argument in '$@'
Exec=/bin/sh -c 'pkexec @libexecdir@/gvfsd-admin "$@" --address $DBUS_SESSION_BUS_ADDRESS' gvfsd-admin
-AutoMount=true
+AutoMount=false
+DBusName=org.gtk.vfs.mountpoint_admin
+MountPerClient=true
diff --git a/daemon/gvfsbackendadmin.c b/daemon/gvfsbackendadmin.c
index 66c93797..d67353da 100644
--- a/daemon/gvfsbackendadmin.c
+++ b/daemon/gvfsbackendadmin.c
@@ -835,6 +835,23 @@ do_mount (GVfsBackend *backend,
GVfsBackendAdmin *self = G_VFS_BACKEND_ADMIN (backend);
GVfsJob *job = G_VFS_JOB (mount_job);
GError *error = NULL;
+ GMountSpec *real_spec;
+ const gchar *client;
+
+ client = g_mount_spec_get (mount_spec, "client");
+ if (client == NULL)
+ {
+ g_vfs_job_failed_literal (job, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT,
+ _("Invalid mount spec"));
+ return;
+ }
+
+ g_debug ("client=%s\n", client);
+
+ real_spec = g_mount_spec_new ("admin");
+ g_mount_spec_set (real_spec, "client", client);
+ g_vfs_backend_set_mount_spec (backend, real_spec);
+ g_mount_spec_unref (real_spec);
self->authority = polkit_authority_get_sync (NULL, &error);
@@ -880,15 +897,10 @@ static void
g_vfs_backend_admin_init (GVfsBackendAdmin *self)
{
GVfsBackend *backend = G_VFS_BACKEND (self);
- GMountSpec *mount_spec;
g_mutex_init (&self->polkit_mutex);
g_vfs_backend_set_user_visible (backend, FALSE);
- mount_spec = g_mount_spec_new ("admin");
- g_vfs_backend_set_mount_spec (backend, mount_spec);
- g_mount_spec_unref (mount_spec);
-
g_vfs_backend_set_icon_name (backend, "folder");
g_vfs_backend_set_symbolic_icon_name (backend, "folder-symbolic");
}
diff --git a/daemon/mount.c b/daemon/mount.c
index 5bab324d..192923ef 100644
--- a/daemon/mount.c
+++ b/daemon/mount.c
@@ -64,6 +64,7 @@ typedef struct {
char **scheme_aliases;
int default_port;
gboolean hostname_is_inet;
+ gboolean mount_per_client;
} VfsMountable;
typedef void (*MountCallback) (VfsMountable *mountable,
@@ -535,6 +536,7 @@ read_mountable_config (void)
g_key_file_get_string_list (keyfile, "Mount", "SchemeAliases", NULL, NULL);
mountable->default_port = g_key_file_get_integer (keyfile, "Mount", "DefaultPort", NULL);
mountable->hostname_is_inet = g_key_file_get_boolean (keyfile, "Mount", "HostnameIsInetAddress", NULL);
+ mountable->mount_per_client = g_key_file_get_boolean (keyfile, "Mount", "MountPerClient", NULL);
if (mountable->scheme == NULL)
mountable->scheme = g_strdup (mountable->type);
@@ -774,6 +776,20 @@ lookup_mount (GVfsDBusMountTracker *object,
vfs_mount_to_dbus (mount));
}
+static void
+sanitize_spec (GMountSpec *spec, GDBusMethodInvocation *invocation)
+{
+ const gchar *client;
+ VfsMountable *mountable;
+
+ mountable = lookup_mountable (spec);
+ if (mountable && mountable->mount_per_client)
+ {
+ client = g_dbus_method_invocation_get_sender (invocation);
+ g_mount_spec_set (spec, "client", client);
+ }
+}
+
static gboolean
handle_lookup_mount (GVfsDBusMountTracker *object,
GDBusMethodInvocation *invocation,
@@ -786,6 +802,7 @@ handle_lookup_mount (GVfsDBusMountTracker *object,
if (spec != NULL)
{
+ sanitize_spec (spec, invocation);
lookup_mount (object, invocation, spec, TRUE);
g_mount_spec_unref (spec);
}
@@ -822,16 +839,28 @@ handle_lookup_mount_by_fuse_path (GVfsDBusMountTracker *object,
static void
build_mounts_array (GVariantBuilder *mounts_array,
- gboolean user_visible_only)
+ gboolean user_visible_only,
+ GDBusMethodInvocation *invocation)
{
GList *l;
VfsMount *mount;
+ VfsMountable *mountable;
g_variant_builder_init (mounts_array, G_VARIANT_TYPE (VFS_MOUNT_ARRAY_DBUS_STRUCT_TYPE));
for (l = mounts; l != NULL; l = l->next)
{
mount = l->data;
+ mountable = lookup_mountable (mount->mount_spec);
+ if (mountable && mountable->mount_per_client)
+ {
+ const gchar *client;
+
+ client = g_dbus_method_invocation_get_sender (invocation);
+ if (g_strcmp0 (g_mount_spec_get (mount->mount_spec, "client"), client) != 0)
+ continue;
+ }
+
if (!user_visible_only || mount->user_visible)
g_variant_builder_add_value (mounts_array, vfs_mount_to_dbus (mount));
}
@@ -844,7 +873,7 @@ handle_list_mounts (GVfsDBusMountTracker *object,
{
GVariantBuilder mounts_array;
- build_mounts_array (&mounts_array, FALSE);
+ build_mounts_array (&mounts_array, FALSE, invocation);
gvfs_dbus_mount_tracker_complete_list_mounts (object, invocation,
g_variant_builder_end (&mounts_array));
@@ -860,7 +889,7 @@ handle_list_mounts2 (GVfsDBusMountTracker *object,
{
GVariantBuilder mounts_array;
- build_mounts_array (&mounts_array, arg_user_visible_only);
+ build_mounts_array (&mounts_array, arg_user_visible_only, invocation);
gvfs_dbus_mount_tracker_complete_list_mounts2 (object, invocation,
g_variant_builder_end (&mounts_array));
@@ -903,6 +932,8 @@ handle_mount_location (GVfsDBusMountTracker *object,
else
{
VfsMount *mount;
+
+ sanitize_spec (spec, invocation);
mount = match_vfs_mount (spec);
if (mount != NULL)