[gvfs] google: Check ownership in is_owner() without additional HTTP request



commit 212f531ee73686cde7f1cbf93e45f961845ac5eb
Author: Mayank Sharma <mayank8019 gmail com>
Date:   Tue Jul 9 14:55:10 2019 +0530

    google: Check ownership in is_owner() without additional HTTP request
    
    Earlier, we were fetching ACL feed of an entry and then checking the
    ownership by comparing account identity with elements from this feed.
    This was slow due to Network IO being performed while checking ownership.
    
    We now use GDataAuthors on a GDataEntry to get the list of "owners" of
    the file. We then use the GoaObject stored on GDataGoaAuthorizer to get
    the account which is being used by GDataService. Finally, we take the
    email address of account and compare them to check the ownership. This
    method now runs without anymore additional network requests.

 daemon/gvfsbackendgoogle.c | 60 +++++++++++-----------------------------------
 1 file changed, 14 insertions(+), 46 deletions(-)
---
diff --git a/daemon/gvfsbackendgoogle.c b/daemon/gvfsbackendgoogle.c
index e60ad510..35cea1dd 100644
--- a/daemon/gvfsbackendgoogle.c
+++ b/daemon/gvfsbackendgoogle.c
@@ -357,50 +357,27 @@ get_parent_ids (GVfsBackendGoogle *self,
 /* ---------------------------------------------------------------------------------------------------- */
 
 static gboolean
-is_owner (GVfsBackendGoogle  *self,
-          GDataEntry         *entry,
-          GCancellable       *cancellable,
-          GError            **error)
+is_owner (GVfsBackendGoogle *self, GDataEntry *entry)
 {
-  GDataFeed *acl_feed;
-  GDataAccessRule *rule;
   GList *l;
-  GError *local_error = NULL;
-  gboolean ret_val = FALSE;
-
-  acl_feed = gdata_access_handler_get_rules (GDATA_ACCESS_HANDLER (GDATA_DOCUMENTS_ENTRY (entry)),
-                                             GDATA_SERVICE (self->service),
-                                             cancellable,
-                                             NULL,
-                                             NULL,
-                                             &local_error);
-
-  if (local_error != NULL)
-    {
-      sanitize_error (&local_error);
-      g_propagate_error (error, local_error);
+  GDataGoaAuthorizer *goa_authorizer;
+  GoaAccount *account;
+  const gchar *account_identity;
 
-      goto out;
-    }
+  goa_authorizer = GDATA_GOA_AUTHORIZER (gdata_service_get_authorizer (GDATA_SERVICE (self->service)));
+  account = goa_object_peek_account (gdata_goa_authorizer_get_goa_object (goa_authorizer));
+  account_identity = goa_account_get_identity (account);
 
-  for (l = gdata_feed_get_entries (acl_feed); l != NULL; l = l->next)
+  for (l = gdata_entry_get_authors (entry); l != NULL; l = l->next)
     {
-      const gchar *scope_value, *scope_type, *role;
-      rule = GDATA_ACCESS_RULE (l->data);
-      role = gdata_access_rule_get_role (rule);
-      gdata_access_rule_get_scope (rule, &scope_type, &scope_value);
+      GDataAuthor *author = GDATA_AUTHOR (l->data);
 
-      if (g_strcmp0 (scope_value, self->account_identity) == 0 &&
-          g_strcmp0 (role, GDATA_DOCUMENTS_ACCESS_ROLE_OWNER) == 0)
-        {
-          ret_val = TRUE;
-          goto out;
-        }
+      if (g_strcmp0 (gdata_author_get_email_address (author), account_identity) == 0) {
+          return TRUE;
+      }
     }
 
-  out:
-   g_clear_object (&acl_feed);
-   return ret_val;
+  return FALSE;
 }
 
 /* ---------------------------------------------------------------------------------------------------- */
@@ -1353,7 +1330,6 @@ g_vfs_backend_google_delete (GVfsBackend   *_self,
   GError *error;
   gchar *entry_path = NULL;
   GList *parent_ids;
-  gboolean owner = FALSE;
   guint parent_ids_len;
 
   g_rec_mutex_lock (&self->mutex);
@@ -1390,17 +1366,9 @@ g_vfs_backend_google_delete (GVfsBackend   *_self,
 
   error = NULL;
 
-  owner = is_owner (self, GDATA_ENTRY (entry), cancellable, &error);
-  if (error != NULL)
-    {
-      g_vfs_job_failed_from_error (G_VFS_JOB (job), error);
-      g_error_free (error);
-      goto out;
-    }
-
   parent_ids = get_parent_ids (self, entry);
   parent_ids_len = g_list_length (parent_ids);
-  if (parent_ids_len > 1 || !owner)
+  if (parent_ids_len > 1 || !is_owner (self, GDATA_ENTRY (entry)))
     {
       /* gdata_documents_service_remove_entry_from_folder () returns the
        * updated entry variable provided as argument with an increased ref.


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