summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Soriano <csoriano@gnome.org>2016-11-04 11:47:39 +0100
committerCarlos Soriano <csoriano@gnome.org>2016-11-21 15:56:38 +0100
commit5db7a2952a8091cb11ec74e0fd87cd1814252da2 (patch)
tree3f95d38e6bd1f90ffd858786a370d961076e351e
parent344e59c7326912562b18a0e3c906e2a5e0ea56fc (diff)
downloadnautilus-5db7a2952a8091cb11ec74e0fd87cd1814252da2.tar.gz
mime-actions: support admin backend
Until now Nautilus was not able to handle files where the user had no permissions. An error was reported. The only way for a user to handle those files were to start Nautilus with sudo, which is something that shoudl be avoided for security reasons. On Wayland, is not even possible to launch an application with sudo, so this is no longer available and therefor no way to handle files with no permissions. On 3.22 gvfs added an admin backend with integration with Polkit, so a file withouth permissions can be accessed using this backend if the user has the root password. Add support for the admin backend in Nautilus, where a file will be opened using it if cannot be read. There still work to do, basically implement the operations with this backend too and refactor the code to be able to open from nautilus application command line also a file withouth permissions. https://bugzilla.gnome.org/show_bug.cgi?id=773937
-rw-r--r--src/nautilus-directory.c13
-rw-r--r--src/nautilus-directory.h1
-rw-r--r--src/nautilus-file.c17
-rw-r--r--src/nautilus-file.h1
-rw-r--r--src/nautilus-mime-actions.c26
5 files changed, 51 insertions, 7 deletions
diff --git a/src/nautilus-directory.c b/src/nautilus-directory.c
index 268c463f4..c2ff9111c 100644
--- a/src/nautilus-directory.c
+++ b/src/nautilus-directory.c
@@ -772,6 +772,19 @@ nautilus_directory_is_remote (NautilusDirectory *directory)
}
gboolean
+nautilus_directory_is_in_admin (NautilusDirectory *directory)
+{
+ g_assert (NAUTILUS_IS_DIRECTORY (directory));
+
+ if (directory->details->location == NULL)
+ {
+ return FALSE;
+ }
+
+ return g_file_has_uri_scheme (directory->details->location, "admin");
+}
+
+gboolean
nautilus_directory_are_all_files_seen (NautilusDirectory *directory)
{
g_return_val_if_fail (NAUTILUS_IS_DIRECTORY (directory), FALSE);
diff --git a/src/nautilus-directory.h b/src/nautilus-directory.h
index dc8c73253..68a398ef4 100644
--- a/src/nautilus-directory.h
+++ b/src/nautilus-directory.h
@@ -225,6 +225,7 @@ gboolean nautilus_directory_is_local_or_fuse (NautilusDirector
gboolean nautilus_directory_is_in_trash (NautilusDirectory *directory);
gboolean nautilus_directory_is_in_recent (NautilusDirectory *directory);
+gboolean nautilus_directory_is_in_admin (NautilusDirectory *directory);
gboolean nautilus_directory_is_remote (NautilusDirectory *directory);
/* Return false if directory contains anything besides a Nautilus metafile.
diff --git a/src/nautilus-file.c b/src/nautilus-file.c
index e662b4ca1..c162b0825 100644
--- a/src/nautilus-file.c
+++ b/src/nautilus-file.c
@@ -8242,6 +8242,23 @@ nautilus_file_is_other_locations (NautilusFile *file)
return is_other_locations;
}
+/**
+ * nautilus_file_is_in_admin
+ *
+ * Check if this file is using admin backend.
+ * @file: NautilusFile representing the file in question.
+ *
+ * Returns: TRUE if @file is using admin backend.
+ *
+ **/
+gboolean
+nautilus_file_is_in_admin (NautilusFile *file)
+{
+ g_assert (NAUTILUS_IS_FILE (file));
+
+ return nautilus_directory_is_in_admin (file->details->directory);
+}
+
GError *
nautilus_file_get_file_info_error (NautilusFile *file)
{
diff --git a/src/nautilus-file.h b/src/nautilus-file.h
index 07b3b50d1..a5943de1b 100644
--- a/src/nautilus-file.h
+++ b/src/nautilus-file.h
@@ -214,6 +214,7 @@ gboolean nautilus_file_is_archive (NautilusFile *file);
gboolean nautilus_file_is_in_search (NautilusFile *file);
gboolean nautilus_file_is_in_trash (NautilusFile *file);
gboolean nautilus_file_is_in_recent (NautilusFile *file);
+gboolean nautilus_file_is_in_admin (NautilusFile *file);
gboolean nautilus_file_is_remote (NautilusFile *file);
gboolean nautilus_file_is_other_locations (NautilusFile *file);
gboolean nautilus_file_is_home (NautilusFile *file);
diff --git a/src/nautilus-mime-actions.c b/src/nautilus-mime-actions.c
index 4a94d4116..3ac8b164f 100644
--- a/src/nautilus-mime-actions.c
+++ b/src/nautilus-mime-actions.c
@@ -1838,19 +1838,34 @@ activate_files (ActivateParameters *parameters)
for (l = open_in_view_files; l != NULL; l = l->next)
{
- GFile *f;
+ g_autofree char *uri = NULL;
+ g_autoptr (GFile) location = NULL;
+ g_autoptr (GFile) location_with_permissions = NULL;
/* The ui should ask for navigation or object windows
* depending on what the current one is */
file = NAUTILUS_FILE (l->data);
-
uri = nautilus_file_get_activation_uri (file);
- f = g_file_new_for_uri (uri);
+ location = g_file_new_for_uri (uri);
+ if (g_file_is_native (location) &&
+ (nautilus_file_is_in_admin (file) ||
+ !nautilus_file_can_read (file) ||
+ !nautilus_file_can_execute (file)))
+ {
+ g_autofree gchar *file_path = NULL;
+
+ g_free (uri);
+
+ file_path = g_file_get_path (location);
+ uri = g_strconcat ("admin://", file_path, NULL);
+ }
+
+ location_with_permissions = g_file_new_for_uri (uri);
/* FIXME: we need to pass the parent_window, but we only use it for the current active window,
* which nautilus-application should take care of. However is not working and creating regressions
* in some cases. Until we figure out what's going on, continue to use the parameters->slot
* to make splicit the window we want to use for activating the files */
nautilus_application_open_location_full (NAUTILUS_APPLICATION (g_application_get_default ()),
- f, flags, NULL, NULL, parameters->slot);
+ location_with_permissions, flags, NULL, NULL, parameters->slot);
/* close only the window from which the action was launched and then open
* tabs/windows (depending on parameters->flags) */
@@ -1867,9 +1882,6 @@ activate_files (ActivateParameters *parameters)
closed_window = TRUE;
}
-
- g_object_unref (f);
- g_free (uri);
}
}