[vinagre/gnome-3-8] Fix credential access with libsecret, bug 704744



commit 4474561f619928a5319c36660dbd4ad70dd6503e
Author: David King <amigadave amigadave com>
Date:   Tue Jul 23 20:50:34 2013 +0100

    Fix credential access with libsecret, bug 704744
    
    When storing attributes in libsecret, string attributes are not
    permitted to have NULL values. The existing workaround for this was
    wrong, as it removed the ability to store passwords for username-less
    connections.  Fix this by terminating the attribute list with a NULL
    attribute, thus ending the list, if there is no username.

 plugins/vnc/vinagre-vnc-tab.c |    6 +-----
 vinagre/vinagre-tab.c         |   14 ++++++++++----
 2 files changed, 11 insertions(+), 9 deletions(-)
---
diff --git a/plugins/vnc/vinagre-vnc-tab.c b/plugins/vnc/vinagre-vnc-tab.c
index 7cae9f2..73a13b8 100644
--- a/plugins/vnc/vinagre-vnc-tab.c
+++ b/plugins/vnc/vinagre-vnc-tab.c
@@ -492,11 +492,7 @@ vnc_authentication_cb (VncDisplay *vnc, GValueArray *credList, VinagreVncTab *vn
 
   if (need_password || need_username)
     {
-      /* libsecret does not support NULL attributes, bug 685041. */
-      if (vinagre_connection_get_username (conn) != NULL)
-        {
-          vinagre_tab_find_credentials_in_keyring (tab, &username, &password);
-        }
+      vinagre_tab_find_credentials_in_keyring (tab, &username, &password);
 
       if ( (need_username && !username) || (need_password && !password) )
        {
diff --git a/vinagre/vinagre-tab.c b/vinagre/vinagre-tab.c
index b594b92..8d3494c 100644
--- a/vinagre/vinagre-tab.c
+++ b/vinagre/vinagre-tab.c
@@ -745,19 +745,21 @@ vinagre_tab_get_from_connection (VinagreConnection *conn)
 gboolean
 vinagre_tab_find_credentials_in_keyring (VinagreTab *tab, gchar **username, gchar **password)
 {
+  const gchar *conn_user = vinagre_connection_get_username (tab->priv->conn);
   *username = NULL;
 
+  /* "user" goes last, to terminate the attribute list if conn_user is NULL. */
   *password = secret_password_lookup_sync (SECRET_SCHEMA_COMPAT_NETWORK, NULL, NULL,
-                                           "user", vinagre_connection_get_username (tab->priv->conn),
                                            "server", vinagre_connection_get_host (tab->priv->conn),
                                            "protocol", vinagre_connection_get_protocol (tab->priv->conn),
                                            "port", vinagre_connection_get_port (tab->priv->conn),
+                                           conn_user ? "user" : NULL, conn_user,
                                            NULL);
 
   if (*password == NULL)
     return FALSE;
 
-  *username = g_strdup (vinagre_connection_get_username (tab->priv->conn));
+  *username = g_strdup (conn_user);
   return TRUE;
 }
 
@@ -771,18 +773,20 @@ vinagre_tab_save_credentials_in_keyring (VinagreTab *tab)
 {
   GError *error = NULL;
   gchar *label;
+  const gchar *conn_user = vinagre_connection_get_username (tab->priv->conn);
 
   if (!tab->priv->save_credentials)
     return;
 
   label = g_strdup_printf (_("Remote desktop password: %s"), vinagre_connection_get_host (tab->priv->conn));
+  /* "user" goes last, to terminate the attribute list if conn_user is NULL. */
   secret_password_store_sync (SECRET_SCHEMA_COMPAT_NETWORK, NULL,
                               label, vinagre_connection_get_password (tab->priv->conn),
                               NULL, &error,
-                              "user", vinagre_connection_get_username (tab->priv->conn),
                               "server", vinagre_connection_get_host (tab->priv->conn),
                               "protocol", vinagre_connection_get_protocol (tab->priv->conn),
                               "port", vinagre_connection_get_port (tab->priv->conn),
+                              conn_user ? "user" : NULL, conn_user,
                               NULL);
   g_free (label);
 
@@ -803,11 +807,13 @@ void vinagre_tab_remove_credentials_from_keyring (VinagreTab *tab)
 {
   if (tab->priv->saved_credentials)
     {
+      /* Put "user" last, to terminate the attributes if conn_user is NULL. */
+      const gchar *conn_user = vinagre_connection_get_username (tab->priv->conn);
       secret_password_clear_sync (SECRET_SCHEMA_COMPAT_NETWORK, NULL, NULL,
-                                  "user", vinagre_connection_get_username (tab->priv->conn),
                                   "server", vinagre_connection_get_host (tab->priv->conn),
                                   "protocol", vinagre_connection_get_protocol (tab->priv->conn),
                                   "port", vinagre_connection_get_port (tab->priv->conn),
+                                  conn_user ? "user" : NULL, conn_user,
                                   NULL);
       tab->priv->saved_credentials = FALSE;
     }


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