public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-commits] proj/gnome:gnome-next commit in: net-misc/networkmanager/, net-misc/networkmanager/files/0.8.9997/
@ 2011-07-22  8:33 Alexandre Restovtsev
  0 siblings, 0 replies; only message in thread
From: Alexandre Restovtsev @ 2011-07-22  8:33 UTC (permalink / raw
  To: gentoo-commits

commit:     eb267876af4514ab823081fc993ca80463ff4e19
Author:     Alexandre Rostovtsev <tetromino <AT> gmail <DOT> com>
AuthorDate: Fri Jul 22 07:57:53 2011 +0000
Commit:     Alexandre Restovtsev <tetromino <AT> gmail <DOT> com>
CommitDate: Fri Jul 22 08:21:29 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gnome.git;a=commit;h=eb267876

net-misc/networkmanager: 0.8.9997 → 0.8.9997-r1

Add a number of highly useful patches from upstream git:
1. don't assume that the network will be the same when unplugging and
replugging an ethernet cable
2. fix failure to auto-connect to hidden SSIDs
3. fix a crasher with glib-2.29.x
4. make sure a temporary DHCP failure doesn't result in a connection
becoming permanently marked invalid
5. fix failure to auto-connect to password-protected connections
6. fix a crasher
7. fix SSID parsing
8. another fix for SSID parsing
9. don't mark a connection as failed if ipv6 failed and ipv4 succeeded

---
 ...auto-retries-counter-when-cable-is-replug.patch |   80 +++
 ...ix-auto-connect-to-hidden-SSIDs-rh-707406.patch |  502 ++++++++++++++++++++
 ...fix-crash-for-AddAndActivateConnection-D-.patch |   29 ++
 ...ve-invalid-mark-for-failed-connections-af.patch |  109 +++++
 ...tions-failed-due-to-missing-secrets-are-r.patch |  280 +++++++++++
 ...-not-crash-on-GetSecrets-in-case-of-missi.patch |   29 ++
 ...tinguish-better-between-string-x-int-list.patch |   70 +++
 ...-integer-list-SSID-parsing-after-30c41a4b.patch |  211 ++++++++
 ...default-to-allowing-IPv6-connections-to-f.patch |   32 ++
 ...97.ebuild => networkmanager-0.8.9997-r1.ebuild} |    4 +
 10 files changed, 1346 insertions(+), 0 deletions(-)

diff --git a/net-misc/networkmanager/files/0.8.9997/0001-core-reset-auto-retries-counter-when-cable-is-replug.patch b/net-misc/networkmanager/files/0.8.9997/0001-core-reset-auto-retries-counter-when-cable-is-replug.patch
new file mode 100644
index 0000000..f6eb6bc
--- /dev/null
+++ b/net-misc/networkmanager/files/0.8.9997/0001-core-reset-auto-retries-counter-when-cable-is-replug.patch
@@ -0,0 +1,80 @@
+From 9aa7efcf28a0230876fc6fc5be6dfee5f35d0630 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Ji=C5=99=C3=AD=20Klime=C5=A1?= <jklimes@redhat.com>
+Date: Mon, 30 May 2011 12:07:41 +0100
+Subject: [PATCH] core: reset auto retries counter when cable is replugged
+
+When re-plugging we may be in a different network. So we should try the
+compatible connections again.
+
+Based on a patch from Mikhail Efremov.
+---
+ src/nm-policy.c |   21 +++++++++++++++------
+ 1 files changed, 15 insertions(+), 6 deletions(-)
+
+diff --git a/src/nm-policy.c b/src/nm-policy.c
+index 194d111..b98fe32 100644
+--- a/src/nm-policy.c
++++ b/src/nm-policy.c
+@@ -817,13 +817,17 @@ hostname_changed (NMManager *manager, GParamSpec *pspec, gpointer user_data)
+ }
+ 
+ static void
+-reset_retries_all (NMSettings *settings)
++reset_retries_all (NMSettings *settings, NMDevice *device)
+ {
+ 	GSList *connections, *iter;
++	GError *error = NULL;
+ 
+ 	connections = nm_settings_get_connections (settings);
+-	for (iter = connections; iter; iter = g_slist_next (iter))
+-		set_connection_auto_retries (NM_CONNECTION (iter->data), RETRIES_DEFAULT);
++	for (iter = connections; iter; iter = g_slist_next (iter)) {
++		if (!device || nm_device_interface_check_connection_compatible (NM_DEVICE_INTERFACE (device), iter->data, &error))
++			set_connection_auto_retries (NM_CONNECTION (iter->data), RETRIES_DEFAULT);
++		g_clear_error (&error);
++	}
+ 	g_slist_free (connections);
+ }
+ 
+@@ -838,7 +842,7 @@ sleeping_changed (NMManager *manager, GParamSpec *pspec, gpointer user_data)
+ 
+ 	/* Reset retries on all connections so they'll checked on wakeup */
+ 	if (sleeping || !enabled)
+-		reset_retries_all (policy->settings);
++		reset_retries_all (policy->settings, NULL);
+ }
+ 
+ static void
+@@ -932,6 +936,11 @@ device_state_changed (NMDevice *device,
+ 		update_routing_and_dns (policy, FALSE);
+ 		break;
+ 	case NM_DEVICE_STATE_DISCONNECTED:
++		/* Clear INVALID_TAG when carrier on. If cable was unplugged
++		 * and plugged again, we should try to reconnect */
++		if (reason == NM_DEVICE_STATE_REASON_CARRIER && old_state == NM_DEVICE_STATE_UNAVAILABLE)
++			reset_retries_all (policy->settings, device);
++
+ 		/* Device is now available for auto-activation */
+ 		update_routing_and_dns (policy, FALSE);
+ 		schedule_activate_check (policy, device, 0);
+@@ -1058,7 +1067,7 @@ connections_loaded (NMSettings *settings, gpointer user_data)
+ 	// that by calling reset_retries_all() in nm_policy_new()
+ 	
+ 	/* Initialize connections' auto-retries */
+-	reset_retries_all (settings);
++	reset_retries_all (settings, NULL);
+ 
+ 	schedule_activate_all ((NMPolicy *) user_data);
+ }
+@@ -1188,7 +1197,7 @@ nm_policy_new (NMManager *manager,
+ 	                          connection_visibility_changed);
+ 
+ 	/* Initialize connections' auto-retries */
+-	reset_retries_all (policy->settings);
++	reset_retries_all (policy->settings, NULL);
+ 
+ 	initialized = TRUE;
+ 	return policy;
+-- 
+1.7.6
+

