123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- From d5dfd823c94045488aef8727c553f1e0f7666b90 Mon Sep 17 00:00:00 2001
- From: Ondrej Holy <oholy@redhat.com>
- Date: Fri, 24 May 2019 09:43:43 +0200
- Subject: [PATCH] admin: Ensure correct ownership when moving to file:// uri
- User and group is not restored properly when moving (or copying with
- G_FILE_COPY_ALL_METADATA) from admin:// to file://, because it is handled
- by GIO fallback code, which doesn't run with root permissions. Let's
- handle this case with pull method to ensure correct ownership.
- [Retrieved from:
- https://gitlab.gnome.org/GNOME/gvfs/commit/d5dfd823c94045488aef8727c553f1e0f7666b90]
- Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
- ---
- daemon/gvfsbackendadmin.c | 46 +++++++++++++++++++++++++++++++++++++++
- 1 file changed, 46 insertions(+)
- diff --git a/daemon/gvfsbackendadmin.c b/daemon/gvfsbackendadmin.c
- index 32b51b1a..9a7e8295 100644
- --- a/daemon/gvfsbackendadmin.c
- +++ b/daemon/gvfsbackendadmin.c
- @@ -807,6 +807,51 @@ do_move (GVfsBackend *backend,
- complete_job (job, error);
- }
-
- +static void
- +do_pull (GVfsBackend *backend,
- + GVfsJobPull *pull_job,
- + const char *source,
- + const char *local_path,
- + GFileCopyFlags flags,
- + gboolean remove_source,
- + GFileProgressCallback progress_callback,
- + gpointer progress_callback_data)
- +{
- + GVfsBackendAdmin *self = G_VFS_BACKEND_ADMIN (backend);
- + GVfsJob *job = G_VFS_JOB (pull_job);
- + GError *error = NULL;
- + GFile *src_file, *dst_file;
- +
- + /* Pull method is necessary when user/group needs to be restored, return
- + * G_IO_ERROR_NOT_SUPPORTED in other cases to proceed with the fallback code.
- + */
- + if (!(flags & G_FILE_COPY_ALL_METADATA))
- + {
- + g_vfs_job_failed_literal (G_VFS_JOB (job), G_IO_ERROR,
- + G_IO_ERROR_NOT_SUPPORTED,
- + _("Operation not supported"));
- + return;
- + }
- +
- + if (!check_permission (self, job))
- + return;
- +
- + src_file = g_file_new_for_path (source);
- + dst_file = g_file_new_for_path (local_path);
- +
- + if (remove_source)
- + g_file_move (src_file, dst_file, flags, job->cancellable,
- + progress_callback, progress_callback_data, &error);
- + else
- + g_file_copy (src_file, dst_file, flags, job->cancellable,
- + progress_callback, progress_callback_data, &error);
- +
- + g_object_unref (src_file);
- + g_object_unref (dst_file);
- +
- + complete_job (job, error);
- +}
- +
- static void
- do_query_settable_attributes (GVfsBackend *backend,
- GVfsJobQueryAttributes *query_job,
- @@ -927,6 +972,7 @@ g_vfs_backend_admin_class_init (GVfsBackendAdminClass * klass)
- backend_class->set_attribute = do_set_attribute;
- backend_class->delete = do_delete;
- backend_class->move = do_move;
- + backend_class->pull = do_pull;
- backend_class->query_settable_attributes = do_query_settable_attributes;
- backend_class->query_writable_namespaces = do_query_writable_namespaces;
- }
- --
- 2.24.1
|