[nautilus] mime-actions: support admin backend



commit 5db7a2952a8091cb11ec74e0fd87cd1814252da2
Author: Carlos Soriano <csoriano gnome org>
Date:   Fri Nov 4 11:47:39 2016 +0100

    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

 src/nautilus-directory.c    |   13 +++++++++++++
 src/nautilus-directory.h    |    1 +
 src/nautilus-file.c         |   17 +++++++++++++++++
 src/nautilus-file.h         |    1 +
 src/nautilus-mime-actions.c |   26 +++++++++++++++++++-------
 5 files changed, 51 insertions(+), 7 deletions(-)
---
diff --git a/src/nautilus-directory.c b/src/nautilus-directory.c
index 268c463..c2ff911 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 dc8c732..68a398e 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 e662b4c..c162b08 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 07b3b50..a5943de 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 4a94d41..3ac8b16 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);
         }
     }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]