diff --git a/net-misc/networkmanager/files/0.8.9997/0002-core-fix-auto-connect-to-hidden-SSIDs-rh-707406.patch b/net-misc/networkmanager/files/0.8.9997/0002-core-fix-auto-connect-to-hidden-SSIDs-rh-707406.patch
new file mode 100644
index 0000000..565b01b
--- /dev/null
+++ b/net-misc/networkmanager/files/0.8.9997/0002-core-fix-auto-connect-to-hidden-SSIDs-rh-707406.patch
@@ -0,0 +1,502 @@
+From 9549c70d943e3709694c4b0eb2595af11962c0eb Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Ji=C5=99=C3=AD=20Klime=C5=A1?= <jklimes@redhat.com>
+Date: Fri, 27 May 2011 17:32:40 +0200
+Subject: [PATCH] core: fix auto-connect to hidden SSIDs (rh #707406)
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Previously (in NM 0.8.x) most WiFi connection were from user settings service.
+And the service updated 'seen-bssids' property when got connected.
+But the settings service in 0.9 don't do that. That inhibits auto-connecting to
+hidden networks. This commit takes care of updating 'seen-bssids'. However, we
+don't want to write out the conection each time it's activated (touching /etc).
+So, seen BSSIDs are kept separately from the connection in a look-aside file.
+
+Signed-off-by: Jiří Klimeš <jklimes@redhat.com>
+---
+ src/nm-device-wifi.c                  |   30 +++++-
+ src/nm-manager.c                      |   44 ++-----
+ src/settings/nm-settings-connection.c |  216 +++++++++++++++++++++++++++++++--
+ src/settings/nm-settings-connection.h |    9 ++
+ src/settings/nm-settings.c            |    3 +
+ 5 files changed, 256 insertions(+), 46 deletions(-)
+
+diff --git a/src/nm-device-wifi.c b/src/nm-device-wifi.c
+index 7a6e752..7f9b5d2 100644
+--- a/src/nm-device-wifi.c
++++ b/src/nm-device-wifi.c
+@@ -55,6 +55,7 @@
+ #include "nm-setting-ip4-config.h"
+ #include "nm-setting-ip6-config.h"
+ #include "nm-system.h"
++#include "nm-settings-connection.h"
+ 
+ static gboolean impl_device_get_access_points (NMDeviceWifi *device,
+                                                GPtrArray **aps,
+@@ -978,6 +979,28 @@ get_active_ap (NMDeviceWifi *self,
+ }
+ 
+ static void
++update_seen_bssids_cache (NMDeviceWifi *self, NMAccessPoint *ap)
++{
++	NMActRequest *req;
++	NMConnection *connection;
++
++	g_return_if_fail (ap != NULL);
++
++	/* Don't cache the BSSID for Ad-Hoc APs */
++	if (nm_ap_get_mode (ap) != NM_802_11_MODE_INFRA)
++		return;
++
++	if (nm_device_get_state (NM_DEVICE (self)) == NM_DEVICE_STATE_ACTIVATED) {
++		req = nm_device_get_act_request (NM_DEVICE (self));
++		if (req) {
++			connection = nm_act_request_get_connection (req);
++			nm_settings_connection_add_seen_bssid (NM_SETTINGS_CONNECTION (connection),
++			                                       nm_ap_get_address (ap));
++		}
++	}
++}
++
++static void
+ set_current_ap (NMDeviceWifi *self, NMAccessPoint *new_ap)
+ {
+ 	NMDeviceWifiPrivate *priv;
+@@ -1003,6 +1026,9 @@ set_current_ap (NMDeviceWifi *self, NMAccessPoint *new_ap)
+ 		 */
+ 		priv->ap_list = g_slist_remove (priv->ap_list, new_ap);
+ 		priv->ap_list = g_slist_prepend (priv->ap_list, new_ap);
++
++		/* Update seen BSSIDs cache */
++		update_seen_bssids_cache (self, priv->current_ap);
+ 	}
+ 
+ 	/* Unref old AP here to ensure object lives if new_ap == old_ap */
+@@ -3436,11 +3462,13 @@ activation_success_handler (NMDevice *dev)
+ done:
+ 	periodic_update (self);
+ 
++	/* Update seen BSSIDs cache with the connected AP */
++	update_seen_bssids_cache (self, priv->current_ap);
++
+ 	/* Reset scan interval to something reasonable */
+ 	priv->scan_interval = SCAN_INTERVAL_MIN + (SCAN_INTERVAL_STEP * 2);
+ }
+ 
+-
+ static void
+ activation_failure_handler (NMDevice *dev)
+ {
+diff --git a/src/nm-manager.c b/src/nm-manager.c
+index 5a3f7f7..a15e4b7 100644
+--- a/src/nm-manager.c
++++ b/src/nm-manager.c
+@@ -63,6 +63,7 @@
+ #include "nm-settings-connection.h"
+ #include "nm-manager-auth.h"
+ #include "NetworkManagerUtils.h"
++#include "nm-utils.h"
+ 
+ #define NM_AUTOIP_DBUS_SERVICE "org.freedesktop.nm_avahi_autoipd"
+ #define NM_AUTOIP_DBUS_IFACE   "org.freedesktop.nm_avahi_autoipd"
+@@ -1040,52 +1041,27 @@ manager_hidden_ap_found (NMDeviceInterface *device,
+ {
+ 	NMManager *manager = NM_MANAGER (user_data);
+ 	NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (manager);
+-	const struct ether_addr *ap_addr;
+-	const GByteArray *ap_ssid;
++	const struct ether_addr *bssid;
+ 	GSList *iter;
+ 	GSList *connections;
+ 	gboolean done = FALSE;
+ 
+-	ap_ssid = nm_ap_get_ssid (ap);
+-	if (ap_ssid && ap_ssid->len)
+-		return;
++	g_return_if_fail (nm_ap_get_ssid (ap) == NULL);
+ 
+-	ap_addr = nm_ap_get_address (ap);
+-	g_assert (ap_addr);
++	bssid = nm_ap_get_address (ap);
++	g_assert (bssid);
+ 
+ 	/* Look for this AP's BSSID in the seen-bssids list of a connection,
+ 	 * and if a match is found, copy over the SSID */
+ 	connections = nm_settings_get_connections (priv->settings);
+-
+ 	for (iter = connections; iter && !done; iter = g_slist_next (iter)) {
+ 		NMConnection *connection = NM_CONNECTION (iter->data);
+-		NMSettingWireless *s_wireless;
+-		const GByteArray *ssid;
+-		guint32 num_bssids;
+-		guint32 i;
+-
+-		s_wireless = (NMSettingWireless *) nm_connection_get_setting (connection, NM_TYPE_SETTING_WIRELESS);
+-		if (!s_wireless)
+-			continue;
+-
+-		num_bssids = nm_setting_wireless_get_num_seen_bssids (s_wireless);
+-		if (num_bssids < 1)
+-			continue;
+-
+-		ssid = nm_setting_wireless_get_ssid (s_wireless);
+-		g_assert (ssid);
+-
+-		for (i = 0; i < num_bssids && !done; i++) {
+-			const char *seen_bssid = nm_setting_wireless_get_seen_bssid (s_wireless, i);
+-			struct ether_addr seen_addr;
++		NMSettingWireless *s_wifi;
+ 
+-			if (ether_aton_r (seen_bssid, &seen_addr)) {
+-				if (memcmp (ap_addr, &seen_addr, sizeof (struct ether_addr)) == 0) {
+-					/* Copy the SSID from the connection to the AP */
+-					nm_ap_set_ssid (ap, ssid);
+-					done = TRUE;
+-				}
+-			}
++		s_wifi = nm_connection_get_setting_wireless (connection);
++		if (s_wifi) {
++			if (nm_settings_connection_has_seen_bssid (NM_SETTINGS_CONNECTION (connection), bssid))
++				nm_ap_set_ssid (ap, nm_setting_wireless_get_ssid (s_wifi));
+ 		}
+ 	}
+ 	g_slist_free (connections);
+diff --git a/src/settings/nm-settings-connection.c b/src/settings/nm-settings-connection.c
+index 828a036..c20ba82 100644
+--- a/src/settings/nm-settings-connection.c
++++ b/src/settings/nm-settings-connection.c
+@@ -22,6 +22,7 @@
+ #include "config.h"
+ 
+ #include <string.h>
++#include <netinet/ether.h>
+ 
+ #include <NetworkManager.h>
+ #include <dbus/dbus-glib-lowlevel.h>
+@@ -38,8 +39,10 @@
+ #include "nm-manager-auth.h"
+ #include "nm-marshal.h"
+ #include "nm-agent-manager.h"
++#include "NetworkManagerUtils.h"
+ 
+ #define SETTINGS_TIMESTAMPS_FILE  LOCALSTATEDIR"/lib/NetworkManager/timestamps"
++#define SETTINGS_SEEN_BSSIDS_FILE LOCALSTATEDIR"/lib/NetworkManager/seen-bssids"
+ 
+ static void impl_settings_connection_get_settings (NMSettingsConnection *connection,
+                                                    DBusGMethodInvocation *context);
+@@ -91,7 +94,8 @@ typedef struct {
+ 	NMSessionMonitor *session_monitor;
+ 	guint session_changed_id;
+ 
+-	guint64 timestamp; /* Up-to-date timestamp of connection use */
++	guint64 timestamp;   /* Up-to-date timestamp of connection use */
++	GHashTable *seen_bssids; /* Up-to-date BSSIDs that's been seen for the connection */
+ } NMSettingsConnectionPrivate;
+ 
+ /**************************************************************/
+@@ -455,12 +459,20 @@ commit_changes (NMSettingsConnection *connection,
+ }
+ 
+ static void
+-remove_timestamp_from_db (NMSettingsConnection *connection)
++remove_entry_from_db (NMSettingsConnection *connection, const char* db_name)
+ {
+-	GKeyFile *timestamps_file;
++	GKeyFile *key_file;
++	const char *db_file;
+ 
+-	timestamps_file = g_key_file_new ();
+-	if (g_key_file_load_from_file (timestamps_file, SETTINGS_TIMESTAMPS_FILE, G_KEY_FILE_KEEP_COMMENTS, NULL)) {
++	if (strcmp (db_name, "timestamps") == 0)
++		db_file = SETTINGS_TIMESTAMPS_FILE;
++	else if (strcmp (db_name, "seen-bssids") == 0)
++		db_file = SETTINGS_SEEN_BSSIDS_FILE;
++	else
++		return;
++
++	key_file = g_key_file_new ();
++	if (g_key_file_load_from_file (key_file, db_file, G_KEY_FILE_KEEP_COMMENTS, NULL)) {
+ 		const char *connection_uuid;
+ 		char *data;
+ 		gsize len;
+@@ -468,18 +480,18 @@ remove_timestamp_from_db (NMSettingsConnection *connection)
+ 
+ 		connection_uuid = nm_connection_get_uuid (NM_CONNECTION (connection));
+ 
+-		g_key_file_remove_key (timestamps_file, "timestamps", connection_uuid, NULL);
+-		data = g_key_file_to_data (timestamps_file, &len, &error);
++		g_key_file_remove_key (key_file, db_name, connection_uuid, NULL);
++		data = g_key_file_to_data (key_file, &len, &error);
+ 		if (data) {
+-			g_file_set_contents (SETTINGS_TIMESTAMPS_FILE, data, len, &error);
++			g_file_set_contents (db_file, data, len, &error);
+ 			g_free (data);
+ 		}
+ 		if (error) {
+-			nm_log_warn (LOGD_SETTINGS, "error writing timestamps file '%s': %s", SETTINGS_TIMESTAMPS_FILE, error->message);
++			nm_log_warn (LOGD_SETTINGS, "error writing %s file '%s': %s", db_name, db_file, error->message);
+ 			g_error_free (error);
+ 		}
+ 	}
+-	g_key_file_free (timestamps_file);
++	g_key_file_free (key_file);
+ }
+ 
+ static void
+@@ -499,7 +511,10 @@ do_delete (NMSettingsConnection *connection,
+ 	nm_agent_manager_delete_secrets (priv->agent_mgr, for_agents, FALSE, 0);
+ 
+ 	/* Remove timestamp from timestamps database file */
+-	remove_timestamp_from_db (connection);
++	remove_entry_from_db (connection, "timestamps");
++
++	/* Remove connection from seen-bssids database file */
++	remove_entry_from_db (connection, "seen-bssids");
+ 
+ 	/* Signal the connection is removed and deleted */
+ 	g_signal_emit (connection, signals[REMOVED], 0);
+@@ -1440,6 +1455,181 @@ nm_settings_connection_read_and_fill_timestamp (NMSettingsConnection *connection
+ 	g_key_file_free (timestamps_file);
+ }
+ 
++static guint
++mac_hash (gconstpointer v)
++{
++	const guint8 *p = v;
++	guint32 i, h = 5381;
++
++	for (i = 0; i < ETH_ALEN; i++)
++		h = (h << 5) + h + p[i];
++	return h;
++}
++
++static gboolean
++mac_equal (gconstpointer a, gconstpointer b)
++{
++	return memcmp (a, b, ETH_ALEN) == 0;
++}
++
++static guint8 *
++mac_dup (const struct ether_addr *old)
++{
++	guint8 *new;
++
++	g_return_val_if_fail (old != NULL, NULL);
++
++	new = g_malloc0 (ETH_ALEN);
++	memcpy (new, old, ETH_ALEN);
++	return new;
++}
++
++/**
++ * nm_settings_connection_has_seen_bssid:
++ * @connection: the #NMSettingsConnection
++ * @bssid: the BSSID to check the seen BSSID list for
++ *
++ * Returns: TRUE if the given @bssid is in the seen BSSIDs list
++ **/
++gboolean
++nm_settings_connection_has_seen_bssid (NMSettingsConnection *connection,
++                                       const struct ether_addr *bssid)
++{
++	g_return_val_if_fail (connection != NULL, FALSE);
++	g_return_val_if_fail (NM_IS_SETTINGS_CONNECTION (connection), FALSE);
++	g_return_val_if_fail (bssid != NULL, FALSE);
++
++	return !!g_hash_table_lookup (NM_SETTINGS_CONNECTION_GET_PRIVATE (connection)->seen_bssids, bssid);
++}
++
++/**
++ * nm_settings_connection_add_seen_bssid:
++ * @connection: the #NMSettingsConnection
++ * @seen_bssid: BSSID to set into the connection and to store into
++ * the seen-bssids database
++ *
++ * Updates the connection and seen-bssids database with the provided BSSID.
++ **/
++void
++nm_settings_connection_add_seen_bssid (NMSettingsConnection *connection,
++                                       const struct ether_addr *seen_bssid)
++{
++	NMSettingsConnectionPrivate *priv = NM_SETTINGS_CONNECTION_GET_PRIVATE (connection);
++	const char *connection_uuid;
++	GKeyFile *seen_bssids_file;
++	char *data, *bssid_str;
++	const char **list;
++	gsize len;
++	GError *error = NULL;
++	GHashTableIter iter;
++	guint n;
++
++	g_return_if_fail (seen_bssid != NULL);
++
++	if (g_hash_table_lookup (priv->seen_bssids, seen_bssid))
++		return;  /* Already in the list */
++
++	/* Add the new BSSID; let the hash take ownership of the allocated BSSID string */
++	bssid_str = nm_ether_ntop (seen_bssid);
++	g_return_if_fail (bssid_str != NULL);
++	g_hash_table_insert (priv->seen_bssids, mac_dup (seen_bssid), bssid_str);
++
++	/* Build up a list of all the BSSIDs in string form */
++	n = 0;
++	list = g_malloc0 (g_hash_table_size (priv->seen_bssids) * sizeof (char *));
++	g_hash_table_iter_init (&iter, priv->seen_bssids);
++	while (g_hash_table_iter_next (&iter, NULL, (gpointer) &bssid_str))
++		list[n++] = bssid_str;
++
++	/* Save BSSID to seen-bssids file */
++	seen_bssids_file = g_key_file_new ();
++	g_key_file_set_list_separator (seen_bssids_file, ',');
++	if (!g_key_file_load_from_file (seen_bssids_file, SETTINGS_SEEN_BSSIDS_FILE, G_KEY_FILE_KEEP_COMMENTS, &error)) {
++		if (!g_error_matches (error, G_FILE_ERROR, G_FILE_ERROR_NOENT)) {
++			nm_log_warn (LOGD_SETTINGS, "error parsing seen-bssids file '%s': %s",
++			             SETTINGS_SEEN_BSSIDS_FILE, error->message);
++		}
++		g_clear_error (&error);
++	}
++
++	connection_uuid = nm_connection_get_uuid (NM_CONNECTION (connection));
++	g_key_file_set_string_list (seen_bssids_file, "seen-bssids", connection_uuid, list, n);
++	g_free (list);
++
++	data = g_key_file_to_data (seen_bssids_file, &len, &error);
++	if (data) {
++		g_file_set_contents (SETTINGS_SEEN_BSSIDS_FILE, data, len, &error);
++		g_free (data);
++	}
++	g_key_file_free (seen_bssids_file);
++
++	if (error) {
++		nm_log_warn (LOGD_SETTINGS, "error saving seen-bssids to file '%s': %s",
++		             SETTINGS_SEEN_BSSIDS_FILE, error->message);
++		g_error_free (error);
++	}
++}
++
++static void
++add_seen_bssid_string (NMSettingsConnection *self, const char *bssid)
++{
++	struct ether_addr mac;
++
++	g_return_if_fail (bssid != NULL);
++	if (ether_aton_r (bssid, &mac)) {
++		g_hash_table_insert (NM_SETTINGS_CONNECTION_GET_PRIVATE (self)->seen_bssids,
++		                     mac_dup (&mac),
++		                     g_strdup (bssid));
++	}
++}
++
++/**
++ * nm_settings_connection_read_and_fill_seen_bssids:
++ * @connection: the #NMSettingsConnection
++ *
++ * Retrieves seen BSSIDs of the connection from database file and stores then into the
++ * connection private data.
++ **/
++void
++nm_settings_connection_read_and_fill_seen_bssids (NMSettingsConnection *connection)
++{
++	NMSettingsConnectionPrivate *priv = NM_SETTINGS_CONNECTION_GET_PRIVATE (connection);
++	const char *connection_uuid;
++	GKeyFile *seen_bssids_file;
++	char **tmp_strv = NULL;
++	gsize i, len = 0;
++	NMSettingWireless *s_wifi;
++
++	/* Get seen BSSIDs from database file */
++	seen_bssids_file = g_key_file_new ();
++	g_key_file_set_list_separator (seen_bssids_file, ',');
++	if (g_key_file_load_from_file (seen_bssids_file, SETTINGS_SEEN_BSSIDS_FILE, G_KEY_FILE_KEEP_COMMENTS, NULL)) {
++		connection_uuid = nm_connection_get_uuid (NM_CONNECTION (connection));
++		tmp_strv = g_key_file_get_string_list (seen_bssids_file, "seen-bssids", connection_uuid, &len, NULL);
++	}
++	g_key_file_free (seen_bssids_file);
++
++	/* Update connection's seen-bssids */
++	if (tmp_strv) {
++		g_hash_table_remove_all (priv->seen_bssids);
++		for (i = 0; i < len; i++)
++			add_seen_bssid_string (connection, tmp_strv[i]);
++		g_strfreev (tmp_strv);
++	} else {
++		/* If this connection didn't have an entry in the seen-bssids database,
++		 * maybe this is the first time we've read it in, so populate the
++		 * seen-bssids list from the deprecated seen-bssids property of the
++		 * wifi setting.
++		 */
++		s_wifi = nm_connection_get_setting_wireless (NM_CONNECTION (connection));
++		if (s_wifi) {
++			len = nm_setting_wireless_get_num_seen_bssids (s_wifi);
++			for (i = 0; i < len; i++)
++				add_seen_bssid_string (connection, nm_setting_wireless_get_seen_bssid (s_wifi, i));
++		}
++	}
++}
++
+ /**************************************************************/
+ 
+ static void
+@@ -1463,6 +1653,8 @@ nm_settings_connection_init (NMSettingsConnection *self)
+ 	                                             self);
+ 
+ 	priv->agent_mgr = nm_agent_manager_get ();
++
++	priv->seen_bssids = g_hash_table_new_full (mac_hash, mac_equal, g_free, g_free);
+ }
+ 
+ static void
+@@ -1490,6 +1682,8 @@ dispose (GObject *object)
+ 		nm_agent_manager_cancel_secrets (priv->agent_mgr, GPOINTER_TO_UINT (iter->data));
+ 	g_slist_free (priv->reqs);
+ 
++	g_hash_table_destroy (priv->seen_bssids);
++
+ 	set_visible (self, FALSE);
+ 
+ 	if (priv->session_changed_id)
+diff --git a/src/settings/nm-settings-connection.h b/src/settings/nm-settings-connection.h
+index 116bfdc..af90c51 100644
+--- a/src/settings/nm-settings-connection.h
++++ b/src/settings/nm-settings-connection.h
+@@ -24,6 +24,7 @@
+ 
+ #include <nm-connection.h>
+ #include "nm-settings-flags.h"
++#include <net/ethernet.h>
+ 
+ G_BEGIN_DECLS
+ 
+@@ -124,6 +125,14 @@ void nm_settings_connection_update_timestamp (NMSettingsConnection *connection,
+ 
+ void nm_settings_connection_read_and_fill_timestamp (NMSettingsConnection *connection);
+ 
++gboolean nm_settings_connection_has_seen_bssid (NMSettingsConnection *connection,
++                                                const struct ether_addr *bssid);
++
++void nm_settings_connection_add_seen_bssid (NMSettingsConnection *connection,
++                                            const struct ether_addr *seen_bssid);
++
++void nm_settings_connection_read_and_fill_seen_bssids (NMSettingsConnection *connection);
++
+ G_END_DECLS
+ 
+ #endif /* NM_SETTINGS_CONNECTION_H */
+diff --git a/src/settings/nm-settings.c b/src/settings/nm-settings.c
+index e23e8d1..8329780 100644
+--- a/src/settings/nm-settings.c
++++ b/src/settings/nm-settings.c
+@@ -773,6 +773,9 @@ claim_connection (NMSettings *self,
+ 	/* Read timestamp from look-aside file and put it into the connection's data */
+ 	nm_settings_connection_read_and_fill_timestamp (connection);
+ 
++	/* Read seen-bssids from look-aside file and put it into the connection's data */
++	nm_settings_connection_read_and_fill_seen_bssids (connection);
++
+ 	/* Ensure it's initial visibility is up-to-date */
+ 	nm_settings_connection_recheck_visibility (connection);
+ 
+-- 
+1.7.6
+

diff --git a/net-misc/networkmanager/files/0.8.9997/0003-libnm-glib-fix-crash-for-AddAndActivateConnection-D-.patch b/net-misc/networkmanager/files/0.8.9997/0003-libnm-glib-fix-crash-for-AddAndActivateConnection-D-.patch
new file mode 100644
index 0000000..8cc16c4
--- /dev/null
+++ b/net-misc/networkmanager/files/0.8.9997/0003-libnm-glib-fix-crash-for-AddAndActivateConnection-D-.patch
@@ -0,0 +1,29 @@
+From b4a72d1ad794aef4c623fd530fc38ceb9b95456d Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Ji=C5=99=C3=AD=20Klime=C5=A1?= <jklimes@redhat.com>
+Date: Tue, 14 Jun 2011 19:39:23 +0200
+Subject: [PATCH] libnm-glib: fix crash for AddAndActivateConnection() D-Bus
+ call (bgo #652512)
+
+When a partial connection is passed to nm_client_add_and_activate_connection(),
+but it doesn't contain any settings, nm_connection_to_hash() returns NULL and
+there's a crash later on the NULL hash.
+---
+ libnm-glib/nm-client.c |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/libnm-glib/nm-client.c b/libnm-glib/nm-client.c
+index 644af3e..752510a 100644
+--- a/libnm-glib/nm-client.c
++++ b/libnm-glib/nm-client.c
+@@ -763,7 +763,7 @@ nm_client_add_and_activate_connection (NMClient *client,
+ 
+ 	if (partial)
+ 		hash = nm_connection_to_hash (partial, NM_SETTING_HASH_FLAG_ALL);
+-	else
++	if (!hash)
+ 		hash = g_hash_table_new (g_str_hash, g_str_equal);
+ 
+ 	priv = NM_CLIENT_GET_PRIVATE (client);
+-- 
+1.7.6
+

diff --git a/net-misc/networkmanager/files/0.8.9997/0004-policy-remove-invalid-mark-for-failed-connections-af.patch b/net-misc/networkmanager/files/0.8.9997/0004-policy-remove-invalid-mark-for-failed-connections-af.patch
new file mode 100644
index 0000000..f2af25e
--- /dev/null
+++ b/net-misc/networkmanager/files/0.8.9997/0004-policy-remove-invalid-mark-for-failed-connections-af.patch
@@ -0,0 +1,109 @@
+From fdfbe00aac3f17b19bb8d84cba1c8f210d90e8a0 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Ji=C5=99=C3=AD=20Klime=C5=A1?= <jklimes@redhat.com>
+Date: Fri, 17 Jun 2011 12:43:28 +0200
+Subject: [PATCH] policy: remove "invalid mark" for failed connections after 5
+ mins
+
+If there is a temporary connection failure (e.g. due to unavailable DHCP), the
+connection is marked as invalid after several retries. Reset the flag after
+5 mins to allow next auto-reconnection.
+---
+ src/nm-policy.c |   47 +++++++++++++++++++++++++++++++++++++++++++++--
+ 1 files changed, 45 insertions(+), 2 deletions(-)
+
+diff --git a/src/nm-policy.c b/src/nm-policy.c
+index 3eead41..e3c899f 100644
+--- a/src/nm-policy.c
++++ b/src/nm-policy.c
+@@ -66,12 +66,16 @@ struct NMPolicy {
+ 
+ 	HostnameThread *lookup;
+ 
++	gint reset_retries_id;  /* idle handler for resetting the retries count */
++
+ 	char *orig_hostname; /* hostname at NM start time */
+ 	char *cur_hostname;  /* hostname we want to assign */
+ };
+ 
+ #define RETRIES_TAG "autoconnect-retries"
+ #define RETRIES_DEFAULT	4
++#define RESET_RETRIES_TIMESTAMP_TAG "reset-retries-timestamp-tag"
++#define RESET_RETRIES_TIMER 300
+ 
+ static NMDevice *
+ get_best_ip4_device (NMManager *manager, NMActRequest **out_req)
+@@ -870,6 +874,37 @@ schedule_activate_check (NMPolicy *policy, NMDevice *device, guint delay_seconds
+ 	}
+ }
+ 
++static gboolean
++reset_connections_retries (gpointer user_data)
++{
++	NMPolicy *policy = (NMPolicy *) user_data;
++	GSList *connections, *iter;
++	time_t con_stamp, min_stamp, now;
++
++	policy->reset_retries_id = 0;
++
++	min_stamp = now = time (NULL);
++	connections = nm_settings_get_connections (policy->settings);
++	for (iter = connections; iter; iter = g_slist_next (iter)) {
++		con_stamp = GPOINTER_TO_SIZE (g_object_get_data (G_OBJECT (iter->data), RESET_RETRIES_TIMESTAMP_TAG));
++		if (con_stamp == 0)
++			continue;
++		if (con_stamp + RESET_RETRIES_TIMER <= now) {
++			set_connection_auto_retries (NM_CONNECTION (iter->data), RETRIES_DEFAULT);
++			g_object_set_data (G_OBJECT (iter->data), RESET_RETRIES_TIMESTAMP_TAG, GSIZE_TO_POINTER (0));
++			continue;
++		}
++		if (con_stamp < min_stamp)
++			min_stamp = con_stamp;
++	}
++	g_slist_free (connections);
++
++	/* Schedule the handler again if there are some stamps left */
++	if (min_stamp != now)
++		policy->reset_retries_id = g_timeout_add_seconds (RESET_RETRIES_TIMER - (now - min_stamp), reset_connections_retries, policy);
++	return FALSE;
++}
++
+ static NMConnection *
+ get_device_connection (NMDevice *device)
+ {
+@@ -914,8 +949,13 @@ device_state_changed (NMDevice *device,
+ 				set_connection_auto_retries (connection, tries - 1);
+ 			}
+ 
+-			if (get_connection_auto_retries (connection) == 0)
++			if (get_connection_auto_retries (connection) == 0) {
+ 				nm_log_info (LOGD_DEVICE, "Marking connection '%s' invalid.", nm_connection_get_id (connection));
++				/* Schedule a handler to reset retries count */
++				g_object_set_data (G_OBJECT (connection), RESET_RETRIES_TIMESTAMP_TAG, GSIZE_TO_POINTER ((gsize) time (NULL)));
++				if (!policy->reset_retries_id)
++					policy->reset_retries_id = g_timeout_add_seconds (RESET_RETRIES_TIMER, reset_connections_retries, policy);
++			}
+ 			nm_connection_clear_secrets (connection);
+ 		}
+ 		schedule_activate_check (policy, device, 3);
+@@ -938,7 +978,7 @@ device_state_changed (NMDevice *device,
+ 		update_routing_and_dns (policy, FALSE);
+ 		break;
+ 	case NM_DEVICE_STATE_DISCONNECTED:
+-		/* Clear INVALID_TAG when carrier on. If cable was unplugged
++		/* Reset RETRIES_TAG when carrier on. If cable was unplugged
+ 		 * and plugged again, we should try to reconnect */
+ 		if (reason == NM_DEVICE_STATE_REASON_CARRIER && old_state == NM_DEVICE_STATE_UNAVAILABLE)
+ 			reset_retries_all (policy->settings, device);
+@@ -1246,6 +1286,9 @@ nm_policy_destroy (NMPolicy *policy)
+ 	}
+ 	g_slist_free (policy->dev_ids);
+ 
++	if (policy->reset_retries_id)
++		g_source_remove (policy->reset_retries_id);
++
+ 	g_free (policy->orig_hostname);
+ 	g_free (policy->cur_hostname);
+ 
+-- 
+1.7.6
+

diff --git a/net-misc/networkmanager/files/0.8.9997/0005-core-connections-failed-due-to-missing-secrets-are-r.patch b/net-misc/networkmanager/files/0.8.9997/0005-core-connections-failed-due-to-missing-secrets-are-r.patch
new file mode 100644
index 0000000..f43cf24
--- /dev/null
+++ b/net-misc/networkmanager/files/0.8.9997/0005-core-connections-failed-due-to-missing-secrets-are-r.patch
@@ -0,0 +1,280 @@
+From 69b767bbf0ef8e038dd8bd0bcb35586c0f91ade7 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Ji=C5=99=C3=AD=20Klime=C5=A1?= <jklimes@redhat.com>
+Date: Tue, 28 Jun 2011 15:48:12 +0200
+Subject: [PATCH] core: connections failed due to missing secrets are re-tried
+ when an secret agent registers (rh #706204)
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Use case:
+A user has an auto-activatable connection with secrets in a keyring. While
+booting NM starts and tries to activate the connection, but it fails because of
+missing secrets. Then the user logs in, but the connection is marked as invalid
+and is not tried again.
+
+This commit solves the issue by removing invalid flag and activating the
+connection when a secret agent registers.
+
+Signed-off-by: Jiří Klimeš <jklimes@redhat.com>
+---
+ src/nm-policy.c                 |   40 +++++++++++++++++++++++++++++++++++++++
+ src/settings/nm-agent-manager.c |   22 +++++++++++++++++++++
+ src/settings/nm-agent-manager.h |    4 +++
+ src/settings/nm-settings.c      |   25 ++++++++++++++++++++++++
+ src/settings/nm-settings.h      |    6 ++++-
+ 5 files changed, 96 insertions(+), 1 deletions(-)
+
+diff --git a/src/nm-policy.c b/src/nm-policy.c
+index e3c899f..44f5e1f 100644
+--- a/src/nm-policy.c
++++ b/src/nm-policy.c
+@@ -76,6 +76,7 @@ struct NMPolicy {
+ #define RETRIES_DEFAULT	4
+ #define RESET_RETRIES_TIMESTAMP_TAG "reset-retries-timestamp-tag"
+ #define RESET_RETRIES_TIMER 300
++#define FAILURE_REASON_TAG "failure-reason"
+ 
+ static NMDevice *
+ get_best_ip4_device (NMManager *manager, NMActRequest **out_req)
+@@ -838,6 +839,23 @@ reset_retries_all (NMSettings *settings, NMDevice *device)
+ }
+ 
+ static void
++reset_retries_for_failed_secrets (NMSettings *settings)
++{
++	GSList *connections, *iter;
++
++	connections = nm_settings_get_connections (settings);
++	for (iter = connections; iter; iter = g_slist_next (iter)) {
++		NMDeviceStateReason reason = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (iter->data), FAILURE_REASON_TAG));
++
++		if (reason == NM_DEVICE_STATE_REASON_NO_SECRETS) {
++			set_connection_auto_retries (NM_CONNECTION (iter->data), RETRIES_DEFAULT);
++			g_object_set_data (G_OBJECT (iter->data), FAILURE_REASON_TAG, GUINT_TO_POINTER (0));
++		}
++	}
++	g_slist_free (connections);
++}
++
++static void
+ sleeping_changed (NMManager *manager, GParamSpec *pspec, gpointer user_data)
+ {
+ 	NMPolicy *policy = user_data;
+@@ -927,6 +945,9 @@ device_state_changed (NMDevice *device,
+ 	NMPolicy *policy = (NMPolicy *) user_data;
+ 	NMConnection *connection = get_device_connection (device);
+ 
++	if (connection)
++		g_object_set_data (G_OBJECT (connection), FAILURE_REASON_TAG, GUINT_TO_POINTER (0));
++
+ 	switch (new_state) {
+ 	case NM_DEVICE_STATE_FAILED:
+ 		/* Mark the connection invalid if it failed during activation so that
+@@ -941,6 +962,11 @@ device_state_changed (NMDevice *device,
+ 				 * automatically retrying because it's just going to fail anyway.
+ 				 */
+ 				set_connection_auto_retries (connection, 0);
++
++				/* Mark the connection as failed due to missing secrets so that we can reset
++				 * RETRIES_TAG and automatically re-try when an secret agent registers.
++				 */
++				g_object_set_data (G_OBJECT (connection), FAILURE_REASON_TAG, GUINT_TO_POINTER (NM_DEVICE_STATE_REASON_NO_SECRETS));
+ 			} else if (tries > 0) {
+ 				/* Otherwise if it's a random failure, just decrease the number
+ 				 * of automatic retries so that the connection gets tried again
+@@ -1173,6 +1199,19 @@ connection_visibility_changed (NMSettings *settings,
+ }
+ 
+ static void
++secret_agent_registered (NMSettings *settings,
++                         NMSecretAgent *agent,
++                         gpointer user_data)
++{
++	/* The registered secret agent may provide some missing secrets. Thus we
++	 * reset retries count here and schedule activation, so that the
++	 * connections failed due to missing secrets may re-try auto-connection.
++	 */
++	reset_retries_for_failed_secrets (settings);
++	schedule_activate_all ((NMPolicy *) user_data);
++}
++
++static void
+ _connect_manager_signal (NMPolicy *policy, const char *name, gpointer callback)
+ {
+ 	guint id;
+@@ -1240,6 +1279,7 @@ nm_policy_new (NMManager *manager,
+ 	_connect_settings_signal (policy, NM_SETTINGS_SIGNAL_CONNECTION_REMOVED, connection_removed);
+ 	_connect_settings_signal (policy, NM_SETTINGS_SIGNAL_CONNECTION_VISIBILITY_CHANGED,
+ 	                          connection_visibility_changed);
++	_connect_settings_signal (policy, NM_SETTINGS_SIGNAL_AGENT_REGISTERED, secret_agent_registered);
+ 
+ 	/* Initialize connections' auto-retries */
+ 	reset_retries_all (policy->settings, NULL);
+diff --git a/src/settings/nm-agent-manager.c b/src/settings/nm-agent-manager.c
+index 9b9e189..1693ae2 100644
+--- a/src/settings/nm-agent-manager.c
++++ b/src/settings/nm-agent-manager.c
+@@ -57,6 +57,14 @@ typedef struct {
+ 	GHashTable *requests;
+ } NMAgentManagerPrivate;
+ 
++enum {
++        AGENT_REGISTERED,
++
++        LAST_SIGNAL
++};
++static guint signals[LAST_SIGNAL] = { 0 };
++
++
+ typedef struct _Request Request;
+ 
+ static void request_add_agent (Request *req,
+@@ -277,6 +285,9 @@ impl_agent_manager_register (NMAgentManager *self,
+ 	            nm_secret_agent_get_description (agent));
+ 	dbus_g_method_return (context);
+ 
++	/* Signal an agent was registered */
++	g_signal_emit (self, signals[AGENT_REGISTERED], 0, agent);
++
+ 	/* Add this agent to any in-progress secrets requests */
+ 	g_hash_table_iter_init (&iter, priv->requests);
+ 	while (g_hash_table_iter_next (&iter, NULL, &data))
+@@ -1363,6 +1374,17 @@ nm_agent_manager_class_init (NMAgentManagerClass *agent_manager_class)
+ 	/* virtual methods */
+ 	object_class->dispose = dispose;
+ 
++	/* Signals */
++	signals[AGENT_REGISTERED] =
++		g_signal_new ("agent-registered",
++		              G_OBJECT_CLASS_TYPE (object_class),
++		              G_SIGNAL_RUN_FIRST,
++		              G_STRUCT_OFFSET (NMAgentManagerClass, agent_registered),
++		              NULL, NULL,
++		              g_cclosure_marshal_VOID__OBJECT,
++		              G_TYPE_NONE, 1,
++		              G_TYPE_OBJECT);
++
+ 	dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (agent_manager_class),
+ 	                                 &dbus_glib_nm_agent_manager_object_info);
+ 
+diff --git a/src/settings/nm-agent-manager.h b/src/settings/nm-agent-manager.h
+index 788a917..287413a 100644
+--- a/src/settings/nm-agent-manager.h
++++ b/src/settings/nm-agent-manager.h
+@@ -25,6 +25,7 @@
+ #include <glib-object.h>
+ #include <nm-connection.h>
+ #include "nm-settings-flags.h"
++#include "nm-secret-agent.h"
+ 
+ #define NM_TYPE_AGENT_MANAGER            (nm_agent_manager_get_type ())
+ #define NM_AGENT_MANAGER(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_AGENT_MANAGER, NMAgentManager))
+@@ -39,6 +40,9 @@ typedef struct {
+ 
+ typedef struct {
+ 	GObjectClass parent;
++
++	/* Signals */
++	void (*agent_registered)   (NMAgentManager *agent_mgr, NMSecretAgent *agent);
+ } NMAgentManagerClass;
+ 
+ GType nm_agent_manager_get_type (void);
+diff --git a/src/settings/nm-settings.c b/src/settings/nm-settings.c
+index 8329780..733e914 100644
+--- a/src/settings/nm-settings.c
++++ b/src/settings/nm-settings.c
+@@ -135,6 +135,7 @@ enum {
+ 	CONNECTION_REMOVED,
+ 	CONNECTION_VISIBILITY_CHANGED,
+ 	CONNECTIONS_LOADED,
++	AGENT_REGISTERED,
+ 
+ 	NEW_CONNECTION, /* exported, not used internally */
+ 	LAST_SIGNAL
+@@ -699,6 +700,18 @@ connection_visibility_changed (NMSettingsConnection *connection,
+ 	               connection);
+ }
+ 
++static void
++secret_agent_registered (NMAgentManager *agent_mgr,
++                         NMSecretAgent *agent,
++                         gpointer user_data)
++{
++	/* Re-emit for listeners like NMPolicy */
++	g_signal_emit (NM_SETTINGS (user_data),
++	               signals[AGENT_REGISTERED],
++	               0,
++	               agent);
++}
++
+ #define NM_DBUS_SERVICE_OPENCONNECT    "org.freedesktop.NetworkManager.openconnect"
+ #define NM_OPENCONNECT_KEY_GATEWAY "gateway"
+ #define NM_OPENCONNECT_KEY_COOKIE "cookie"
+@@ -1530,6 +1543,8 @@ nm_settings_init (NMSettings *self)
+ 	 * recreated often.
+ 	 */
+ 	priv->agent_mgr = nm_agent_manager_get ();
++
++	g_signal_connect (priv->agent_mgr, "agent-registered", G_CALLBACK (secret_agent_registered), self);
+ }
+ 
+ static void
+@@ -1693,6 +1708,16 @@ nm_settings_class_init (NMSettingsClass *class)
+ 	                              g_cclosure_marshal_VOID__VOID,
+ 	                              G_TYPE_NONE, 0);
+ 
++	signals[AGENT_REGISTERED] =
++		g_signal_new (NM_SETTINGS_SIGNAL_AGENT_REGISTERED,
++		              G_OBJECT_CLASS_TYPE (object_class),
++		              G_SIGNAL_RUN_FIRST,
++		              G_STRUCT_OFFSET (NMSettingsClass, agent_registered),
++		              NULL, NULL,
++		              g_cclosure_marshal_VOID__OBJECT,
++		              G_TYPE_NONE, 1, G_TYPE_OBJECT);
++
++
+ 	signals[NEW_CONNECTION] = 
+ 	                g_signal_new ("new-connection",
+ 	                              G_OBJECT_CLASS_TYPE (object_class),
+diff --git a/src/settings/nm-settings.h b/src/settings/nm-settings.h
+index a5cb4d7..66d41cc 100644
+--- a/src/settings/nm-settings.h
++++ b/src/settings/nm-settings.h
+@@ -19,7 +19,7 @@
+  * with this program; if not, write to the Free Software Foundation, Inc.,
+  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+  *
+- * (C) Copyright 2007 - 2010 Red Hat, Inc.
++ * (C) Copyright 2007 - 2011 Red Hat, Inc.
+  * (C) Copyright 2008 Novell, Inc.
+  */
+ 
+@@ -31,6 +31,7 @@
+ #include "nm-settings-connection.h"
+ #include "nm-system-config-interface.h"
+ #include "nm-device.h"
++#include "nm-secret-agent.h"
+ 
+ #define NM_TYPE_SETTINGS            (nm_settings_get_type ())
+ #define NM_SETTINGS(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_SETTINGS, NMSettings))
+@@ -48,6 +49,7 @@
+ #define NM_SETTINGS_SIGNAL_CONNECTION_REMOVED            "connection-removed"
+ #define NM_SETTINGS_SIGNAL_CONNECTION_VISIBILITY_CHANGED "connection-visibility-changed"
+ #define NM_SETTINGS_SIGNAL_CONNECTIONS_LOADED            "connections-loaded"
++#define NM_SETTINGS_SIGNAL_AGENT_REGISTERED              "agent-registered"
+ 
+ typedef struct {
+ 	GObject parent_instance;
+@@ -68,6 +70,8 @@ typedef struct {
+ 	void (*connection_visibility_changed) (NMSettings *self, NMSettingsConnection *connection);
+ 
+ 	void (*connections_loaded) (NMSettings *self);
++
++	void (*agent_registered) (NMSettings *self, NMSecretAgent *agent);
+ } NMSettingsClass;
+ 
+ GType nm_settings_get_type (void);
+-- 
+1.7.6
+

diff --git a/net-misc/networkmanager/files/0.8.9997/0006-settings-do-not-crash-on-GetSecrets-in-case-of-missi.patch b/net-misc/networkmanager/files/0.8.9997/0006-settings-do-not-crash-on-GetSecrets-in-case-of-missi.patch
new file mode 100644
index 0000000..b01842f
--- /dev/null
+++ b/net-misc/networkmanager/files/0.8.9997/0006-settings-do-not-crash-on-GetSecrets-in-case-of-missi.patch
@@ -0,0 +1,29 @@
+From 5b650f9ae3c5a2972b0b018b8b75d02d815f2c3a Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Ji=C5=99=C3=AD=20Klime=C5=A1?= <jklimes@redhat.com>
+Date: Thu, 7 Jul 2011 12:51:22 +0200
+Subject: [PATCH] settings: do not crash on GetSecrets() in case of missing
+ secrets
+
+When secrets are flagged as agent-owned in a connection configuration file, but
+actually not available, we have to return an empty hash (nm_connection_to_hash()
+returns NULL).
+---
+ src/settings/nm-settings-connection.c |    2 ++
+ 1 files changed, 2 insertions(+), 0 deletions(-)
+
+diff --git a/src/settings/nm-settings-connection.c b/src/settings/nm-settings-connection.c
+index a14b159..f0f9c1a 100644
+--- a/src/settings/nm-settings-connection.c
++++ b/src/settings/nm-settings-connection.c
+@@ -1339,6 +1339,8 @@ dbus_get_agent_secrets_cb (NMSettingsConnection *self,
+ 		update_secrets_cache (self);
+ 
+ 		hash = nm_connection_to_hash (NM_CONNECTION (self), NM_SETTING_HASH_FLAG_ONLY_SECRETS);
++		if (!hash)
++			hash = g_hash_table_new (NULL, NULL);
+ 		dbus_g_method_return (context, hash);
+ 		g_hash_table_destroy (hash);
+ 	}
+-- 
+1.7.6
+

diff --git a/net-misc/networkmanager/files/0.8.9997/0007-keyfile-distinguish-better-between-string-x-int-list.patch b/net-misc/networkmanager/files/0.8.9997/0007-keyfile-distinguish-better-between-string-x-int-list.patch
new file mode 100644
index 0000000..4206df1
--- /dev/null
+++ b/net-misc/networkmanager/files/0.8.9997/0007-keyfile-distinguish-better-between-string-x-int-list.patch
@@ -0,0 +1,70 @@
+From 30c41a4b800408150edcca9047a3996fa1d6ae68 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Ji=C5=99=C3=AD=20Klime=C5=A1?= <jklimes@redhat.com>
+Date: Thu, 7 Jul 2011 15:25:11 +0200
+Subject: [PATCH] keyfile: distinguish better between string x int list
+ formats (bgo #649422)
+
+This commit enhances get_uchar_array() to better differentiate between string
+ad integer list formats. This allows using ';' character in SSIDs.
+---
+ src/settings/plugins/keyfile/reader.c |   28 +++++++++++++---------------
+ 1 files changed, 13 insertions(+), 15 deletions(-)
+
+diff --git a/src/settings/plugins/keyfile/reader.c b/src/settings/plugins/keyfile/reader.c
+index 4b28965..7da6e1a 100644
+--- a/src/settings/plugins/keyfile/reader.c
++++ b/src/settings/plugins/keyfile/reader.c
+@@ -16,7 +16,7 @@
+  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+  *
+  * Copyright (C) 2008 - 2009 Novell, Inc.
+- * Copyright (C) 2008 - 2010 Red Hat, Inc.
++ * Copyright (C) 2008 - 2011 Red Hat, Inc.
+  */
+ 
+ #include <errno.h>
+@@ -736,29 +736,27 @@ get_uchar_array (GKeyFile *keyfile,
+                  const char *key)
+ {
+ 	GByteArray *array = NULL;
+-	char *p, *tmp_string;
++	char *tmp_string;
+ 	gint *tmp_list;
+ 	gsize length;
+ 	int i;
+ 
+-	/* New format: just a string.  We try parsing the new format if there are
+-	 * no ';' in the string or it's not just numbers.
++	/* New format: just a string
++	 * Old format: integer list; e.g. 11;25;38
+ 	 */
+-	p = tmp_string = g_key_file_get_string (keyfile, setting_name, key, NULL);
++	tmp_string = g_key_file_get_string (keyfile, setting_name, key, NULL);
+ 	if (tmp_string) {
+ 		gboolean new_format = FALSE;
++		GRegex *regex;
++		GMatchInfo *match_info;
++		const char *pattern = "^[[:space:]]*[[:digit:]]+[[:space:]]*(;[[:space:]]*[[:digit:]]+[[:space:]]*)*(;[[:space:]]*)?$";
+ 
+-		if (strchr (p, ';') == NULL)
+-			new_format = TRUE;
+-		else {
++		regex = g_regex_new (pattern, 0, 0, NULL);
++		g_regex_match (regex, tmp_string, 0, &match_info);
++		if (!g_match_info_matches (match_info))
+ 			new_format = TRUE;
+-			while (p && *p) {
+-				if (!isdigit (*p++)) {
+-					new_format = FALSE;
+-					break;
+-				}
+-			}
+-		}
++		g_match_info_free (match_info);
++		g_regex_unref (regex);
+ 
+ 		if (new_format) {
+ 			array = g_byte_array_sized_new (strlen (tmp_string));
+-- 
+1.7.6
+

diff --git a/net-misc/networkmanager/files/0.8.9997/0008-keyfile-fix-integer-list-SSID-parsing-after-30c41a4b.patch b/net-misc/networkmanager/files/0.8.9997/0008-keyfile-fix-integer-list-SSID-parsing-after-30c41a4b.patch
new file mode 100644
index 0000000..b4e0ef0
--- /dev/null
+++ b/net-misc/networkmanager/files/0.8.9997/0008-keyfile-fix-integer-list-SSID-parsing-after-30c41a4b.patch
@@ -0,0 +1,211 @@
+From 9cdc5021ab0b94dbf1a0d1994bc2e5ba4049caf9 Mon Sep 17 00:00:00 2001
+From: Dan Williams <dcbw@redhat.com>
+Date: Wed, 20 Jul 2011 17:44:14 -0500
+Subject: [PATCH 1/2] keyfile: fix integer list SSID parsing after
+ 30c41a4b800408150edcca9047a3996fa1d6ae68
+
+The regex was capturing integers larger than 3 digits, which aren't
+valid SSID integer list items because each byte of the SSID cannot be
+larger than 255.  Add an explicit testcase for intlist SSIDs too.
+The previous regex was causing a testcase failure with an SSID of
+'1337' which it was interpreting as a single element intlist, but
+should have been interpreted as a string since it's clear > 255.
+---
+ src/settings/plugins/keyfile/reader.c              |    2 +-
+ .../plugins/keyfile/tests/keyfiles/Makefile.am     |    1 +
+ .../keyfile/tests/keyfiles/Test_Intlist_SSID       |   11 ++
+ src/settings/plugins/keyfile/tests/test-keyfile.c  |  128 ++++++++++++++++++++
+ 4 files changed, 141 insertions(+), 1 deletions(-)
+ create mode 100644 src/settings/plugins/keyfile/tests/keyfiles/Test_Intlist_SSID
+
+diff --git a/src/settings/plugins/keyfile/reader.c b/src/settings/plugins/keyfile/reader.c
+index 7da6e1a..c4136e0 100644
+--- a/src/settings/plugins/keyfile/reader.c
++++ b/src/settings/plugins/keyfile/reader.c
+@@ -749,7 +749,7 @@ get_uchar_array (GKeyFile *keyfile,
+ 		gboolean new_format = FALSE;
+ 		GRegex *regex;
+ 		GMatchInfo *match_info;
+-		const char *pattern = "^[[:space:]]*[[:digit:]]+[[:space:]]*(;[[:space:]]*[[:digit:]]+[[:space:]]*)*(;[[:space:]]*)?$";
++		const char *pattern = "^[[:space:]]*[[:digit:]]{1,3}[[:space:]]*(;[[:space:]]*[[:digit:]]{1,3}[[:space:]]*)*(;[[:space:]]*)?$";
+ 
+ 		regex = g_regex_new (pattern, 0, 0, NULL);
+ 		g_regex_match (regex, tmp_string, 0, &match_info);
+diff --git a/src/settings/plugins/keyfile/tests/keyfiles/Makefile.am b/src/settings/plugins/keyfile/tests/keyfiles/Makefile.am
+index ce5ff99..302db86 100644
+--- a/src/settings/plugins/keyfile/tests/keyfiles/Makefile.am
++++ b/src/settings/plugins/keyfile/tests/keyfiles/Makefile.am
+@@ -7,6 +7,7 @@ KEYFILES = \
+ 	ATT_Data_Connect_BT \
+ 	ATT_Data_Connect_Plain \
+ 	Test_String_SSID \
++	Test_Intlist_SSID \
+ 	Test_Wired_TLS_Old \
+ 	Test_Wired_TLS_New \
+ 	Test_Wired_TLS_Blob \
+diff --git a/src/settings/plugins/keyfile/tests/keyfiles/Test_Intlist_SSID b/src/settings/plugins/keyfile/tests/keyfiles/Test_Intlist_SSID
+new file mode 100644
+index 0000000..6d2bc0f
+--- /dev/null
++++ b/src/settings/plugins/keyfile/tests/keyfiles/Test_Intlist_SSID
+@@ -0,0 +1,11 @@
++[connection]
++id=Test 
++uuid=2f962388-e5f3-45af-a62c-ac220b8f7baa
++type=802-11-wireless
++
++[802-11-wireless]
++ssid=98;108;97;104;49;50;51;52;
++
++[ipv4]
++method=auto
++
+diff --git a/src/settings/plugins/keyfile/tests/test-keyfile.c b/src/settings/plugins/keyfile/tests/test-keyfile.c
+index 6cdd198..3bbaaae 100644
+--- a/src/settings/plugins/keyfile/tests/test-keyfile.c
++++ b/src/settings/plugins/keyfile/tests/test-keyfile.c
+@@ -1438,6 +1438,131 @@ test_write_string_ssid (void)
+ 	g_object_unref (connection);
+ }
+ 
++#define TEST_INTLIST_SSID_FILE TEST_KEYFILES_DIR"/Test_Intlist_SSID"
++
++static void
++test_read_intlist_ssid (void)
++{
++	NMConnection *connection;
++	NMSettingWireless *s_wifi;
++	GError *error = NULL;
++	gboolean success;
++	const GByteArray *array;
++	const char *expected_ssid = "blah1234";
++
++	connection = nm_keyfile_plugin_connection_from_file (TEST_INTLIST_SSID_FILE, &error);
++	g_assert_no_error (error);
++	g_assert (connection);
++
++	success = nm_connection_verify (connection, &error);
++	g_assert_no_error (error);
++	g_assert (success);
++
++	/* SSID */
++	s_wifi = nm_connection_get_setting_wireless (connection);
++	g_assert (s_wifi);
++
++	array = nm_setting_wireless_get_ssid (s_wifi);
++	g_assert (array != NULL);
++	g_assert_cmpint (array->len, ==, strlen (expected_ssid));
++	g_assert_cmpint (memcmp (array->data, expected_ssid, strlen (expected_ssid)), ==, 0);
++
++	g_object_unref (connection);
++}
++
++static void
++test_write_intlist_ssid (void)
++{
++	NMConnection *connection;
++	NMSettingConnection *s_con;
++	NMSettingWireless *s_wifi;
++	NMSettingIP4Config *s_ip4;
++	char *uuid, *testfile = NULL;
++	GByteArray *ssid;
++	unsigned char tmpssid[] = { 65, 49, 50, 51, 0, 50, 50 };
++	gboolean success;
++	NMConnection *reread;
++	GError *error = NULL;
++	pid_t owner_grp;
++	uid_t owner_uid;
++	GKeyFile *keyfile;
++	gint *intlist;
++	gsize len = 0, i;
++
++	connection = nm_connection_new ();
++	g_assert (connection);
++
++	/* Connection setting */
++
++	s_con = NM_SETTING_CONNECTION (nm_setting_connection_new ());
++	g_assert (s_con);
++	nm_connection_add_setting (connection, NM_SETTING (s_con));
++
++	uuid = nm_utils_uuid_generate ();
++	g_object_set (s_con,
++	              NM_SETTING_CONNECTION_ID, "Intlist SSID Test",
++	              NM_SETTING_CONNECTION_UUID, uuid,
++	              NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRELESS_SETTING_NAME,
++	              NULL);
++	g_free (uuid);
++
++	/* Wireless setting */
++	s_wifi = NM_SETTING_WIRELESS (nm_setting_wireless_new ());
++	g_assert (s_wifi);
++	nm_connection_add_setting (connection, NM_SETTING (s_wifi));
++
++	ssid = g_byte_array_sized_new (sizeof (tmpssid));
++	g_byte_array_append (ssid, &tmpssid[0], sizeof (tmpssid));
++	g_object_set (s_wifi, NM_SETTING_WIRELESS_SSID, ssid, NULL);
++	g_byte_array_free (ssid, TRUE);
++
++	/* IP4 setting */
++	s_ip4 = NM_SETTING_IP4_CONFIG (nm_setting_ip4_config_new ());
++	g_assert (s_ip4);
++	nm_connection_add_setting (connection, NM_SETTING (s_ip4));
++	g_object_set (s_ip4, NM_SETTING_IP4_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO, NULL);
++
++	/* Write out the connection */
++	owner_uid = geteuid ();
++	owner_grp = getegid ();
++	success = nm_keyfile_plugin_write_test_connection (connection, TEST_SCRATCH_DIR, owner_uid, owner_grp, &testfile, &error);
++	g_assert_no_error (error);
++	g_assert (success);
++	g_assert (testfile != NULL);
++
++	/* Ensure the SSID was written out as an int list */
++	keyfile = g_key_file_new ();
++	success = g_key_file_load_from_file (keyfile, testfile, 0, &error);
++	g_assert_no_error (error);
++	g_assert (success);
++
++	intlist = g_key_file_get_integer_list (keyfile, NM_SETTING_WIRELESS_SETTING_NAME, NM_SETTING_WIRELESS_SSID, &len, &error);
++	g_assert_no_error (error);
++	g_assert (intlist);
++	g_assert_cmpint (len, ==, sizeof (tmpssid));
++
++	for (i = 0; i < len; i++)
++		g_assert_cmpint (intlist[i], ==, tmpssid[i]);
++	g_free (intlist);
++
++	g_key_file_free (keyfile);
++
++	/* Read the connection back in and compare it to the one we just wrote out */
++	reread = nm_keyfile_plugin_connection_from_file (testfile, &error);
++	g_assert_no_error (error);
++	g_assert (reread);
++
++	success = nm_connection_compare (connection, reread, NM_SETTING_COMPARE_FLAG_EXACT);
++	g_assert (success);
++
++	g_clear_error (&error);
++	unlink (testfile);
++	g_free (testfile);
++
++	g_object_unref (reread);
++	g_object_unref (connection);
++}
++
+ #define TEST_BT_DUN_FILE TEST_KEYFILES_DIR"/ATT_Data_Connect_BT"
+ 
+ static void
+@@ -2488,6 +2613,9 @@ int main (int argc, char **argv)
+ 	test_read_string_ssid ();
+ 	test_write_string_ssid ();
+ 
++	test_read_intlist_ssid ();
++	test_write_intlist_ssid ();
++
+ 	test_read_bt_dun_connection ();
+ 	test_write_bt_dun_connection ();
+ 
+-- 
+1.7.6
+

diff --git a/net-misc/networkmanager/files/0.8.9997/0009-libnm-util-default-to-allowing-IPv6-connections-to-f.patch b/net-misc/networkmanager/files/0.8.9997/0009-libnm-util-default-to-allowing-IPv6-connections-to-f.patch
new file mode 100644
index 0000000..4a3c6fc
--- /dev/null
+++ b/net-misc/networkmanager/files/0.8.9997/0009-libnm-util-default-to-allowing-IPv6-connections-to-f.patch
@@ -0,0 +1,32 @@
+From 36db194ae95e35cc7b8f431ab984780dea24656d Mon Sep 17 00:00:00 2001
+From: Mathieu Trudel-Lapierre <mathieu.tl@gmail.com>
+Date: Wed, 20 Jul 2011 23:56:48 -0500
+Subject: [PATCH 2/2] libnm-util: default to allowing IPv6 connections to fail
+
+Allow IPv6 connections to fail by changing the default value of the may-fail
+property for ipv6 settings to TRUE.
+
+This makes sure connections created manually using nm-connection-editor
+will default to having the "Require ..." checkbox unchecked; in other words,
+IPv6 timing out will still allow the interface to be configured if
+IPv4 succeeds.
+---
+ libnm-util/nm-setting-ip6-config.c |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/libnm-util/nm-setting-ip6-config.c b/libnm-util/nm-setting-ip6-config.c
+index e911639..4dc8f46 100644
+--- a/libnm-util/nm-setting-ip6-config.c
++++ b/libnm-util/nm-setting-ip6-config.c
+@@ -1056,7 +1056,7 @@ nm_setting_ip6_config_class_init (NMSettingIP6ConfigClass *setting_class)
+ 						   "this property to TRUE allows the overall network "
+ 						   "configuration to succeed if IPv6 configuration "
+ 						   "fails but IPv4 configuration completes successfully.",
+-						   FALSE,
++						   TRUE,
+ 						   G_PARAM_READWRITE | G_PARAM_CONSTRUCT | NM_SETTING_PARAM_SERIALIZE));
+ }
+ 
+-- 
+1.7.6
+

diff --git a/net-misc/networkmanager/networkmanager-0.8.9997.ebuild b/net-misc/networkmanager/networkmanager-0.8.9997-r1.ebuild
similarity index 96%
rename from net-misc/networkmanager/networkmanager-0.8.9997.ebuild
rename to net-misc/networkmanager/networkmanager-0.8.9997-r1.ebuild
index 5bdd0d2..0a1b561 100644
--- a/net-misc/networkmanager/networkmanager-0.8.9997.ebuild
+++ b/net-misc/networkmanager/networkmanager-0.8.9997-r1.ebuild
@@ -84,6 +84,10 @@ pkg_pretend() {
 }
 
 src_prepare() {
+	# Add useful patches from upstream git (fixing crashes, SSID parsing bugs,
+	# and significant usability problems).
+	epatch "${FILESDIR}/${PV}/"*.patch
+
 	# Don't build tests
 	epatch "${FILESDIR}/${PN}-fix-tests.patch"
 	eautoreconf



^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2011-07-22  8:34 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-07-22  8:33 [gentoo-commits] proj/gnome:gnome-next commit in: net-misc/networkmanager/, net-misc/networkmanager/files/0.8.9997/ Alexandre Restovtsev

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox