daemon: Caching and storing token data for unsaved identity
authorAmarnath Valluri <amarnath.valluri@linux.intel.com>
Wed, 8 May 2013 15:21:07 +0000 (18:21 +0300)
committerAmarnath Valluri <amarnath.valluri@linux.intel.com>
Wed, 8 May 2013 15:21:07 +0000 (18:21 +0300)
src/daemon/gsignond-auth-session.c
src/daemon/gsignond-auth-session.h
src/daemon/gsignond-identity.c

index 83e25d0..45dd640 100644 (file)
@@ -378,6 +378,7 @@ gsignond_auth_session_init (GSignondAuthSession *self)
     self->priv->method = NULL;
     self->priv->proxy = NULL;
     self->priv->identity_info = NULL;
+    self->priv->token_data = NULL;
     self->priv->available_mechanisms = NULL;
 }
 
@@ -453,6 +454,14 @@ gsignond_auth_session_get_method (GSignondAuthSession *session)
     return session->priv->method;
 }
 
+GSignondDictionary *
+gsignond_auth_session_get_token_data (GSignondAuthSession *session)
+{
+    g_return_val_if_fail (session && GSIGNOND_IS_AUTH_SESSION (session), NULL);
+
+    return session->priv->token_data;
+}
+
 void
 gsignond_auth_session_notify_process_result (GSignondAuthSession *iface,
                                              GSignondSessionData *result,
@@ -504,6 +513,15 @@ void
 gsignond_auth_session_notify_store (GSignondAuthSession *self, 
                                     GSignondDictionary *token_data)
 {
+    g_return_if_fail (self && GSIGNOND_IS_AUTH_SESSION (self));
+    g_return_if_fail (token_data);
+
+    /* cache token data */
+    if (self->priv->token_data)
+        gsignond_dictionary_unref (self->priv->token_data);
+    self->priv->token_data = token_data;
+    gsignond_dictionary_ref (self->priv->token_data);
+
     g_signal_emit (self, signals[SIG_PROCESS_STORE], 0, token_data);
 }
 
index 2863bca..18facc2 100644 (file)
@@ -107,6 +107,9 @@ gsignond_auth_session_refresh (GSignondAuthSession *self,
 const gchar *
 gsignond_auth_session_get_method (GSignondAuthSession *session);
 
+GSignondDictionary *
+gsignond_auth_session_get_token_data (GSignondAuthSession *session);
+
 GSignondAccessControlManager *
 gsignond_auth_session_get_acm (GSignondAuthSession *session);
 
index f399f92..9239c99 100644 (file)
@@ -377,12 +377,10 @@ _on_store_token (GSignondAuthSession *session, GSignondDictionary *token_data, g
 
     identity_id = gsignond_identity_info_get_id (identity->priv->info);
 
-    if (identity_id == GSIGNOND_IDENTITY_INFO_NEW_IDENTITY)
-        /* TODO; cache token */
-        ;
-    else
+    if (identity_id != GSIGNOND_IDENTITY_INFO_NEW_IDENTITY) {
         gsignond_daemon_store_identity_data (identity->priv->owner, identity_id, 
             gsignond_auth_session_get_method (session), token_data);
+    }
 }
 
 static gboolean
@@ -467,12 +465,12 @@ 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 {
-        /* TODO : load cached token data for unsaved identity */
-    }
+    } 
 
     session = gsignond_auth_session_new (identity->priv->info, method, token_data);
 
+    if (token_data) gsignond_dictionary_unref (token_data);
+
     if (!session) {
         if (error) *error = gsignond_get_gerror_for_id (GSIGNOND_ERROR_UNKNOWN, "Unknown error");
         return NULL;
@@ -733,6 +731,21 @@ gsignond_identity_sign_out (GSignondIdentity *identity,
     return success;
 }
 
+typedef struct _{
+    GSignondDaemon *daemon;
+    guint32 identity_id;
+}_StoreCachedTokenCbInfo;
+static void
+_store_cached_token_data (const gchar *method, GSignondAuthSession *session, _StoreCachedTokenCbInfo *data)
+{
+    if (!data || !method || !session) return ;
+
+    GSignondDictionary *token_data = gsignond_auth_session_get_token_data (session);
+
+    if (token_data)
+        gsignond_daemon_store_identity_data (data->daemon, data->identity_id, method, token_data);
+}
+
 guint32
 gsignond_identity_store (GSignondIdentity *identity, 
                          const GVariant *info,
@@ -790,8 +803,12 @@ gsignond_identity_store (GSignondIdentity *identity,
                                                         "Failed to store identity");
     }
     else {
-        if (was_new_identity) 
+        if (was_new_identity) {
             _set_id (identity, id);
+            _StoreCachedTokenCbInfo data = { identity->priv->owner, id };
+            /* store any cached token data if available at auth sessions */
+            g_hash_table_foreach (identity->priv->auth_sessions, (GHFunc)_store_cached_token_data, (gpointer)&data);
+        }
 
         g_signal_emit (identity, signals[SIG_INFO_UPDATED], 0, GSIGNOND_IDENTITY_DATA_UPDATED);
     }