[PATCH] libnm-util: accept old-style UUIDs as valid



Old versions such as 0.9.4 generated 40-character UUIDs with no
hashes, but libnm-util regards them as invalid. That means that
existing connections stop working when upgrading from 0.9.4.

Continue accepting such UUIDs as valid, and add a test so that
we don't forget in future.
---
 libnm-util/nm-utils.c           |  9 ++++++++-
 libnm-util/tests/test-general.c | 24 ++++++++++++++++++++++++
 2 files changed, 32 insertions(+), 1 deletion(-)

diff --git a/libnm-util/nm-utils.c b/libnm-util/nm-utils.c
index e869e0a..c0b18f6 100644
--- a/libnm-util/nm-utils.c
+++ b/libnm-util/nm-utils.c
@@ -2264,5 +2264,12 @@ nm_utils_is_uuid (const char *str)
                p++;
        }
 
-       return (num_dashes == 4) && (p - str == 36);
+       if ((num_dashes == 4) && (p - str == 36))
+               return TRUE;
+
+       /* Backwards compat for older configurations */
+       if ((num_dashes == 0) && (p - str == 40))
+               return TRUE;
+
+       return FALSE;
 }
diff --git a/libnm-util/tests/test-general.c b/libnm-util/tests/test-general.c
index ff89128..3e6cee7 100644
--- a/libnm-util/tests/test-general.c
+++ b/libnm-util/tests/test-general.c
@@ -2075,6 +2075,29 @@ test_setting_802_1x_changed_signal (void)
        g_object_unref (connection);
 }
 
+static void
+test_setting_old_uuid (void)
+{
+       GError *error = NULL;
+       NMSetting *setting;
+       gboolean success;
+
+       /* NetworkManager-0.9.4.0 generated 40-character UUIDs with no dashes,
+        * like this one. Test that we maintain compatibility. */
+       const char *uuid = "f43bec2cdd60e5da381ebb1eb1fa39f3cc52660c";
+
+       setting = nm_setting_connection_new ();
+       g_object_set (G_OBJECT (setting),
+                     NM_SETTING_CONNECTION_ID, "uuidtest",
+                     NM_SETTING_CONNECTION_UUID, uuid,
+                     NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRED_SETTING_NAME,
+                     NULL);
+
+       success = nm_setting_verify (NM_SETTING (setting), NULL, &error);
+       g_assert_no_error (error);
+       g_assert (success == TRUE);
+}
+
 int main (int argc, char **argv)
 {
        GError *error = NULL;
@@ -2106,6 +2129,7 @@ int main (int argc, char **argv)
        test_setting_compare_vpn_secrets (NM_SETTING_SECRET_FLAG_NOT_SAVED, 
NM_SETTING_COMPARE_FLAG_IGNORE_NOT_SAVED_SECRETS, TRUE);
        test_setting_compare_vpn_secrets (NM_SETTING_SECRET_FLAG_NONE, 
NM_SETTING_COMPARE_FLAG_IGNORE_SECRETS, TRUE);
        test_setting_compare_vpn_secrets (NM_SETTING_SECRET_FLAG_NONE, NM_SETTING_COMPARE_FLAG_EXACT, FALSE);
+       test_setting_old_uuid ();
 
        test_connection_to_hash_setting_name ();
        test_setting_new_from_hash ();
-- 
1.8.3.1



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