[telepathy-mission-control/master] mcd-account: only set or get strings in or from the keyring

Jonny Lamb jonny.lamb at collabora.co.uk
Mon Sep 14 11:09:19 PDT 2009


Signed-off-by: Jonny Lamb <jonny.lamb at collabora.co.uk>
---
 src/mcd-account.c |   96 +++++++++++++++++++++++++++++++++--------------------
 1 files changed, 60 insertions(+), 36 deletions(-)

diff --git a/src/mcd-account.c b/src/mcd-account.c
index 549af64..a15f0ef 100644
--- a/src/mcd-account.c
+++ b/src/mcd-account.c
@@ -363,6 +363,7 @@ mcd_account_loaded (McdAccount *account)
 typedef struct
 {
     McdAccount *account;
+    gchar *name;
     McdAccountSetParameterCb callback;
     gpointer user_data;
 } KeyringSetData;
@@ -380,6 +381,10 @@ keyring_set_cb (GnomeKeyringResult result,
                      "Failed to set item in keyring: %s",
                      gnome_keyring_result_to_message (result));
     }
+    else
+    {
+        DEBUG ("Set secret parameter %s in keyring", data->name);
+    }
 
     if (data->callback != NULL)
         data->callback (data->account, error, data->user_data);
@@ -387,6 +392,7 @@ keyring_set_cb (GnomeKeyringResult result,
     if (error != NULL)
         g_error_free (error);
 
+    g_free (data->name);
     g_slice_free (KeyringSetData, data);
 }
 #endif
@@ -412,27 +418,34 @@ set_parameter (McdAccount *account, const gchar *name, const GValue *value,
     {
         if (gnome_keyring_is_available ())
         {
-            gchar *display_name;
-            KeyringSetData *data;
-
-            data = g_slice_new0 (KeyringSetData);
-            data->account = account;
-            data->callback = callback;
-            data->user_data = user_data;
-
-            display_name = g_strdup_printf ("Password for account %s",
-                                            priv->unique_name);
-
-            /* TODO: this assumes the secret to store is a password (ie. is
-             * a string. */
-            gnome_keyring_store_password (&keyring_schema, GNOME_KEYRING_DEFAULT,
-                                          display_name, g_value_get_string (value),
-                                          keyring_set_cb, data, NULL,
-                                          "account", priv->unique_name,
-                                          "param", name,
-                                          NULL);
-            g_free (display_name);
-            return;
+            if (G_VALUE_TYPE (value) != G_TYPE_STRING)
+            {
+                g_warning ("Cannot set non-string secret parameter %s in keyring; "
+                           "falling back to storing in keyfile", name);
+            }
+            else
+            {
+                gchar *display_name;
+                KeyringSetData *data;
+
+                data = g_slice_new0 (KeyringSetData);
+                data->account = account;
+                data->name = g_strdup (name);
+                data->callback = callback;
+                data->user_data = user_data;
+
+                display_name = g_strdup_printf ("Password for account %s",
+                                                priv->unique_name);
+
+                gnome_keyring_store_password (&keyring_schema, GNOME_KEYRING_DEFAULT,
+                                              display_name, g_value_get_string (value),
+                                              keyring_set_cb, data, NULL,
+                                              "account", priv->unique_name,
+                                              "param", name,
+                                              NULL);
+                g_free (display_name);
+                return;
+            }
         }
         else
         {
@@ -533,6 +546,7 @@ static GType mc_param_type (const TpConnectionManagerParam *param);
 typedef struct
 {
     McdAccount *account;
+    gchar *name;
     McdAccountGetParameterCb callback;
     gpointer user_data;
 } KeyringGetData;
@@ -553,6 +567,7 @@ keyring_get_cb (GnomeKeyringResult result, const gchar* password,
     }
     else
     {
+        DEBUG ("Successfully got secret parameter %s from keyring", data->name);
         value = tp_g_value_slice_new_string (password);
     }
 
@@ -565,6 +580,7 @@ keyring_get_cb (GnomeKeyringResult result, const gchar* password,
     if (error != NULL)
         g_error_free (error);
 
+    g_free (data->name);
     g_slice_free (KeyringGetData, data);
 }
 #endif
@@ -590,6 +606,8 @@ get_parameter (McdAccount *account, const gchar *name,
     param = mcd_manager_get_protocol_param (priv->manager,
                                             priv->protocol_name, name);
 
+    type = mc_param_type (param);
+
     if (param != NULL && param->flags & TP_CONN_MGR_PARAM_FLAG_SECRET)
         is_secret = TRUE;
 
@@ -598,19 +616,27 @@ get_parameter (McdAccount *account, const gchar *name,
     {
         if (gnome_keyring_is_available ())
         {
-          KeyringGetData *data;
-
-          data = g_slice_new0 (KeyringGetData);
-          data->account = account;
-          data->callback = callback;
-          data->user_data = user_data;
-
-          gnome_keyring_find_password (&keyring_schema,
-                                       keyring_get_cb, data, NULL,
-                                       "account", priv->unique_name,
-                                       "param", name,
-                                       NULL);
-          return;
+            if (type != G_TYPE_STRING)
+            {
+                g_warning ("Not looking for non-string secret parameter %s in keyring", name);
+            }
+            else
+            {
+                KeyringGetData *data;
+
+                data = g_slice_new0 (KeyringGetData);
+                data->account = account;
+                data->name = g_strdup (name);
+                data->callback = callback;
+                data->user_data = user_data;
+
+                gnome_keyring_find_password (&keyring_schema,
+                                             keyring_get_cb, data, NULL,
+                                             "account", priv->unique_name,
+                                             "param", name,
+                                             NULL);
+                return;
+            }
         }
         else
         {
@@ -624,8 +650,6 @@ get_parameter (McdAccount *account, const gchar *name,
     if (!g_key_file_has_key (priv->keyfile, priv->unique_name, key, NULL))
         goto error;
 
-    type = mc_param_type (param);
-
     switch (type)
     {
     case G_TYPE_STRING:
-- 
1.5.6.5




More information about the telepathy-commits mailing list