network-manager-applet r622 - in trunk: . src src/gconf-helpers src/wireless-security



Author: dcbw
Date: Sun Mar 30 18:33:55 2008
New Revision: 622
URL: http://svn.gnome.org/viewvc/network-manager-applet?rev=622&view=rev

Log:
2008-03-30  Dan Williams  <dcbw redhat com>

	* src/gconf-helpers/gconf-helpers.c
	  src/gconf-helpers/gconf-helpers.h
	  src/gconf-helpers/Makefile.am
		- (nm_gconf_get_keyring_items): new function; pull generic bits out
			of applet_exported_connection_get_secrets() so that the connection
			editor can use them too

	* src/applet-dbus-settings.c
		- (applet_exported_connection_get_secrets): pull keyring-reading stuff
			out into nm_gconf_get_keyring_items() and use that instead



Modified:
   trunk/ChangeLog
   trunk/src/applet-dbus-settings.c
   trunk/src/gconf-helpers/Makefile.am
   trunk/src/gconf-helpers/gconf-helpers.c
   trunk/src/gconf-helpers/gconf-helpers.h
   trunk/src/wireless-security/Makefile.am

Modified: trunk/src/applet-dbus-settings.c
==============================================================================
--- trunk/src/applet-dbus-settings.c	(original)
+++ trunk/src/applet-dbus-settings.c	Sun Mar 30 18:33:55 2008
@@ -1069,153 +1069,6 @@
 	return exported->conf_dir;
 }
 
-static GValue *
-string_to_gvalue (const char *str)
-{
-	GValue *val;
-
-	val = g_slice_new0 (GValue);
-	g_value_init (val, G_TYPE_STRING);
-	g_value_set_string (val, str);
-
-	return val;
-}
-
-static GValue *
-byte_array_to_gvalue (const GByteArray *array)
-{
-	GValue *val;
-
-	val = g_slice_new0 (GValue);
-	g_value_init (val, DBUS_TYPE_G_UCHAR_ARRAY);
-	g_value_set_boxed (val, array);
-
-	return val;
-}
-
-static void
-destroy_gvalue (gpointer data)
-{
-	GValue *value = (GValue *) data;
-
-	g_value_unset (value);
-	g_slice_free (GValue, value);
-}
-
-static gboolean
-get_one_private_key (NMConnection *connection,
-                     const char *tag,
-                     const char *password,
-                     GHashTable *secrets)
-{
-	GByteArray *array = NULL;
-	const char *privkey_tag;
-	const char *secret_name;
-	gboolean success = FALSE;
-	GError *error = NULL;
-
-	g_return_val_if_fail (connection != NULL, FALSE);
-	g_return_val_if_fail (tag != NULL, FALSE);
-	g_return_val_if_fail (password != NULL, FALSE);
-
-	if (!strcmp (tag, NMA_PRIVATE_KEY_PASSWORD_TAG)) {
-		privkey_tag = NMA_PATH_PRIVATE_KEY_TAG;
-		secret_name = NM_SETTING_802_1X_PRIVATE_KEY;
-	} else if (!strcmp (tag, NMA_PHASE2_PRIVATE_KEY_PASSWORD_TAG)) {
-		privkey_tag = NMA_PATH_PHASE2_PRIVATE_KEY_TAG;
-		secret_name = NM_SETTING_802_1X_PHASE2_PRIVATE_KEY;
-	} else {
-		g_warning ("Unknown private key password type '%s'", tag);
-		return FALSE;
-	}
-
-	utils_fill_one_crypto_object (connection, privkey_tag, TRUE, password, &array, &error);
-	if (error) {
-		g_warning ("Couldn't read private key: %s", error->message);
-		g_clear_error (&error);
-	} else if (!array || !array->len) {
-		g_warning ("Couldn't read private key; unknown reason.");
-		goto out;
-	}
-
-	g_hash_table_insert (secrets,
-	                     g_strdup (secret_name),
-	                     byte_array_to_gvalue (array));
-	success = TRUE;
-
-out:
-	if (array) {
-		/* Try not to leave the decrypted private key around in memory */
-		memset (array->data, 0, array->len);
-		g_byte_array_free (array, TRUE);
-	}
-	return success;
-}
-
-static GHashTable *
-extract_secrets (NMConnection *connection,
-                 GList *found_list,
-                 const char *connection_name,
-                 const char *setting_name,
-                 GError **error)
-{
-	GHashTable *secrets;
-	GList *iter;
-
-	g_return_val_if_fail (setting_name != NULL, NULL);
-	g_return_val_if_fail (error != NULL, NULL);
-	g_return_val_if_fail (*error == NULL, NULL);
-
-	secrets = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, destroy_gvalue);
-
-	for (iter = found_list; iter != NULL; iter = g_list_next (iter)) {
-		GnomeKeyringFound *found = (GnomeKeyringFound *) iter->data;
-		int i;
-		const char * key_name = NULL;
-
-		for (i = 0; i < found->attributes->len; i++) {
-			GnomeKeyringAttribute *attr;
-
-			attr = &(gnome_keyring_attribute_list_index (found->attributes, i));
-			if (   (strcmp (attr->name, "setting-key") == 0)
-			    && (attr->type == GNOME_KEYRING_ATTRIBUTE_TYPE_STRING)) {
-				key_name = attr->value.string;
-				break;
-			}
-		}
-
-		if (key_name == NULL) {
-			g_set_error (error, NM_SETTINGS_ERROR, 1,
-			             "%s.%d - Internal error; keyring item '%s/%s' didn't "
-			             "have a 'setting-key' attribute.",
-			             __FILE__, __LINE__, connection_name, setting_name);
-			break;
-		}
-
-		if (   !strcmp (setting_name, NM_SETTING_802_1X_SETTING_NAME)
-		    && (   !strcmp (key_name, NMA_PRIVATE_KEY_PASSWORD_TAG)
-		        || !strcmp (key_name, NMA_PHASE2_PRIVATE_KEY_PASSWORD_TAG))) {
-			/* Private key passwords aren't passed to NM, they are used
-			 * to decrypt the private key and send _that_ to NM.
-			 */
-			if (!get_one_private_key (connection, key_name, found->secret, secrets))
-				g_warning ("Couldn't retrieve and decrypt private key.");
-		} else {
-			/* Ignore older obsolete keyring keys that we don't want to leak
-			 * through to NM.
-			 */
-			if (   strcmp (key_name, "private-key-passwd")
-			    && strcmp (key_name, "phase2-private-key-passwd")) {
-				g_hash_table_insert (secrets,
-				                     g_strdup (key_name),
-				                     string_to_gvalue (found->secret));
-			}
-		}
-	}
-
-	return secrets;
-}
-
 static GHashTable *
 applet_exported_connection_get_settings (NMExportedConnection *parent)
 {
@@ -1247,8 +1100,6 @@
 	GError *error = NULL;
 	GHashTable *settings = NULL;
 	GHashTable *secrets = NULL;
-	GList *found_list = NULL;
-	GnomeKeyringResult ret;
 	NMSettingConnection *s_con;
 	NMSetting *setting;
 
@@ -1293,33 +1144,23 @@
 		goto get_secrets;
 	}
 
