| 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 |
| |