diff -up NetworkManager-0.6.4/gnome/applet/applet-dbus-info.c.obfuscate-wpa-password NetworkManager-0.6.4/gnome/applet/applet-dbus-info.c --- NetworkManager-0.6.4/gnome/applet/applet-dbus-info.c.obfuscate-wpa-password 2006-06-15 12:42:47.000000000 -0400 +++ NetworkManager-0.6.4/gnome/applet/applet-dbus-info.c 2008-01-07 17:34:38.000000000 -0500 @@ -29,7 +29,6 @@ #include <dbus/dbus.h> #include <gtk/gtk.h> #include <glade/glade.h> -#include <gnome-keyring.h> #include <iwlib.h> #include "NetworkManager.h" @@ -69,67 +68,6 @@ static inline gboolean nmi_network_type_ } -typedef struct NMGetNetworkKeyCBData -{ - NMApplet *applet; - DBusMessage *message; - NetworkDevice *dev; - char *net_path; - char *essid; -} NMGetNetworkKeyCBData; - -static void free_network_key_cb_data (NMGetNetworkKeyCBData *cb_data) -{ - if (cb_data) - { - dbus_message_unref (cb_data->message); - network_device_unref (cb_data->dev); - g_free (cb_data->net_path); - g_free (cb_data->essid); - memset (cb_data, 0, sizeof (NMGetNetworkKeyCBData)); - g_free (cb_data); - } -} - - -static void nmi_dbus_get_network_key_callback (GnomeKeyringResult result, - GList *found_list, - gpointer data) -{ - NMGetNetworkKeyCBData * cb_data = (NMGetNetworkKeyCBData*) data; - NMApplet * applet = cb_data->applet; - DBusMessage * message = cb_data->message; - NetworkDevice * dev = cb_data->dev; - char * net_path = cb_data->net_path; - char * essid = cb_data->essid; - - if (result == GNOME_KEYRING_RESULT_OK) - { - gchar * escaped_network; - GnomeKeyringFound * found; - NMGConfWSO * gconf_wso; - - escaped_network = gconf_escape_key (essid, strlen (essid)); - gconf_wso = nm_gconf_wso_new_deserialize_gconf (applet->gconf_client, escaped_network); - g_free (escaped_network); - - found = found_list->data; - nm_gconf_wso_set_key (gconf_wso, found->secret, strlen (found->secret)); - nmi_dbus_return_user_key (applet->connection, message, gconf_wso); - } - else - { - WirelessNetwork *net; - - nmi_passphrase_dialog_destroy (applet); - if ((net = network_device_get_wireless_network_by_nm_path (dev, net_path))) - applet->passphrase_dialog = nmi_passphrase_dialog_new (applet, 0, dev, net, message); - } - - free_network_key_cb_data (cb_data); -} - - /* * nmi_dbus_get_key_for_network * @@ -177,21 +115,11 @@ nmi_dbus_get_key_for_network (DBusConnec escaped_network, &temp) || !temp) new_key = TRUE; - g_free (escaped_network); /* It's not a new key, so try to get the key from the keyring. */ if (!new_key) { - NMGetNetworkKeyCBData *cb_data; - - cb_data = g_malloc0 (sizeof (NMGetNetworkKeyCBData)); - cb_data->applet = applet; - cb_data->essid = g_strdup (essid); - cb_data->message = message; - dbus_message_ref (message); - cb_data->dev = dev; - network_device_ref (dev); - cb_data->net_path = g_strdup (net_path); + NMGConfWSO *gconf_wso; /* If the menu happens to be showing when we pop up the * keyring dialog, we get an X server deadlock. So deactivate @@ -200,18 +129,23 @@ nmi_dbus_get_key_for_network (DBusConnec if (applet->dropdown_menu && GTK_WIDGET_VISIBLE (GTK_WIDGET (applet->dropdown_menu))) gtk_menu_shell_deactivate (GTK_MENU_SHELL (applet->dropdown_menu)); - /* Get the essid key, if any, from the keyring */ - gnome_keyring_find_itemsv (GNOME_KEYRING_ITEM_GENERIC_SECRET, - (GnomeKeyringOperationGetListCallback) nmi_dbus_get_network_key_callback, - cb_data, - NULL, - "essid", - GNOME_KEYRING_ATTRIBUTE_TYPE_STRING, - essid, - NULL); + gconf_wso = nm_gconf_wso_new_deserialize_gconf (applet->gconf_client, escaped_network); + if (!gconf_wso) { + new_key = TRUE; + goto new_key; + } + + /* Grab secrets from the keyring, if any */ + if (!nm_gconf_wso_read_secrets (gconf_wso, essid)) { + new_key = TRUE; + goto new_key; + } + + nmi_dbus_return_user_key (applet->connection, message, gconf_wso); } - else - { + +new_key: + if (new_key) { /* We only ask the user for a new key when we know about the network from NM, * since throwing up a dialog with a random essid from somewhere is a security issue. */ @@ -222,6 +156,7 @@ nmi_dbus_get_key_for_network (DBusConnec } } + g_free (escaped_network); return NULL; } @@ -904,35 +839,7 @@ nmi_save_network_info (NMApplet *applet, } /* Stuff the encryption key into the keyring */ - if (nm_gconf_wso_get_we_cipher (gconf_wso) != IW_AUTH_CIPHER_NONE) - { - GnomeKeyringAttributeList * attributes; - GnomeKeyringAttribute attr; - char * display_name; - GnomeKeyringResult ret; - guint32 item_id; - - display_name = g_strdup_printf (_("Passphrase for wireless network %s"), essid); - - attributes = gnome_keyring_attribute_list_new (); - attr.name = g_strdup ("essid"); - attr.type = GNOME_KEYRING_ATTRIBUTE_TYPE_STRING; - attr.value.string = g_strdup (essid); - g_array_append_val (attributes, attr); - - ret = gnome_keyring_item_create_sync (NULL, - GNOME_KEYRING_ITEM_GENERIC_SECRET, - display_name, - attributes, - nm_gconf_wso_get_key (gconf_wso), - TRUE, - &item_id); - if (ret != GNOME_KEYRING_RESULT_OK) - nm_warning ("Error saving secret for wireless network '%s' in keyring: %d", essid, ret); - - g_free (display_name); - gnome_keyring_attribute_list_free (attributes); - } + nm_gconf_wso_write_secrets (gconf_wso, essid); out: g_free (escaped_network); diff -up NetworkManager-0.6.4/gnome/applet/nm-gconf-wso.h.obfuscate-wpa-password NetworkManager-0.6.4/gnome/applet/nm-gconf-wso.h --- NetworkManager-0.6.4/gnome/applet/nm-gconf-wso.h.obfuscate-wpa-password 2006-01-26 16:08:42.000000000 -0500 +++ NetworkManager-0.6.4/gnome/applet/nm-gconf-wso.h 2008-01-07 17:34:38.000000000 -0500 @@ -57,6 +57,10 @@ struct _NMGConfWSOClass gboolean (*serialize_dbus_func) (NMGConfWSO *self, DBusMessageIter *iter); gboolean (*serialize_gconf_func) (NMGConfWSO *self, GConfClient *client, const char *network); + + gboolean (*read_secrets_func) (NMGConfWSO *self, const char *ssid); + + void (*write_secrets_func) (NMGConfWSO *self, const char *ssid); }; @@ -78,4 +82,8 @@ gboolean nm_gconf_wso_serialize_dbus (NM gboolean nm_gconf_wso_serialize_gconf (NMGConfWSO *self, GConfClient *client, const char *network); +gboolean nm_gconf_wso_read_secrets (NMGConfWSO *self, const char *ssid); + +void nm_gconf_wso_write_secrets (NMGConfWSO *self, const char *ssid); + #endif /* NM_GCONF_WSO_H */ diff -up NetworkManager-0.6.4/gnome/applet/nm-gconf-wso.c.obfuscate-wpa-password NetworkManager-0.6.4/gnome/applet/nm-gconf-wso.c --- NetworkManager-0.6.4/gnome/applet/nm-gconf-wso.c.obfuscate-wpa-password 2008-01-07 17:34:38.000000000 -0500 +++ NetworkManager-0.6.4/gnome/applet/nm-gconf-wso.c 2008-01-07 17:34:38.000000000 -0500 @@ -23,6 +23,7 @@ #include <glib/gi18n.h> #include <dbus/dbus.h> #include <gconf/gconf-client.h> +#include <gnome-keyring.h> #include <iwlib.h> #include "applet.h" @@ -34,6 +35,7 @@ #include "nm-gconf-wso-leap.h" #include "gconf-helpers.h" #include "wireless-security-option.h" +#include "nm-utils.h" #define NM_GCONF_WSO_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_GCONF_WSO, NMGConfWSOPrivate)) @@ -296,6 +298,81 @@ nm_gconf_wso_serialize_gconf (NMGConfWSO return NM_GCONF_WSO_GET_CLASS (self)->serialize_gconf_func (self, client, network); } +gboolean +nm_gconf_wso_read_secrets (NMGConfWSO *self, + const char *ssid) +{ + return NM_GCONF_WSO_GET_CLASS (self)->read_secrets_func (self, ssid); +} + +static gboolean +real_read_secrets (NMGConfWSO *self, + const char *ssid) +{ + GList *found_list = NULL; + GnomeKeyringResult ret; + GnomeKeyringFound *found; + + ret = gnome_keyring_find_itemsv_sync (GNOME_KEYRING_ITEM_GENERIC_SECRET, + &found_list, + "essid", + GNOME_KEYRING_ATTRIBUTE_TYPE_STRING, + ssid, + NULL); + if ((ret != GNOME_KEYRING_RESULT_OK) || (g_list_length (found_list) == 0)) { + nm_info ("No keyring secrets found for network %s", ssid); + return FALSE; + } + + found = (GnomeKeyringFound *) found_list->data; + nm_gconf_wso_set_key (self, found->secret, strlen (found->secret)); + gnome_keyring_found_list_free (found_list); + + return TRUE; +} + +void +nm_gconf_wso_write_secrets (NMGConfWSO *self, + const char *ssid) +{ + NM_GCONF_WSO_GET_CLASS (self)->write_secrets_func (self, ssid); +} + +static void +real_write_secrets (NMGConfWSO *self, + const char *ssid) +{ + GnomeKeyringAttributeList *attributes; + GnomeKeyringAttribute attr; + char *display_name; + GnomeKeyringResult ret; + guint32 item_id; + + if (nm_gconf_wso_get_we_cipher (self) == IW_AUTH_CIPHER_NONE) + return; + + display_name = g_strdup_printf (_("Passphrase for wireless network %s"), ssid); + + attributes = gnome_keyring_attribute_list_new (); + attr.name = g_strdup ("essid"); + attr.type = GNOME_KEYRING_ATTRIBUTE_TYPE_STRING; + attr.value.string = g_strdup (ssid); + g_array_append_val (attributes, attr); + + ret = gnome_keyring_item_create_sync (NULL, + GNOME_KEYRING_ITEM_GENERIC_SECRET, + display_name, + attributes, + nm_gconf_wso_get_key (self), + TRUE, + &item_id); + if (ret != GNOME_KEYRING_RESULT_OK) + nm_warning ("Error saving secret for wireless network '%s' in keyring: %d", ssid, ret); + + g_free (display_name); + gnome_keyring_attribute_list_free (attributes); +} + static void nm_gconf_wso_init (NMGConfWSO * self) { @@ -359,6 +436,8 @@ nm_gconf_wso_class_init (NMGConfWSOClass klass->serialize_dbus_func = real_serialize_dbus; klass->serialize_gconf_func = real_serialize_gconf; + klass->read_secrets_func = real_read_secrets; + klass->write_secrets_func = real_write_secrets; g_type_class_add_private (object_class, sizeof (NMGConfWSOPrivate)); } diff -up NetworkManager-0.6.4/gnome/applet/applet.c.obfuscate-wpa-password NetworkManager-0.6.4/gnome/applet/applet.c --- NetworkManager-0.6.4/gnome/applet/applet.c.obfuscate-wpa-password 2008-01-07 17:34:38.000000000 -0500 +++ NetworkManager-0.6.4/gnome/applet/applet.c 2008-01-07 17:34:38.000000000 -0500 @@ -2552,6 +2552,7 @@ static GtkWidget * nma_get_instance (NMA * synchronous calls against gnome-keyring. */ nma_compat_convert_oldformat_entries (applet->gconf_client); + nma_compat_move_wpa_eap_passwords (applet->gconf_client); nma_dbus_init_helper (applet); diff -up NetworkManager-0.6.4/gnome/applet/nm-gconf-wso-wpa-eap.c.obfuscate-wpa-password NetworkManager-0.6.4/gnome/applet/nm-gconf-wso-wpa-eap.c --- NetworkManager-0.6.4/gnome/applet/nm-gconf-wso-wpa-eap.c.obfuscate-wpa-password 2006-06-19 13:42:14.000000000 -0400 +++ NetworkManager-0.6.4/gnome/applet/nm-gconf-wso-wpa-eap.c 2008-01-07 17:34:38.000000000 -0500 @@ -24,6 +24,7 @@ #include <glib/gi18n.h> #include <dbus/dbus.h> #include <iwlib.h> +#include <gnome-keyring.h> #include "applet.h" #include "nm-gconf-wso.h" @@ -31,6 +32,7 @@ #include "nm-gconf-wso-private.h" #include "dbus-helpers.h" #include "gconf-helpers.h" +#include "nm-utils.h" #define WPA_EAP_PREFIX "wpa_eap_" @@ -38,16 +40,17 @@ struct _NMGConfWSOWPA_EAPPrivate { - int eap_method; - int key_type; - int wpa_version; - int key_mgmt; - const char * identity; - const char * passwd; - const char * anon_identity; - const char * private_key_file; - const char * client_cert_file; - const char * ca_cert_file; + int eap_method; + int key_type; + int wpa_version; + int key_mgmt; + char * identity; + char * passwd; + char * anon_identity; + char * private_key_file; + char * private_key_passwd; + char * client_cert_file; + char * ca_cert_file; }; @@ -77,13 +80,14 @@ nm_gconf_wso_wpa_eap_new_deserialize_dbu /* Success, build up our security object */ security = g_object_new (NM_TYPE_GCONF_WSO_WPA_EAP, NULL); nm_gconf_wso_set_we_cipher (NM_GCONF_WSO (security), we_cipher); - if (private_key_passwd && strlen (private_key_passwd) > 0) - nm_gconf_wso_set_key (NM_GCONF_WSO (security), private_key_passwd, strlen (private_key_passwd)); + nm_gconf_wso_set_key (NM_GCONF_WSO (security), passwd, strlen (passwd)); security->priv->wpa_version = wpa_version; security->priv->eap_method = eap_method; security->priv->key_type = key_type; security->priv->key_mgmt = IW_AUTH_KEY_MGMT_802_1X; security->priv->identity = g_strdup (identity); + if (private_key_passwd && strlen (private_key_passwd) > 0) + security->priv->private_key_passwd = g_strdup (private_key_passwd); security->priv->passwd = g_strdup (passwd); security->priv->anon_identity = g_strdup (anon_identity); security->priv->private_key_file = g_strdup (private_key_file); @@ -100,7 +104,6 @@ nm_gconf_wso_wpa_eap_new_deserialize_gco { NMGConfWSOWPA_EAP * security = NULL; char * identity = NULL; - char * passwd = NULL; char * anon_identity = NULL; char * private_key_file = NULL; char * client_cert_file = NULL; @@ -146,12 +149,6 @@ nm_gconf_wso_wpa_eap_new_deserialize_gco nm_gconf_get_string_helper (client, GCONF_PATH_WIRELESS_NETWORKS, - WPA_EAP_PREFIX"passwd", - network, - &passwd); - - nm_gconf_get_string_helper (client, - GCONF_PATH_WIRELESS_NETWORKS, WPA_EAP_PREFIX"anon_identity", network, &anon_identity); @@ -182,14 +179,12 @@ nm_gconf_wso_wpa_eap_new_deserialize_gco security->priv->key_type = key_type; security->priv->key_mgmt = IW_AUTH_KEY_MGMT_802_1X; security->priv->identity = g_strdup (identity); - security->priv->passwd = g_strdup (passwd); security->priv->anon_identity = g_strdup (anon_identity); security->priv->private_key_file = g_strdup (private_key_file); security->priv->client_cert_file = g_strdup (client_cert_file); security->priv->ca_cert_file = g_strdup (ca_cert_file); g_free (identity); - g_free (passwd); g_free (anon_identity); g_free (private_key_file); g_free (client_cert_file); @@ -208,9 +203,9 @@ real_serialize_dbus (NMGConfWSO *instanc self->priv->eap_method, self->priv->key_type, self->priv->identity ? : "", - self->priv->passwd ? : "", - self->priv->anon_identity ? : "", nm_gconf_wso_get_key (instance) ? : "", + self->priv->anon_identity ? : "", + self->priv->private_key_passwd ? : "", self->priv->private_key_file ? : "", self->priv->client_cert_file ? : "", self->priv->ca_cert_file ? : "", @@ -248,13 +243,6 @@ real_serialize_gconf (NMGConfWSO *instan g_free (key); } - if (self->priv->passwd && strlen (self->priv->passwd) > 0) - { - key = g_strdup_printf ("%s/%s/%spasswd", GCONF_PATH_WIRELESS_NETWORKS, network, WPA_EAP_PREFIX); - gconf_client_set_string (client, key, self->priv->passwd, NULL); - g_free (key); - } - if (self->priv->anon_identity && strlen (self->priv->anon_identity) > 0) { key = g_strdup_printf ("%s/%s/%sanon_identity", GCONF_PATH_WIRELESS_NETWORKS, network, WPA_EAP_PREFIX); @@ -286,6 +274,72 @@ real_serialize_gconf (NMGConfWSO *instan return TRUE; } +static gboolean +real_read_secrets (NMGConfWSO *instance, + const char *ssid) +{ + NMGConfWSOWPA_EAP *self = NM_GCONF_WSO_WPA_EAP (instance); + GList *found_list = NULL; + GnomeKeyringResult ret; + GnomeKeyringFound *found; + + NM_GCONF_WSO_CLASS (g_type_class_peek (NM_TYPE_GCONF_WSO))->read_secrets_func (instance, ssid); + + ret = gnome_keyring_find_itemsv_sync (GNOME_KEYRING_ITEM_GENERIC_SECRET, + &found_list, + "private-key-passwd", + GNOME_KEYRING_ATTRIBUTE_TYPE_STRING, + ssid, + NULL); + if ((ret != GNOME_KEYRING_RESULT_OK) || (g_list_length (found_list) == 0)) { + nm_info ("No keyring secrets found for network %s", ssid); + return FALSE; + } + + found = (GnomeKeyringFound *) found_list->data; + self->priv->private_key_passwd = g_strdup (found->secret); + gnome_keyring_found_list_free (found_list); + + return TRUE; +} + +static void +real_write_secrets (NMGConfWSO *instance, + const char *ssid) +{ + NMGConfWSOWPA_EAP *self = NM_GCONF_WSO_WPA_EAP (instance); + GnomeKeyringAttributeList *attributes; + GnomeKeyringAttribute attr; + char *display_name; + GnomeKeyringResult ret; + guint32 item_id; + + NM_GCONF_WSO_CLASS (g_type_class_peek (NM_TYPE_GCONF_WSO))->write_secrets_func (instance, ssid); + + if (!self->priv->private_key_passwd) + return; + + display_name = g_strdup_printf (_("Private key password for wireless network %s"), ssid); + + attributes = gnome_keyring_attribute_list_new (); + attr.name = g_strdup ("private-key-passwd"); + attr.type = GNOME_KEYRING_ATTRIBUTE_TYPE_STRING; + attr.value.string = g_strdup (ssid); + g_array_append_val (attributes, attr); + + ret = gnome_keyring_item_create_sync (NULL, + GNOME_KEYRING_ITEM_GENERIC_SECRET, + display_name, + attributes, + self->priv->private_key_passwd, + TRUE, + &item_id); + if (ret != GNOME_KEYRING_RESULT_OK) + nm_warning ("Error saving secret for wireless network '%s' in keyring: %d", ssid, ret); + + g_free (display_name); + gnome_keyring_attribute_list_free (attributes); +} static void nm_gconf_wso_wpa_eap_init (NMGConfWSOWPA_EAP *self) @@ -304,6 +358,8 @@ nm_gconf_wso_wpa_eap_class_init (NMGConf par_class->serialize_dbus_func = real_serialize_dbus; par_class->serialize_gconf_func = real_serialize_gconf; + par_class->read_secrets_func = real_read_secrets; + par_class->write_secrets_func = real_write_secrets; g_type_class_add_private (object_class, sizeof (NMGConfWSOWPA_EAPPrivate)); } diff -up NetworkManager-0.6.4/gnome/applet/applet-compat.c.obfuscate-wpa-password NetworkManager-0.6.4/gnome/applet/applet-compat.c --- NetworkManager-0.6.4/gnome/applet/applet-compat.c.obfuscate-wpa-password 2008-01-07 17:34:38.000000000 -0500 +++ NetworkManager-0.6.4/gnome/applet/applet-compat.c 2008-01-07 17:51:36.000000000 -0500 @@ -397,3 +397,192 @@ nma_compat_convert_oldformat_entries (GC g_slist_free (dir_list); } + +#define WPA_EAP_PREFIX "wpa_eap_" + +static void +copy_one_wpa_private_key_password (GConfClient *client, + const char *ssid, + const char *escaped_network) +{ + char *private_key_passwd = NULL; + GnomeKeyringResult ret; + GnomeKeyringAttributeList *attrs; + char *display_name = NULL; + GList *found_list = NULL; + char *temp = NULL; + guint32 item_id = 0; + + nm_gconf_get_string_helper (client, + GCONF_PATH_WIRELESS_NETWORKS, + WPA_EAP_PREFIX"private_key_file", + escaped_network, + &temp); + /* Nothing to do if a private key file wasn't specified */ + if (!temp) + goto out; + + ret = gnome_keyring_find_itemsv_sync (GNOME_KEYRING_ITEM_GENERIC_SECRET, + &found_list, + "private-key-passwd", + GNOME_KEYRING_ATTRIBUTE_TYPE_STRING, + ssid, + NULL); + /* Nothing to do if the passwords were already converted */ + if ((ret == GNOME_KEYRING_RESULT_OK) && g_list_length (found_list)) + goto out; + gnome_keyring_found_list_free (found_list); + found_list = NULL; + + /* Read private_key_passwd from keyring */ + ret = gnome_keyring_find_itemsv_sync (GNOME_KEYRING_ITEM_GENERIC_SECRET, + &found_list, + "essid", + GNOME_KEYRING_ATTRIBUTE_TYPE_STRING, + ssid, + NULL); + if ((ret == GNOME_KEYRING_RESULT_OK) && g_list_length (found_list)) { + GnomeKeyringFound *found = (GnomeKeyringFound *) found_list->data; + + private_key_passwd = g_strdup (found->secret); + /* Delete old private_key_password keyring item */ + gnome_keyring_item_delete_sync (NULL, found->item_id); + } + gnome_keyring_found_list_free (found_list); + + if (!private_key_passwd) + goto out; + + /* Save private_key_passwd to keyring */ + display_name = g_strdup_printf (_("Private key password for wireless network %s"), ssid); + + attrs = gnome_keyring_attribute_list_new (); + gnome_keyring_attribute_list_append_string (attrs, "private-key-passwd", ssid); + ret = gnome_keyring_item_create_sync (NULL, + GNOME_KEYRING_ITEM_GENERIC_SECRET, + display_name, + attrs, + private_key_passwd, + TRUE, + &item_id); + if (ret != GNOME_KEYRING_RESULT_OK) + nm_warning ("Error saving secret for wireless network '%s' in keyring: %d", ssid, ret); + + g_free (display_name); + gnome_keyring_attribute_list_free (attrs); + +out: + g_free (private_key_passwd); + g_free (temp); +} + +static void +copy_one_wpa_password (GConfClient *client, + const char *ssid, + const char *dir, + const char *escaped_network) +{ + char *gconf_key = NULL; + char *passwd = NULL; + char *display_name = NULL; + GnomeKeyringResult ret; + GnomeKeyringAttributeList *attributes; + GnomeKeyringAttribute attr; + guint32 item_id = 0; + + nm_gconf_get_string_helper (client, + GCONF_PATH_WIRELESS_NETWORKS, + WPA_EAP_PREFIX"passwd", + escaped_network, + &passwd); + /* Nothing to do if a passwd wasn't specified */ + if (!passwd) + return; + + display_name = g_strdup_printf (_("Passphrase for wireless network %s"), ssid); + + attributes = gnome_keyring_attribute_list_new (); + attr.name = g_strdup ("essid"); + attr.type = GNOME_KEYRING_ATTRIBUTE_TYPE_STRING; + attr.value.string = g_strdup (ssid); + g_array_append_val (attributes, attr); + + ret = gnome_keyring_item_create_sync (NULL, + GNOME_KEYRING_ITEM_GENERIC_SECRET, + display_name, + attributes, + passwd, + TRUE, + &item_id); + if (ret != GNOME_KEYRING_RESULT_OK) + nm_warning ("Error saving secret for wireless network '%s' in keyring: %d", ssid, ret); + + g_free (display_name); + gnome_keyring_attribute_list_free (attributes); + + /* Remove passwd value from GConf */ + gconf_key = g_strdup_printf ("%s/%spasswd", dir, WPA_EAP_PREFIX); + if (gconf_key) { + gconf_client_unset (client, gconf_key, NULL); + g_free (gconf_key); + } + + g_free (passwd); +} + +void +nma_compat_move_wpa_eap_passwords (GConfClient *client) +{ + GSList *dir_list = NULL; + GSList *elt; + + g_return_if_fail (client != NULL); + + if (!(dir_list = gconf_client_all_dirs (client, GCONF_PATH_WIRELESS_NETWORKS, NULL))) + return; + + for (elt = dir_list; elt; elt = g_slist_next (elt)) { + char key[100]; + GConfValue *value; + char *dir = (char *) (elt->data); + + g_snprintf (&key[0], 99, "%s/essid", dir); + if ((value = gconf_client_get (client, key, NULL))) { + const char *ssid; + char *escaped_network = NULL; + int we_cipher = -1; + + if (value->type != GCONF_VALUE_STRING) + goto next; + + ssid = gconf_value_get_string (value); + escaped_network = gconf_escape_key (ssid, strlen (ssid)); + if (!escaped_network || strlen (escaped_network) == 0) { + nm_warning ("%s:%d (%s): couldn't unescape network name '%s'.", + __FILE__, __LINE__, __func__, ssid); + goto next; + } + + /* Ignore any entry that looks like it doesn't need conversion */ + if (!nm_gconf_get_int_helper (client, + GCONF_PATH_WIRELESS_NETWORKS, + "we_cipher", + escaped_network, + &we_cipher)) + goto next; + + if (we_cipher != NM_AUTH_TYPE_WPA_EAP) + goto next; + + copy_one_wpa_private_key_password (client, ssid, escaped_network); + copy_one_wpa_password (client, ssid, dir, escaped_network); + +next: + g_free (escaped_network); + gconf_value_free (value); + } + g_free (dir); + } + g_slist_free (dir_list); +} + diff -up NetworkManager-0.6.4/gnome/applet/applet-compat.h.bork NetworkManager-0.6.4/gnome/applet/applet-compat.h --- NetworkManager-0.6.4/gnome/applet/applet-compat.h.bork 2008-01-08 10:17:06.000000000 -0500 +++ NetworkManager-0.6.4/gnome/applet/applet-compat.h 2008-01-08 10:17:26.000000000 -0500 @@ -27,4 +27,6 @@ void nma_compat_convert_oldformat_entries (GConfClient *client); +void nma_compat_move_wpa_eap_passwords (GConfClient *client); + #endif /* APPLET_COMPAT_H */