summary refs log tree commit diff
path: root/src/libnm-core-impl/nm-setting-ovs-external-ids.c
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2023-02-10 11:50:34 +0100
committerMichael Biebl <biebl@debian.org>2023-02-10 11:50:34 +0100
commit1372848511cb896b80b51ed1a3e9606bd9816631 (patch)
tree674792b9385bdef935988894b45f06b2af39f88c /src/libnm-core-impl/nm-setting-ovs-external-ids.c
parent40ec077ea305994c1fc2130add6787ca0c73e2c6 (diff)
New upstream version 1.42.0 upstream/1.42.0
Diffstat (limited to 'src/libnm-core-impl/nm-setting-ovs-external-ids.c')
-rw-r--r--src/libnm-core-impl/nm-setting-ovs-external-ids.c122
1 files changed, 68 insertions, 54 deletions
diff --git a/src/libnm-core-impl/nm-setting-ovs-external-ids.c b/src/libnm-core-impl/nm-setting-ovs-external-ids.c
index f4e31f81..54684380 100644
--- a/src/libnm-core-impl/nm-setting-ovs-external-ids.c
+++ b/src/libnm-core-impl/nm-setting-ovs-external-ids.c
@@ -10,6 +10,7 @@
 #include "nm-setting-private.h"
 #include "nm-utils-private.h"
 #include "nm-connection-private.h"
+#include "nm-setting-ovs-other-config.h"
 
 #define MAX_NUM_KEYS 256
 