-	ret = gnome_keyring_find_itemsv_sync (GNOME_KEYRING_ITEM_GENERIC_SECRET,
-	                                      &found_list,
-	                                      "connection-name",
-	                                      GNOME_KEYRING_ATTRIBUTE_TYPE_STRING,
-	                                      s_con->id,
-	                                      "setting-name",
-	                                      GNOME_KEYRING_ATTRIBUTE_TYPE_STRING,
-	                                      setting_name,
-	                                      NULL);
-	if ((ret != GNOME_KEYRING_RESULT_OK) || (g_list_length (found_list) == 0)) {
-		nm_info ("No keyring secrets found for %s/%s; ask the user",
-		         s_con->id, setting_name);
-		goto get_secrets;
-	}
-
 	/* Returned secrets are a{sa{sv}}; this is the outer a{s...} hash that
 	 * will contain all the individual settings hashes.
 	 */
 	settings = g_hash_table_new_full (g_str_hash, g_str_equal,
 	                                  g_free, (GDestroyNotify) g_hash_table_destroy);
 
-	/* Inner a{sv} hash of one setting */
-	secrets = extract_secrets (connection, found_list, s_con->id, setting_name, &error);
-	if (error) {
-		g_warning (error->message);
-		dbus_g_method_return_error (context, error);
-		g_error_free (error);
+	secrets = nm_gconf_get_keyring_items (connection, setting_name, &error);
+	if (!secrets) {
+		if (error) {
+			nm_warning ("Error getting secrets: %s", error->message);
+			dbus_g_method_return_error (context, error);
+			g_error_free (error);
+		} else {
+			nm_info ("No keyring secrets found for %s/%s; asking user.",
+			         s_con->id, setting_name);
+			goto get_secrets;
+		}
 	} else {
 		if (g_hash_table_size (secrets) == 0) {
 			g_hash_table_destroy (secrets);
@@ -1333,7 +1174,6 @@
 	}
 
 	g_hash_table_destroy (settings);
-	gnome_keyring_found_list_free (found_list);
 	return;
 
 get_secrets:

Modified: trunk/src/gconf-helpers/Makefile.am
==============================================================================
--- trunk/src/gconf-helpers/Makefile.am	(original)
+++ trunk/src/gconf-helpers/Makefile.am	Sun Mar 30 18:33:55 2008
@@ -8,7 +8,10 @@
 
 libgconf_helpers_la_CPPFLAGS = \
 	$(NMA_CFLAGS) \
-	-I${top_srcdir}/src
+	-I${top_srcdir}/src \
+	-I${top_srcdir}/src/utils
 
-libgconf_helpers_la_LIBADD = $(NMA_LIBS)
+libgconf_helpers_la_LIBADD = \
+	$(NMA_LIBS) \
+	${top_builddir}/src/utils/libutils.la
 

Modified: trunk/src/gconf-helpers/gconf-helpers.c
==============================================================================
--- trunk/src/gconf-helpers/gconf-helpers.c	(original)
+++ trunk/src/gconf-helpers/gconf-helpers.c	Sun Mar 30 18:33:55 2008
@@ -32,9 +32,11 @@
 #include <nm-setting-8021x.h>
 #include <nm-setting-vpn.h>
 #include <nm-utils.h>
+#include <nm-settings.h>
 
 #include "gconf-helpers.h"
 #include "gconf-upgrade.h"
+#include "utils.h"
 
 const char *applet_8021x_ignore_keys[] = {
 	"ca-cert",
@@ -1034,3 +1036,192 @@
 	write_applet_private_values_to_gconf (&info);
 }
 
+static GValue *
+string_to_gvalue (const char *str)
+{
+	GValue *val;
+
+	val = g_slice_new0 (GValue);
+	g_value_init (val, G_TYPE_STRING);
+	g_value_set_string (val, str);
+
+	return val;
+}
+
+static GValue *
+byte_array_to_gvalue (const GByteArray *array)
+{
+	GValue *val;
+
+	val = g_slice_new0 (GValue);
+	g_value_init (val, DBUS_TYPE_G_UCHAR_ARRAY);
+	g_value_set_boxed (val, array);
+
+	return val;
+}
+
+static void
+destroy_gvalue (gpointer data)
+{
+	GValue *value = (GValue *) data;
+
+	g_value_unset (value);
+	g_slice_free (GValue, value);
+}
+
+static gboolean
+get_one_private_key (NMConnection *connection,
+                     const char *setting_name,
+                     const char *tag,
+                     const char *password,
+                     GHashTable *secrets,
+                     GError **error)
+{
+	NMSettingConnection *s_con;
+	GByteArray *array = NULL;
+	const char *privkey_tag;
+	const char *secret_name;
+	gboolean success = FALSE;
+
+	g_return_val_if_fail (connection != NULL, FALSE);
+	g_return_val_if_fail (tag != NULL, FALSE);
+	g_return_val_if_fail (password != NULL, FALSE);
+	g_return_val_if_fail (error != NULL, FALSE);
+	g_return_val_if_fail (*error == NULL, FALSE);
+
+	s_con = NM_SETTING_CONNECTION (nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION));
+
+	if (!strcmp (tag, NMA_PRIVATE_KEY_PASSWORD_TAG)) {
+		privkey_tag = NMA_PATH_PRIVATE_KEY_TAG;
+		secret_name = NM_SETTING_802_1X_PRIVATE_KEY;
+	} else if (!strcmp (tag, NMA_PHASE2_PRIVATE_KEY_PASSWORD_TAG)) {
+		privkey_tag = NMA_PATH_PHASE2_PRIVATE_KEY_TAG;
+		secret_name = NM_SETTING_802_1X_PHASE2_PRIVATE_KEY;
+	} else {
+		g_set_error (error, NM_SETTINGS_ERROR, 1,
+		             "%s.%d - %s/%s Unknown private key password type '%s'.",
+		             __FILE__, __LINE__, s_con->id, setting_name, tag);
+		return FALSE;
+	}
+
+	utils_fill_one_crypto_object (connection, privkey_tag, TRUE, password, &array, error);
+	if (*error) {
+		goto out;
+	} else if (!array || !array->len) {
+		g_set_error (error, NM_SETTINGS_ERROR, 1,
+		             "%s.%d - %s/%s couldn't read private key.",
+		             __FILE__, __LINE__, s_con->id, setting_name);
+		goto out;
+	}
+
+	g_hash_table_insert (secrets,
+	                     g_strdup (secret_name),
+	                     byte_array_to_gvalue (array));
+	success = TRUE;
+
+out:
+	if (array) {
+		/* Try not to leave the decrypted private key around in memory */
+		memset (array->data, 0, array->len);
+		g_byte_array_free (array, TRUE);
+	}
+	return success;
+}
+
+GHashTable *
+nm_gconf_get_keyring_items (NMConnection *connection,
+                            const char *setting_name,
+                            GError **error)
+{
+	NMSettingConnection *s_con;
+	GHashTable *secrets;
+	GList *found_list = NULL;
+	GnomeKeyringResult ret;
+	GList *iter;
+
+	g_return_val_if_fail (connection != NULL, NULL);
+	g_return_val_if_fail (setting_name != NULL, NULL);
+	g_return_val_if_fail (error != NULL, NULL);
+	g_return_val_if_fail (*error == NULL, NULL);
+
+	s_con = NM_SETTING_CONNECTION (nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION));
+	g_assert (s_con);
+	g_assert (s_con->id);
+
+	ret = gnome_keyring_find_itemsv_sync (GNOME_KEYRING_ITEM_GENERIC_SECRET,
+	                                      &found_list,
+	                                      "connection-name",
+	                                      GNOME_KEYRING_ATTRIBUTE_TYPE_STRING,
+	                                      s_con->id,
+	                                      "setting-name",
+	                                      GNOME_KEYRING_ATTRIBUTE_TYPE_STRING,
+	                                      setting_name,
+	                                      NULL);
+	if ((ret != GNOME_KEYRING_RESULT_OK) || (g_list_length (found_list) == 0))
+		return NULL;
+
+	secrets = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, destroy_gvalue);
+
+	for (iter = found_list; iter != NULL; iter = g_list_next (iter)) {
+		GnomeKeyringFound *found = (GnomeKeyringFound *) iter->data;
+		int i;
+		const char * key_name = NULL;
+
+		for (i = 0; i < found->attributes->len; i++) {
+			GnomeKeyringAttribute *attr;
+
+			attr = &(gnome_keyring_attribute_list_index (found->attributes, i));
+			if (   (strcmp (attr->name, "setting-key") == 0)
+			    && (attr->type == GNOME_KEYRING_ATTRIBUTE_TYPE_STRING)) {
+				key_name = attr->value.string;
+				break;
+			}
+		}
+
+		if (key_name == NULL) {
+			g_set_error (error, NM_SETTINGS_ERROR, 1,
+			             "%s.%d - Internal error; keyring item '%s/%s' didn't "
+			             "have a 'setting-key' attribute.",
+			             __FILE__, __LINE__, s_con->id, setting_name);
+			break;
+		}
+
+		if (   !strcmp (setting_name, NM_SETTING_802_1X_SETTING_NAME)
+		    && (   !strcmp (key_name, NMA_PRIVATE_KEY_PASSWORD_TAG)
+		        || !strcmp (key_name, NMA_PHASE2_PRIVATE_KEY_PASSWORD_TAG))) {
+			/* Private key passwords aren't passed to NM, they are used
+			 * to decrypt the private key and send _that_ to NM.
+			 */
+			if (!get_one_private_key (connection, setting_name, key_name,
+			                          found->secret, secrets, error)) {
+				if (!*error) {
+					g_set_error (error, NM_SETTINGS_ERROR, 1,
+					             "%s.%d - %s/%s unknown error from get_one_private_key().",
+					             __FILE__, __LINE__, s_con->id, setting_name);
+				}
+				break;
+			}
+		} else {
+			/* Ignore older obsolete keyring keys that we don't want to leak
+			 * through to NM.
+			 */
+			if (   strcmp (key_name, "private-key-passwd")
+			    && strcmp (key_name, "phase2-private-key-passwd")) {
+				g_hash_table_insert (secrets,
+				                     g_strdup (key_name),
+				                     string_to_gvalue (found->secret));
+			}
+		}
+	}
+
+	if (*error) {
+		nm_warning ("%s: error reading secrets: (%d) %s", __func__,
+		            (*error)->code, (*error)->message);
+		g_hash_table_destroy (secrets);
+		secrets = NULL;
+	}
+
+	gnome_keyring_found_list_free (found_list);
+	return secrets;
+}
+

Modified: trunk/src/gconf-helpers/gconf-helpers.h
==============================================================================
--- trunk/src/gconf-helpers/gconf-helpers.h	(original)
+++ trunk/src/gconf-helpers/gconf-helpers.h	Sun Mar 30 18:33:55 2008
@@ -159,5 +159,10 @@
                            const char *setting_key,
                            const char *secret);
 
+GHashTable *
+nm_gconf_get_keyring_items (NMConnection *connection,
+                            const char *setting_name,
+                            GError **error);
+
 #endif	/* GCONF_HELPERS_H */
 

Modified: trunk/src/wireless-security/Makefile.am
==============================================================================
--- trunk/src/wireless-security/Makefile.am	(original)
+++ trunk/src/wireless-security/Makefile.am	Sun Mar 30 18:33:55 2008
@@ -35,5 +35,6 @@
 
 libwireless_security_la_LIBADD = \
 	$(NMA_LIBS) \
-	${top_builddir}/src/utils/libutils.la
+	${top_builddir}/src/utils/libutils.la \
+	${top_builddir}/src/gconf-helpers/libgconf-helpers.la
 



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