From 05130b6e107c4cbc636cd03d9b290692da9f7c16 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 2 May 2021 22:01:00 +0200 Subject: [PATCH 01/22] ifupdown: replace _str_has_prefix() by NM_STR_HAS_PREFIX() --- .../plugins/ifupdown/nms-ifupdown-parser.c | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/src/core/settings/plugins/ifupdown/nms-ifupdown-parser.c b/src/core/settings/plugins/ifupdown/nms-ifupdown-parser.c index 8b388d9413..9fdedaa1cd 100644 --- a/src/core/settings/plugins/ifupdown/nms-ifupdown-parser.c +++ b/src/core/settings/plugins/ifupdown/nms-ifupdown-parser.c @@ -32,14 +32,6 @@ /*****************************************************************************/ -#define _str_has_prefix(val, prefix, require_suffix) \ - ({ \ - const char *_val = (val); \ - \ - (strncmp(_val, "" prefix "", NM_STRLEN(prefix)) == 0) \ - && (!(require_suffix) || _val[NM_STRLEN(prefix)] != '\0'); \ - }) - static const char * _ifupdownplugin_guess_connection_type(if_block *block) { @@ -51,8 +43,7 @@ _ifupdownplugin_guess_connection_type(if_block *block) if_data *ifb; c_list_for_each_entry (ifb, &block->data_lst_head, data_lst) { - if (_str_has_prefix(ifb->key, "wireless-", FALSE) - || _str_has_prefix(ifb->key, "wpa-", FALSE)) { + if (NM_STR_HAS_PREFIX(ifb->key, "wireless-") || NM_STR_HAS_PREFIX(ifb->key, "wpa-")) { ret_type = NM_SETTING_WIRELESS_SETTING_NAME; break; } @@ -102,7 +93,7 @@ update_wireless_setting_from_if_block(NMConnection *connection, if_block *block) wireless_setting = NM_SETTING_WIRELESS(nm_setting_wireless_new()); c_list_for_each_entry (curr, &block->data_lst_head, data_lst) { - if (_str_has_prefix(curr->key, "wireless-", TRUE)) { + if (NM_STR_HAS_PREFIX_WITH_MORE(curr->key, "wireless-")) { const char *newkey = map_by_mapping(mapping, curr->key + NM_STRLEN("wireless-")); _LOGI("wireless setting key: %s='%s'", newkey, curr->data); @@ -137,7 +128,7 @@ update_wireless_setting_from_if_block(NMConnection *connection, if_block *block) } else { g_object_set(wireless_setting, newkey, curr->data, NULL); } - } else if (_str_has_prefix(curr->key, "wpa-", TRUE)) { + } else if (NM_STR_HAS_PREFIX_WITH_MORE(curr->key, "wpa-")) { const char *newkey = map_by_mapping(mapping, curr->key + NM_STRLEN("wpa-")); if (nm_streq0(newkey, "ssid")) { @@ -304,7 +295,7 @@ update_wireless_security_setting_from_if_block(NMConnection *connection, if_bloc wireless_security_setting = NM_SETTING_WIRELESS_SECURITY(nm_setting_wireless_security_new()); c_list_for_each_entry (curr, &block->data_lst_head, data_lst) { - if (_str_has_prefix(curr->key, "wireless-", TRUE)) { + if (NM_STR_HAS_PREFIX_WITH_MORE(curr->key, "wireless-")) { const char * key = curr->key + NM_STRLEN("wireless-"); char * property_value = NULL; gpointer typed_property_value = NULL; @@ -336,7 +327,7 @@ wireless_next: if (typed_property_value && free_func) (*free_func)(typed_property_value); - } else if (_str_has_prefix(curr->key, "wpa-", TRUE)) { + } else if (NM_STR_HAS_PREFIX_WITH_MORE(curr->key, "wpa-")) { const char * key = curr->key + NM_STRLEN("wpa-"); char * property_value = NULL; gpointer typed_property_value = NULL; From 36d92182a8797a47f79f9d1fbcc1b08563eb252d Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 4 May 2021 14:29:19 +0200 Subject: [PATCH 02/22] libnm-core/tests: add test for connection.uuid of settings --- src/libnm-core-impl/tests/test-setting.c | 75 ++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/src/libnm-core-impl/tests/test-setting.c b/src/libnm-core-impl/tests/test-setting.c index 5f9877c134..4516c472dc 100644 --- a/src/libnm-core-impl/tests/test-setting.c +++ b/src/libnm-core-impl/tests/test-setting.c @@ -229,6 +229,79 @@ test_private_key_import(const char *path, const char *password, NMSetting8021xCK g_object_unref(s_8021x); } +/*****************************************************************************/ + +static void +_do_test_connection_uuid(NMConnection *con, const char *uuid, const char *expected_uuid) +{ + NMSettingConnection *s_con; + gs_free char * uuid_old = NULL; + gboolean success; + + nmtst_assert_connection_verifies_without_normalization(con); + + s_con = NM_SETTING_CONNECTION(nm_connection_get_setting(con, NM_TYPE_SETTING_CONNECTION)); + g_assert(NM_IS_SETTING_CONNECTION(s_con)); + + g_assert(uuid); + + uuid_old = g_strdup(nm_setting_connection_get_uuid(s_con)); + + g_assert(nm_utils_is_uuid(uuid_old)); + + g_object_set(s_con, NM_SETTING_CONNECTION_UUID, uuid, NULL); + + g_assert_cmpstr(uuid, ==, nm_setting_connection_get_uuid(s_con)); + + if (nm_streq0(uuid, expected_uuid)) { + nmtst_assert_connection_verifies_without_normalization(con); + g_assert(nm_utils_is_uuid(uuid)); + } else if (!expected_uuid) { + gs_free_error GError *error = NULL; + + success = nm_connection_verify(con, &error); + nmtst_assert_no_success(success, error); + g_assert_error(error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY); + + g_assert(!nm_utils_is_uuid(uuid)); + } else + g_assert_not_reached(); + + g_object_set(s_con, NM_SETTING_CONNECTION_UUID, uuid_old, NULL); + nmtst_assert_connection_verifies_without_normalization(con); +} + +static void +test_connection_uuid(void) +{ + gs_unref_object NMConnection *con = NULL; + + con = nmtst_create_minimal_connection("test-uuid", NULL, NM_SETTING_WIRED_SETTING_NAME, NULL); + + nmtst_connection_normalize(con); + +#define _do_test_connection_uuid_bad(con, uuid) _do_test_connection_uuid((con), "" uuid "", NULL) + +#define _do_test_connection_uuid_good(con, uuid) \ + _do_test_connection_uuid((con), "" uuid "", "" uuid "") + + _do_test_connection_uuid_bad(con, "x1e775e3-a316-4eb2-b4d8-4b0f2bcaea53"); + _do_test_connection_uuid_bad(con, "1e775e3aa3164eb2b4d84b0f2bcaea53abcdabc"); + _do_test_connection_uuid_bad(con, "1e775e3aa3164eb2b4d84b0f2bcaea53abcdabcdd"); + + _do_test_connection_uuid_good(con, "a1e775e3-a316-4eb2-b4d8-4b0f2bcaea53"); + + _do_test_connection_uuid_good(con, "A1E775e3-a316-4eb2-b4d8-4b0f2bcaea53"); + _do_test_connection_uuid_good(con, "A1E775E3-A316-4EB2-B4D8-4B0F2BCAEA53"); + _do_test_connection_uuid_good(con, "-1e775e3aa316-4eb2-b4d8-4b0f2bcaea53"); + _do_test_connection_uuid_good(con, "----1e775e3aa3164eb2b4d84b0f2bcaea53"); + _do_test_connection_uuid_good(con, "1e775e3aa3164eb2b4d84b0f2bcaea53abcdabcd"); + _do_test_connection_uuid_good(con, "1e775e3Aa3164eb2b4d84b0f2bcaea53abcdabcd"); + _do_test_connection_uuid_good(con, "1E775E3AA3164EB2B4D84B0F2BCAEA53ABCDABCD"); +} + +/*****************************************************************************/ + static void test_phase2_private_key_import(const char * path, const char * password, @@ -4258,6 +4331,8 @@ main(int argc, char **argv) { nmtst_init(&argc, &argv, TRUE); + g_test_add_func("/libnm/test_connection_uuid", test_connection_uuid); + g_test_add_data_func("/libnm/setting-8021x/key-and-cert", "test_key_and_cert.pem, test", test_8021x); From 50add1c75a97c12fd9f385af55288f83df21e4dd Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 2 May 2021 09:39:07 +0200 Subject: [PATCH 03/22] glib-aux: add "nm-uuid.[ch]" sources --- Makefile.am | 2 ++ src/libnm-glib-aux/meson.build | 1 + src/libnm-glib-aux/nm-uuid.c | 5 +++++ src/libnm-glib-aux/nm-uuid.h | 6 ++++++ 4 files changed, 14 insertions(+) create mode 100644 src/libnm-glib-aux/nm-uuid.c create mode 100644 src/libnm-glib-aux/nm-uuid.h diff --git a/Makefile.am b/Makefile.am index 5b99dc98a4..3eb66ecdb2 100644 --- a/Makefile.am +++ b/Makefile.am @@ -444,6 +444,8 @@ src_libnm_glib_aux_libnm_glib_aux_la_SOURCES = \ src/libnm-glib-aux/nm-test-utils.h \ src/libnm-glib-aux/nm-time-utils.c \ src/libnm-glib-aux/nm-time-utils.h \ + src/libnm-glib-aux/nm-uuid.c \ + src/libnm-glib-aux/nm-uuid.h \ src/libnm-glib-aux/nm-value-type.h \ $(NULL) diff --git a/src/libnm-glib-aux/meson.build b/src/libnm-glib-aux/meson.build index 39eccbdfca..4f13fd0b17 100644 --- a/src/libnm-glib-aux/meson.build +++ b/src/libnm-glib-aux/meson.build @@ -17,6 +17,7 @@ libnm_glib_aux = static_library( 'nm-secret-utils.c', 'nm-shared-utils.c', 'nm-time-utils.c', + 'nm-uuid.c', ), include_directories: [ src_inc, diff --git a/src/libnm-glib-aux/nm-uuid.c b/src/libnm-glib-aux/nm-uuid.c new file mode 100644 index 0000000000..38d9826a3a --- /dev/null +++ b/src/libnm-glib-aux/nm-uuid.c @@ -0,0 +1,5 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +#include "libnm-glib-aux/nm-default-glib.h" + +#include "nm-uuid.h" diff --git a/src/libnm-glib-aux/nm-uuid.h b/src/libnm-glib-aux/nm-uuid.h new file mode 100644 index 0000000000..e1ef9bf65c --- /dev/null +++ b/src/libnm-glib-aux/nm-uuid.h @@ -0,0 +1,6 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +#ifndef __NM_UUID_H__ +#define __NM_UUID_H__ + +#endif /* __NM_UUID_H__ */ From daebb11af8edd33c0a2fbf737ee059c47de75c16 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 2 May 2021 09:50:32 +0200 Subject: [PATCH 04/22] glib-aux: move NMUuid to "src/libnm-glib-aux/nm-uuid.h" --- src/libnm-core-intern/nm-core-internal.h | 5 +---- src/libnm-glib-aux/nm-uuid.h | 4 ++++ 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/libnm-core-intern/nm-core-internal.h b/src/libnm-core-intern/nm-core-internal.h index c3d4273062..cc396483dc 100644 --- a/src/libnm-core-intern/nm-core-internal.h +++ b/src/libnm-core-intern/nm-core-internal.h @@ -21,6 +21,7 @@ #endif #include "libnm-base/nm-base.h" +#include "libnm-glib-aux/nm-uuid.h" #include "nm-connection.h" #include "nm-core-enum-types.h" #include "nm-meta-setting-base.h" @@ -351,10 +352,6 @@ gboolean _nm_utils_check_module_file(const char * name, /*****************************************************************************/ -typedef struct _NMUuid { - guchar uuid[16]; -} NMUuid; - NMUuid *_nm_utils_uuid_parse(const char *str, NMUuid *uuid); char * _nm_utils_uuid_unparse(const NMUuid *uuid, char *out_str /*[37]*/); NMUuid *_nm_utils_uuid_generate_random(NMUuid *out_uuid); diff --git a/src/libnm-glib-aux/nm-uuid.h b/src/libnm-glib-aux/nm-uuid.h index e1ef9bf65c..dea52b94ce 100644 --- a/src/libnm-glib-aux/nm-uuid.h +++ b/src/libnm-glib-aux/nm-uuid.h @@ -3,4 +3,8 @@ #ifndef __NM_UUID_H__ #define __NM_UUID_H__ +typedef struct _NMUuid { + guint8 uuid[16]; +} NMUuid; + #endif /* __NM_UUID_H__ */ From cd45ad4acfeaab286176154d8b23b0364dd6c4f0 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 2 May 2021 10:01:32 +0200 Subject: [PATCH 05/22] glib-aux: add nm_uuid_unparse() --- src/libnm-glib-aux/nm-uuid.c | 25 +++++++++++++++++++++++++ src/libnm-glib-aux/nm-uuid.h | 8 ++++++++ 2 files changed, 33 insertions(+) diff --git a/src/libnm-glib-aux/nm-uuid.c b/src/libnm-glib-aux/nm-uuid.c index 38d9826a3a..485dd4d611 100644 --- a/src/libnm-glib-aux/nm-uuid.c +++ b/src/libnm-glib-aux/nm-uuid.c @@ -3,3 +3,28 @@ #include "libnm-glib-aux/nm-default-glib.h" #include "nm-uuid.h" + +/*****************************************************************************/ + +char * +nm_uuid_unparse_case(const NMUuid *uuid, char out_str[static 37], gboolean upper_case) +{ + char *s; + int i; + + nm_assert(uuid); + nm_assert(out_str); + + s = out_str; + for (i = 0; i < 16; i++) { + const guint8 c = uuid->uuid[i]; + + if (NM_IN_SET(i, 4, 6, 8, 10)) + *(s++) = '-'; + *(s++) = nm_hexchar(c >> 4, upper_case); + *(s++) = nm_hexchar(c, upper_case); + } + *s = '\0'; + + return out_str; +} diff --git a/src/libnm-glib-aux/nm-uuid.h b/src/libnm-glib-aux/nm-uuid.h index dea52b94ce..bfae517132 100644 --- a/src/libnm-glib-aux/nm-uuid.h +++ b/src/libnm-glib-aux/nm-uuid.h @@ -7,4 +7,12 @@ typedef struct _NMUuid { guint8 uuid[16]; } NMUuid; +char *nm_uuid_unparse_case(const NMUuid *uuid, char out_str[static 37], gboolean upper_case); + +static inline char * +nm_uuid_unparse(const NMUuid *uuid, char out_str[static 37]) +{ + return nm_uuid_unparse_case(uuid, out_str, FALSE); +} + #endif /* __NM_UUID_H__ */ From 596bf4b91bb0e56b6f8af14a0eb5cdeaf11a207d Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 2 May 2021 10:01:32 +0200 Subject: [PATCH 06/22] glib-aux: use nm_uuid_unparse() --- src/core/nm-core-utils.c | 2 +- src/libnm-core-impl/nm-utils.c | 18 ++---------------- src/libnm-core-intern/nm-core-internal.h | 1 - 3 files changed, 3 insertions(+), 18 deletions(-) diff --git a/src/core/nm-core-utils.c b/src/core/nm-core-utils.c index 82e65a8483..ec7bcab059 100644 --- a/src/core/nm-core-utils.c +++ b/src/core/nm-core-utils.c @@ -2402,7 +2402,7 @@ _uuid_data_init(UuidData *uuid_data, gboolean packed, gboolean is_fake, const NM nm_utils_bin2hexstr_full(uuid, sizeof(*uuid), '\0', FALSE, uuid_data->str); } else { G_STATIC_ASSERT_EXPR(sizeof(uuid_data->str) >= 37); - _nm_utils_uuid_unparse(uuid, uuid_data->str); + nm_uuid_unparse(uuid, uuid_data->str); } return uuid_data; } diff --git a/src/libnm-core-impl/nm-utils.c b/src/libnm-core-impl/nm-utils.c index dea6a4f93c..761c627063 100644 --- a/src/libnm-core-impl/nm-utils.c +++ b/src/libnm-core-impl/nm-utils.c @@ -3055,20 +3055,6 @@ _nm_utils_uuid_parse(const char *str, NMUuid *out_uuid) return out_uuid; } -char * -_nm_utils_uuid_unparse(const NMUuid *uuid, char *out_str /*[37]*/) -{ - nm_assert(uuid); - - if (!out_str) { - /* for convenience, allow %NULL to indicate that a new - * string should be allocated. */ - out_str = g_malloc(37); - } - uuid_unparse_lower(uuid->uuid, out_str); - return out_str; -} - NMUuid * _nm_utils_uuid_generate_random(NMUuid *out_uuid) { @@ -3107,7 +3093,7 @@ nm_utils_uuid_generate_buf_(char *buf) nm_assert(buf); _nm_utils_uuid_generate_random(&uuid); - return _nm_utils_uuid_unparse(&uuid, buf); + return nm_uuid_unparse(&uuid, buf); } /** @@ -3220,7 +3206,7 @@ nm_utils_uuid_generate_from_string(const char *s, gssize slen, int uuid_type, gp NMUuid uuid; nm_utils_uuid_generate_from_string_bin(&uuid, s, slen, uuid_type, type_args); - return _nm_utils_uuid_unparse(&uuid, NULL); + return nm_uuid_unparse(&uuid, g_new(char, 37)); } /** diff --git a/src/libnm-core-intern/nm-core-internal.h b/src/libnm-core-intern/nm-core-internal.h index cc396483dc..66b102a1f3 100644 --- a/src/libnm-core-intern/nm-core-internal.h +++ b/src/libnm-core-intern/nm-core-internal.h @@ -353,7 +353,6 @@ gboolean _nm_utils_check_module_file(const char * name, /*****************************************************************************/ NMUuid *_nm_utils_uuid_parse(const char *str, NMUuid *uuid); -char * _nm_utils_uuid_unparse(const NMUuid *uuid, char *out_str /*[37]*/); NMUuid *_nm_utils_uuid_generate_random(NMUuid *out_uuid); gboolean nm_utils_uuid_is_null(const NMUuid *uuid); From e7568e29b2c92c287ee6a8bee5c97b85f3cc8d8f Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 2 May 2021 11:57:17 +0200 Subject: [PATCH 07/22] glib-aux: add nm_uuid_parse() helper --- src/libnm-glib-aux/nm-uuid.c | 65 ++++++++++++++++++++++++++++++++++++ src/libnm-glib-aux/nm-uuid.h | 12 +++++++ 2 files changed, 77 insertions(+) diff --git a/src/libnm-glib-aux/nm-uuid.c b/src/libnm-glib-aux/nm-uuid.c index 485dd4d611..55ad6e48b6 100644 --- a/src/libnm-glib-aux/nm-uuid.c +++ b/src/libnm-glib-aux/nm-uuid.c @@ -28,3 +28,68 @@ nm_uuid_unparse_case(const NMUuid *uuid, char out_str[static 37], gboolean upper return out_str; } + +/*****************************************************************************/ + +gboolean +nm_uuid_parse_full(const char *str, NMUuid *out_uuid, gboolean *out_is_normalized) +{ + NMUuid uuid; + guint8 * p; + int i; + gboolean is_normalized = TRUE; + + nm_assert(str); + + p = uuid.uuid; + + for (i = 0; TRUE;) { + int v0; + int v1; + + if (NM_IN_SET(i, 8, 13, 18, 23)) { + if (str[i] != '-') + return FALSE; + i++; + continue; + } + + if (i == 36) { + if (str[i] != '\0') + return FALSE; + + NM_SET_OUT(out_is_normalized, is_normalized); + NM_SET_OUT(out_uuid, uuid); + return TRUE; + } + +#define _hexchar(ch, out_is_normalized2) \ + ({ \ + const char _ch = (ch); \ + int _result = -1; \ + \ + if (_ch >= '0') { \ + if (_ch <= '9') \ + _result = (_ch - '0'); \ + else if (_ch >= 'A') { \ + if (_ch <= 'F') { \ + *(out_is_normalized2) = FALSE; \ + _result = ((int) _ch) + (10 - (int) 'A'); \ + } else if (_ch >= 'a' && _ch <= 'f') \ + _result = ((int) _ch) + (10 - (int) 'a'); \ + } \ + } \ + \ + _result; \ + }) + + v0 = _hexchar(str[i++], &is_normalized); + if (v0 < 0) + return FALSE; + v1 = _hexchar(str[i++], &is_normalized); + if (v1 < 0) + return FALSE; + + *(p++) = (v0 << 4) + v1; + } +} diff --git a/src/libnm-glib-aux/nm-uuid.h b/src/libnm-glib-aux/nm-uuid.h index bfae517132..950fb62969 100644 --- a/src/libnm-glib-aux/nm-uuid.h +++ b/src/libnm-glib-aux/nm-uuid.h @@ -15,4 +15,16 @@ nm_uuid_unparse(const NMUuid *uuid, char out_str[static 37]) return nm_uuid_unparse_case(uuid, out_str, FALSE); } +gboolean nm_uuid_parse_full(const char *str, NMUuid *out_uuid, gboolean *out_is_normalized); + +static inline NMUuid * +nm_uuid_parse(const char *str, NMUuid *out_uuid) +{ + nm_assert(out_uuid); + + if (!nm_uuid_parse_full(str, out_uuid, NULL)) + return NULL; + return out_uuid; +} + #endif /* __NM_UUID_H__ */ From 42d67415b46304bf94da498ea3b4a071af66c931 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 2 May 2021 13:45:53 +0200 Subject: [PATCH 08/22] glib-aux: use nm_uuid_parse() helper --- src/core/nm-core-utils.c | 2 +- src/libnm-core-impl/nm-utils.c | 13 +------------ src/libnm-core-impl/tests/test-general.c | 2 +- src/libnm-core-intern/nm-core-internal.h | 1 - 4 files changed, 3 insertions(+), 15 deletions(-) diff --git a/src/core/nm-core-utils.c b/src/core/nm-core-utils.c index ec7bcab059..0bb5040829 100644 --- a/src/core/nm-core-utils.c +++ b/src/core/nm-core-utils.c @@ -2854,7 +2854,7 @@ again: NULL, NULL, NULL); - if (!contents || !_nm_utils_uuid_parse(nm_strstrip(contents), &uuid)) { + if (!contents || !nm_uuid_parse(nm_strstrip(contents), &uuid)) { /* generate a random UUID instead. */ is_fake = TRUE; _nm_utils_uuid_generate_random(&uuid); diff --git a/src/libnm-core-impl/nm-utils.c b/src/libnm-core-impl/nm-utils.c index 761c627063..11a59e50f6 100644 --- a/src/libnm-core-impl/nm-utils.c +++ b/src/libnm-core-impl/nm-utils.c @@ -3044,17 +3044,6 @@ _nm_utils_sriov_vf_from_strparts(const char *index, /*****************************************************************************/ -NMUuid * -_nm_utils_uuid_parse(const char *str, NMUuid *out_uuid) -{ - nm_assert(str); - nm_assert(out_uuid); - - if (uuid_parse(str, out_uuid->uuid) != 0) - return NULL; - return out_uuid; -} - NMUuid * _nm_utils_uuid_generate_random(NMUuid *out_uuid) { @@ -3148,7 +3137,7 @@ nm_utils_uuid_generate_from_string_bin(NMUuid * uuid, if (type_args) { /* type_args can be a name space UUID. Interpret it as (char *) */ - if (!_nm_utils_uuid_parse(type_args, &ns_uuid)) + if (!nm_uuid_parse(type_args, &ns_uuid)) g_return_val_if_reached(NULL); } diff --git a/src/libnm-core-impl/tests/test-general.c b/src/libnm-core-impl/tests/test-general.c index 0cd8ad9475..3000779951 100644 --- a/src/libnm-core-impl/tests/test-general.c +++ b/src/libnm-core-impl/tests/test-general.c @@ -7219,7 +7219,7 @@ _uuid(const char *str) static NMUuid u; g_assert(str); - g_assert(_nm_utils_uuid_parse(str, &u)); + g_assert(nm_uuid_parse(str, &u)); return &u; } diff --git a/src/libnm-core-intern/nm-core-internal.h b/src/libnm-core-intern/nm-core-internal.h index 66b102a1f3..79fe36dd53 100644 --- a/src/libnm-core-intern/nm-core-internal.h +++ b/src/libnm-core-intern/nm-core-internal.h @@ -352,7 +352,6 @@ gboolean _nm_utils_check_module_file(const char * name, /*****************************************************************************/ -NMUuid *_nm_utils_uuid_parse(const char *str, NMUuid *uuid); NMUuid *_nm_utils_uuid_generate_random(NMUuid *out_uuid); gboolean nm_utils_uuid_is_null(const NMUuid *uuid); From b4608b3ff7b6a7a21b11b0bac7626fc62ffa1001 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 2 May 2021 13:52:27 +0200 Subject: [PATCH 09/22] glib-aux: add nm_uuid_generate_random() helper --- src/libnm-glib-aux/nm-uuid.c | 32 ++++++++++++++++++++++++++++++++ src/libnm-glib-aux/nm-uuid.h | 2 ++ 2 files changed, 34 insertions(+) diff --git a/src/libnm-glib-aux/nm-uuid.c b/src/libnm-glib-aux/nm-uuid.c index 55ad6e48b6..199c3df4b2 100644 --- a/src/libnm-glib-aux/nm-uuid.c +++ b/src/libnm-glib-aux/nm-uuid.c @@ -4,6 +4,8 @@ #include "nm-uuid.h" +#include "libnm-glib-aux/nm-random-utils.h" + /*****************************************************************************/ char * @@ -93,3 +95,33 @@ nm_uuid_parse_full(const char *str, NMUuid *out_uuid, gboolean *out_is_normalize *(p++) = (v0 << 4) + v1; } } + +/*****************************************************************************/ + +NMUuid * +nm_uuid_generate_random(NMUuid *out_uuid) +{ + nm_assert(out_uuid); + + /* https://tools.ietf.org/html/rfc4122#section-4.4 */ + + /* See also, systemd's id128_make_v4_uuid() */ + + /* nm_utils_random_bytes() is supposed to try hard to give good + * randomness. If it fails, it still makes an effort to fill + * random data into the buffer. There is not much we can do about + * that case, except making sure that it does not happen in the + * first place. */ + nm_utils_random_bytes(out_uuid, sizeof(*out_uuid)); + + /* Set the four most significant bits (bits 12 through 15) of the + * time_hi_and_version field to the 4-bit version number from + * Section 4.1.3. */ + out_uuid->uuid[6] = (out_uuid->uuid[6] & 0x0Fu) | 0x40u; + + /* Set the two most significant bits (bits 6 and 7) of the + * clock_seq_hi_and_reserved to zero and one, respectively. */ + out_uuid->uuid[8] = (out_uuid->uuid[8] & 0x3Fu) | 0x80u; + + return out_uuid; +} diff --git a/src/libnm-glib-aux/nm-uuid.h b/src/libnm-glib-aux/nm-uuid.h index 950fb62969..812886eed0 100644 --- a/src/libnm-glib-aux/nm-uuid.h +++ b/src/libnm-glib-aux/nm-uuid.h @@ -27,4 +27,6 @@ nm_uuid_parse(const char *str, NMUuid *out_uuid) return out_uuid; } +NMUuid *nm_uuid_generate_random(NMUuid *out_uuid); + #endif /* __NM_UUID_H__ */ From 7a15144f75b374d1644747c07ff72226c5d3f24d Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 2 May 2021 13:45:53 +0200 Subject: [PATCH 10/22] glib-aux: use nm_uuid_generate_random() helper --- src/core/nm-core-utils.c | 2 +- src/libnm-core-impl/nm-utils.c | 11 +---------- src/libnm-core-intern/nm-core-internal.h | 2 -- 3 files changed, 2 insertions(+), 13 deletions(-) diff --git a/src/core/nm-core-utils.c b/src/core/nm-core-utils.c index 0bb5040829..cb4d88e55a 100644 --- a/src/core/nm-core-utils.c +++ b/src/core/nm-core-utils.c @@ -2857,7 +2857,7 @@ again: if (!contents || !nm_uuid_parse(nm_strstrip(contents), &uuid)) { /* generate a random UUID instead. */ is_fake = TRUE; - _nm_utils_uuid_generate_random(&uuid); + nm_uuid_generate_random(&uuid); } if (!g_once_init_enter(&lock)) diff --git a/src/libnm-core-impl/nm-utils.c b/src/libnm-core-impl/nm-utils.c index 11a59e50f6..edbee57dee 100644 --- a/src/libnm-core-impl/nm-utils.c +++ b/src/libnm-core-impl/nm-utils.c @@ -3044,15 +3044,6 @@ _nm_utils_sriov_vf_from_strparts(const char *index, /*****************************************************************************/ -NMUuid * -_nm_utils_uuid_generate_random(NMUuid *out_uuid) -{ - nm_assert(out_uuid); - - uuid_generate_random(out_uuid->uuid); - return out_uuid; -} - gboolean nm_utils_uuid_is_null(const NMUuid *uuid) { @@ -3081,7 +3072,7 @@ nm_utils_uuid_generate_buf_(char *buf) nm_assert(buf); - _nm_utils_uuid_generate_random(&uuid); + nm_uuid_generate_random(&uuid); return nm_uuid_unparse(&uuid, buf); } diff --git a/src/libnm-core-intern/nm-core-internal.h b/src/libnm-core-intern/nm-core-internal.h index 79fe36dd53..86630c0bf7 100644 --- a/src/libnm-core-intern/nm-core-internal.h +++ b/src/libnm-core-intern/nm-core-internal.h @@ -352,8 +352,6 @@ gboolean _nm_utils_check_module_file(const char * name, /*****************************************************************************/ -NMUuid *_nm_utils_uuid_generate_random(NMUuid *out_uuid); - gboolean nm_utils_uuid_is_null(const NMUuid *uuid); #define NM_UTILS_UUID_TYPE_LEGACY 0 From 73b9883c6f30320b727a664ff2c84cc772aac94b Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 2 May 2021 14:09:05 +0200 Subject: [PATCH 11/22] build: don't link libnm/libnm-core against libuuid We use util-linux's libuuid for handling UUIDs. But UUIDs are really a trivial thing, at least the portion that we use. Reimplement the parse/unparse/generate_random() methods and drop the dependency. Note that no other libraries from our dependency chain was dragging in libuuid, so thereby we really get rid of the dependency. We still require libuuid for building, because it is used by an example program. Maybe that should be changed, to avoid the build dependency. But that can be done at a later time. --- Makefile.am | 2 -- src/libnm-core-impl/nm-utils.c | 1 - 2 files changed, 3 deletions(-) diff --git a/Makefile.am b/Makefile.am index 3eb66ecdb2..1f74709ffc 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1394,7 +1394,6 @@ nodist_src_libnm_core_impl_libnm_core_impl_la_SOURCES = \ src_libnm_core_impl_libnm_core_impl_la_LIBADD = \ $(GLIB_LIBS) \ - $(UUID_LIBS) \ $(NULL) src_libnm_core_impl_libnm_core_impl_la_LDFLAGS = \ @@ -1762,7 +1761,6 @@ src_libnm_client_impl_libnm_client_impl_la_LIBADD = \ src/c-siphash/libc-siphash.la \ $(GLIB_LIBS) \ $(DL_LIBS) \ - $(UUID_LIBS) \ $(LIBUDEV_LIBS) \ $(NULL) diff --git a/src/libnm-core-impl/nm-utils.c b/src/libnm-core-impl/nm-utils.c index edbee57dee..932206f3bc 100644 --- a/src/libnm-core-impl/nm-utils.c +++ b/src/libnm-core-impl/nm-utils.c @@ -11,7 +11,6 @@ #include #include #include -#include #include #include #include From dd1a618745a5dff77a8373a54af7c76cccdba02e Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 2 May 2021 14:17:32 +0200 Subject: [PATCH 12/22] libnm,glib-aux: move nm_utils_uuid_is_null() to "nm-uuid.h" --- src/core/nm-core-utils.c | 2 +- src/libnm-core-impl/nm-utils.c | 15 --------------- src/libnm-core-impl/tests/test-general.c | 8 ++++---- src/libnm-core-intern/nm-core-internal.h | 2 -- src/libnm-glib-aux/nm-uuid.c | 17 +++++++++++++++++ src/libnm-glib-aux/nm-uuid.h | 2 ++ 6 files changed, 24 insertions(+), 22 deletions(-) diff --git a/src/core/nm-core-utils.c b/src/core/nm-core-utils.c index cb4d88e55a..19ff105911 100644 --- a/src/core/nm-core-utils.c +++ b/src/core/nm-core-utils.c @@ -2455,7 +2455,7 @@ again: (guint8 *) &uuid, sizeof(uuid), NULL)) { - if (!nm_utils_uuid_is_null(&uuid)) { + if (!nm_uuid_is_null(&uuid)) { /* an all-zero machine-id is not valid. */ is_fake = FALSE; } diff --git a/src/libnm-core-impl/nm-utils.c b/src/libnm-core-impl/nm-utils.c index 932206f3bc..75e06e9127 100644 --- a/src/libnm-core-impl/nm-utils.c +++ b/src/libnm-core-impl/nm-utils.c @@ -3043,21 +3043,6 @@ _nm_utils_sriov_vf_from_strparts(const char *index, /*****************************************************************************/ -gboolean -nm_utils_uuid_is_null(const NMUuid *uuid) -{ - int i; - - if (!uuid) - return TRUE; - - for (i = 0; i < (int) G_N_ELEMENTS(uuid->uuid); i++) { - if (uuid->uuid[i]) - return FALSE; - } - return TRUE; -} - /** * nm_utils_uuid_generate_buf_: * @buf: input buffer, must contain at least 37 bytes diff --git a/src/libnm-core-impl/tests/test-general.c b/src/libnm-core-impl/tests/test-general.c index 3000779951..537b1e7784 100644 --- a/src/libnm-core-impl/tests/test-general.c +++ b/src/libnm-core-impl/tests/test-general.c @@ -7859,10 +7859,10 @@ test_nm_utils_uuid_generate_from_strings(void) g_assert_cmpmem(&uuid0, sizeof(uuid0), _uuid("00000000-0000-0000-0000-000000000000"), 16); - g_assert(nm_utils_uuid_is_null(NULL)); - g_assert(nm_utils_uuid_is_null(&uuid0)); - g_assert(nm_utils_uuid_is_null(_uuid("00000000-0000-0000-0000-000000000000"))); - g_assert(!nm_utils_uuid_is_null(_uuid("10000000-0000-0000-0000-000000000000"))); + g_assert(nm_uuid_is_null(NULL)); + g_assert(nm_uuid_is_null(&uuid0)); + g_assert(nm_uuid_is_null(_uuid("00000000-0000-0000-0000-000000000000"))); + g_assert(!nm_uuid_is_null(_uuid("10000000-0000-0000-0000-000000000000"))); _test_uuid("b07c334a-399b-32de-8d50-58e4e08f98e3", "", 0, NULL); _test_uuid("b8a426cb-bcb5-30a3-bd8f-6786fea72df9", "\0", 1, ""); diff --git a/src/libnm-core-intern/nm-core-internal.h b/src/libnm-core-intern/nm-core-internal.h index 86630c0bf7..db10c572a4 100644 --- a/src/libnm-core-intern/nm-core-internal.h +++ b/src/libnm-core-intern/nm-core-internal.h @@ -352,8 +352,6 @@ gboolean _nm_utils_check_module_file(const char * name, /*****************************************************************************/ -gboolean nm_utils_uuid_is_null(const NMUuid *uuid); - #define NM_UTILS_UUID_TYPE_LEGACY 0 #define NM_UTILS_UUID_TYPE_VERSION3 3 #define NM_UTILS_UUID_TYPE_VERSION5 5 diff --git a/src/libnm-glib-aux/nm-uuid.c b/src/libnm-glib-aux/nm-uuid.c index 199c3df4b2..3d94c4e337 100644 --- a/src/libnm-glib-aux/nm-uuid.c +++ b/src/libnm-glib-aux/nm-uuid.c @@ -125,3 +125,20 @@ nm_uuid_generate_random(NMUuid *out_uuid) return out_uuid; } + +/*****************************************************************************/ + +gboolean +nm_uuid_is_null(const NMUuid *uuid) +{ + int i; + + if (!uuid) + return TRUE; + + for (i = 0; i < (int) G_N_ELEMENTS(uuid->uuid); i++) { + if (uuid->uuid[i]) + return FALSE; + } + return TRUE; +} diff --git a/src/libnm-glib-aux/nm-uuid.h b/src/libnm-glib-aux/nm-uuid.h index 812886eed0..5b3a1a44e5 100644 --- a/src/libnm-glib-aux/nm-uuid.h +++ b/src/libnm-glib-aux/nm-uuid.h @@ -29,4 +29,6 @@ nm_uuid_parse(const char *str, NMUuid *out_uuid) NMUuid *nm_uuid_generate_random(NMUuid *out_uuid); +gboolean nm_uuid_is_null(const NMUuid *uuid); + #endif /* __NM_UUID_H__ */ From 73cfc4097a82db44a06d0d0251412f99c13adc1b Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 2 May 2021 14:55:46 +0200 Subject: [PATCH 13/22] libnm,glib-aux: add and use nm_uuid_generate_random_str*() helpers --- src/core/NetworkManagerUtils.c | 2 +- src/core/devices/bluetooth/nm-bluez-manager.c | 2 +- src/core/devices/nm-device.c | 2 +- src/core/devices/wifi/nm-iwd-manager.c | 2 +- .../plugins/ifcfg-rh/tests/test-ifcfg-rh.c | 116 +++++++++--------- src/libnm-core-impl/nm-connection.c | 2 +- src/libnm-core-impl/nm-utils.c | 19 +-- src/libnm-core-impl/tests/test-setting.c | 2 +- src/libnm-core-intern/nm-core-internal.h | 8 -- src/libnm-glib-aux/nm-uuid.c | 11 ++ src/libnm-glib-aux/nm-uuid.h | 16 +++ src/nm-initrd-generator/nmi-cmdline-reader.c | 2 +- 12 files changed, 93 insertions(+), 91 deletions(-) diff --git a/src/core/NetworkManagerUtils.c b/src/core/NetworkManagerUtils.c index 481672968b..700acf37d9 100644 --- a/src/core/NetworkManagerUtils.c +++ b/src/core/NetworkManagerUtils.c @@ -254,7 +254,7 @@ nm_utils_complete_generic(NMPlatform * platform, g_object_set(G_OBJECT(s_con), NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_buf(uuid), + nm_uuid_generate_random_str_arr(uuid), NULL); } diff --git a/src/core/devices/bluetooth/nm-bluez-manager.c b/src/core/devices/bluetooth/nm-bluez-manager.c index a16a22a096..123591e1a1 100644 --- a/src/core/devices/bluetooth/nm-bluez-manager.c +++ b/src/core/devices/bluetooth/nm-bluez-manager.c @@ -1321,7 +1321,7 @@ _conn_create_panu_connection(NMBluezManager *self, BzDBusObj *bzobj) char uuid[37]; gs_free_error GError *error = NULL; - nm_utils_uuid_generate_buf(uuid); + nm_uuid_generate_random_str_arr(uuid); id = g_strdup_printf(_("%s Network"), bzobj->d_device.name); connection = nm_simple_connection_new(); diff --git a/src/core/devices/nm-device.c b/src/core/devices/nm-device.c index d91b27ec91..b8819a4bbd 100644 --- a/src/core/devices/nm-device.c +++ b/src/core/devices/nm-device.c @@ -7238,7 +7238,7 @@ nm_device_generate_connection(NMDevice *self, g_object_set(s_con, NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_buf(uuid), + nm_uuid_generate_random_str_arr(uuid), NM_SETTING_CONNECTION_ID, ifname, NM_SETTING_CONNECTION_AUTOCONNECT, diff --git a/src/core/devices/wifi/nm-iwd-manager.c b/src/core/devices/wifi/nm-iwd-manager.c index c7ba20eaa6..9ede0311c0 100644 --- a/src/core/devices/wifi/nm-iwd-manager.c +++ b/src/core/devices/wifi/nm-iwd-manager.c @@ -774,7 +774,7 @@ mirror_connection(NMIwdManager * self, NM_SETTING_CONNECTION_ID, id->name, NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_buf(uuid), + nm_uuid_generate_random_str_arr(uuid), NM_SETTING_CONNECTION_AUTOCONNECT, autoconnectable, NULL); diff --git a/src/core/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c b/src/core/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c index 797c31649b..e0a265bed9 100644 --- a/src/core/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c +++ b/src/core/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c @@ -2519,7 +2519,7 @@ test_write_dns_options(void) NM_SETTING_CONNECTION_ID, "Test DNS options", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_TYPE, @@ -3977,7 +3977,7 @@ test_write_wifi_hidden(void) NM_SETTING_CONNECTION_ID, "Test Write Wi-Fi Hidden", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRELESS_SETTING_NAME, NULL); @@ -4062,7 +4062,7 @@ test_write_wifi_mac_random(gconstpointer user_data) NM_SETTING_CONNECTION_ID, val, NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRELESS_SETTING_NAME, NULL); @@ -4122,7 +4122,7 @@ test_write_wired_wake_on_lan(void) NM_SETTING_CONNECTION_ID, "Test Write Wired Wake-on-LAN", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRED_SETTING_NAME, NULL); @@ -4305,7 +4305,7 @@ test_write_wifi_band_a(void) NM_SETTING_CONNECTION_ID, "Test Write Wi-Fi Band A", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRELESS_SETTING_NAME, NULL); @@ -4363,7 +4363,7 @@ test_write_wifi_ap_mode(void) NM_SETTING_CONNECTION_ID, "Test Write Wi-Fi AP Mode", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRELESS_SETTING_NAME, NULL); @@ -4676,7 +4676,7 @@ test_write_wired_static(void) NM_SETTING_CONNECTION_ID, "Test Write Wired Static", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_AUTOCONNECT_RETRIES, @@ -4831,7 +4831,7 @@ test_write_wired_static_with_generic(void) NM_SETTING_CONNECTION_ID, "Test Write Wired Static", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_AUTOCONNECT_RETRIES, @@ -4999,7 +4999,7 @@ test_write_wired_dhcp(void) NM_SETTING_CONNECTION_ID, "Test Write Wired DHCP", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_TYPE, @@ -5111,7 +5111,7 @@ test_write_routing_rules(void) NM_SETTING_CONNECTION_ID, "Test Write Routing Rules", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_TYPE, @@ -5169,7 +5169,7 @@ test_write_wired_match(void) NM_SETTING_CONNECTION_ID, "Test Write Wired with Match setting", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_TYPE, @@ -5315,7 +5315,7 @@ test_write_wired_static_ip6_only(void) NM_SETTING_CONNECTION_ID, "Test Write Wired Static IP6 Only", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_TYPE, @@ -5432,7 +5432,7 @@ test_write_wired_static_ip6_only_gw(gconstpointer user_data) NM_SETTING_CONNECTION_ID, id, NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_TYPE, @@ -5587,7 +5587,7 @@ test_write_wired_static_routes(void) NM_SETTING_CONNECTION_ID, "Test Write Wired Static Routes", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_TYPE, @@ -5711,7 +5711,7 @@ test_write_wired_dhcp_8021x_peap_mschapv2(void) NM_SETTING_CONNECTION_ID, "Test Write Wired DHCP 802.1x PEAP MSCHAPv2", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_TYPE, @@ -5813,7 +5813,7 @@ test_write_wired_8021x_tls(gconstpointer test_data) NM_SETTING_CONNECTION_ID, "Test Write Wired 802.1x TLS Blobs", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_TYPE, @@ -5983,7 +5983,7 @@ test_write_wired_aliases(void) NM_SETTING_CONNECTION_ID, "alias0", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRED_SETTING_NAME, NULL); @@ -6110,7 +6110,7 @@ test_write_gateway(void) NM_SETTING_CONNECTION_ID, "Test Write Static Addresses Gateway", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRED_SETTING_NAME, NULL); @@ -6187,7 +6187,7 @@ test_write_wifi_open(void) NM_SETTING_CONNECTION_ID, "Test Write Wifi Open", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_TYPE, @@ -6273,7 +6273,7 @@ test_write_wifi_open_hex_ssid(void) NM_SETTING_CONNECTION_ID, "Test Write Wifi Open Hex SSID", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_TYPE, @@ -6347,7 +6347,7 @@ test_write_wifi_wep(void) NM_SETTING_CONNECTION_ID, "Test Write Wifi WEP", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_TYPE, @@ -6445,7 +6445,7 @@ test_write_wifi_wep_adhoc(void) NM_SETTING_CONNECTION_ID, "Test Write Wifi WEP AdHoc", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_TYPE, @@ -6539,7 +6539,7 @@ test_write_wifi_wep_passphrase(void) NM_SETTING_CONNECTION_ID, "Test Write Wifi WEP Passphrase", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_TYPE, @@ -6634,7 +6634,7 @@ test_write_wifi_wep_40_ascii(void) NM_SETTING_CONNECTION_ID, "Test Write Wifi WEP 40 ASCII", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_TYPE, @@ -6732,7 +6732,7 @@ test_write_wifi_wep_104_ascii(void) NM_SETTING_CONNECTION_ID, "Test Write Wifi WEP 104 ASCII", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_TYPE, @@ -6833,7 +6833,7 @@ test_write_wifi_leap(void) NM_SETTING_CONNECTION_ID, "Test Write Wifi LEAP", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_TYPE, @@ -6931,7 +6931,7 @@ test_write_wifi_leap_secret_flags(gconstpointer data) NM_SETTING_CONNECTION_ID, "Test Write Wifi LEAP Secret Flags", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRELESS_SETTING_NAME, NULL); @@ -7037,7 +7037,7 @@ test_write_wifi_wpa_psk(gconstpointer test_data) NM_SETTING_CONNECTION_ID, args.name, NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_TYPE, @@ -7142,7 +7142,7 @@ test_write_wifi_wpa_psk_adhoc(void) NM_SETTING_CONNECTION_ID, "Test Write Wifi WPA PSK", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_TYPE, @@ -7252,7 +7252,7 @@ test_write_wifi_wpa_eap_tls(void) NM_SETTING_CONNECTION_ID, "Test Write Wifi WPA EAP-TLS", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_TYPE, @@ -7379,7 +7379,7 @@ test_write_wifi_wpa_eap_ttls_tls(void) NM_SETTING_CONNECTION_ID, "Test Write Wifi WPA EAP-TTLS (TLS)", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_TYPE, @@ -7515,7 +7515,7 @@ test_write_wifi_wpa_eap_ttls_mschapv2(void) NM_SETTING_CONNECTION_ID, "Test Write Wifi WPA EAP-TTLS (MSCHAPv2)", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_TYPE, @@ -7630,7 +7630,7 @@ test_write_wifi_wpa_then_open(void) NM_SETTING_CONNECTION_ID, "random wifi connection", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_TYPE, @@ -7747,7 +7747,7 @@ test_write_wifi_wpa_then_wep_with_perms(void) NM_SETTING_CONNECTION_ID, "random wifi connection 2", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_PERMISSIONS, @@ -7872,7 +7872,7 @@ test_write_wifi_dynamic_wep_leap(void) NM_SETTING_CONNECTION_ID, "Test Write Wifi Dynamic WEP LEAP", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRELESS_SETTING_NAME, NULL); @@ -7969,7 +7969,7 @@ test_write_wired_qeth_dhcp(void) NM_SETTING_CONNECTION_ID, "Test Write Wired qeth Static", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_TYPE, @@ -8043,7 +8043,7 @@ test_write_wired_ctc_dhcp(void) NM_SETTING_CONNECTION_ID, "Test Write Wired ctc Static", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRED_SETTING_NAME, NULL); @@ -8118,7 +8118,7 @@ test_write_permissions(void) NM_SETTING_CONNECTION_ID, "Test Write Permissions", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_TYPE, @@ -8187,7 +8187,7 @@ test_write_wifi_wep_agent_keys(void) NM_SETTING_CONNECTION_ID, "Test Write Wifi WEP Agent Owned", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRELESS_SETTING_NAME, NULL); @@ -8273,7 +8273,7 @@ test_write_wired_pppoe(void) NM_SETTING_CONNECTION_ID, "Test Write Wired PPPoE", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_TYPE, @@ -8334,7 +8334,7 @@ test_write_vpn(void) NM_SETTING_CONNECTION_ID, "Test Write VPN", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_TYPE, @@ -8392,7 +8392,7 @@ test_write_mobile_broadband(gconstpointer data) NM_SETTING_CONNECTION_ID, gsm ? "Test Write GSM" : "Test Write CDMA", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_TYPE, @@ -8510,7 +8510,7 @@ test_write_bridge_main(void) NM_SETTING_CONNECTION_ID, "Test Write Bridge Main", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_INTERFACE_NAME, @@ -8639,7 +8639,7 @@ test_write_bridge_component(void) NM_SETTING_CONNECTION_ID, "Test Write Bridge Component", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_TYPE, @@ -9023,7 +9023,7 @@ test_write_vlan_reorder_hdr(void) NM_SETTING_CONNECTION_ID, "Test Write VLAN reorder_hdr", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, FALSE, NM_SETTING_CONNECTION_TYPE, @@ -9078,7 +9078,7 @@ test_write_ethernet_missing_ipv6(void) NM_SETTING_CONNECTION_ID, "Test Write Ethernet Without IPv6 Setting", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_TYPE, @@ -9202,7 +9202,7 @@ test_write_bond_main(void) NM_SETTING_CONNECTION_ID, "Test Write Bond Main", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_INTERFACE_NAME, @@ -9302,7 +9302,7 @@ test_write_bond_slave(void) NM_SETTING_CONNECTION_ID, "Test Write Bond Slave", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_TYPE, @@ -9389,7 +9389,7 @@ test_write_infiniband(void) NM_SETTING_CONNECTION_ID, "Test Write InfiniBand", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_TYPE, @@ -9478,7 +9478,7 @@ test_write_bond_slave_ib(void) NM_SETTING_CONNECTION_ID, "Test Write Bond Slave InfiniBand", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_TYPE, @@ -9636,7 +9636,7 @@ test_write_dcb_basic(void) NM_SETTING_CONNECTION_ID, "dcb-test", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRED_SETTING_NAME, NM_SETTING_CONNECTION_INTERFACE_NAME, @@ -9882,7 +9882,7 @@ test_write_fcoe_mode(gconstpointer user_data) NM_SETTING_CONNECTION_ID, "fcoe-test", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRED_SETTING_NAME, NM_SETTING_CONNECTION_INTERFACE_NAME, @@ -10000,7 +10000,7 @@ test_write_team_master(void) NM_SETTING_CONNECTION_ID, "Test Write Team Master", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_INTERFACE_NAME, "team0", NM_SETTING_CONNECTION_TYPE, @@ -10092,7 +10092,7 @@ test_write_team_port(void) NM_SETTING_CONNECTION_ID, "Test Write Team Port", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRED_SETTING_NAME, NM_SETTING_CONNECTION_MASTER, @@ -10151,7 +10151,7 @@ test_write_team_infiniband_port(void) NM_SETTING_CONNECTION_ID, "Test Write Team Infiniband Port", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_TYPE, NM_SETTING_INFINIBAND_SETTING_NAME, NM_SETTING_CONNECTION_MASTER, @@ -10341,7 +10341,7 @@ test_write_proxy_basic(void) NM_SETTING_CONNECTION_ID, "Test Write Proxy Basic", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRED_SETTING_NAME, NULL); @@ -11031,7 +11031,7 @@ test_sriov_write(void) NM_SETTING_CONNECTION_ID, "Test Write SR-IOV config", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_INTERFACE_NAME, @@ -11166,7 +11166,7 @@ test_tc_write(void) NM_SETTING_CONNECTION_ID, "Test Write TC config", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_INTERFACE_NAME, diff --git a/src/libnm-core-impl/nm-connection.c b/src/libnm-core-impl/nm-connection.c index e9880ef49b..960a34fcc0 100644 --- a/src/libnm-core-impl/nm-connection.c +++ b/src/libnm-core-impl/nm-connection.c @@ -710,7 +710,7 @@ _normalize_connection_uuid(NMConnection *self) if (nm_setting_connection_get_uuid(s_con)) return FALSE; - g_object_set(s_con, NM_SETTING_CONNECTION_UUID, nm_utils_uuid_generate_buf(uuid), NULL); + g_object_set(s_con, NM_SETTING_CONNECTION_UUID, nm_uuid_generate_random_str_arr(uuid), NULL); return TRUE; } diff --git a/src/libnm-core-impl/nm-utils.c b/src/libnm-core-impl/nm-utils.c index 75e06e9127..5bb43c8d00 100644 --- a/src/libnm-core-impl/nm-utils.c +++ b/src/libnm-core-impl/nm-utils.c @@ -3043,23 +3043,6 @@ _nm_utils_sriov_vf_from_strparts(const char *index, /*****************************************************************************/ -/** - * nm_utils_uuid_generate_buf_: - * @buf: input buffer, must contain at least 37 bytes - * - * Returns: generates a new random UUID, writes it to @buf and returns @buf. - **/ -char * -nm_utils_uuid_generate_buf_(char *buf) -{ - NMUuid uuid; - - nm_assert(buf); - - nm_uuid_generate_random(&uuid); - return nm_uuid_unparse(&uuid, buf); -} - /** * nm_utils_uuid_generate: * @@ -3069,7 +3052,7 @@ nm_utils_uuid_generate_buf_(char *buf) char * nm_utils_uuid_generate(void) { - return nm_utils_uuid_generate_buf_(g_malloc(37)); + return nm_uuid_generate_random_str_malloc(); } /** diff --git a/src/libnm-core-impl/tests/test-setting.c b/src/libnm-core-impl/tests/test-setting.c index 4516c472dc..b64bf79612 100644 --- a/src/libnm-core-impl/tests/test-setting.c +++ b/src/libnm-core-impl/tests/test-setting.c @@ -2219,7 +2219,7 @@ test_sriov_setting(void) NM_SETTING_CONNECTION_ID, "Test SR-IOV connection", NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NM_SETTING_CONNECTION_INTERFACE_NAME, diff --git a/src/libnm-core-intern/nm-core-internal.h b/src/libnm-core-intern/nm-core-internal.h index db10c572a4..f4edcedefb 100644 --- a/src/libnm-core-intern/nm-core-internal.h +++ b/src/libnm-core-intern/nm-core-internal.h @@ -370,14 +370,6 @@ nm_utils_uuid_generate_from_string(const char *s, gssize slen, int uuid_type, gp char *_nm_utils_uuid_generate_from_strings(const char *string1, ...) G_GNUC_NULL_TERMINATED; -char *nm_utils_uuid_generate_buf_(char *buf); -#define nm_utils_uuid_generate_buf(buf) \ - ({ \ - G_STATIC_ASSERT(sizeof(buf) == G_N_ELEMENTS(buf) && sizeof(buf) >= 37); \ - nm_utils_uuid_generate_buf_(buf); \ - }) -#define nm_utils_uuid_generate_a() (nm_utils_uuid_generate_buf_(g_alloca(37))) - void _nm_dbus_errors_init(void); extern gboolean _nm_utils_is_manager_process; diff --git a/src/libnm-glib-aux/nm-uuid.c b/src/libnm-glib-aux/nm-uuid.c index 3d94c4e337..d4ccca52a6 100644 --- a/src/libnm-glib-aux/nm-uuid.c +++ b/src/libnm-glib-aux/nm-uuid.c @@ -142,3 +142,14 @@ nm_uuid_is_null(const NMUuid *uuid) } return TRUE; } + +char * +nm_uuid_generate_random_str(char buf[static 37]) +{ + NMUuid uuid; + + nm_assert(buf); + + nm_uuid_generate_random(&uuid); + return nm_uuid_unparse(&uuid, buf); +} diff --git a/src/libnm-glib-aux/nm-uuid.h b/src/libnm-glib-aux/nm-uuid.h index 5b3a1a44e5..a4be9536c3 100644 --- a/src/libnm-glib-aux/nm-uuid.h +++ b/src/libnm-glib-aux/nm-uuid.h @@ -31,4 +31,20 @@ NMUuid *nm_uuid_generate_random(NMUuid *out_uuid); gboolean nm_uuid_is_null(const NMUuid *uuid); +/*****************************************************************************/ + +char *nm_uuid_generate_random_str(char buf[static 37]); + +#define nm_uuid_generate_random_str_arr(buf) \ + ({ \ + G_STATIC_ASSERT(sizeof(buf) == G_N_ELEMENTS(buf) && sizeof(buf) >= 37); \ + nm_uuid_generate_random_str(buf); \ + }) + +#define nm_uuid_generate_random_str_a() (nm_uuid_generate_random_str(g_alloca(37))) + +#define nm_uuid_generate_random_str_malloc() (nm_uuid_generate_random_str(g_new(char, 37))) + +/*****************************************************************************/ + #endif /* __NM_UUID_H__ */ diff --git a/src/nm-initrd-generator/nmi-cmdline-reader.c b/src/nm-initrd-generator/nmi-cmdline-reader.c index 2353e2ea0e..eaaed73143 100644 --- a/src/nm-initrd-generator/nmi-cmdline-reader.c +++ b/src/nm-initrd-generator/nmi-cmdline-reader.c @@ -141,7 +141,7 @@ reader_create_connection(Reader * reader, NM_SETTING_CONNECTION_ID, id, NM_SETTING_CONNECTION_UUID, - nm_utils_uuid_generate_a(), + nm_uuid_generate_random_str_a(), NM_SETTING_CONNECTION_INTERFACE_NAME, ifname, NM_SETTING_CONNECTION_TYPE, From c5985db7cf1e85d95a071ddf1a8f17d57cc40b0f Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 2 May 2021 15:32:35 +0200 Subject: [PATCH 14/22] libnm,glib-aux: move nm_crypto_md5_hash() to "libnm-glib-aux" This only uses glib's md5 code and has no dependency on our crypto libraries (gnutls, nss). Move it to "libnm-glib-aux" so it can be freely used. Maybe it deserves a better name, but "nm-shared-utils.h" is a heap of various utility functions, it's hard to name them well. --- src/libnm-core-impl/nm-crypto.c | 40 -------------------------- src/libnm-core-impl/nm-crypto.h | 7 ----- src/libnm-glib-aux/nm-shared-utils.c | 42 ++++++++++++++++++++++++++++ src/libnm-glib-aux/nm-shared-utils.h | 9 ++++++ 4 files changed, 51 insertions(+), 47 deletions(-) diff --git a/src/libnm-core-impl/nm-crypto.c b/src/libnm-core-impl/nm-crypto.c index 42f9bf5f1e..b14b681e16 100644 --- a/src/libnm-core-impl/nm-crypto.c +++ b/src/libnm-core-impl/nm-crypto.c @@ -914,46 +914,6 @@ nm_crypto_verify_private_key(const char *filename, error); } -void -nm_crypto_md5_hash(const guint8 *salt, - gsize salt_len, - const guint8 *password, - gsize password_len, - guint8 * buffer, - gsize buflen) -{ - nm_auto_free_checksum GChecksum * ctx = NULL; - nm_auto_clear_static_secret_ptr const NMSecretPtr digest = - NM_SECRET_PTR_STATIC(NM_UTILS_CHECKSUM_LENGTH_MD5); - gsize bufidx = 0; - int i; - - g_return_if_fail(password_len == 0 || password); - g_return_if_fail(buffer); - g_return_if_fail(buflen > 0); - g_return_if_fail(salt_len == 0 || salt); - - ctx = g_checksum_new(G_CHECKSUM_MD5); - - for (;;) { - if (password_len > 0) - g_checksum_update(ctx, (const guchar *) password, password_len); - if (salt_len > 0) - g_checksum_update(ctx, (const guchar *) salt, salt_len); - - nm_utils_checksum_get_digest_len(ctx, digest.bin, NM_UTILS_CHECKSUM_LENGTH_MD5); - - for (i = 0; i < NM_UTILS_CHECKSUM_LENGTH_MD5; i++) { - if (bufidx >= buflen) - return; - buffer[bufidx++] = digest.bin[i]; - } - - g_checksum_reset(ctx); - g_checksum_update(ctx, digest.ptr, NM_UTILS_CHECKSUM_LENGTH_MD5); - } -} - gboolean nm_crypto_randomize(void *buffer, gsize buffer_len, GError **error) { diff --git a/src/libnm-core-impl/nm-crypto.h b/src/libnm-core-impl/nm-crypto.h index 8665a234bf..855e4f9c68 100644 --- a/src/libnm-core-impl/nm-crypto.h +++ b/src/libnm-core-impl/nm-crypto.h @@ -63,13 +63,6 @@ NMCryptoFileFormat nm_crypto_verify_private_key(const char *file, gboolean * out_is_encrypted, GError ** error); -void nm_crypto_md5_hash(const guint8 *salt, - gsize salt_len, - const guint8 *password, - gsize password_len, - guint8 * buffer, - gsize buflen); - gboolean nm_crypto_randomize(void *buffer, gsize buffer_len, GError **error); /*****************************************************************************/ diff --git a/src/libnm-glib-aux/nm-shared-utils.c b/src/libnm-glib-aux/nm-shared-utils.c index 7dcba45681..021893f86a 100644 --- a/src/libnm-glib-aux/nm-shared-utils.c +++ b/src/libnm-glib-aux/nm-shared-utils.c @@ -6199,3 +6199,45 @@ NM_ASSERT_VALID_PATH_COMPONENT(const char *name) NM_PRINT_FMT_QUOTED(name, "\"", name, "\"", "(null)")); g_assert_not_reached(); } + +/*****************************************************************************/ + +void +nm_crypto_md5_hash(const guint8 *salt, + gsize salt_len, + const guint8 *password, + gsize password_len, + guint8 * buffer, + gsize buflen) +{ + nm_auto_free_checksum GChecksum * ctx = NULL; + nm_auto_clear_static_secret_ptr const NMSecretPtr digest = + NM_SECRET_PTR_STATIC(NM_UTILS_CHECKSUM_LENGTH_MD5); + gsize bufidx = 0; + int i; + + g_return_if_fail(password_len == 0 || password); + g_return_if_fail(buffer); + g_return_if_fail(buflen > 0); + g_return_if_fail(salt_len == 0 || salt); + + ctx = g_checksum_new(G_CHECKSUM_MD5); + + for (;;) { + if (password_len > 0) + g_checksum_update(ctx, (const guchar *) password, password_len); + if (salt_len > 0) + g_checksum_update(ctx, (const guchar *) salt, salt_len); + + nm_utils_checksum_get_digest_len(ctx, digest.bin, NM_UTILS_CHECKSUM_LENGTH_MD5); + + for (i = 0; i < NM_UTILS_CHECKSUM_LENGTH_MD5; i++) { + if (bufidx >= buflen) + return; + buffer[bufidx++] = digest.bin[i]; + } + + g_checksum_reset(ctx); + g_checksum_update(ctx, digest.ptr, NM_UTILS_CHECKSUM_LENGTH_MD5); + } +} diff --git a/src/libnm-glib-aux/nm-shared-utils.h b/src/libnm-glib-aux/nm-shared-utils.h index 48e9eca8fb..699d4d52b2 100644 --- a/src/libnm-glib-aux/nm-shared-utils.h +++ b/src/libnm-glib-aux/nm-shared-utils.h @@ -2786,4 +2786,13 @@ gboolean nm_utils_sysctl_ip_conf_is_path(int addr_family, const char *ifname, const char *property); +/*****************************************************************************/ + +void nm_crypto_md5_hash(const guint8 *salt, + gsize salt_len, + const guint8 *password, + gsize password_len, + guint8 * buffer, + gsize buflen); + #endif /* __NM_SHARED_UTILS_H__ */ From 78297db72139b0da8ce7bf9853e7c3a797db68e8 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 2 May 2021 15:35:06 +0200 Subject: [PATCH 15/22] libnm,glib-aux: move nm_utils_uuid_*() API to libnm-glib-aux --- src/libnm-core-impl/nm-utils.c | 145 ---------------------- src/libnm-core-intern/nm-core-internal.h | 18 --- src/libnm-glib-aux/nm-uuid.c | 148 +++++++++++++++++++++++ src/libnm-glib-aux/nm-uuid.h | 20 +++ 4 files changed, 168 insertions(+), 163 deletions(-) diff --git a/src/libnm-core-impl/nm-utils.c b/src/libnm-core-impl/nm-utils.c index 5bb43c8d00..4c4d98d25b 100644 --- a/src/libnm-core-impl/nm-utils.c +++ b/src/libnm-core-impl/nm-utils.c @@ -3055,151 +3055,6 @@ nm_utils_uuid_generate(void) return nm_uuid_generate_random_str_malloc(); } -/** - * nm_utils_uuid_generate_from_string_bin: - * @uuid: the UUID to update inplace. This function cannot - * fail to succeed. - * @s: a string to use as the seed for the UUID - * @slen: if negative, treat @s as zero terminated C string. - * Otherwise, assume the length as given (and allow @s to be - * non-null terminated or contain '\0'). - * @uuid_type: a type identifier which UUID format to generate. - * @type_args: additional arguments, depending on the uuid_type - * - * For a given @s, this function will always return the same UUID. - * - * Returns: the input @uuid. This function cannot fail. - **/ -NMUuid * -nm_utils_uuid_generate_from_string_bin(NMUuid * uuid, - const char *s, - gssize slen, - int uuid_type, - gpointer type_args) -{ - g_return_val_if_fail(uuid, FALSE); - g_return_val_if_fail(slen == 0 || s, FALSE); - - if (slen < 0) - slen = s ? strlen(s) : 0; - - switch (uuid_type) { - case NM_UTILS_UUID_TYPE_LEGACY: - g_return_val_if_fail(!type_args, NULL); - nm_crypto_md5_hash(NULL, 0, (guint8 *) s, slen, (guint8 *) uuid, sizeof(*uuid)); - break; - case NM_UTILS_UUID_TYPE_VERSION3: - case NM_UTILS_UUID_TYPE_VERSION5: - { - NMUuid ns_uuid = {}; - - if (type_args) { - /* type_args can be a name space UUID. Interpret it as (char *) */ - if (!nm_uuid_parse(type_args, &ns_uuid)) - g_return_val_if_reached(NULL); - } - - if (uuid_type == NM_UTILS_UUID_TYPE_VERSION3) { - nm_crypto_md5_hash((guint8 *) s, - slen, - (guint8 *) &ns_uuid, - sizeof(ns_uuid), - (guint8 *) uuid, - sizeof(*uuid)); - } else { - nm_auto_free_checksum GChecksum *sum = NULL; - union { - guint8 sha1[NM_UTILS_CHECKSUM_LENGTH_SHA1]; - NMUuid uuid; - } digest; - - sum = g_checksum_new(G_CHECKSUM_SHA1); - g_checksum_update(sum, (guchar *) &ns_uuid, sizeof(ns_uuid)); - g_checksum_update(sum, (guchar *) s, slen); - nm_utils_checksum_get_digest(sum, digest.sha1); - - G_STATIC_ASSERT_EXPR(sizeof(digest.sha1) > sizeof(digest.uuid)); - *uuid = digest.uuid; - } - - uuid->uuid[6] = (uuid->uuid[6] & 0x0F) | (uuid_type << 4); - uuid->uuid[8] = (uuid->uuid[8] & 0x3F) | 0x80; - break; - } - default: - g_return_val_if_reached(NULL); - } - - return uuid; -} - -/** - * nm_utils_uuid_generate_from_string: - * @s: a string to use as the seed for the UUID - * @slen: if negative, treat @s as zero terminated C string. - * Otherwise, assume the length as given (and allow @s to be - * non-null terminated or contain '\0'). - * @uuid_type: a type identifier which UUID format to generate. - * @type_args: additional arguments, depending on the uuid_type - * - * For a given @s, this function will always return the same UUID. - * - * Returns: a newly allocated UUID suitable for use as the #NMSettingConnection - * object's #NMSettingConnection:id: property - **/ -char * -nm_utils_uuid_generate_from_string(const char *s, gssize slen, int uuid_type, gpointer type_args) -{ - NMUuid uuid; - - nm_utils_uuid_generate_from_string_bin(&uuid, s, slen, uuid_type, type_args); - return nm_uuid_unparse(&uuid, g_new(char, 37)); -} - -/** - * _nm_utils_uuid_generate_from_strings: - * @string1: a variadic list of strings. Must be NULL terminated. - * - * Returns a variant3 UUID based on the concatenated C strings. - * It does not simply concatenate them, but also includes the - * terminating '\0' character. For example "a", "b", gives - * "a\0b\0". - * - * This has the advantage, that the following invocations - * all give different UUIDs: (NULL), (""), ("",""), ("","a"), ("a",""), - * ("aa"), ("aa", ""), ("", "aa"), ... - */ -char * -_nm_utils_uuid_generate_from_strings(const char *string1, ...) -{ - if (!string1) - return nm_utils_uuid_generate_from_string(NULL, - 0, - NM_UTILS_UUID_TYPE_VERSION3, - NM_UTILS_UUID_NS); - - { - nm_auto_str_buf NMStrBuf str = NM_STR_BUF_INIT(NM_UTILS_GET_NEXT_REALLOC_SIZE_104, FALSE); - va_list args; - const char * s; - - nm_str_buf_append_len(&str, string1, strlen(string1) + 1u); - - va_start(args, string1); - s = va_arg(args, const char *); - while (s) { - nm_str_buf_append_len(&str, s, strlen(s) + 1u); - s = va_arg(args, const char *); - } - va_end(args); - - return nm_utils_uuid_generate_from_string(nm_str_buf_get_str_unsafe(&str), - str.len, - NM_UTILS_UUID_TYPE_VERSION3, - NM_UTILS_UUID_NS); - } -} - /*****************************************************************************/ static gboolean diff --git a/src/libnm-core-intern/nm-core-internal.h b/src/libnm-core-intern/nm-core-internal.h index f4edcedefb..03c2cbb5b4 100644 --- a/src/libnm-core-intern/nm-core-internal.h +++ b/src/libnm-core-intern/nm-core-internal.h @@ -352,24 +352,6 @@ gboolean _nm_utils_check_module_file(const char * name, /*****************************************************************************/ -#define NM_UTILS_UUID_TYPE_LEGACY 0 -#define NM_UTILS_UUID_TYPE_VERSION3 3 -#define NM_UTILS_UUID_TYPE_VERSION5 5 - -NMUuid *nm_utils_uuid_generate_from_string_bin(NMUuid * uuid, - const char *s, - gssize slen, - int uuid_type, - gpointer type_args); - -char * -nm_utils_uuid_generate_from_string(const char *s, gssize slen, int uuid_type, gpointer type_args); - -/* arbitrarily chosen namespace UUID for _nm_utils_uuid_generate_from_strings() */ -#define NM_UTILS_UUID_NS "b425e9fb-7598-44b4-9e3b-5a2e3aaa4905" - -char *_nm_utils_uuid_generate_from_strings(const char *string1, ...) G_GNUC_NULL_TERMINATED; - void _nm_dbus_errors_init(void); extern gboolean _nm_utils_is_manager_process; diff --git a/src/libnm-glib-aux/nm-uuid.c b/src/libnm-glib-aux/nm-uuid.c index d4ccca52a6..564daeb720 100644 --- a/src/libnm-glib-aux/nm-uuid.c +++ b/src/libnm-glib-aux/nm-uuid.c @@ -5,6 +5,7 @@ #include "nm-uuid.h" #include "libnm-glib-aux/nm-random-utils.h" +#include "libnm-glib-aux/nm-str-buf.h" /*****************************************************************************/ @@ -153,3 +154,150 @@ nm_uuid_generate_random_str(char buf[static 37]) nm_uuid_generate_random(&uuid); return nm_uuid_unparse(&uuid, buf); } + +/*****************************************************************************/ + +/** + * nm_utils_uuid_generate_from_string_bin: + * @uuid: the UUID to update inplace. This function cannot + * fail to succeed. + * @s: a string to use as the seed for the UUID + * @slen: if negative, treat @s as zero terminated C string. + * Otherwise, assume the length as given (and allow @s to be + * non-null terminated or contain '\0'). + * @uuid_type: a type identifier which UUID format to generate. + * @type_args: additional arguments, depending on the uuid_type + * + * For a given @s, this function will always return the same UUID. + * + * Returns: the input @uuid. This function cannot fail. + **/ +NMUuid * +nm_utils_uuid_generate_from_string_bin(NMUuid * uuid, + const char *s, + gssize slen, + int uuid_type, + gpointer type_args) +{ + g_return_val_if_fail(uuid, FALSE); + g_return_val_if_fail(slen == 0 || s, FALSE); + + if (slen < 0) + slen = s ? strlen(s) : 0; + + switch (uuid_type) { + case NM_UTILS_UUID_TYPE_LEGACY: + g_return_val_if_fail(!type_args, NULL); + nm_crypto_md5_hash(NULL, 0, (guint8 *) s, slen, (guint8 *) uuid, sizeof(*uuid)); + break; + case NM_UTILS_UUID_TYPE_VERSION3: + case NM_UTILS_UUID_TYPE_VERSION5: + { + NMUuid ns_uuid = {}; + + if (type_args) { + /* type_args can be a name space UUID. Interpret it as (char *) */ + if (!nm_uuid_parse(type_args, &ns_uuid)) + g_return_val_if_reached(NULL); + } + + if (uuid_type == NM_UTILS_UUID_TYPE_VERSION3) { + nm_crypto_md5_hash((guint8 *) s, + slen, + (guint8 *) &ns_uuid, + sizeof(ns_uuid), + (guint8 *) uuid, + sizeof(*uuid)); + } else { + nm_auto_free_checksum GChecksum *sum = NULL; + union { + guint8 sha1[NM_UTILS_CHECKSUM_LENGTH_SHA1]; + NMUuid uuid; + } digest; + + sum = g_checksum_new(G_CHECKSUM_SHA1); + g_checksum_update(sum, (guchar *) &ns_uuid, sizeof(ns_uuid)); + g_checksum_update(sum, (guchar *) s, slen); + nm_utils_checksum_get_digest(sum, digest.sha1); + + G_STATIC_ASSERT_EXPR(sizeof(digest.sha1) > sizeof(digest.uuid)); + *uuid = digest.uuid; + } + + uuid->uuid[6] = (uuid->uuid[6] & 0x0F) | (uuid_type << 4); + uuid->uuid[8] = (uuid->uuid[8] & 0x3F) | 0x80; + break; + } + default: + g_return_val_if_reached(NULL); + } + + return uuid; +} + +/** + * nm_utils_uuid_generate_from_string: + * @s: a string to use as the seed for the UUID + * @slen: if negative, treat @s as zero terminated C string. + * Otherwise, assume the length as given (and allow @s to be + * non-null terminated or contain '\0'). + * @uuid_type: a type identifier which UUID format to generate. + * @type_args: additional arguments, depending on the uuid_type + * + * For a given @s, this function will always return the same UUID. + * + * Returns: a newly allocated UUID suitable for use as the #NMSettingConnection + * object's #NMSettingConnection:id: property + **/ +char * +nm_utils_uuid_generate_from_string(const char *s, gssize slen, int uuid_type, gpointer type_args) +{ + NMUuid uuid; + + nm_utils_uuid_generate_from_string_bin(&uuid, s, slen, uuid_type, type_args); + return nm_uuid_unparse(&uuid, g_new(char, 37)); +} + +/** + * _nm_utils_uuid_generate_from_strings: + * @string1: a variadic list of strings. Must be NULL terminated. + * + * Returns a variant3 UUID based on the concatenated C strings. + * It does not simply concatenate them, but also includes the + * terminating '\0' character. For example "a", "b", gives + * "a\0b\0". + * + * This has the advantage, that the following invocations + * all give different UUIDs: (NULL), (""), ("",""), ("","a"), ("a",""), + * ("aa"), ("aa", ""), ("", "aa"), ... + */ +char * +_nm_utils_uuid_generate_from_strings(const char *string1, ...) +{ + if (!string1) + return nm_utils_uuid_generate_from_string(NULL, + 0, + NM_UTILS_UUID_TYPE_VERSION3, + NM_UTILS_UUID_NS); + + { + nm_auto_str_buf NMStrBuf str = NM_STR_BUF_INIT(NM_UTILS_GET_NEXT_REALLOC_SIZE_104, FALSE); + va_list args; + const char * s; + + nm_str_buf_append_len(&str, string1, strlen(string1) + 1u); + + va_start(args, string1); + s = va_arg(args, const char *); + while (s) { + nm_str_buf_append_len(&str, s, strlen(s) + 1u); + s = va_arg(args, const char *); + } + va_end(args); + + return nm_utils_uuid_generate_from_string(nm_str_buf_get_str_unsafe(&str), + str.len, + NM_UTILS_UUID_TYPE_VERSION3, + NM_UTILS_UUID_NS); + } +} diff --git a/src/libnm-glib-aux/nm-uuid.h b/src/libnm-glib-aux/nm-uuid.h index a4be9536c3..2535d0d228 100644 --- a/src/libnm-glib-aux/nm-uuid.h +++ b/src/libnm-glib-aux/nm-uuid.h @@ -47,4 +47,24 @@ char *nm_uuid_generate_random_str(char buf[static 37]); /*****************************************************************************/ +#define NM_UTILS_UUID_TYPE_LEGACY 0 +#define NM_UTILS_UUID_TYPE_VERSION3 3 +#define NM_UTILS_UUID_TYPE_VERSION5 5 + +NMUuid *nm_utils_uuid_generate_from_string_bin(NMUuid * uuid, + const char *s, + gssize slen, + int uuid_type, + gpointer type_args); + +char * +nm_utils_uuid_generate_from_string(const char *s, gssize slen, int uuid_type, gpointer type_args); + +/* arbitrarily chosen namespace UUID for _nm_utils_uuid_generate_from_strings() */ +#define NM_UTILS_UUID_NS "b425e9fb-7598-44b4-9e3b-5a2e3aaa4905" + +char *_nm_utils_uuid_generate_from_strings(const char *string1, ...) G_GNUC_NULL_TERMINATED; + +/*****************************************************************************/ + #endif /* __NM_UUID_H__ */ From 995c78245ed7be0542d13f1c0688ba319e6b2012 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 2 May 2021 21:32:31 +0200 Subject: [PATCH 16/22] glib-aux/trivial: rename NMUuid API --- src/core/devices/nm-device-ethernet.c | 10 +- src/core/nm-core-utils.c | 10 +- .../plugins/ifcfg-rh/nms-ifcfg-rh-reader.c | 8 +- .../plugins/ifupdown/nms-ifupdown-parser.c | 2 +- .../keyfile/tests/test-keyfile-settings.c | 2 +- src/libnm-core-impl/nm-keyfile.c | 2 +- src/libnm-core-impl/nm-setting-connection.c | 2 +- src/libnm-core-impl/tests/test-general.c | 112 ++++++------------ src/libnm-glib-aux/nm-uuid.c | 43 ++++--- src/libnm-glib-aux/nm-uuid.h | 24 ++-- src/nm-initrd-generator/nmi-ibft-reader.c | 14 +-- 11 files changed, 94 insertions(+), 135 deletions(-) diff --git a/src/core/devices/nm-device-ethernet.c b/src/core/devices/nm-device-ethernet.c index 638c9b6937..64b526add6 100644 --- a/src/core/devices/nm-device-ethernet.c +++ b/src/core/devices/nm-device-ethernet.c @@ -1718,11 +1718,11 @@ new_default_connection(NMDevice *self) /* Create a stable UUID. The UUID is also the Network_ID for stable-privacy addr-gen-mode, * thus when it changes we will also generate different IPv6 addresses. */ - uuid = _nm_utils_uuid_generate_from_strings("default-wired", - nm_utils_machine_id_str(), - defname, - perm_hw_addr ?: iface, - NULL); + uuid = nm_uuid_generate_from_strings("default-wired", + nm_utils_machine_id_str(), + defname, + perm_hw_addr ?: iface, + NULL); g_object_set(setting, NM_SETTING_CONNECTION_ID, diff --git a/src/core/nm-core-utils.c b/src/core/nm-core-utils.c index 19ff105911..53cd3d9501 100644 --- a/src/core/nm-core-utils.c +++ b/src/core/nm-core-utils.c @@ -2500,11 +2500,11 @@ again: /* the fake machine-id is based on secret-key/boot-id, but we hash it * again, so that they are not literally the same. */ - nm_utils_uuid_generate_from_string_bin(&uuid, - (const char *) seed_bin, - seed_len, - NM_UTILS_UUID_TYPE_VERSION5, - (gpointer) hash_seed); + nm_uuid_generate_from_string(&uuid, + (const char *) seed_bin, + seed_len, + NM_UUID_TYPE_VERSION5, + (gpointer) hash_seed); } if (!g_once_init_enter(&lock)) diff --git a/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c b/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c index 161bc0a68e..3447ee910b 100644 --- a/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c +++ b/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c @@ -405,11 +405,9 @@ make_connection_setting(const char *file, /* Try for a UUID key before falling back to hashing the file name */ uuid = svGetValueStr(ifcfg, "UUID", &uuid_free); if (!uuid) { - uuid_free = nm_utils_uuid_generate_from_string(svFileGetName(ifcfg), - -1, - NM_UTILS_UUID_TYPE_LEGACY, - NULL); - uuid = uuid_free; + uuid_free = + nm_uuid_generate_from_string_str(svFileGetName(ifcfg), -1, NM_UUID_TYPE_LEGACY, NULL); + uuid = uuid_free; } g_object_set(s_con, diff --git a/src/core/settings/plugins/ifupdown/nms-ifupdown-parser.c b/src/core/settings/plugins/ifupdown/nms-ifupdown-parser.c index 9fdedaa1cd..099ad3a77e 100644 --- a/src/core/settings/plugins/ifupdown/nms-ifupdown-parser.c +++ b/src/core/settings/plugins/ifupdown/nms-ifupdown-parser.c @@ -635,7 +635,7 @@ ifupdown_new_connection_from_if_block(if_block *block, gboolean autoconnect, GEr type = _ifupdownplugin_guess_connection_type(block); idstr = g_strconcat("Ifupdown (", block->name, ")", NULL); - uuid = nm_utils_uuid_generate_from_string(idstr, -1, NM_UTILS_UUID_TYPE_LEGACY, NULL); + uuid = nm_uuid_generate_from_string_str(idstr, -1, NM_UUID_TYPE_LEGACY, NULL); g_object_set(s_con, NM_SETTING_CONNECTION_TYPE, type, diff --git a/src/core/settings/plugins/keyfile/tests/test-keyfile-settings.c b/src/core/settings/plugins/keyfile/tests/test-keyfile-settings.c index 5c5786b947..f6480e67d8 100644 --- a/src/core/settings/plugins/keyfile/tests/test-keyfile-settings.c +++ b/src/core/settings/plugins/keyfile/tests/test-keyfile-settings.c @@ -2289,7 +2289,7 @@ test_read_missing_id_uuid(void) gs_free char * expected_uuid = NULL; const char * FILENAME = TEST_KEYFILES_DIR "/Test_Missing_ID_UUID"; - expected_uuid = _nm_utils_uuid_generate_from_strings("keyfile", FILENAME, NULL); + expected_uuid = nm_uuid_generate_from_strings("keyfile", FILENAME, NULL); connection = keyfile_read_connection_from_file(FILENAME); diff --git a/src/libnm-core-impl/nm-keyfile.c b/src/libnm-core-impl/nm-keyfile.c index bd89345506..6c1d6bf83c 100644 --- a/src/libnm-core-impl/nm-keyfile.c +++ b/src/libnm-core-impl/nm-keyfile.c @@ -3695,7 +3695,7 @@ nm_keyfile_read_ensure_uuid(NMConnection *connection, const char *fallback_uuid_ if (nm_setting_connection_get_uuid(s_con)) return FALSE; - hashed_uuid = _nm_utils_uuid_generate_from_strings("keyfile", fallback_uuid_seed, NULL); + hashed_uuid = nm_uuid_generate_from_strings("keyfile", fallback_uuid_seed, NULL); g_object_set(s_con, NM_SETTING_CONNECTION_UUID, hashed_uuid, NULL); return TRUE; } diff --git a/src/libnm-core-impl/nm-setting-connection.c b/src/libnm-core-impl/nm-setting-connection.c index 241a871e05..8b6bd4e089 100644 --- a/src/libnm-core-impl/nm-setting-connection.c +++ b/src/libnm-core-impl/nm-setting-connection.c @@ -1854,7 +1854,7 @@ nm_setting_connection_class_init(NMSettingConnectionClass *klass) * The UUID must be in the format "2815492f-7e56-435e-b2e9-246bd7cdc664" * (ie, contains only hexadecimal characters and "-"). A suitable UUID may * be generated by nm_utils_uuid_generate() or - * nm_utils_uuid_generate_from_string(). + * nm_uuid_generate_from_string_str(). **/ /* ---ifcfg-rh--- * property: uuid diff --git a/src/libnm-core-impl/tests/test-general.c b/src/libnm-core-impl/tests/test-general.c index 537b1e7784..fd95f3d85c 100644 --- a/src/libnm-core-impl/tests/test-general.c +++ b/src/libnm-core-impl/tests/test-general.c @@ -7232,7 +7232,7 @@ _test_uuid(int uuid_type, { gs_free char *uuid_test = NULL; - uuid_test = nm_utils_uuid_generate_from_string(str, slen, uuid_type, type_args); + uuid_test = nm_uuid_generate_from_string_str(str, slen, uuid_type, type_args); g_assert(uuid_test); g_assert(nm_utils_is_uuid(uuid_test)); @@ -7242,7 +7242,7 @@ _test_uuid(int uuid_type, uuid_type, str, (long long) slen, - NM_IN_SET(uuid_type, NM_UTILS_UUID_TYPE_VERSION3, NM_UTILS_UUID_TYPE_VERSION5) + NM_IN_SET(uuid_type, NM_UUID_TYPE_VERSION3, NM_UUID_TYPE_VERSION5) ? (((const char *) type_args) ?: "(all-zero)") : (type_args ? "(unknown)" : "(null)"), uuid_test, @@ -7257,8 +7257,7 @@ _test_uuid(int uuid_type, _test_uuid(uuid_type, expected_uuid, NULL, 0, type_args); } - if (NM_IN_SET(uuid_type, NM_UTILS_UUID_TYPE_VERSION3, NM_UTILS_UUID_TYPE_VERSION5) - && !type_args) { + if (NM_IN_SET(uuid_type, NM_UUID_TYPE_VERSION3, NM_UUID_TYPE_VERSION5) && !type_args) { /* For version3 and version5, a missing @type_args is equal to UUID_NS_ZERO */ _test_uuid(uuid_type, expected_uuid, str, slen, UUID_NS_ZERO); } @@ -7679,76 +7678,44 @@ test_nm_utils_uuid_generate_from_string(void) char i_str[30]; guint i; - _test_uuid(NM_UTILS_UUID_TYPE_LEGACY, "d41d8cd9-8f00-b204-e980-0998ecf8427e", "", -1, NULL); - _test_uuid(NM_UTILS_UUID_TYPE_LEGACY, "0cc175b9-c0f1-b6a8-31c3-99e269772661", "a", -1, NULL); - _test_uuid(NM_UTILS_UUID_TYPE_LEGACY, "098f6bcd-4621-d373-cade-4e832627b4f6", "test", -1, NULL); - _test_uuid(NM_UTILS_UUID_TYPE_LEGACY, "70350f60-27bc-e371-3f6b-76473084309b", "a\0b", 3, NULL); - _test_uuid(NM_UTILS_UUID_TYPE_LEGACY, + _test_uuid(NM_UUID_TYPE_LEGACY, "d41d8cd9-8f00-b204-e980-0998ecf8427e", "", -1, NULL); + _test_uuid(NM_UUID_TYPE_LEGACY, "0cc175b9-c0f1-b6a8-31c3-99e269772661", "a", -1, NULL); + _test_uuid(NM_UUID_TYPE_LEGACY, "098f6bcd-4621-d373-cade-4e832627b4f6", "test", -1, NULL); + _test_uuid(NM_UUID_TYPE_LEGACY, "70350f60-27bc-e371-3f6b-76473084309b", "a\0b", 3, NULL); + _test_uuid(NM_UUID_TYPE_LEGACY, "59c0547b-7fe2-1c15-2cce-e328e8bf6742", "/etc/NetworkManager/system-connections/em1", -1, NULL); - _test_uuid(NM_UTILS_UUID_TYPE_VERSION3, "4ae71336-e44b-39bf-b9d2-752e234818a5", "", -1, NULL); - _test_uuid(NM_UTILS_UUID_TYPE_VERSION3, "0531103a-d8fc-3dd4-b972-d98e4750994e", "a", -1, NULL); - _test_uuid(NM_UTILS_UUID_TYPE_VERSION3, - "96e17d7a-ac89-38cf-95e1-bf5098da34e1", - "test", - -1, - NULL); - _test_uuid(NM_UTILS_UUID_TYPE_VERSION3, - "8156568e-4ae6-3f34-a93e-18e2c6cbbf78", - "a\0b", - 3, - NULL); + _test_uuid(NM_UUID_TYPE_VERSION3, "4ae71336-e44b-39bf-b9d2-752e234818a5", "", -1, NULL); + _test_uuid(NM_UUID_TYPE_VERSION3, "0531103a-d8fc-3dd4-b972-d98e4750994e", "a", -1, NULL); + _test_uuid(NM_UUID_TYPE_VERSION3, "96e17d7a-ac89-38cf-95e1-bf5098da34e1", "test", -1, NULL); + _test_uuid(NM_UUID_TYPE_VERSION3, "8156568e-4ae6-3f34-a93e-18e2c6cbbf78", "a\0b", 3, NULL); - _test_uuid(NM_UTILS_UUID_TYPE_VERSION3, - "c87ee674-4ddc-3efe-a74e-dfe25da5d7b3", - "", - -1, - UUID_NS_DNS); - _test_uuid(NM_UTILS_UUID_TYPE_VERSION3, - "4c104dd0-4821-30d5-9ce3-0e7a1f8b7c0d", - "a", - -1, - UUID_NS_DNS); - _test_uuid(NM_UTILS_UUID_TYPE_VERSION3, + _test_uuid(NM_UUID_TYPE_VERSION3, "c87ee674-4ddc-3efe-a74e-dfe25da5d7b3", "", -1, UUID_NS_DNS); + _test_uuid(NM_UUID_TYPE_VERSION3, "4c104dd0-4821-30d5-9ce3-0e7a1f8b7c0d", "a", -1, UUID_NS_DNS); + _test_uuid(NM_UUID_TYPE_VERSION3, "45a113ac-c7f2-30b0-90a5-a399ab912716", "test", -1, UUID_NS_DNS); - _test_uuid(NM_UTILS_UUID_TYPE_VERSION3, + _test_uuid(NM_UUID_TYPE_VERSION3, "002a0ada-f547-375a-bab5-896a11d1927e", "a\0b", 3, UUID_NS_DNS); - _test_uuid(NM_UTILS_UUID_TYPE_VERSION3, + _test_uuid(NM_UUID_TYPE_VERSION3, "9a75f5f2-195e-31a9-9d07-8c18b5d3b285", "test123", -1, UUID_NS_DNS); - _test_uuid(NM_UTILS_UUID_TYPE_VERSION3, - "ec794efe-a384-3b11-a0b6-ec8995bc6acc", - "x", - -1, - UUID_NS_DNS); + _test_uuid(NM_UUID_TYPE_VERSION3, "ec794efe-a384-3b11-a0b6-ec8995bc6acc", "x", -1, UUID_NS_DNS); - _test_uuid(NM_UTILS_UUID_TYPE_VERSION5, - "a7650b9f-f19f-5300-8a13-91160ea8de2c", - "a\0b", - 3, - NULL); - _test_uuid(NM_UTILS_UUID_TYPE_VERSION5, - "4f3f2898-69e3-5a0d-820a-c4e87987dbce", - "a", - -1, - UUID_NS_DNS); - _test_uuid(NM_UTILS_UUID_TYPE_VERSION5, - "05b16a01-46c6-56dd-bd6e-c6dfb4a1427a", - "x", - -1, - UUID_NS_DNS); - _test_uuid(NM_UTILS_UUID_TYPE_VERSION5, + _test_uuid(NM_UUID_TYPE_VERSION5, "a7650b9f-f19f-5300-8a13-91160ea8de2c", "a\0b", 3, NULL); + _test_uuid(NM_UUID_TYPE_VERSION5, "4f3f2898-69e3-5a0d-820a-c4e87987dbce", "a", -1, UUID_NS_DNS); + _test_uuid(NM_UUID_TYPE_VERSION5, "05b16a01-46c6-56dd-bd6e-c6dfb4a1427a", "x", -1, UUID_NS_DNS); + _test_uuid(NM_UUID_TYPE_VERSION5, "c9ed566a-6b79-5d3a-b2b7-96a936b48cf3", "test123", -1, @@ -7756,58 +7723,58 @@ test_nm_utils_uuid_generate_from_string(void) for (i = 0; i < G_N_ELEMENTS(zero_uuids); i++) { nm_sprintf_buf(i_str, "%u", i), - _test_uuid(NM_UTILS_UUID_TYPE_VERSION3, zero_uuids[i].uuid3, i_str, -1, NULL); - _test_uuid(NM_UTILS_UUID_TYPE_VERSION5, zero_uuids[i].uuid5, i_str, -1, NULL); + _test_uuid(NM_UUID_TYPE_VERSION3, zero_uuids[i].uuid3, i_str, -1, NULL); + _test_uuid(NM_UUID_TYPE_VERSION5, zero_uuids[i].uuid5, i_str, -1, NULL); } for (i = 0; i < G_N_ELEMENTS(dns_uuids); i++) { nm_sprintf_buf(i_str, "%u", i), - _test_uuid(NM_UTILS_UUID_TYPE_VERSION3, dns_uuids[i].uuid3, i_str, -1, UUID_NS_DNS); - _test_uuid(NM_UTILS_UUID_TYPE_VERSION5, dns_uuids[i].uuid5, i_str, -1, UUID_NS_DNS); + _test_uuid(NM_UUID_TYPE_VERSION3, dns_uuids[i].uuid3, i_str, -1, UUID_NS_DNS); + _test_uuid(NM_UUID_TYPE_VERSION5, dns_uuids[i].uuid5, i_str, -1, UUID_NS_DNS); } /* examples from cpython unit tests: */ - _test_uuid(NM_UTILS_UUID_TYPE_VERSION3, + _test_uuid(NM_UUID_TYPE_VERSION3, "6fa459ea-ee8a-3ca4-894e-db77e160355e", "python.org", -1, UUID_NS_DNS); - _test_uuid(NM_UTILS_UUID_TYPE_VERSION5, + _test_uuid(NM_UUID_TYPE_VERSION5, "886313e1-3b8a-5372-9b90-0c9aee199e5d", "python.org", -1, UUID_NS_DNS); - _test_uuid(NM_UTILS_UUID_TYPE_VERSION3, + _test_uuid(NM_UUID_TYPE_VERSION3, "9fe8e8c4-aaa8-32a9-a55c-4535a88b748d", "http://python.org/", -1, UUID_NS_URL); - _test_uuid(NM_UTILS_UUID_TYPE_VERSION5, + _test_uuid(NM_UUID_TYPE_VERSION5, "4c565f0d-3f5a-5890-b41b-20cf47701c5e", "http://python.org/", -1, UUID_NS_URL); - _test_uuid(NM_UTILS_UUID_TYPE_VERSION3, + _test_uuid(NM_UUID_TYPE_VERSION3, "dd1a1cef-13d5-368a-ad82-eca71acd4cd1", "1.3.6.1", -1, UUID_NS_OID); - _test_uuid(NM_UTILS_UUID_TYPE_VERSION5, + _test_uuid(NM_UUID_TYPE_VERSION5, "1447fa61-5277-5fef-a9b3-fbc6e44f4af3", "1.3.6.1", -1, UUID_NS_OID); - _test_uuid(NM_UTILS_UUID_TYPE_VERSION3, + _test_uuid(NM_UUID_TYPE_VERSION3, "658d3002-db6b-3040-a1d1-8ddd7d189a4d", "c=ca", -1, UUID_NS_X500); - _test_uuid(NM_UTILS_UUID_TYPE_VERSION5, + _test_uuid(NM_UUID_TYPE_VERSION5, "cc957dd1-a972-5349-98cd-874190002798", "c=ca", -1, UUID_NS_X500); - _test_uuid(NM_UTILS_UUID_TYPE_VERSION5, + _test_uuid(NM_UUID_TYPE_VERSION5, "74738ff5-5367-5958-9aee-98fffdcd1876", "www.example.org", -1, @@ -7831,10 +7798,7 @@ __test_uuid(const char *expected_uuid, const char *str, gssize slen, char *uuid_ } g_free(uuid_test); - uuid_test = nm_utils_uuid_generate_from_string(str, - slen, - NM_UTILS_UUID_TYPE_VERSION3, - NM_UTILS_UUID_NS); + uuid_test = nm_uuid_generate_from_string_str(str, slen, NM_UUID_TYPE_VERSION3, NM_UUID_NS1); g_assert(uuid_test); g_assert(nm_utils_is_uuid(uuid_test)); @@ -7850,7 +7814,7 @@ __test_uuid(const char *expected_uuid, const char *str, gssize slen, char *uuid_ } #define _test_uuid(expected_uuid, str, strlen, ...) \ - __test_uuid(expected_uuid, str, strlen, _nm_utils_uuid_generate_from_strings(__VA_ARGS__, NULL)) + __test_uuid(expected_uuid, str, strlen, nm_uuid_generate_from_strings(__VA_ARGS__, NULL)) static void test_nm_utils_uuid_generate_from_strings(void) @@ -10828,7 +10792,7 @@ main(int argc, char **argv) g_test_add_func("/core/general/nm_strquote", test_nm_strquote); g_test_add_func("/core/general/test_nm_utils_uuid_generate_from_string", test_nm_utils_uuid_generate_from_string); - g_test_add_func("/core/general/_nm_utils_uuid_generate_from_strings", + g_test_add_func("/core/general/nm_uuid_generate_from_strings", test_nm_utils_uuid_generate_from_strings); g_test_add_func("/core/general/_nm_utils_ascii_str_to_int64", test_nm_utils_ascii_str_to_int64); diff --git a/src/libnm-glib-aux/nm-uuid.c b/src/libnm-glib-aux/nm-uuid.c index 564daeb720..3ebfb25138 100644 --- a/src/libnm-glib-aux/nm-uuid.c +++ b/src/libnm-glib-aux/nm-uuid.c @@ -158,7 +158,7 @@ nm_uuid_generate_random_str(char buf[static 37]) /*****************************************************************************/ /** - * nm_utils_uuid_generate_from_string_bin: + * nm_uuid_generate_from_string: * @uuid: the UUID to update inplace. This function cannot * fail to succeed. * @s: a string to use as the seed for the UUID @@ -173,11 +173,11 @@ nm_uuid_generate_random_str(char buf[static 37]) * Returns: the input @uuid. This function cannot fail. **/ NMUuid * -nm_utils_uuid_generate_from_string_bin(NMUuid * uuid, - const char *s, - gssize slen, - int uuid_type, - gpointer type_args) +nm_uuid_generate_from_string(NMUuid * uuid, + const char *s, + gssize slen, + int uuid_type, + gpointer type_args) { g_return_val_if_fail(uuid, FALSE); g_return_val_if_fail(slen == 0 || s, FALSE); @@ -186,12 +186,12 @@ nm_utils_uuid_generate_from_string_bin(NMUuid * uuid, slen = s ? strlen(s) : 0; switch (uuid_type) { - case NM_UTILS_UUID_TYPE_LEGACY: + case NM_UUID_TYPE_LEGACY: g_return_val_if_fail(!type_args, NULL); nm_crypto_md5_hash(NULL, 0, (guint8 *) s, slen, (guint8 *) uuid, sizeof(*uuid)); break; - case NM_UTILS_UUID_TYPE_VERSION3: - case NM_UTILS_UUID_TYPE_VERSION5: + case NM_UUID_TYPE_VERSION3: + case NM_UUID_TYPE_VERSION5: { NMUuid ns_uuid = {}; @@ -201,7 +201,7 @@ nm_utils_uuid_generate_from_string_bin(NMUuid * uuid, g_return_val_if_reached(NULL); } - if (uuid_type == NM_UTILS_UUID_TYPE_VERSION3) { + if (uuid_type == NM_UUID_TYPE_VERSION3) { nm_crypto_md5_hash((guint8 *) s, slen, (guint8 *) &ns_uuid, @@ -236,7 +236,7 @@ nm_utils_uuid_generate_from_string_bin(NMUuid * uuid, } /** - * nm_utils_uuid_generate_from_string: + * nm_uuid_generate_from_string_str: * @s: a string to use as the seed for the UUID * @slen: if negative, treat @s as zero terminated C string. * Otherwise, assume the length as given (and allow @s to be @@ -250,16 +250,16 @@ nm_utils_uuid_generate_from_string_bin(NMUuid * uuid, * object's #NMSettingConnection:id: property **/ char * -nm_utils_uuid_generate_from_string(const char *s, gssize slen, int uuid_type, gpointer type_args) +nm_uuid_generate_from_string_str(const char *s, gssize slen, int uuid_type, gpointer type_args) { NMUuid uuid; - nm_utils_uuid_generate_from_string_bin(&uuid, s, slen, uuid_type, type_args); + nm_uuid_generate_from_string(&uuid, s, slen, uuid_type, type_args); return nm_uuid_unparse(&uuid, g_new(char, 37)); } /** - * _nm_utils_uuid_generate_from_strings: + * nm_uuid_generate_from_strings: * @string1: a variadic list of strings. Must be NULL terminated. * * Returns a variant3 UUID based on the concatenated C strings. @@ -272,13 +272,10 @@ nm_utils_uuid_generate_from_string(const char *s, gssize slen, int uuid_type, gp * ("aa"), ("aa", ""), ("", "aa"), ... */ char * -_nm_utils_uuid_generate_from_strings(const char *string1, ...) +nm_uuid_generate_from_strings(const char *string1, ...) { if (!string1) - return nm_utils_uuid_generate_from_string(NULL, - 0, - NM_UTILS_UUID_TYPE_VERSION3, - NM_UTILS_UUID_NS); + return nm_uuid_generate_from_string_str(NULL, 0, NM_UUID_TYPE_VERSION3, NM_UUID_NS1); { nm_auto_str_buf NMStrBuf str = NM_STR_BUF_INIT(NM_UTILS_GET_NEXT_REALLOC_SIZE_104, FALSE); @@ -295,9 +292,9 @@ _nm_utils_uuid_generate_from_strings(const char *string1, ...) } va_end(args); - return nm_utils_uuid_generate_from_string(nm_str_buf_get_str_unsafe(&str), - str.len, - NM_UTILS_UUID_TYPE_VERSION3, - NM_UTILS_UUID_NS); + return nm_uuid_generate_from_string_str(nm_str_buf_get_str_unsafe(&str), + str.len, + NM_UUID_TYPE_VERSION3, + NM_UUID_NS1); } } diff --git a/src/libnm-glib-aux/nm-uuid.h b/src/libnm-glib-aux/nm-uuid.h index 2535d0d228..59b69a0336 100644 --- a/src/libnm-glib-aux/nm-uuid.h +++ b/src/libnm-glib-aux/nm-uuid.h @@ -47,23 +47,23 @@ char *nm_uuid_generate_random_str(char buf[static 37]); /*****************************************************************************/ -#define NM_UTILS_UUID_TYPE_LEGACY 0 -#define NM_UTILS_UUID_TYPE_VERSION3 3 -#define NM_UTILS_UUID_TYPE_VERSION5 5 +#define NM_UUID_TYPE_LEGACY 0 +#define NM_UUID_TYPE_VERSION3 3 +#define NM_UUID_TYPE_VERSION5 5 -NMUuid *nm_utils_uuid_generate_from_string_bin(NMUuid * uuid, - const char *s, - gssize slen, - int uuid_type, - gpointer type_args); +NMUuid *nm_uuid_generate_from_string(NMUuid * uuid, + const char *s, + gssize slen, + int uuid_type, + gpointer type_args); char * -nm_utils_uuid_generate_from_string(const char *s, gssize slen, int uuid_type, gpointer type_args); +nm_uuid_generate_from_string_str(const char *s, gssize slen, int uuid_type, gpointer type_args); -/* arbitrarily chosen namespace UUID for _nm_utils_uuid_generate_from_strings() */ -#define NM_UTILS_UUID_NS "b425e9fb-7598-44b4-9e3b-5a2e3aaa4905" +/* arbitrarily chosen namespace UUID for nm_uuid_generate_from_strings() */ +#define NM_UUID_NS1 "b425e9fb-7598-44b4-9e3b-5a2e3aaa4905" -char *_nm_utils_uuid_generate_from_strings(const char *string1, ...) G_GNUC_NULL_TERMINATED; +char *nm_uuid_generate_from_strings(const char *string1, ...) G_GNUC_NULL_TERMINATED; /*****************************************************************************/ diff --git a/src/nm-initrd-generator/nmi-ibft-reader.c b/src/nm-initrd-generator/nmi-ibft-reader.c index 8f4b5a7a45..cb7c57eca4 100644 --- a/src/nm-initrd-generator/nmi-ibft-reader.c +++ b/src/nm-initrd-generator/nmi-ibft-reader.c @@ -304,13 +304,13 @@ connection_setting_add(GHashTable * nic, s_index ? " " : "", s_index ? s_index : ""); - uuid = _nm_utils_uuid_generate_from_strings("ibft", - s_hwaddr, - s_vlanid ? "V" : "v", - s_vlanid ? s_vlanid : "", - s_ipaddr ? "A" : "DHCP", - s_ipaddr ? s_ipaddr : "", - NULL); + uuid = nm_uuid_generate_from_strings("ibft", + s_hwaddr, + s_vlanid ? "V" : "v", + s_vlanid ? s_vlanid : "", + s_ipaddr ? "A" : "DHCP", + s_ipaddr ? s_ipaddr : "", + NULL); s_con = (NMSetting *) nm_connection_get_setting_connection(connection); if (!s_con) { From 414ce2236e98e7e37d128ee8d4025b8740231db5 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 2 May 2021 21:41:43 +0200 Subject: [PATCH 17/22] glib-aux: add NMUuidType enum for nm_uuid_generate_from_string() Let's have an enum instead of plain "int" and #define. --- src/libnm-glib-aux/nm-uuid.c | 7 +++++-- src/libnm-glib-aux/nm-uuid.h | 16 ++++++++++------ 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/libnm-glib-aux/nm-uuid.c b/src/libnm-glib-aux/nm-uuid.c index 3ebfb25138..7497b7c489 100644 --- a/src/libnm-glib-aux/nm-uuid.c +++ b/src/libnm-glib-aux/nm-uuid.c @@ -176,7 +176,7 @@ NMUuid * nm_uuid_generate_from_string(NMUuid * uuid, const char *s, gssize slen, - int uuid_type, + NMUuidType uuid_type, gpointer type_args) { g_return_val_if_fail(uuid, FALSE); @@ -250,7 +250,10 @@ nm_uuid_generate_from_string(NMUuid * uuid, * object's #NMSettingConnection:id: property **/ char * -nm_uuid_generate_from_string_str(const char *s, gssize slen, int uuid_type, gpointer type_args) +nm_uuid_generate_from_string_str(const char *s, + gssize slen, + NMUuidType uuid_type, + gpointer type_args) { NMUuid uuid; diff --git a/src/libnm-glib-aux/nm-uuid.h b/src/libnm-glib-aux/nm-uuid.h index 59b69a0336..c4a6bdb57c 100644 --- a/src/libnm-glib-aux/nm-uuid.h +++ b/src/libnm-glib-aux/nm-uuid.h @@ -47,18 +47,22 @@ char *nm_uuid_generate_random_str(char buf[static 37]); /*****************************************************************************/ -#define NM_UUID_TYPE_LEGACY 0 -#define NM_UUID_TYPE_VERSION3 3 -#define NM_UUID_TYPE_VERSION5 5 +typedef enum { + NM_UUID_TYPE_LEGACY = 0, + NM_UUID_TYPE_VERSION3 = 3, + NM_UUID_TYPE_VERSION5 = 5, +} NMUuidType; NMUuid *nm_uuid_generate_from_string(NMUuid * uuid, const char *s, gssize slen, - int uuid_type, + NMUuidType uuid_type, gpointer type_args); -char * -nm_uuid_generate_from_string_str(const char *s, gssize slen, int uuid_type, gpointer type_args); +char *nm_uuid_generate_from_string_str(const char *s, + gssize slen, + NMUuidType uuid_type, + gpointer type_args); /* arbitrarily chosen namespace UUID for nm_uuid_generate_from_strings() */ #define NM_UUID_NS1 "b425e9fb-7598-44b4-9e3b-5a2e3aaa4905" From 2fcabf5699cb612a04167e4eba1a89be73a4956b Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 2 May 2021 21:47:22 +0200 Subject: [PATCH 18/22] all: only include "libnm-glib-aux/nm-uuid.h" where needed Don't let "nm-core-internal.h" (which is a very popular header itself) drag in "nm-uuid.h". --- src/core/NetworkManagerUtils.c | 1 + src/core/devices/bluetooth/nm-bluez-manager.c | 1 + src/core/devices/nm-device-ethernet.c | 1 + src/core/devices/nm-device.c | 1 + src/core/devices/wifi/nm-iwd-manager.c | 1 + src/core/nm-core-utils.c | 1 + src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c | 1 + src/core/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c | 1 + src/core/settings/plugins/ifupdown/nms-ifupdown-parser.c | 1 + src/core/settings/plugins/keyfile/tests/test-keyfile-settings.c | 1 + src/core/systemd/nm-sd-utils-core.c | 2 +- src/core/tests/test-core.c | 1 + src/libnm-core-impl/nm-connection.c | 1 + src/libnm-core-impl/nm-keyfile.c | 1 + src/libnm-core-impl/nm-utils.c | 1 + src/libnm-core-impl/tests/test-general.c | 1 + src/libnm-core-impl/tests/test-setting.c | 1 + src/libnm-core-intern/nm-core-internal.h | 1 - src/nm-initrd-generator/nmi-cmdline-reader.c | 1 + src/nm-initrd-generator/nmi-ibft-reader.c | 1 + 20 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/core/NetworkManagerUtils.c b/src/core/NetworkManagerUtils.c index 700acf37d9..6a58289c67 100644 --- a/src/core/NetworkManagerUtils.c +++ b/src/core/NetworkManagerUtils.c @@ -14,6 +14,7 @@ #include "libnm-glib-aux/nm-c-list.h" +#include "libnm-glib-aux/nm-uuid.h" #include "libnm-base/nm-net-aux.h" #include "libnm-core-aux-intern/nm-common-macros.h" #include "nm-utils.h" diff --git a/src/core/devices/bluetooth/nm-bluez-manager.c b/src/core/devices/bluetooth/nm-bluez-manager.c index 123591e1a1..953c1fd070 100644 --- a/src/core/devices/bluetooth/nm-bluez-manager.c +++ b/src/core/devices/bluetooth/nm-bluez-manager.c @@ -12,6 +12,7 @@ #include #include +#include "libnm-glib-aux/nm-uuid.h" #include "libnm-glib-aux/nm-dbus-aux.h" #include "libnm-glib-aux/nm-c-list.h" #include "nm-dbus-manager.h" diff --git a/src/core/devices/nm-device-ethernet.c b/src/core/devices/nm-device-ethernet.c index 64b526add6..abe875334d 100644 --- a/src/core/devices/nm-device-ethernet.c +++ b/src/core/devices/nm-device-ethernet.c @@ -14,6 +14,7 @@ #include #include +#include "libnm-glib-aux/nm-uuid.h" #include "nm-device-private.h" #include "nm-act-request.h" #include "nm-ip4-config.h" diff --git a/src/core/devices/nm-device.c b/src/core/devices/nm-device.c index b8819a4bbd..0aa0d3c7dc 100644 --- a/src/core/devices/nm-device.c +++ b/src/core/devices/nm-device.c @@ -24,6 +24,7 @@ #include #include "libnm-std-aux/unaligned.h" +#include "libnm-glib-aux/nm-uuid.h" #include "libnm-glib-aux/nm-dedup-multi.h" #include "libnm-glib-aux/nm-random-utils.h" #include "libnm-systemd-shared/nm-sd-utils-shared.h" diff --git a/src/core/devices/wifi/nm-iwd-manager.c b/src/core/devices/wifi/nm-iwd-manager.c index 9ede0311c0..b65022c346 100644 --- a/src/core/devices/wifi/nm-iwd-manager.c +++ b/src/core/devices/wifi/nm-iwd-manager.c @@ -16,6 +16,7 @@ #include "nm-manager.h" #include "nm-device-iwd.h" #include "nm-wifi-utils.h" +#include "libnm-glib-aux/nm-uuid.h" #include "libnm-glib-aux/nm-random-utils.h" #include "libnm-glib-aux/nm-io-utils.h" #include "settings/nm-settings.h" diff --git a/src/core/nm-core-utils.c b/src/core/nm-core-utils.c index 53cd3d9501..15cf4d8183 100644 --- a/src/core/nm-core-utils.c +++ b/src/core/nm-core-utils.c @@ -22,6 +22,7 @@ #include #include +#include "libnm-glib-aux/nm-uuid.h" #include "libnm-platform/nmp-base.h" #include "libnm-std-aux/unaligned.h" #include "libnm-glib-aux/nm-random-utils.h" diff --git a/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c b/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c index 3447ee910b..19e672e0bd 100644 --- a/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c +++ b/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c @@ -18,6 +18,7 @@ #include #include +#include "libnm-glib-aux/nm-uuid.h" #include "libnm-glib-aux/nm-secret-utils.h" #include "nm-connection.h" #include "nm-dbus-interface.h" diff --git a/src/core/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c b/src/core/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c index e0a265bed9..073e4c3356 100644 --- a/src/core/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c +++ b/src/core/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c @@ -17,6 +17,7 @@ #include #include +#include "libnm-glib-aux/nm-uuid.h" #include "libnm-glib-aux/nm-json-aux.h" #include "nm-utils.h" #include "nm-setting-connection.h" diff --git a/src/core/settings/plugins/ifupdown/nms-ifupdown-parser.c b/src/core/settings/plugins/ifupdown/nms-ifupdown-parser.c index 099ad3a77e..db6b1aefb7 100644 --- a/src/core/settings/plugins/ifupdown/nms-ifupdown-parser.c +++ b/src/core/settings/plugins/ifupdown/nms-ifupdown-parser.c @@ -12,6 +12,7 @@ #include #include +#include "libnm-glib-aux/nm-uuid.h" #include "libnm-core-intern/nm-core-internal.h" #include "settings/nm-settings-plugin.h" diff --git a/src/core/settings/plugins/keyfile/tests/test-keyfile-settings.c b/src/core/settings/plugins/keyfile/tests/test-keyfile-settings.c index f6480e67d8..a13c25864f 100644 --- a/src/core/settings/plugins/keyfile/tests/test-keyfile-settings.c +++ b/src/core/settings/plugins/keyfile/tests/test-keyfile-settings.c @@ -15,6 +15,7 @@ #include #include +#include "libnm-glib-aux/nm-uuid.h" #include "libnm-core-intern/nm-core-internal.h" #include "settings/plugins/keyfile/nms-keyfile-reader.h" diff --git a/src/core/systemd/nm-sd-utils-core.c b/src/core/systemd/nm-sd-utils-core.c index b81e36f377..451e8b600b 100644 --- a/src/core/systemd/nm-sd-utils-core.c +++ b/src/core/systemd/nm-sd-utils-core.c @@ -7,7 +7,7 @@ #include "nm-sd-utils-core.h" -#include "libnm-core-intern/nm-core-internal.h" +#include "libnm-glib-aux/nm-uuid.h" #include "nm-sd-adapt-core.h" diff --git a/src/core/tests/test-core.c b/src/core/tests/test-core.c index f212886331..d7f733066a 100644 --- a/src/core/tests/test-core.c +++ b/src/core/tests/test-core.c @@ -11,6 +11,7 @@ /* need math.h for isinf() and INFINITY. No need to link with -lm */ #include +#include "libnm-glib-aux/nm-uuid.h" #include "NetworkManagerUtils.h" #include "libnm-core-intern/nm-core-internal.h" #include "nm-core-utils.h" diff --git a/src/libnm-core-impl/nm-connection.c b/src/libnm-core-impl/nm-connection.c index 960a34fcc0..8abfa65e51 100644 --- a/src/libnm-core-impl/nm-connection.c +++ b/src/libnm-core-impl/nm-connection.c @@ -10,6 +10,7 @@ #include +#include "libnm-glib-aux/nm-uuid.h" #include "nm-connection-private.h" #include "nm-utils.h" #include "nm-setting-private.h" diff --git a/src/libnm-core-impl/nm-keyfile.c b/src/libnm-core-impl/nm-keyfile.c index 6c1d6bf83c..3bd87c5fb4 100644 --- a/src/libnm-core-impl/nm-keyfile.c +++ b/src/libnm-core-impl/nm-keyfile.c @@ -18,6 +18,7 @@ #include #include +#include "libnm-glib-aux/nm-uuid.h" #include "libnm-glib-aux/nm-str-buf.h" #include "libnm-glib-aux/nm-secret-utils.h" #include "libnm-systemd-shared/nm-sd-utils-shared.h" diff --git a/src/libnm-core-impl/nm-utils.c b/src/libnm-core-impl/nm-utils.c index 4c4d98d25b..39248378ff 100644 --- a/src/libnm-core-impl/nm-utils.c +++ b/src/libnm-core-impl/nm-utils.c @@ -17,6 +17,7 @@ #include #include +#include "libnm-glib-aux/nm-uuid.h" #include "libnm-glib-aux/nm-json-aux.h" #include "libnm-glib-aux/nm-str-buf.h" #include "libnm-glib-aux/nm-enum-utils.h" diff --git a/src/libnm-core-impl/tests/test-general.c b/src/libnm-core-impl/tests/test-general.c index fd95f3d85c..67b6ab482f 100644 --- a/src/libnm-core-impl/tests/test-general.c +++ b/src/libnm-core-impl/tests/test-general.c @@ -14,6 +14,7 @@ #include #include "libnm-std-aux/c-list-util.h" +#include "libnm-glib-aux/nm-uuid.h" #include "libnm-glib-aux/nm-enum-utils.h" #include "libnm-glib-aux/nm-str-buf.h" #include "libnm-glib-aux/nm-json-aux.h" diff --git a/src/libnm-core-impl/tests/test-setting.c b/src/libnm-core-impl/tests/test-setting.c index b64bf79612..c175a816c8 100644 --- a/src/libnm-core-impl/tests/test-setting.c +++ b/src/libnm-core-impl/tests/test-setting.c @@ -8,6 +8,7 @@ #include #include +#include "libnm-glib-aux/nm-uuid.h" #include "libnm-glib-aux/nm-json-aux.h" #include "libnm-base/nm-ethtool-utils-base.h" #include "libnm-core-intern/nm-core-internal.h" diff --git a/src/libnm-core-intern/nm-core-internal.h b/src/libnm-core-intern/nm-core-internal.h index 03c2cbb5b4..c186fe1229 100644 --- a/src/libnm-core-intern/nm-core-internal.h +++ b/src/libnm-core-intern/nm-core-internal.h @@ -21,7 +21,6 @@ #endif #include "libnm-base/nm-base.h" -#include "libnm-glib-aux/nm-uuid.h" #include "nm-connection.h" #include "nm-core-enum-types.h" #include "nm-meta-setting-base.h" diff --git a/src/nm-initrd-generator/nmi-cmdline-reader.c b/src/nm-initrd-generator/nmi-cmdline-reader.c index eaaed73143..799fd5dcc0 100644 --- a/src/nm-initrd-generator/nmi-cmdline-reader.c +++ b/src/nm-initrd-generator/nmi-cmdline-reader.c @@ -8,6 +8,7 @@ #include #include +#include "libnm-glib-aux/nm-uuid.h" #include "libnm-log-core/nm-logging.h" #include "libnm-core-intern/nm-core-internal.h" #include "nm-initrd-generator.h" diff --git a/src/nm-initrd-generator/nmi-ibft-reader.c b/src/nm-initrd-generator/nmi-ibft-reader.c index cb7c57eca4..b3db3f0180 100644 --- a/src/nm-initrd-generator/nmi-ibft-reader.c +++ b/src/nm-initrd-generator/nmi-ibft-reader.c @@ -17,6 +17,7 @@ #include #include +#include "libnm-glib-aux/nm-uuid.h" #include "libnm-log-core/nm-logging.h" #include "libnm-core-intern/nm-core-internal.h" #include "libnm-platform/nm-platform-utils.h" From b12f116a02c658c911d0483423000df942077632 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 2 May 2021 22:29:56 +0200 Subject: [PATCH 19/22] glib-aux: add nm_uuid_is_valid_nmlegacy() helper --- src/libnm-glib-aux/nm-uuid.c | 41 ++++++++++++++++++++++++++++++++++++ src/libnm-glib-aux/nm-uuid.h | 4 ++++ 2 files changed, 45 insertions(+) diff --git a/src/libnm-glib-aux/nm-uuid.c b/src/libnm-glib-aux/nm-uuid.c index 7497b7c489..18badc46d8 100644 --- a/src/libnm-glib-aux/nm-uuid.c +++ b/src/libnm-glib-aux/nm-uuid.c @@ -129,6 +129,47 @@ nm_uuid_generate_random(NMUuid *out_uuid) /*****************************************************************************/ +/** + * nm_uuid_is_valid_nmlegacy() + * @str: the string to check whether it's a valid UUID. + * + * Note that this does not perform a strict check. + * Instead, it checks a more relaxed format (including + * non valid UUID strings). This is for backward compatibility, + * where older code did not perform a strict check. + * + * Returns: %TRUE, if the string is a valid legacy format. + * This may not be a valid UUID! + */ +gboolean +nm_uuid_is_valid_nmlegacy(const char *str) +{ + const char *p = str; + int num_dashes = 0; + + if (!p) + return FALSE; + + while (*p) { + if (*p == '-') + num_dashes++; + else if (!g_ascii_isxdigit(*p)) + return FALSE; + p++; + } + + 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; +} + +/*****************************************************************************/ + gboolean nm_uuid_is_null(const NMUuid *uuid) { diff --git a/src/libnm-glib-aux/nm-uuid.h b/src/libnm-glib-aux/nm-uuid.h index c4a6bdb57c..0cb7ec2311 100644 --- a/src/libnm-glib-aux/nm-uuid.h +++ b/src/libnm-glib-aux/nm-uuid.h @@ -33,6 +33,10 @@ gboolean nm_uuid_is_null(const NMUuid *uuid); /*****************************************************************************/ +gboolean nm_uuid_is_valid_nmlegacy(const char *str); + +/*****************************************************************************/ + char *nm_uuid_generate_random_str(char buf[static 37]); #define nm_uuid_generate_random_str_arr(buf) \ From ce65fc52a8089ab14f8fcd1ed817ddfeac595fc7 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 4 May 2021 14:56:02 +0200 Subject: [PATCH 20/22] glib-aux: add nm_uuid_is_valid() helper --- src/libnm-glib-aux/nm-uuid.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/libnm-glib-aux/nm-uuid.h b/src/libnm-glib-aux/nm-uuid.h index 0cb7ec2311..90727532eb 100644 --- a/src/libnm-glib-aux/nm-uuid.h +++ b/src/libnm-glib-aux/nm-uuid.h @@ -33,6 +33,14 @@ gboolean nm_uuid_is_null(const NMUuid *uuid); /*****************************************************************************/ +static inline gboolean +nm_uuid_is_valid(const char *str) +{ + return str && nm_uuid_parse_full(str, NULL, NULL); +} + +/*****************************************************************************/ + gboolean nm_uuid_is_valid_nmlegacy(const char *str); /*****************************************************************************/ From 5bd03fd9a35a0e783e1740166fbc94cbb28185e4 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 2 May 2021 22:30:31 +0200 Subject: [PATCH 21/22] libnm: use nm_uuid_is_valid_nmlegacy() to implement nm_utils_is_uuid() --- src/libnm-core-impl/nm-utils.c | 23 +---------------------- 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/src/libnm-core-impl/nm-utils.c b/src/libnm-core-impl/nm-utils.c index 39248378ff..1d2c216a5b 100644 --- a/src/libnm-core-impl/nm-utils.c +++ b/src/libnm-core-impl/nm-utils.c @@ -4438,28 +4438,7 @@ nm_utils_iface_valid_name(const char *name) gboolean nm_utils_is_uuid(const char *str) { - const char *p = str; - int num_dashes = 0; - - if (!p) - return FALSE; - - while (*p) { - if (*p == '-') - num_dashes++; - else if (!g_ascii_isxdigit(*p)) - return FALSE; - p++; - } - - 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; + return nm_uuid_is_valid_nmlegacy(str); } static _nm_thread_local char _nm_utils_inet_ntop_buffer[NM_UTILS_INET_ADDRSTRLEN]; From 207cf3d5d4c9147ef52e1d54840a3eb90ca4c1ba Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 2 May 2021 22:42:51 +0200 Subject: [PATCH 22/22] libnm: normalize "connection.uuid" For NetworkManager profiles, "connection.uuid" is the identifier of the profile. It is supposed to be a UUID, however: - the UUID was not ensured to be all-lower case. We should make sure that our UUIDs are in a consistent manner, so that users can rely on the format of the string. - the UUID was never actually interpreted as a UUID. It only was some opaque string, that we use as identifier. We had nm_utils_is_uuid() which checks that the format is valid, however that did not fully validate the format, like it would accept "----7daf444dd78741a59e1ef1b3c8b1c0e8" and "549fac10a25f4bcc912d1ae688c2b4987daf444d" (40 hex characters). Both invalid UUIDs and non-normalized UUID should be normalized. We don't want to break existing profiles that use such UUIDs, thus we don't outright reject them. Let's instead mangle them during nm_connection_normalize(). --- NEWS | 3 + src/libnm-core-impl/nm-connection.c | 18 ++++-- src/libnm-core-impl/nm-setting-connection.c | 16 ++++- src/libnm-core-impl/tests/test-setting.c | 64 +++++++++++++++++--- src/libnm-glib-aux/nm-uuid.c | 65 +++++++++++++++++++++ src/libnm-glib-aux/nm-uuid.h | 4 ++ 6 files changed, 156 insertions(+), 14 deletions(-) diff --git a/NEWS b/NEWS index 368e8de6b3..62e9abd072 100644 --- a/NEWS +++ b/NEWS @@ -13,6 +13,9 @@ USE AT YOUR OWN RISK. NOT RECOMMENDED FOR PRODUCTION USE! mode). * nmcli: fix setting property aliases to empty value to reset the default value. +* Enforce valid "connection.uuid" by normalizing the string to lower + case. This changes the UUID of existing profiles that had an invalid, + non-normalized value. ============================================= NetworkManager-1.30 diff --git a/src/libnm-core-impl/nm-connection.c b/src/libnm-core-impl/nm-connection.c index 8abfa65e51..a8435c909c 100644 --- a/src/libnm-core-impl/nm-connection.c +++ b/src/libnm-core-impl/nm-connection.c @@ -704,14 +704,24 @@ static gboolean _normalize_connection_uuid(NMConnection *self) { NMSettingConnection *s_con = nm_connection_get_setting_connection(self); - char uuid[37]; + char uuid_normalized[37]; + const char * uuid; nm_assert(s_con); - if (nm_setting_connection_get_uuid(s_con)) - return FALSE; + uuid = nm_setting_connection_get_uuid(s_con); - g_object_set(s_con, NM_SETTING_CONNECTION_UUID, nm_uuid_generate_random_str_arr(uuid), NULL); + if (uuid) { + gboolean uuid_is_normalized; + + if (!nm_uuid_is_valid_nm(uuid, &uuid_is_normalized, uuid_normalized)) + return nm_assert_unreachable_val(FALSE); + if (!uuid_is_normalized) + return FALSE; + } else + nm_uuid_generate_random_str_arr(uuid_normalized); + + g_object_set(s_con, NM_SETTING_CONNECTION_UUID, uuid_normalized, NULL); return TRUE; } diff --git a/src/libnm-core-impl/nm-setting-connection.c b/src/libnm-core-impl/nm-setting-connection.c index 8b6bd4e089..8693c85363 100644 --- a/src/libnm-core-impl/nm-setting-connection.c +++ b/src/libnm-core-impl/nm-setting-connection.c @@ -8,6 +8,7 @@ #include "nm-setting-connection.h" +#include "libnm-glib-aux/nm-uuid.h" #include "libnm-core-aux-intern/nm-common-macros.h" #include "nm-utils.h" #include "nm-utils-private.h" @@ -1065,6 +1066,7 @@ verify(NMSetting *setting, NMConnection *connection, GError **error) const char * normerr_missing_slave_type = NULL; const char * normerr_missing_slave_type_port = NULL; gboolean normerr_base_setting = FALSE; + gboolean uuid_was_normalized = FALSE; if (!priv->id) { g_set_error_literal(error, @@ -1088,7 +1090,7 @@ verify(NMSetting *setting, NMConnection *connection, GError **error) return FALSE; } - if (priv->uuid && !nm_utils_is_uuid(priv->uuid)) { + if (priv->uuid && !nm_uuid_is_valid_nm(priv->uuid, &uuid_was_normalized, NULL)) { g_set_error(error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY, @@ -1460,6 +1462,18 @@ after_interface_name: } } + if (uuid_was_normalized) { + g_set_error_literal(error, + NM_CONNECTION_ERROR, + NM_CONNECTION_ERROR_MISSING_PROPERTY, + _("UUID needs normalization")); + g_prefix_error(error, + "%s.%s: ", + NM_SETTING_CONNECTION_SETTING_NAME, + NM_SETTING_CONNECTION_UUID); + return NM_SETTING_VERIFY_NORMALIZABLE; + } + return TRUE; } diff --git a/src/libnm-core-impl/tests/test-setting.c b/src/libnm-core-impl/tests/test-setting.c index c175a816c8..6671536537 100644 --- a/src/libnm-core-impl/tests/test-setting.c +++ b/src/libnm-core-impl/tests/test-setting.c @@ -238,6 +238,8 @@ _do_test_connection_uuid(NMConnection *con, const char *uuid, const char *expect NMSettingConnection *s_con; gs_free char * uuid_old = NULL; gboolean success; + gboolean is_normalized; + char uuid_normalized[37]; nmtst_assert_connection_verifies_without_normalization(con); @@ -257,6 +259,9 @@ _do_test_connection_uuid(NMConnection *con, const char *uuid, const char *expect if (nm_streq0(uuid, expected_uuid)) { nmtst_assert_connection_verifies_without_normalization(con); g_assert(nm_utils_is_uuid(uuid)); + g_assert(nm_uuid_is_valid(uuid)); + g_assert(nm_uuid_is_valid_nm(uuid, &is_normalized, NULL)); + g_assert(!is_normalized); } else if (!expected_uuid) { gs_free_error GError *error = NULL; @@ -265,11 +270,35 @@ _do_test_connection_uuid(NMConnection *con, const char *uuid, const char *expect g_assert_error(error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY); g_assert(!nm_utils_is_uuid(uuid)); - } else - g_assert_not_reached(); + g_assert(!nm_uuid_is_valid(uuid)); + g_assert(!nm_uuid_is_valid_nmlegacy(uuid)); + g_assert(!nm_uuid_is_valid_nm(uuid, NULL, NULL)); + } else { + gs_free_error GError *error = NULL; + + nmtst_assert_connection_verifies_and_normalizable(con); + + success = nm_connection_verify(con, &error); + nmtst_assert_success(success, error); + + if (!nmtst_connection_normalize(con)) + g_assert_not_reached(); + + g_assert_cmpstr(expected_uuid, ==, nm_setting_connection_get_uuid(s_con)); + g_assert(nm_uuid_is_valid(expected_uuid)); + + g_assert(nm_utils_is_uuid(uuid)); + g_assert(nm_uuid_is_valid_nmlegacy(uuid)); + g_assert(nm_uuid_is_valid_nm(uuid, &is_normalized, uuid_normalized)); + + g_assert_cmpstr(expected_uuid, ==, uuid_normalized); + } g_object_set(s_con, NM_SETTING_CONNECTION_UUID, uuid_old, NULL); nmtst_assert_connection_verifies_without_normalization(con); + + if (expected_uuid && !nm_streq(expected_uuid, uuid)) + _do_test_connection_uuid(con, expected_uuid, expected_uuid); } static void @@ -286,19 +315,36 @@ test_connection_uuid(void) #define _do_test_connection_uuid_good(con, uuid) \ _do_test_connection_uuid((con), "" uuid "", "" uuid "") +#define _do_test_connection_uuid_norm(con, uuid, expected_uuid) \ + _do_test_connection_uuid((con), "" uuid "", "" expected_uuid "") + _do_test_connection_uuid_bad(con, "x1e775e3-a316-4eb2-b4d8-4b0f2bcaea53"); _do_test_connection_uuid_bad(con, "1e775e3aa3164eb2b4d84b0f2bcaea53abcdabc"); _do_test_connection_uuid_bad(con, "1e775e3aa3164eb2b4d84b0f2bcaea53abcdabcdd"); _do_test_connection_uuid_good(con, "a1e775e3-a316-4eb2-b4d8-4b0f2bcaea53"); - _do_test_connection_uuid_good(con, "A1E775e3-a316-4eb2-b4d8-4b0f2bcaea53"); - _do_test_connection_uuid_good(con, "A1E775E3-A316-4EB2-B4D8-4B0F2BCAEA53"); - _do_test_connection_uuid_good(con, "-1e775e3aa316-4eb2-b4d8-4b0f2bcaea53"); - _do_test_connection_uuid_good(con, "----1e775e3aa3164eb2b4d84b0f2bcaea53"); - _do_test_connection_uuid_good(con, "1e775e3aa3164eb2b4d84b0f2bcaea53abcdabcd"); - _do_test_connection_uuid_good(con, "1e775e3Aa3164eb2b4d84b0f2bcaea53abcdabcd"); - _do_test_connection_uuid_good(con, "1E775E3AA3164EB2B4D84B0F2BCAEA53ABCDABCD"); + _do_test_connection_uuid_norm(con, + "A1E775e3-a316-4eb2-b4d8-4b0f2bcaea53", + "a1e775e3-a316-4eb2-b4d8-4b0f2bcaea53"); + _do_test_connection_uuid_norm(con, + "A1E775E3-A316-4EB2-B4D8-4B0F2BCAEA53", + "a1e775e3-a316-4eb2-b4d8-4b0f2bcaea53"); + _do_test_connection_uuid_norm(con, + "-1e775e3aa316-4eb2-b4d8-4b0f2bcaea53", + "bdd73688-5c87-5454-917d-f5c3faed39c0"); + _do_test_connection_uuid_norm(con, + "----1e775e3aa3164eb2b4d84b0f2bcaea53", + "8a232814-c6cf-54c9-9384-71a60011d0b2"); + _do_test_connection_uuid_norm(con, + "1e775e3aa3164eb2b4d84b0f2bcaea53abcdabcd", + "ae35a4a8-4029-5770-9fa4-d79a672874c3"); + _do_test_connection_uuid_norm(con, + "1e775e3Aa3164eb2b4d84b0f2bcaea53abcdabcd", + "ae35a4a8-4029-5770-9fa4-d79a672874c3"); + _do_test_connection_uuid_norm(con, + "1E775E3AA3164EB2B4D84B0F2BCAEA53ABCDABCD", + "ae35a4a8-4029-5770-9fa4-d79a672874c3"); } /*****************************************************************************/ diff --git a/src/libnm-glib-aux/nm-uuid.c b/src/libnm-glib-aux/nm-uuid.c index 18badc46d8..bc90352084 100644 --- a/src/libnm-glib-aux/nm-uuid.c +++ b/src/libnm-glib-aux/nm-uuid.c @@ -158,6 +158,9 @@ nm_uuid_is_valid_nmlegacy(const char *str) p++; } + /* While we accept here bogus strings as UUIDs, they must contain only + * hexdigits and '-', and they must be eithr 36 or 40 chars long. */ + if ((num_dashes == 4) && (p - str == 36)) return TRUE; @@ -170,6 +173,68 @@ nm_uuid_is_valid_nmlegacy(const char *str) /*****************************************************************************/ +gboolean +nm_uuid_is_valid_nm(const char *str, + gboolean * out_normalized, + char * out_normalized_str /* [static 37] */) +{ + NMUuid uuid; + gboolean is_normalized; + + if (!str) + return FALSE; + + if (nm_uuid_parse_full(str, &uuid, &is_normalized)) { + if (is_normalized) { + /* @str is a normalized (lower-case), valid UUID. Nothing to normalize, + * and return success. */ + NM_SET_OUT(out_normalized, FALSE); + return TRUE; + } + + /* @str is a valid UUID, but not normalized. That means that it's + * upper case. Normalize the UUID. */ + NM_SET_OUT(out_normalized, TRUE); + if (out_normalized_str) + nm_uuid_unparse(&uuid, out_normalized_str); + return TRUE; + } + + if (nm_uuid_is_valid_nmlegacy(str)) { + /* This is not a valid UUID, but something that we used to + * accept according to nm_uuid_is_valid_nmlegacy(). + * + * Normalize it by sha1 hashing the string. Upper case characters + * are made lower case first. */ + NM_SET_OUT(out_normalized, TRUE); + if (out_normalized_str) { + char str_lower[40 + 1]; + int i; + + nm_assert(strlen(str) < G_N_ELEMENTS(str_lower)); + + /* normalize first to lower-case. */ + g_strlcpy(str_lower, str, sizeof(str_lower)); + for (i = 0; str_lower[i]; i++) + str_lower[i] = g_ascii_tolower(str_lower[i]); + + /* The namespace UUID is chosen randomly. */ + nm_uuid_generate_from_string(&uuid, + str_lower, + -1, + NM_UUID_TYPE_VERSION5, + "4e72f709-ca95-4405-9053-1f43294a618c"); + nm_uuid_unparse(&uuid, out_normalized_str); + } + return TRUE; + } + + /* UUID is not valid. */ + return FALSE; +} + +/*****************************************************************************/ + gboolean nm_uuid_is_null(const NMUuid *uuid) { diff --git a/src/libnm-glib-aux/nm-uuid.h b/src/libnm-glib-aux/nm-uuid.h index 90727532eb..afa16891ce 100644 --- a/src/libnm-glib-aux/nm-uuid.h +++ b/src/libnm-glib-aux/nm-uuid.h @@ -43,6 +43,10 @@ nm_uuid_is_valid(const char *str) gboolean nm_uuid_is_valid_nmlegacy(const char *str); +gboolean nm_uuid_is_valid_nm(const char *str, + gboolean * out_normalized, + char * out_normalized_str /* [static 37] */); + /*****************************************************************************/ char *nm_uuid_generate_random_str(char buf[static 37]);