plugins: add a separate parameter for token cache throughout the API
authorAlexander Kanavin <alex.kanavin@gmail.com>
Tue, 16 Jul 2013 20:51:56 +0000 (23:51 +0300)
committerAlexander Kanavin <alex.kanavin@gmail.com>
Tue, 16 Jul 2013 20:51:56 +0000 (23:51 +0300)
16 files changed:
include/gsignond/gsignond-plugin-interface.h
src/common/gsignond-plugin-interface.c
src/daemon/dbus/interfaces/com.google.code.AccountsSSO.gSingleSignOn.RemotePlugin.xml
src/daemon/gsignond-auth-session.c
src/daemon/gsignond-identity.c
src/daemon/plugins/gsignond-plugin-proxy.c
src/daemon/plugins/gsignond-plugin-proxy.h
src/daemon/plugins/gsignond-plugin-remote.c
src/daemon/plugins/plugind/gsignond-plugin-daemon.c
src/plugins/digest/gsignond-digest-plugin.c
src/plugins/password/gsignond-password-plugin.c
src/plugins/ssotest/gsignond-ssotest-plugin.c
test/plugins/digestplugintest.c
test/plugins/passwordplugintest.c
test/plugins/pluginproxytest.c
test/plugins/pluginremotetest.c

index 29bcdf2..1d07c34 100644 (file)
@@ -78,7 +78,8 @@ struct _GSignondPluginInterface {
 
     void (*cancel) (GSignondPlugin *self);
     void (*request_initial) (GSignondPlugin *self, 
-                     GSignondSessionData *session_data, 
+                     GSignondSessionData *session_data,
+                     GSignondDictionary *identity_method_cache, 
                      const gchar *mechanism);
     void (*request) (GSignondPlugin *self, 
                      GSignondSessionData *session_data);
@@ -96,6 +97,7 @@ gsignond_plugin_cancel (GSignondPlugin *self);
 void 
 gsignond_plugin_request_initial (GSignondPlugin *self, 
                               GSignondSessionData *session_data, 
+                              GSignondDictionary *identity_method_cache,
                               const gchar *mechanism);
 void 
 gsignond_plugin_request (GSignondPlugin *self, 
@@ -116,7 +118,7 @@ gsignond_plugin_response_final (GSignondPlugin *self,
                              GSignondSessionData *session_data);
 void 
 gsignond_plugin_store (GSignondPlugin *self, 
-                       GSignondDictionary *token_data);
+                       GSignondDictionary *identity_method_cache);
 void 
 gsignond_plugin_error (GSignondPlugin *self, GError *error);
 void 
index fa9d131..ee3b46c 100644 (file)
@@ -95,11 +95,13 @@ void gsignond_plugin_cancel (GSignondPlugin *self)
 
 void gsignond_plugin_request_initial (GSignondPlugin *self, 
                               GSignondSessionData *session_data, 
+                              GSignondDictionary *identity_method_cache,
                               const gchar *mechanism)
 {
     g_return_if_fail (GSIGNOND_IS_PLUGIN (self));
     
     GSIGNOND_PLUGIN_GET_INTERFACE (self)->request_initial (self, session_data,
+            identity_method_cache,
             mechanism);
 }
 
@@ -141,9 +143,9 @@ void gsignond_plugin_response_final (GSignondPlugin *self,
 }
 
 void gsignond_plugin_store (GSignondPlugin *self, 
-                            GSignondDictionary *token_data)
+                            GSignondDictionary *identity_method_cache)
 {
-    g_signal_emit (self, signals[STORE], 0, token_data);
+    g_signal_emit (self, signals[STORE], 0, identity_method_cache);
 }
 
 void gsignond_plugin_error (GSignondPlugin *self, GError *error)
index a7b97d2..ef09de0 100644 (file)
@@ -5,6 +5,7 @@
     </method>
     <method name="requestInitial">
       <arg name="sessionData" type="a{sv}" direction="in"/>
+      <arg name="identityMethodCache" type="a{sv}" direction="in"/>
       <arg name="mechanism" type="s" direction="in"/>
     </method>
     <method name="request">
