[epiphany/wip/sync: 5/6] web-extension: Create new sync service when UI process changes sync user



commit d9f9e13cef51b9af01fdf92848a5d58000354d5b
Author: Gabriel Ivascu <ivascu gabriel59 gmail com>
Date:   Wed May 3 19:38:05 2017 +0300

    web-extension: Create new sync service when UI process changes sync user
    
    Saved passwords are added from the web process in EphyWebExtension.
    Because of this, EphyWebExtension needs to have its own instance of sync
    service to upload newly added passwords. Because the sign in/sign out
    happens in the other sync service from the UI process, the web process
    needs to figure out on its own when the sync user has changed (i.e. the
    user signed in or signed out) and create a new sync service that will
    load the new user-specific secret data from disk (which was previously
    stored by the sync service from the UI process at sign in). This way the
    passwords added in the future are uploaded to the correct sync user and
    not to an invalid user.

 embed/web-extension/ephy-web-extension.c |   55 +++++++++++++++++++++++++++--
 1 files changed, 51 insertions(+), 4 deletions(-)
---
diff --git a/embed/web-extension/ephy-web-extension.c b/embed/web-extension/ephy-web-extension.c
index bcc3446..5637fcb 100644
--- a/embed/web-extension/ephy-web-extension.c
+++ b/embed/web-extension/ephy-web-extension.c
@@ -52,12 +52,15 @@ struct _EphyWebExtension {
   GDBusConnection *dbus_connection;
   GArray *page_created_signals_pending;
 
-  EphySyncService *sync_service;
   EphyPasswordManager *password_manager;
   GHashTable *form_auth_data_save_requests;
   EphyWebOverviewModel *overview_model;
   EphyPermissionsManager *permissions_manager;
   EphyUriTester *uri_tester;
+
+  EphySyncService *sync_service;
+  char *sync_user;
+  guint source_id;
 };
 
 static const char introspection_xml[] =
@@ -1456,6 +1459,7 @@ ephy_web_extension_dispose (GObject *object)
   g_clear_object (&extension->permissions_manager);
   g_clear_object (&extension->password_manager);
   g_clear_object (&extension->sync_service);
+  g_clear_pointer (&extension->sync_user, g_free);
 
   if (extension->form_auth_data_save_requests) {
     g_hash_table_destroy (extension->form_auth_data_save_requests);
@@ -1467,6 +1471,11 @@ ephy_web_extension_dispose (GObject *object)
     extension->page_created_signals_pending = NULL;
   }
 
+  if (extension->source_id != 0) {
+    g_source_remove (extension->source_id);
+    extension->source_id = 0;
+  }
+
   g_clear_object (&extension->dbus_connection);
   g_clear_object (&extension->extension);
 
@@ -1548,6 +1557,35 @@ authorize_authenticated_peer_cb (GDBusAuthObserver *observer,
   return ephy_dbus_peer_is_authorized (credentials);
 }
 
+static gboolean
+check_sync_user (gpointer user_data)
+{
+  EphyWebExtension *extension = ephy_web_extension_get ();
+  char *sync_user = g_settings_get_string (EPHY_SETTINGS_SYNC, EPHY_PREFS_SYNC_USER);
+
+  /* If the sync user has changed we need to destroy the previous sync service
+   * (which is no longer valid because the user specific data has been cleared)
+   * and create a new one which will load the new user specific data. This way
+   * we will correctly upload new saved passwords in the future. */
+  if (extension->sync_user && !g_strcmp0 (sync_user, "")) {
+    /* Signed out. */
+    ephy_sync_service_unregister_manager (extension->sync_service,
+                                          EPHY_SYNCHRONIZABLE_MANAGER (extension->password_manager));
+    g_clear_object (&extension->sync_service);
+    g_clear_pointer (&extension->sync_user, g_free);
+  } else if (!extension->sync_user && g_strcmp0 (sync_user, "")) {
+    /* Signed in. */
+    extension->sync_service = ephy_sync_service_new (FALSE);
+    ephy_sync_service_register_manager (extension->sync_service,
+                                        EPHY_SYNCHRONIZABLE_MANAGER (extension->password_manager));
+    extension->sync_user = g_strdup (ephy_sync_service_get_sync_user (extension->sync_service));
+  }
+
+  g_free (sync_user);
+
+  return G_SOURCE_CONTINUE;
+}
+
 void
 ephy_web_extension_initialize (EphyWebExtension   *extension,
                                WebKitWebExtension *wk_extension,
@@ -1566,10 +1604,19 @@ ephy_web_extension_initialize (EphyWebExtension   *extension,
 
   extension->extension = g_object_ref (wk_extension);
   if (!is_private_profile) {
-    extension->sync_service = ephy_sync_service_new (FALSE);
+    char *sync_user = g_settings_get_string (EPHY_SETTINGS_SYNC,
+                                             EPHY_PREFS_SYNC_USER);
     extension->password_manager = ephy_password_manager_new ();
-    ephy_sync_service_register_manager (extension->sync_service,
-                                        EPHY_SYNCHRONIZABLE_MANAGER (extension->password_manager));
+
+    if (g_strcmp0 (sync_user, "")) {
+      extension->sync_service = ephy_sync_service_new (FALSE);
+      ephy_sync_service_register_manager (extension->sync_service,
+                                          EPHY_SYNCHRONIZABLE_MANAGER (extension->password_manager));
+      extension->sync_user = g_strdup (ephy_sync_service_get_sync_user (extension->sync_service));
+    }
+
+    extension->source_id = g_timeout_add_seconds (5, check_sync_user, extension);
+    g_free (sync_user);
   }
 
   extension->permissions_manager = ephy_permissions_manager_new ();


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