* [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