index 2a5c199..649829e 100644 (file)
@@ -239,20 +239,13 @@ gsignond_auth_session_process (GSignondAuthSession *self,
         }
     }
 
-    /* pass token data to session data */
-    if (self->priv->token_data) {
-        GVariant *token_data = gsignond_dictionary_to_variant (self->priv->token_data);
-        /* FIXME: better add API GSignondSessionData to support(set/get) token data.
-                  That will be the cleaner solution */
-        gsignond_dictionary_set (session_data, "Token", token_data);
-    }
-
     _ProcessData * data = g_slice_new0 (_ProcessData);
     data->self = self;
     data->ready_cb = ready_cb;
     data->state_change_cb = state_change_cb;
     data->userdata = userdata;
     gsignond_plugin_proxy_process(self->priv->proxy, self, session_data,
+                                  self->priv->token_data,
                                   mechanism, data);
 
     return TRUE;
index f97ea32..f50ad5b 100644 (file)
@@ -523,7 +523,9 @@ gsignond_identity_get_auth_session (GSignondIdentity *identity,
     if ( (identity_id = gsignond_identity_info_get_id (identity->priv->info)) !=
             GSIGNOND_IDENTITY_INFO_NEW_IDENTITY) {
         token_data = gsignond_daemon_load_identity_data (identity->priv->owner, identity_id, method);
-    } 
+    } else {
+        token_data = gsignond_dictionary_new();
+    }        
 
     session = gsignond_auth_session_new (identity->priv->info, method, token_data);
 
index cfb3638..23dc999 100644 (file)
@@ -61,6 +61,7 @@ struct _GSignondPluginProxyPrivate
 typedef struct {
     GSignondAuthSession* auth_session;
     GSignondSessionData* session_data;
+    GSignondDictionary* identity_method_cache;
     gchar* mechanism;
     gpointer userdata;
 } GSignondProcessData;
@@ -73,12 +74,15 @@ static GSignondProcessData*
 gsignond_process_data_new (
         GSignondAuthSession* auth_session,
         GSignondSessionData *session_data,
+        GSignondDictionary *identity_method_cache,
         const gchar* mechanism,
         gpointer userdata)
 {
     GSignondProcessData* data = g_slice_new0 (GSignondProcessData);
     data->auth_session = g_object_ref (auth_session);
     data->session_data = gsignond_dictionary_copy (session_data);
+    if (identity_method_cache)
+        data->identity_method_cache = gsignond_dictionary_copy (identity_method_cache);
     data->mechanism = g_strdup (mechanism);
     data->userdata = userdata;
     return data;
@@ -90,6 +94,8 @@ gsignond_process_data_free (
 {
     g_object_unref (data->auth_session);
     gsignond_dictionary_unref (data->session_data);
+    if (data->identity_method_cache)
+        gsignond_dictionary_unref (data->identity_method_cache);
     g_free (data->mechanism);
     g_slice_free (GSignondProcessData, data);
 }
@@ -113,6 +119,7 @@ gsignond_plugin_proxy_process_queue (
                 priv->active_process_userdata);
         gsignond_plugin_request_initial (priv->plugin,
                                          next_data->session_data,
+                                         next_data->identity_method_cache,
                                          next_data->mechanism);
         gsignond_process_data_free (next_data);
     }
@@ -500,6 +507,7 @@ gsignond_plugin_proxy_process (
         GSignondPluginProxy *self,
         GSignondAuthSession *session,
         GSignondSessionData *session_data,
+        GSignondDictionary *identity_method_cache,
         const gchar *mechanism,
         gpointer userdata)
 {
@@ -510,14 +518,15 @@ gsignond_plugin_proxy_process (
 
     if (session == priv->active_session && priv->expecting_request == TRUE) {
         priv->expecting_request = FALSE;
-        // mechanism is discarded if this is not an initial request
+        // mechanism and identity_method_cache are discarded if this is not an initial request
         gsignond_plugin_request (priv->plugin, session_data);
         return;
     }
 
     g_queue_push_tail (priv->session_queue,
                        gsignond_process_data_new (session,
-                                                  session_data,
+                                                  session_data, 
+                                                  identity_method_cache,
                                                   mechanism, userdata));
     gsignond_auth_session_notify_state_changed (
             session, GSIGNOND_PLUGIN_STATE_PROCESS_PENDING,
index 089e125..d5b5bc1 100644 (file)
@@ -83,6 +83,7 @@ gsignond_plugin_proxy_process (
         GSignondPluginProxy *self,
         GSignondAuthSession* session,
         GSignondSessionData *session_data,
+        GSignondDictionary *identity_method_cache,
         const gchar *mechanism,
         gpointer userdata);
 void
index 6953057..c8c86f7 100644 (file)
@@ -444,6 +444,7 @@ static void
 gsignond_plugin_remote_request_initial (
     GSignondPlugin *plugin,
     GSignondSessionData *session_data,
+    GSignondDictionary *identity_method_cache,
     const gchar *mechanism)
 {
     g_return_if_fail (session_data && plugin &&
@@ -451,8 +452,16 @@ gsignond_plugin_remote_request_initial (
     GSignondPluginRemote *self = GSIGNOND_PLUGIN_REMOTE (plugin);
 
     GVariant *data = gsignond_dictionary_to_variant (session_data);
+    GVariant *cache;
+    if (identity_method_cache)
+        cache = gsignond_dictionary_to_variant (identity_method_cache);
+    else {
+        GSignondDictionary* empty_cache = gsignond_dictionary_new();
+        cache = gsignond_dictionary_to_variant (empty_cache);
+        gsignond_dictionary_unref(empty_cache);
+    }
     gsignond_dbus_remote_plugin_call_request_initial (
-            self->priv->dbus_plugin_proxy, data, mechanism, NULL,
+            self->priv->dbus_plugin_proxy, data, cache, mechanism, NULL,
             _request_initial_async_cb, self);
 }
 
index 641eeca..e4a978a 100644 (file)
@@ -175,6 +175,7 @@ _handle_request_initial_from_dbus (
         GSignondPluginDaemon *self,
         GDBusMethodInvocation *invocation,
         const GVariant *session_data,
+        const GVariant *identity_method_cache,
         const gchar *mechanism,
         gpointer user_data)
 {
@@ -186,8 +187,11 @@ _handle_request_initial_from_dbus (
 
     GSignondSessionData *data = (GSignondSessionData *)
             gsignond_dictionary_new_from_variant ((GVariant *)session_data);
-    gsignond_plugin_request_initial (self->priv->plugin, data, mechanism);
+    GSignondSessionData *cache = 
+            gsignond_dictionary_new_from_variant ((GVariant *)identity_method_cache);
+    gsignond_plugin_request_initial (self->priv->plugin, data, cache, mechanism);
     gsignond_dictionary_unref (data);
+    gsignond_dictionary_unref (cache);
 
     return TRUE;
 }
index cd091ea..0ff6486 100644 (file)
@@ -174,6 +174,7 @@ static void
 gsignond_digest_plugin_request_initial (
     GSignondPlugin *plugin,
     GSignondSessionData *session_data,
+    GSignondDictionary *identity_method_cache,
     const gchar *mechanism)
 {
     g_return_if_fail (plugin != NULL);
index 90bf757..98a9c0f 100644 (file)
@@ -51,6 +51,7 @@ static void gsignond_password_plugin_request (
 
 static void gsignond_password_plugin_request_initial (
     GSignondPlugin *self, GSignondSessionData *session_data, 
+    GSignondDictionary* identity_method_cache,
     const gchar *mechanism)
 {
     const gchar* username = gsignond_session_data_get_username(session_data);
index 32c6cad..3d1ab29 100644 (file)
@@ -65,6 +65,7 @@ static void gsignond_ssotest_plugin_cancel (GSignondPlugin *plugin)
 
 static void gsignond_ssotest_plugin_request_initial (
     GSignondPlugin *plugin, GSignondSessionData *session_data, 
+    GSignondDictionary* identity_method_cache,
     const gchar *mechanism)
 {
     gint i;
index 953eefd..c54a4bf 100644 (file)
@@ -117,7 +117,7 @@ START_TEST (test_digestplugin_request)
     gsignond_session_data_set_username(data, "user1");
     gsignond_session_data_set_secret(data, "password1");
 
-    gsignond_plugin_request_initial(plugin, data, "digest");
+    gsignond_plugin_request_initial(plugin, data, NULL, "digest");
     fail_if(result != NULL);
     fail_if(ui_action != NULL);
     fail_if(error == NULL);
@@ -134,7 +134,7 @@ START_TEST (test_digestplugin_request)
     gsignond_dictionary_set_string(data, "Method", "GET");
     gsignond_dictionary_set_string(data, "DigestUri", "/test/index.html");
 
-    gsignond_plugin_request_initial(plugin, data, "digest");
+    gsignond_plugin_request_initial(plugin, data, NULL, "digest");
     fail_if(result == NULL);
     fail_if(ui_action != NULL);
     fail_if(error != NULL);
@@ -147,7 +147,7 @@ START_TEST (test_digestplugin_request)
 
     //remove secret so that ui action is required
     gsignond_dictionary_remove (data, "Secret");
-    gsignond_plugin_request_initial(plugin, data, "digest");
+    gsignond_plugin_request_initial(plugin, data, NULL, "digest");
     fail_if(result != NULL);
     fail_if(ui_action == NULL);
     fail_if(error != NULL);
@@ -243,7 +243,7 @@ START_TEST (test_digestplugin_user_action_finished)
             "abg10b1234ee1f0e8b11d0f600bfb0c093");
     gsignond_dictionary_set_string (data, "Method", "GET");
     gsignond_dictionary_set_string (data, "DigestUri", "/test/index.html");
-    gsignond_plugin_request_initial (plugin, data, "digest");
+    gsignond_plugin_request_initial (plugin, data, NULL, "digest");
     gsignond_dictionary_unref (data); data = NULL;
 
     gsignond_plugin_user_action_finished (plugin, ui_data);
index b7b3eab..5c7670a 100644 (file)
@@ -105,7 +105,7 @@ START_TEST (test_passwordplugin_request)
 
     // username empty, password not empty
     gsignond_session_data_set_secret(data, "megapassword");
-    gsignond_plugin_request_initial(plugin, data, "password");
+    gsignond_plugin_request_initial(plugin, data, NULL, "password");
     fail_if(result == NULL);    
     fail_if(ui_action != NULL);
     fail_if(error != NULL);
@@ -117,7 +117,7 @@ START_TEST (test_passwordplugin_request)
     
     // username and password not empty
     gsignond_session_data_set_username(data, "megauser");
-    gsignond_plugin_request_initial(plugin, data, "password");
+    gsignond_plugin_request_initial(plugin, data, NULL, "password");
     fail_if(result == NULL);    
     fail_if(ui_action != NULL);
     fail_if(error != NULL);
@@ -131,7 +131,7 @@ START_TEST (test_passwordplugin_request)
     //username and password empty
     gsignond_dictionary_unref(data);
     data = gsignond_dictionary_new();
-    gsignond_plugin_request_initial(plugin, data, "password");
+    gsignond_plugin_request_initial(plugin, data, NULL, "password");
     fail_if(result != NULL);    
     fail_if(ui_action == NULL);
     fail_if(error != NULL);
@@ -144,7 +144,7 @@ START_TEST (test_passwordplugin_request)
     
     //username not empty, password empty
     gsignond_session_data_set_username(data, "megauser");
-    gsignond_plugin_request_initial(plugin, data, "password");
+    gsignond_plugin_request_initial(plugin, data, NULL, "password");
     fail_if(result != NULL);    
     fail_if(ui_action == NULL);
     fail_if(error != NULL);
index 998abfe..113df32 100644 (file)
@@ -134,10 +134,10 @@ gsignond_auth_session_notify_process_result (
             gsignond_session_data_set_username(data, "megauser");
             gsignond_session_data_set_secret(data, "megapassword");
 
-            gsignond_plugin_proxy_process(proxy, iface, data, "password",
+            gsignond_plugin_proxy_process(proxy, iface, data, NULL, "password",
                     proxy);
 
-            gsignond_plugin_proxy_process(proxy, iface, data, "password",
+            gsignond_plugin_proxy_process(proxy, iface, data, NULL, "password",
                     proxy);
     
             gsignond_dictionary_unref(data);
@@ -154,7 +154,7 @@ gsignond_auth_session_notify_process_result (
             fail_if(data == NULL);
 
             for (i = 0; i < 9; i++) {
-                gsignond_plugin_proxy_process(proxy, iface, data, "mech1",
+                gsignond_plugin_proxy_process(proxy, iface, data, NULL, "mech1",
                         proxy);
             }
             gsignond_dictionary_unref(data);
@@ -303,7 +303,7 @@ START_TEST (test_pluginproxy_process)
 
     testing_proxy_process = TRUE;
 
-    gsignond_plugin_proxy_process(proxy, test_auth_session, data, "password",
+    gsignond_plugin_proxy_process(proxy, test_auth_session, data, NULL, "password",
             proxy);
 
     _run_mainloop ();
@@ -335,7 +335,7 @@ START_TEST (test_pluginproxy_process_cancel)
     
     testing_proxy_process_cancel = TRUE;
     
-    gsignond_plugin_proxy_process(proxy, test_auth_session, data, "mech1",
+    gsignond_plugin_proxy_process(proxy, test_auth_session, data, NULL, "mech1",
             proxy);
 
     _run_mainloop ();
@@ -369,7 +369,7 @@ START_TEST (test_pluginproxy_process_queue)
     
     testing_proxy_process_queue = TRUE;
     
-    gsignond_plugin_proxy_process(proxy, test_auth_session, data, "password",
+    gsignond_plugin_proxy_process(proxy, test_auth_session, data, NULL, "password",
             proxy);
     _run_mainloop ();
 
@@ -399,7 +399,7 @@ START_TEST (test_pluginproxy_process_queue_cancel)
     
     testing_proxy_process_queue_cancel = TRUE;
     
-    gsignond_plugin_proxy_process(proxy, test_auth_session, data, "mech1",
+    gsignond_plugin_proxy_process(proxy, test_auth_session, data, NULL, "mech1",
             proxy);
 
     _run_mainloop ();
index 32fc2cb..18d1475 100644 (file)
@@ -340,7 +340,7 @@ START_TEST (test_pluginremote_request)
 
     // username empty, password not empty
     gsignond_session_data_set_secret(data, "megapassword");
-    gsignond_plugin_request_initial(plugin, data, "password");
+    gsignond_plugin_request_initial(plugin, data, NULL, "password");
     _run_mainloop ();
 
     fail_if(result == NULL);    
@@ -354,7 +354,7 @@ START_TEST (test_pluginremote_request)
     
     // username and password not empty
     gsignond_session_data_set_username(data, "megauser");
-    gsignond_plugin_request_initial(plugin, data, "password");
+    gsignond_plugin_request_initial(plugin, data, NULL, "password");
     _run_mainloop ();
 
     fail_if(result == NULL);    
@@ -370,7 +370,7 @@ START_TEST (test_pluginremote_request)
     //username and password empty
     gsignond_dictionary_unref(data);
     data = gsignond_dictionary_new();
-    gsignond_plugin_request_initial(plugin, data, "password");
+    gsignond_plugin_request_initial(plugin, data, NULL, "password");
     _run_mainloop ();
 
     fail_if(result != NULL);    
@@ -387,7 +387,7 @@ START_TEST (test_pluginremote_request)
     
     //username not empty, password empty
     gsignond_session_data_set_username(data, "megauser");
-    gsignond_plugin_request_initial(plugin, data, "password");
+    gsignond_plugin_request_initial(plugin, data, NULL, "password");
     _run_mainloop ();
 
     fail_if(result != NULL);