@@ -53,15 +54,6 @@ G_DEFINE_TYPE(NMSettingOvsExternalIDs, nm_setting_ovs_external_ids, NM_TYPE_SETT
 
 /*****************************************************************************/
 
-static gboolean
-_exid_key_char_is_regular(char ch)
-{
-    /* allow words of printable characters, plus some
-     * special characters, for example to support base64 encoding. */
-    return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9')
-           || NM_IN_SET(ch, '-', '_', '+', '/', '=', '.');
-}
-
 /**
  * nm_setting_ovs_external_ids_check_key:
  * @key: (allow-none): the key to check
@@ -105,7 +97,7 @@ nm_setting_ovs_external_ids_check_key(const char *key, GError **error)
                             _("key must be UTF8"));
         return FALSE;
     }
-    if (!NM_STRCHAR_ALL(key, ch, _exid_key_char_is_regular(ch))) {
+    if (!NM_STRCHAR_ALL(key, ch, nm_ascii_is_regular_char(ch))) {
         /* Probably OVS is more forgiving about what makes a valid key for
          * an external-id. However, we are strict (at least, for now). */
         g_set_error_literal(error,
@@ -127,6 +119,56 @@ nm_setting_ovs_external_ids_check_key(const char *key, GError **error)
     return TRUE;
 }
 
+gboolean
+_nm_setting_ovs_verify_connection_type(GType gtype, NMConnection *connection, GError **error)
+{
+    NMSettingConnection *s_con;
+    const char          *type;
+    const char          *slave_type;
+
+    nm_assert(!connection || NM_IS_CONNECTION(connection));
+    nm_assert(NM_IN_SET(gtype, NM_TYPE_SETTING_OVS_EXTERNAL_IDS, NM_TYPE_SETTING_OVS_OTHER_CONFIG));
+    nm_assert(!error || !*error);
+
+    if (!connection) {
+        /* We don't know. It's valid. */
+        return TRUE;
+    }
+
+    type = nm_connection_get_connection_type(connection);
+    if (!type) {
+        NMSetting *s_base;
+
+        s_base = _nm_connection_find_base_type_setting(connection);
+        if (s_base)
+            type = nm_setting_get_name(s_base);
+    }
+    if (NM_IN_STRSET(type,
+                     NM_SETTING_OVS_BRIDGE_SETTING_NAME,
+                     NM_SETTING_OVS_PORT_SETTING_NAME,
+                     NM_SETTING_OVS_INTERFACE_SETTING_NAME))
+        return TRUE;
+
+    if ((s_con = nm_connection_get_setting_connection(connection))
+        && _nm_connection_detect_slave_type_full(s_con,
+                                                 connection,
+                                                 &slave_type,
+                                                 NULL,
+                                                 NULL,
+                                                 NULL,
+                                                 NULL)
+        && nm_streq0(slave_type, NM_SETTING_OVS_PORT_SETTING_NAME))
+        return TRUE;
+
+    g_set_error(error,
+                NM_CONNECTION_ERROR,
+                NM_CONNECTION_ERROR_INVALID_PROPERTY,
+                _("OVS %s can only be added to a profile of type OVS "
+                  "bridge/port/interface or to OVS system interface"),
+                gtype == NM_TYPE_SETTING_OVS_EXTERNAL_IDS ? "external-ids" : "other-config");
+    return FALSE;
+}
+
 /**
  * nm_setting_ovs_external_ids_check_val:
  * @val: (allow-none): the value to check
@@ -204,6 +246,8 @@ nm_setting_ovs_external_ids_get_data_keys(NMSettingOvsExternalIDs *setting, guin
     NMSettingOvsExternalIDs        *self = setting;
     NMSettingOvsExternalIDsPrivate *priv;
 
+    NM_SET_OUT(out_len, 0);
+
     g_return_val_if_fail(NM_IS_SETTING_OVS_EXTERNAL_IDS(self), NULL);
 
     priv = NM_SETTING_OVS_EXTERNAL_IDS_GET_PRIVATE(self);
@@ -302,12 +346,16 @@ verify(NMSetting *setting, NMConnection *connection, GError **error)
 
     if (priv->data) {
         gs_free_error GError *local = NULL;
-        GHashTableIter        iter;
-        const char           *key;
-        const char           *val;
+        const char *const    *keys;
+        guint                 len;
+        guint                 i;
+
+        keys = nm_setting_ovs_external_ids_get_data_keys(self, &len);
+
+        for (i = 0; i < len; i++) {
+            const char *key = keys[i];
+            const char *val = g_hash_table_lookup(priv->data, key);
 
-        g_hash_table_iter_init(&iter, priv->data);
-        while (g_hash_table_iter_next(&iter, (gpointer *) &key, (gpointer *) &val)) {
             if (!nm_setting_ovs_external_ids_check_key(key, &local)) {
                 g_set_error(error,
                             NM_CONNECTION_ERROR,
@@ -336,7 +384,7 @@ verify(NMSetting *setting, NMConnection *connection, GError **error)
         g_set_error(error,
                     NM_CONNECTION_ERROR,
                     NM_CONNECTION_ERROR_INVALID_PROPERTY,
-                    _("maximum number of user data entries reached (%u instead of %u)"),
+                    _("maximum number of entries reached (%u instead of %u)"),
                     g_hash_table_size(priv->data),
                     (unsigned) MAX_NUM_KEYS);
         g_prefix_error(error,
@@ -346,44 +394,10 @@ verify(NMSetting *setting, NMConnection *connection, GError **error)
         return FALSE;
     }
 
-    if (connection) {
-        NMSettingConnection *s_con;
-        const char          *type;
-        const char          *slave_type;
-
-        type = nm_connection_get_connection_type(connection);
-        if (!type) {
-            NMSetting *s_base;
-
-            s_base = _nm_connection_find_base_type_setting(connection);
-            if (s_base)
-                type = nm_setting_get_name(s_base);
-        }
-        if (NM_IN_STRSET(type,
-                         NM_SETTING_OVS_BRIDGE_SETTING_NAME,
-                         NM_SETTING_OVS_PORT_SETTING_NAME,
-                         NM_SETTING_OVS_INTERFACE_SETTING_NAME))
-            goto connection_type_is_good;
-
-        if ((s_con = nm_connection_get_setting_connection(connection))
-            && _nm_connection_detect_slave_type_full(s_con,
-                                                     connection,
-                                                     &slave_type,
-                                                     NULL,
-                                                     NULL,
-                                                     NULL,
-                                                     NULL)
-            && nm_streq0(slave_type, NM_SETTING_OVS_PORT_SETTING_NAME))
-            goto connection_type_is_good;
-
-        g_set_error_literal(error,
-                            NM_CONNECTION_ERROR,
-                            NM_CONNECTION_ERROR_INVALID_PROPERTY,
-                            _("OVS external IDs can only be added to a profile of type OVS "
-                              "bridge/port/interface or to OVS system interface"));
+    if (!_nm_setting_ovs_verify_connection_type(NM_TYPE_SETTING_OVS_EXTERNAL_IDS,
+                                                connection,
+                                                error))
         return FALSE;
-    }
-connection_type_is_good:
 
     return TRUE;
 }
@@ -519,7 +533,7 @@ nm_setting_ovs_external_ids_class_init(NMSettingOvsExternalIDsClass *klass)
     /**
      * NMSettingOvsExternalIDs:data: (type GHashTable(utf8,utf8))
      *
-     * A dictionary of key/value pairs with exernal-ids for OVS.
+     * A dictionary of key/value pairs with external-ids for OVS.
      *
      * Since: 1.30
      **/