diff --git a/src/libnm-core-impl/nm-setting-6lowpan.c b/src/libnm-core-impl/nm-setting-6lowpan.c
index eafc580b0e..7066c3e6bb 100644
--- a/src/libnm-core-impl/nm-setting-6lowpan.c
+++ b/src/libnm-core-impl/nm-setting-6lowpan.c
@@ -176,7 +176,8 @@ nm_setting_6lowpan_class_init(NMSetting6LowpanClass *klass)
PROP_PARENT,
NM_SETTING_PARAM_INFERRABLE,
NMSetting6LowpanPrivate,
- parent);
+ parent,
+ .direct_string_allow_empty = TRUE);
g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties);
diff --git a/src/libnm-core-impl/nm-setting-8021x.c b/src/libnm-core-impl/nm-setting-8021x.c
index 36934184ef..945fd6d3ff 100644
--- a/src/libnm-core-impl/nm-setting-8021x.c
+++ b/src/libnm-core-impl/nm-setting-8021x.c
@@ -3248,7 +3248,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass)
PROP_IDENTITY,
NM_SETTING_PARAM_NONE,
NMSetting8021xPrivate,
- identity);
+ identity,
+ .direct_string_allow_empty = TRUE);
/**
* NMSetting8021x:anonymous-identity:
@@ -3269,7 +3270,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass)
PROP_ANONYMOUS_IDENTITY,
NM_SETTING_PARAM_NONE,
NMSetting8021xPrivate,
- anonymous_identity);
+ anonymous_identity,
+ .direct_string_allow_empty = TRUE);
/**
* NMSetting8021x:pac-file:
@@ -3289,7 +3291,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass)
PROP_PAC_FILE,
NM_SETTING_PARAM_NONE,
NMSetting8021xPrivate,
- pac_file);
+ pac_file,
+ .direct_string_allow_empty = TRUE);
/**
* NMSetting8021x:ca-cert:
@@ -3342,7 +3345,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass)
PROP_CA_CERT_PASSWORD,
NM_SETTING_PARAM_SECRET,
NMSetting8021xPrivate,
- ca_cert_password);
+ ca_cert_password,
+ .direct_string_allow_empty = TRUE);
/**
* NMSetting8021x:ca-cert-password-flags:
@@ -3380,7 +3384,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass)
PROP_CA_PATH,
NM_SETTING_PARAM_NONE,
NMSetting8021xPrivate,
- ca_path);
+ ca_path,
+ .direct_string_allow_empty = TRUE);
/**
* NMSetting8021x:subject-match:
@@ -3406,7 +3411,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass)
NM_SETTING_PARAM_NONE,
NMSetting8021xPrivate,
subject_match,
- .is_deprecated = TRUE, );
+ .is_deprecated = TRUE,
+ .direct_string_allow_empty = TRUE);
/**
* NMSetting8021x:altsubject-matches:
@@ -3453,7 +3459,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass)
PROP_DOMAIN_SUFFIX_MATCH,
NM_SETTING_PARAM_NONE,
NMSetting8021xPrivate,
- domain_suffix_match);
+ domain_suffix_match,
+ .direct_string_allow_empty = TRUE);
/**
* NMSetting8021x:domain-match:
@@ -3479,7 +3486,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass)
PROP_DOMAIN_MATCH,
NM_SETTING_PARAM_NONE,
NMSetting8021xPrivate,
- domain_match);
+ domain_match,
+ .direct_string_allow_empty = TRUE);
/**
* NMSetting8021x:client-cert:
@@ -3527,7 +3535,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass)
PROP_CLIENT_CERT_PASSWORD,
NM_SETTING_PARAM_SECRET,
NMSetting8021xPrivate,
- client_cert_password);
+ client_cert_password,
+ .direct_string_allow_empty = TRUE);
/**
* NMSetting8021x:client-cert-password-flags:
@@ -3566,7 +3575,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass)
PROP_PHASE1_PEAPVER,
NM_SETTING_PARAM_NONE,
NMSetting8021xPrivate,
- phase1_peapver);
+ phase1_peapver,
+ .direct_string_allow_empty = TRUE);
/**
* NMSetting8021x:phase1-peaplabel:
@@ -3590,7 +3600,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass)
PROP_PHASE1_PEAPLABEL,
NM_SETTING_PARAM_NONE,
NMSetting8021xPrivate,
- phase1_peaplabel);
+ phase1_peaplabel,
+ .direct_string_allow_empty = TRUE);
/**
* NMSetting8021x:phase1-fast-provisioning:
@@ -3616,7 +3627,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass)
PROP_PHASE1_FAST_PROVISIONING,
NM_SETTING_PARAM_NONE,
NMSetting8021xPrivate,
- phase1_fast_provisioning);
+ phase1_fast_provisioning,
+ .direct_string_allow_empty = TRUE);
/**
* NMSetting8021x:phase1-auth-flags:
@@ -3680,7 +3692,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass)
PROP_PHASE2_AUTH,
NM_SETTING_PARAM_NONE,
NMSetting8021xPrivate,
- phase2_auth);
+ phase2_auth,
+ .direct_string_allow_empty = TRUE);
/**
* NMSetting8021x:phase2-autheap:
@@ -3707,7 +3720,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass)
PROP_PHASE2_AUTHEAP,
NM_SETTING_PARAM_NONE,
NMSetting8021xPrivate,
- phase2_autheap);
+ phase2_autheap,
+ .direct_string_allow_empty = TRUE);
/**
* NMSetting8021x:phase2-ca-cert:
@@ -3754,7 +3768,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass)
PROP_PHASE2_CA_CERT_PASSWORD,
NM_SETTING_PARAM_SECRET,
NMSetting8021xPrivate,
- phase2_ca_cert_password);
+ phase2_ca_cert_password,
+ .direct_string_allow_empty = TRUE);
/**
* NMSetting8021x:phase2-ca-cert-password-flags:
@@ -3792,7 +3807,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass)
PROP_PHASE2_CA_PATH,
NM_SETTING_PARAM_NONE,
NMSetting8021xPrivate,
- phase2_ca_path);
+ phase2_ca_path,
+ .direct_string_allow_empty = TRUE);
/**
* NMSetting8021x:phase2-subject-match:
@@ -3819,7 +3835,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass)
NM_SETTING_PARAM_NONE,
NMSetting8021xPrivate,
phase2_subject_match,
- .is_deprecated = TRUE, );
+ .is_deprecated = TRUE,
+ .direct_string_allow_empty = TRUE);
/**
* NMSetting8021x:phase2-altsubject-matches:
@@ -3866,7 +3883,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass)
PROP_PHASE2_DOMAIN_SUFFIX_MATCH,
NM_SETTING_PARAM_NONE,
NMSetting8021xPrivate,
- phase2_domain_suffix_match);
+ phase2_domain_suffix_match,
+ .direct_string_allow_empty = TRUE);
/**
* NMSetting8021x:phase2-domain-match:
@@ -3893,7 +3911,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass)
PROP_PHASE2_DOMAIN_MATCH,
NM_SETTING_PARAM_NONE,
NMSetting8021xPrivate,
- phase2_domain_match);
+ phase2_domain_match,
+ .direct_string_allow_empty = TRUE);
/**
* NMSetting8021x:phase2-client-cert:
@@ -3944,7 +3963,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass)
PROP_PHASE2_CLIENT_CERT_PASSWORD,
NM_SETTING_PARAM_SECRET,
NMSetting8021xPrivate,
- phase2_client_cert_password);
+ phase2_client_cert_password,
+ .direct_string_allow_empty = TRUE);
/**
* NMSetting8021x:phase2-client-cert-password-flags:
@@ -3981,7 +4001,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass)
PROP_PASSWORD,
NM_SETTING_PARAM_SECRET,
NMSetting8021xPrivate,
- password);
+ password,
+ .direct_string_allow_empty = TRUE);
/**
* NMSetting8021x:password-flags:
@@ -4113,7 +4134,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass)
PROP_PRIVATE_KEY_PASSWORD,
NM_SETTING_PARAM_SECRET,
NMSetting8021xPrivate,
- private_key_password);
+ private_key_password,
+ .direct_string_allow_empty = TRUE);
/**
* NMSetting8021x:private-key-password-flags:
@@ -4199,7 +4221,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass)
PROP_PHASE2_PRIVATE_KEY_PASSWORD,
NM_SETTING_PARAM_SECRET,
NMSetting8021xPrivate,
- phase2_private_key_password);
+ phase2_private_key_password,
+ .direct_string_allow_empty = TRUE);
/**
* NMSetting8021x:phase2-private-key-password-flags:
@@ -4239,7 +4262,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass)
PROP_PIN,
NM_SETTING_PARAM_SECRET,
NMSetting8021xPrivate,
- pin);
+ pin,
+ .direct_string_allow_empty = TRUE);
/**
* NMSetting8021x:pin-flags:
diff --git a/src/libnm-core-impl/nm-setting-adsl.c b/src/libnm-core-impl/nm-setting-adsl.c
index 3336c27471..f9aacb83f4 100644
--- a/src/libnm-core-impl/nm-setting-adsl.c
+++ b/src/libnm-core-impl/nm-setting-adsl.c
@@ -283,7 +283,8 @@ nm_setting_adsl_class_init(NMSettingAdslClass *klass)
PROP_USERNAME,
NM_SETTING_PARAM_NONE,
NMSettingAdslPrivate,
- username);
+ username,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingAdsl:password:
@@ -296,7 +297,8 @@ nm_setting_adsl_class_init(NMSettingAdslClass *klass)
PROP_PASSWORD,
NM_SETTING_PARAM_SECRET,
NMSettingAdslPrivate,
- password);
+ password,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingAdsl:password-flags:
@@ -322,7 +324,8 @@ nm_setting_adsl_class_init(NMSettingAdslClass *klass)
NM_SETTING_PARAM_NONE,
NMSettingAdslPrivate,
protocol,
- .direct_set_string_ascii_strdown = TRUE);
+ .direct_set_string_ascii_strdown = TRUE,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingAdsl:encapsulation:
@@ -336,7 +339,8 @@ nm_setting_adsl_class_init(NMSettingAdslClass *klass)
NM_SETTING_PARAM_NONE,
NMSettingAdslPrivate,
encapsulation,
- .direct_set_string_ascii_strdown = TRUE);
+ .direct_set_string_ascii_strdown = TRUE,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingAdsl:vpi:
diff --git a/src/libnm-core-impl/nm-setting-bluetooth.c b/src/libnm-core-impl/nm-setting-bluetooth.c
index 795379f39b..3c2605a17e 100644
--- a/src/libnm-core-impl/nm-setting-bluetooth.c
+++ b/src/libnm-core-impl/nm-setting-bluetooth.c
@@ -283,7 +283,8 @@ nm_setting_bluetooth_class_init(NMSettingBluetoothClass *klass)
PROP_TYPE,
NM_SETTING_PARAM_INFERRABLE,
NMSettingBluetoothPrivate,
- type);
+ type,
+ .direct_string_allow_empty = TRUE);
g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties);
diff --git a/src/libnm-core-impl/nm-setting-bridge.c b/src/libnm-core-impl/nm-setting-bridge.c
index 253214b590..7e9a09649b 100644
--- a/src/libnm-core-impl/nm-setting-bridge.c
+++ b/src/libnm-core-impl/nm-setting-bridge.c
@@ -1811,7 +1811,8 @@ nm_setting_bridge_class_init(NMSettingBridgeClass *klass)
PROP_VLAN_PROTOCOL,
NM_SETTING_PARAM_INFERRABLE,
NMSettingBridge,
- _priv.vlan_protocol);
+ _priv.vlan_protocol,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingBridge:vlan-stats-enabled:
@@ -1862,7 +1863,8 @@ nm_setting_bridge_class_init(NMSettingBridgeClass *klass)
PROP_MULTICAST_ROUTER,
NM_SETTING_PARAM_INFERRABLE,
NMSettingBridge,
- _priv.multicast_router);
+ _priv.multicast_router,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingBridge:multicast-query-use-ifaddr:
diff --git a/src/libnm-core-impl/nm-setting-cdma.c b/src/libnm-core-impl/nm-setting-cdma.c
index f27f71a24a..b497cf14e1 100644
--- a/src/libnm-core-impl/nm-setting-cdma.c
+++ b/src/libnm-core-impl/nm-setting-cdma.c
@@ -236,7 +236,8 @@ nm_setting_cdma_class_init(NMSettingCdmaClass *klass)
PROP_NUMBER,
NM_SETTING_PARAM_NONE,
NMSettingCdmaPrivate,
- number);
+ number,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingCdma:username:
@@ -251,7 +252,8 @@ nm_setting_cdma_class_init(NMSettingCdmaClass *klass)
PROP_USERNAME,
NM_SETTING_PARAM_NONE,
NMSettingCdmaPrivate,
- username);
+ username,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingCdma:password:
@@ -266,7 +268,8 @@ nm_setting_cdma_class_init(NMSettingCdmaClass *klass)
PROP_PASSWORD,
NM_SETTING_PARAM_SECRET,
NMSettingCdmaPrivate,
- password);
+ password,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingCdma:password-flags:
diff --git a/src/libnm-core-impl/nm-setting-connection.c b/src/libnm-core-impl/nm-setting-connection.c
index 4c9ece00f3..892e7d3151 100644
--- a/src/libnm-core-impl/nm-setting-connection.c
+++ b/src/libnm-core-impl/nm-setting-connection.c
@@ -2122,7 +2122,8 @@ nm_setting_connection_class_init(NMSettingConnectionClass *klass)
PROP_STABLE_ID,
NM_SETTING_PARAM_FUZZY_IGNORE,
NMSettingConnectionPrivate,
- stable_id);
+ stable_id,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingConnection:interface-name:
@@ -2163,7 +2164,8 @@ nm_setting_connection_class_init(NMSettingConnectionClass *klass)
.from_dbus_is_full = TRUE,
.from_dbus_direct_allow_transform = TRUE),
NMSettingConnectionPrivate,
- interface_name);
+ interface_name,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingConnection:type:
@@ -2190,7 +2192,8 @@ nm_setting_connection_class_init(NMSettingConnectionClass *klass)
NM_SETTING_PARAM_INFERRABLE,
NMSettingConnectionPrivate,
type,
- .direct_string_is_refstr = TRUE);
+ .direct_string_is_refstr = TRUE,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingConnection:permissions:
@@ -2422,7 +2425,8 @@ nm_setting_connection_class_init(NMSettingConnectionClass *klass)
NM_SETTING_PARAM_FUZZY_IGNORE
| NM_SETTING_PARAM_REAPPLY_IMMEDIATELY,
NMSettingConnectionPrivate,
- zone);
+ zone,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingConnection:master:
@@ -2453,7 +2457,8 @@ nm_setting_connection_class_init(NMSettingConnectionClass *klass)
.from_dbus_fcn = _nm_setting_connection_master_from_dbus, ),
NMSettingConnectionPrivate,
controller,
- .is_deprecated = 1);
+ .direct_string_allow_empty = TRUE,
+ .is_deprecated = TRUE);
/**
* NMSettingConnection:controller:
@@ -2474,7 +2479,8 @@ nm_setting_connection_class_init(NMSettingConnectionClass *klass)
_nm_setting_connection_controller_from_dbus),
NMSettingConnectionPrivate,
controller,
- .direct_also_notify = obj_properties[PROP_MASTER]);
+ .direct_string_allow_empty = TRUE,
+ .direct_also_notify = obj_properties[PROP_MASTER]);
nm_g_array_index(properties_override, NMSettInfoProperty, prop_idx).direct_also_notify =
obj_properties[PROP_CONTROLLER];
@@ -2512,7 +2518,8 @@ nm_setting_connection_class_init(NMSettingConnectionClass *klass)
_nm_setting_connection_slave_type_from_dbus, ),
NMSettingConnectionPrivate,
port_type,
- .is_deprecated = 1);
+ .is_deprecated = 1,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingConnection:port-type:
@@ -2537,7 +2544,8 @@ nm_setting_connection_class_init(NMSettingConnectionClass *klass)
_nm_setting_connection_port_type_from_dbus, ),
NMSettingConnectionPrivate,
port_type,
- .direct_also_notify = obj_properties[PROP_SLAVE_TYPE]);
+ .direct_string_allow_empty = TRUE,
+ .direct_also_notify = obj_properties[PROP_SLAVE_TYPE]);
nm_g_array_index(properties_override, NMSettInfoProperty, prop_idx).direct_also_notify =
obj_properties[PROP_PORT_TYPE];
@@ -2987,7 +2995,8 @@ nm_setting_connection_class_init(NMSettingConnectionClass *klass)
PROP_MUD_URL,
NM_SETTING_PARAM_NONE,
NMSettingConnectionPrivate,
- mud_url);
+ mud_url,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingConnection:wait-activation-delay:
diff --git a/src/libnm-core-impl/nm-setting-dcb.c b/src/libnm-core-impl/nm-setting-dcb.c
index cca51641a1..c59ee8b457 100644
--- a/src/libnm-core-impl/nm-setting-dcb.c
+++ b/src/libnm-core-impl/nm-setting-dcb.c
@@ -920,7 +920,8 @@ nm_setting_dcb_class_init(NMSettingDcbClass *klass)
PROP_APP_FCOE_MODE,
NM_SETTING_PARAM_NONE,
NMSettingDcbPrivate,
- app_fcoe_mode);
+ app_fcoe_mode,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingDcb:app-iscsi-flags:
diff --git a/src/libnm-core-impl/nm-setting-gsm.c b/src/libnm-core-impl/nm-setting-gsm.c
index 3271571902..632b0ccc81 100644
--- a/src/libnm-core-impl/nm-setting-gsm.c
+++ b/src/libnm-core-impl/nm-setting-gsm.c
@@ -602,7 +602,8 @@ nm_setting_gsm_class_init(NMSettingGsmClass *klass)
NM_SETTING_PARAM_NONE,
NMSettingGsmPrivate,
number,
- .is_deprecated = TRUE, );
+ .is_deprecated = TRUE,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingGsm:username:
@@ -617,7 +618,8 @@ nm_setting_gsm_class_init(NMSettingGsmClass *klass)
PROP_USERNAME,
NM_SETTING_PARAM_NONE,
NMSettingGsmPrivate,
- username);
+ username,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingGsm:password:
@@ -632,7 +634,8 @@ nm_setting_gsm_class_init(NMSettingGsmClass *klass)
PROP_PASSWORD,
NM_SETTING_PARAM_SECRET,
NMSettingGsmPrivate,
- password);
+ password,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingGsm:password-flags:
@@ -655,6 +658,10 @@ nm_setting_gsm_class_init(NMSettingGsmClass *klass)
* is important to use the correct APN for the user's mobile broadband plan.
* The APN may only be composed of the characters a-z, 0-9, ., and - per GSM
* 03.60 Section 14.9.
+ *
+ * If the APN is unset (the default) then it may be detected based on
+ * "auto-config" setting. The property can be explicitly set to the
+ * empty string to prevent that and use no APN.
**/
_nm_setting_property_define_direct_string(properties_override,
obj_properties,
@@ -663,7 +670,8 @@ nm_setting_gsm_class_init(NMSettingGsmClass *klass)
NM_SETTING_PARAM_NONE,
NMSettingGsmPrivate,
apn,
- .direct_set_string_strip = TRUE);
+ .direct_set_string_strip = TRUE,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingGsm:network-id:
@@ -681,7 +689,8 @@ nm_setting_gsm_class_init(NMSettingGsmClass *klass)
NM_SETTING_PARAM_NONE,
NMSettingGsmPrivate,
network_id,
- .direct_set_string_strip = TRUE);
+ .direct_set_string_strip = TRUE,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingGsm:pin:
@@ -696,7 +705,8 @@ nm_setting_gsm_class_init(NMSettingGsmClass *klass)
PROP_PIN,
NM_SETTING_PARAM_SECRET,
NMSettingGsmPrivate,
- pin);
+ pin,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingGsm:pin-flags:
@@ -740,7 +750,8 @@ nm_setting_gsm_class_init(NMSettingGsmClass *klass)
PROP_DEVICE_ID,
NM_SETTING_PARAM_NONE,
NMSettingGsmPrivate,
- device_id);
+ device_id,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingGsm:sim-id:
@@ -758,7 +769,8 @@ nm_setting_gsm_class_init(NMSettingGsmClass *klass)
PROP_SIM_ID,
NM_SETTING_PARAM_NONE,
NMSettingGsmPrivate,
- sim_id);
+ sim_id,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingGsm:sim-operator-id:
@@ -777,7 +789,8 @@ nm_setting_gsm_class_init(NMSettingGsmClass *klass)
PROP_SIM_OPERATOR_ID,
NM_SETTING_PARAM_NONE,
NMSettingGsmPrivate,
- sim_operator_id);
+ sim_operator_id,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingGsm:mtu:
@@ -831,7 +844,8 @@ nm_setting_gsm_class_init(NMSettingGsmClass *klass)
PROP_INITIAL_EPS_APN,
NM_SETTING_PARAM_NONE,
NMSettingGsmPrivate,
- initial_eps_apn);
+ initial_eps_apn,
+ .direct_string_allow_empty = TRUE);
/* Ignore incoming deprecated properties */
_nm_properties_override_dbus(properties_override,
diff --git a/src/libnm-core-impl/nm-setting-infiniband.c b/src/libnm-core-impl/nm-setting-infiniband.c
index 74f8cb5177..203e4b2bda 100644
--- a/src/libnm-core-impl/nm-setting-infiniband.c
+++ b/src/libnm-core-impl/nm-setting-infiniband.c
@@ -414,7 +414,8 @@ nm_setting_infiniband_class_init(NMSettingInfinibandClass *klass)
PROP_TRANSPORT_MODE,
NM_SETTING_PARAM_INFERRABLE,
NMSettingInfinibandPrivate,
- transport_mode);
+ transport_mode,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingInfiniband:p-key:
@@ -480,7 +481,8 @@ nm_setting_infiniband_class_init(NMSettingInfinibandClass *klass)
PROP_PARENT,
NM_SETTING_PARAM_INFERRABLE,
NMSettingInfinibandPrivate,
- parent);
+ parent,
+ .direct_string_allow_empty = TRUE);
g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties);
diff --git a/src/libnm-core-impl/nm-setting-ip-config.c b/src/libnm-core-impl/nm-setting-ip-config.c
index d4547655d1..bfebe7d13d 100644
--- a/src/libnm-core-impl/nm-setting-ip-config.c
+++ b/src/libnm-core-impl/nm-setting-ip-config.c
@@ -5951,7 +5951,8 @@ _nm_sett_info_property_override_create_array_ip_config(int addr_family)
properties_override,
obj_properties[PROP_METHOD],
&nm_sett_info_propert_type_direct_string,
- .direct_offset = NM_STRUCT_OFFSET_ENSURE_TYPE(char *, NMSettingIPConfigPrivate, method));
+ .direct_offset = NM_STRUCT_OFFSET_ENSURE_TYPE(char *, NMSettingIPConfigPrivate, method),
+ .direct_string_allow_empty = TRUE);
_nm_properties_override_gobj(
properties_override,
@@ -5964,20 +5965,23 @@ _nm_sett_info_property_override_create_array_ip_config(int addr_family)
.from_dbus_fcn = _nm_setting_property_from_dbus_fcn_direct_ip_config_gateway),
.direct_offset = NM_STRUCT_OFFSET_ENSURE_TYPE(char *, NMSettingIPConfigPrivate, gateway),
.direct_set_string_ip_address_addr_family = addr_family + 1,
- .direct_set_string_ip_address_addr_family_map_zero_to_null = TRUE);
+ .direct_set_string_ip_address_addr_family_map_zero_to_null = TRUE,
+ .direct_string_allow_empty = TRUE);
_nm_properties_override_gobj(
properties_override,
obj_properties[PROP_DHCP_HOSTNAME],
&nm_sett_info_propert_type_direct_string,
.direct_offset =
- NM_STRUCT_OFFSET_ENSURE_TYPE(char *, NMSettingIPConfigPrivate, dhcp_hostname));
+ NM_STRUCT_OFFSET_ENSURE_TYPE(char *, NMSettingIPConfigPrivate, dhcp_hostname),
+ .direct_string_allow_empty = TRUE);
_nm_properties_override_gobj(
properties_override,
obj_properties[PROP_DHCP_IAID],
&nm_sett_info_propert_type_direct_string,
- .direct_offset = NM_STRUCT_OFFSET_ENSURE_TYPE(char *, NMSettingIPConfigPrivate, dhcp_iaid));
+ .direct_offset = NM_STRUCT_OFFSET_ENSURE_TYPE(char *, NMSettingIPConfigPrivate, dhcp_iaid),
+ .direct_string_allow_empty = TRUE);
/* ---dbus---
* property: routing-rules
diff --git a/src/libnm-core-impl/nm-setting-ip-tunnel.c b/src/libnm-core-impl/nm-setting-ip-tunnel.c
index f04842067d..3512ff2e68 100644
--- a/src/libnm-core-impl/nm-setting-ip-tunnel.c
+++ b/src/libnm-core-impl/nm-setting-ip-tunnel.c
@@ -584,7 +584,8 @@ nm_setting_ip_tunnel_class_init(NMSettingIPTunnelClass *klass)
PROP_PARENT,
NM_SETTING_PARAM_INFERRABLE,
NMSettingIPTunnelPrivate,
- parent);
+ parent,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingIPTunnel:mode:
@@ -630,7 +631,8 @@ nm_setting_ip_tunnel_class_init(NMSettingIPTunnelClass *klass)
PROP_LOCAL,
NM_SETTING_PARAM_INFERRABLE,
NMSettingIPTunnelPrivate,
- local);
+ local,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingIPTunnel:remote:
@@ -646,7 +648,8 @@ nm_setting_ip_tunnel_class_init(NMSettingIPTunnelClass *klass)
PROP_REMOTE,
NM_SETTING_PARAM_INFERRABLE,
NMSettingIPTunnelPrivate,
- remote);
+ remote,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingIPTunnel:ttl
@@ -716,7 +719,8 @@ nm_setting_ip_tunnel_class_init(NMSettingIPTunnelClass *klass)
PROP_INPUT_KEY,
NM_SETTING_PARAM_INFERRABLE,
NMSettingIPTunnelPrivate,
- input_key);
+ input_key,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingIPTunnel:output-key:
@@ -732,7 +736,8 @@ nm_setting_ip_tunnel_class_init(NMSettingIPTunnelClass *klass)
PROP_OUTPUT_KEY,
NM_SETTING_PARAM_INFERRABLE,
NMSettingIPTunnelPrivate,
- output_key);
+ output_key,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingIPTunnel:encapsulation-limit:
diff --git a/src/libnm-core-impl/nm-setting-ip4-config.c b/src/libnm-core-impl/nm-setting-ip4-config.c
index 09ce3a25df..92495125ea 100644
--- a/src/libnm-core-impl/nm-setting-ip4-config.c
+++ b/src/libnm-core-impl/nm-setting-ip4-config.c
@@ -919,7 +919,8 @@ nm_setting_ip4_config_class_init(NMSettingIP4ConfigClass *klass)
PROP_DHCP_CLIENT_ID,
NM_SETTING_PARAM_NONE,
NMSettingIP4ConfigPrivate,
- dhcp_client_id);
+ dhcp_client_id,
+ .direct_string_allow_empty = TRUE);
/* ---ifcfg-rh---
* property: dad-timeout
@@ -972,7 +973,8 @@ nm_setting_ip4_config_class_init(NMSettingIP4ConfigClass *klass)
PROP_DHCP_FQDN,
NM_SETTING_PARAM_NONE,
NMSettingIP4ConfigPrivate,
- dhcp_fqdn);
+ dhcp_fqdn,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingIP4Config:dhcp-vendor-class-identifier:
@@ -999,7 +1001,8 @@ nm_setting_ip4_config_class_init(NMSettingIP4ConfigClass *klass)
PROP_DHCP_VENDOR_CLASS_IDENTIFIER,
NM_SETTING_PARAM_NONE,
NMSettingIP4ConfigPrivate,
- dhcp_vendor_class_identifier);
+ dhcp_vendor_class_identifier,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingIP4Config:link-local:
diff --git a/src/libnm-core-impl/nm-setting-ip6-config.c b/src/libnm-core-impl/nm-setting-ip6-config.c
index e34745d656..9d607264fa 100644
--- a/src/libnm-core-impl/nm-setting-ip6-config.c
+++ b/src/libnm-core-impl/nm-setting-ip6-config.c
@@ -1069,7 +1069,8 @@ nm_setting_ip6_config_class_init(NMSettingIP6ConfigClass *klass)
PROP_TOKEN,
NM_SETTING_PARAM_INFERRABLE,
NMSettingIP6ConfigPrivate,
- token);
+ token,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingIP6Config:ra-timeout:
@@ -1172,7 +1173,8 @@ nm_setting_ip6_config_class_init(NMSettingIP6ConfigClass *klass)
PROP_DHCP_DUID,
NM_SETTING_PARAM_NONE,
NMSettingIP6ConfigPrivate,
- dhcp_duid);
+ dhcp_duid,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingIP6Config:dhcp-pd-hint:
@@ -1201,7 +1203,8 @@ nm_setting_ip6_config_class_init(NMSettingIP6ConfigClass *klass)
NMSettingIP6ConfigPrivate,
dhcp_pd_hint,
.direct_set_fcn.set_string =
- _set_string_fcn_dhcp_pd_hint);
+ _set_string_fcn_dhcp_pd_hint,
+ .direct_string_allow_empty = TRUE);
/* IP6-specific property overrides */
diff --git a/src/libnm-core-impl/nm-setting-macsec.c b/src/libnm-core-impl/nm-setting-macsec.c
index 8e2336eba4..f66fc52a39 100644
--- a/src/libnm-core-impl/nm-setting-macsec.c
+++ b/src/libnm-core-impl/nm-setting-macsec.c
@@ -456,7 +456,8 @@ nm_setting_macsec_class_init(NMSettingMacsecClass *klass)
PROP_PARENT,
NM_SETTING_PARAM_INFERRABLE,
NMSettingMacsecPrivate,
- parent);
+ parent,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingMacsec:mode:
@@ -507,7 +508,8 @@ nm_setting_macsec_class_init(NMSettingMacsecClass *klass)
PROP_MKA_CAK,
NM_SETTING_PARAM_SECRET,
NMSettingMacsecPrivate,
- mka_cak);
+ mka_cak,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingMacsec:mka-cak-flags:
@@ -539,7 +541,8 @@ nm_setting_macsec_class_init(NMSettingMacsecClass *klass)
PROP_MKA_CKN,
NM_SETTING_PARAM_NONE,
NMSettingMacsecPrivate,
- mka_ckn);
+ mka_ckn,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingMacsec:port:
diff --git a/src/libnm-core-impl/nm-setting-macvlan.c b/src/libnm-core-impl/nm-setting-macvlan.c
index 1f808c3cc0..2adecdfe6c 100644
--- a/src/libnm-core-impl/nm-setting-macvlan.c
+++ b/src/libnm-core-impl/nm-setting-macvlan.c
@@ -226,7 +226,8 @@ nm_setting_macvlan_class_init(NMSettingMacvlanClass *klass)
PROP_PARENT,
NM_SETTING_PARAM_INFERRABLE,
NMSettingMacvlanPrivate,
- parent);
+ parent,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingMacvlan:mode:
diff --git a/src/libnm-core-impl/nm-setting-ovs-bridge.c b/src/libnm-core-impl/nm-setting-ovs-bridge.c
index 909e357650..bc5dd04a68 100644
--- a/src/libnm-core-impl/nm-setting-ovs-bridge.c
+++ b/src/libnm-core-impl/nm-setting-ovs-bridge.c
@@ -242,7 +242,8 @@ nm_setting_ovs_bridge_class_init(NMSettingOvsBridgeClass *klass)
PROP_FAIL_MODE,
NM_SETTING_PARAM_INFERRABLE,
NMSettingOvsBridge,
- fail_mode);
+ fail_mode,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingOvsBridge:mcast-snooping-enable:
@@ -305,7 +306,8 @@ nm_setting_ovs_bridge_class_init(NMSettingOvsBridgeClass *klass)
PROP_DATAPATH_TYPE,
NM_SETTING_PARAM_INFERRABLE,
NMSettingOvsBridge,
- datapath_type);
+ datapath_type,
+ .direct_string_allow_empty = TRUE);
g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties);
diff --git a/src/libnm-core-impl/nm-setting-ovs-dpdk.c b/src/libnm-core-impl/nm-setting-ovs-dpdk.c
index 87e9a3e8ce..53931f469d 100644
--- a/src/libnm-core-impl/nm-setting-ovs-dpdk.c
+++ b/src/libnm-core-impl/nm-setting-ovs-dpdk.c
@@ -190,7 +190,8 @@ nm_setting_ovs_dpdk_class_init(NMSettingOvsDpdkClass *klass)
PROP_DEVARGS,
NM_SETTING_PARAM_INFERRABLE,
NMSettingOvsDpdk,
- devargs);
+ devargs,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingOvsDpdk:n-rxq:
diff --git a/src/libnm-core-impl/nm-setting-ovs-interface.c b/src/libnm-core-impl/nm-setting-ovs-interface.c
index 68ce9ff4dd..8837908755 100644
--- a/src/libnm-core-impl/nm-setting-ovs-interface.c
+++ b/src/libnm-core-impl/nm-setting-ovs-interface.c
@@ -394,7 +394,8 @@ nm_setting_ovs_interface_class_init(NMSettingOvsInterfaceClass *klass)
PROP_TYPE,
NM_SETTING_PARAM_INFERRABLE,
NMSettingOvsInterface,
- type);
+ type,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingOvsInterface:ofport-request:
*
diff --git a/src/libnm-core-impl/nm-setting-ovs-patch.c b/src/libnm-core-impl/nm-setting-ovs-patch.c
index 2781d43599..e44646a65f 100644
--- a/src/libnm-core-impl/nm-setting-ovs-patch.c
+++ b/src/libnm-core-impl/nm-setting-ovs-patch.c
@@ -138,7 +138,8 @@ nm_setting_ovs_patch_class_init(NMSettingOvsPatchClass *klass)
PROP_PEER,
NM_SETTING_PARAM_INFERRABLE,
NMSettingOvsPatch,
- peer);
+ peer,
+ .direct_string_allow_empty = TRUE);
g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties);
diff --git a/src/libnm-core-impl/nm-setting-ovs-port.c b/src/libnm-core-impl/nm-setting-ovs-port.c
index c4c3d88090..f2071d4354 100644
--- a/src/libnm-core-impl/nm-setting-ovs-port.c
+++ b/src/libnm-core-impl/nm-setting-ovs-port.c
@@ -614,7 +614,8 @@ nm_setting_ovs_port_class_init(NMSettingOvsPortClass *klass)
PROP_VLAN_MODE,
NM_SETTING_PARAM_INFERRABLE,
NMSettingOvsPort,
- vlan_mode);
+ vlan_mode,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingOvsPort:tag:
@@ -672,7 +673,8 @@ nm_setting_ovs_port_class_init(NMSettingOvsPortClass *klass)
PROP_LACP,
NM_SETTING_PARAM_INFERRABLE,
NMSettingOvsPort,
- lacp);
+ lacp,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingOvsPort:bond-mode:
@@ -687,7 +689,8 @@ nm_setting_ovs_port_class_init(NMSettingOvsPortClass *klass)
PROP_BOND_MODE,
NM_SETTING_PARAM_INFERRABLE,
NMSettingOvsPort,
- bond_mode);
+ bond_mode,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingOvsPort:bond-updelay:
diff --git a/src/libnm-core-impl/nm-setting-pppoe.c b/src/libnm-core-impl/nm-setting-pppoe.c
index 6c2e1e86a3..48da78e7f1 100644
--- a/src/libnm-core-impl/nm-setting-pppoe.c
+++ b/src/libnm-core-impl/nm-setting-pppoe.c
@@ -240,7 +240,8 @@ nm_setting_pppoe_class_init(NMSettingPppoeClass *klass)
PROP_PARENT,
NM_SETTING_PARAM_INFERRABLE,
NMSettingPppoePrivate,
- parent);
+ parent,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingPppoe:service:
@@ -256,7 +257,8 @@ nm_setting_pppoe_class_init(NMSettingPppoeClass *klass)
PROP_SERVICE,
NM_SETTING_PARAM_NONE,
NMSettingPppoePrivate,
- service);
+ service,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingPppoe:username:
@@ -269,7 +271,8 @@ nm_setting_pppoe_class_init(NMSettingPppoeClass *klass)
PROP_USERNAME,
NM_SETTING_PARAM_NONE,
NMSettingPppoePrivate,
- username);
+ username,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingPppoe:password:
@@ -282,7 +285,8 @@ nm_setting_pppoe_class_init(NMSettingPppoeClass *klass)
PROP_PASSWORD,
NM_SETTING_PARAM_SECRET,
NMSettingPppoePrivate,
- password);
+ password,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingPppoe:password-flags:
diff --git a/src/libnm-core-impl/nm-setting-proxy.c b/src/libnm-core-impl/nm-setting-proxy.c
index 62ba5050a4..e50721dfd0 100644
--- a/src/libnm-core-impl/nm-setting-proxy.c
+++ b/src/libnm-core-impl/nm-setting-proxy.c
@@ -307,7 +307,8 @@ nm_setting_proxy_class_init(NMSettingProxyClass *klass)
PROP_PAC_URL,
NM_SETTING_PARAM_NONE,
NMSettingProxyPrivate,
- pac_url);
+ pac_url,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingProxy:pac-script:
@@ -339,7 +340,8 @@ nm_setting_proxy_class_init(NMSettingProxyClass *klass)
PROP_PAC_SCRIPT,
NM_SETTING_PARAM_NONE,
NMSettingProxyPrivate,
- pac_script);
+ pac_script,
+ .direct_string_allow_empty = TRUE);
g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties);
diff --git a/src/libnm-core-impl/nm-setting-tun.c b/src/libnm-core-impl/nm-setting-tun.c
index a6060850f9..05460104a4 100644
--- a/src/libnm-core-impl/nm-setting-tun.c
+++ b/src/libnm-core-impl/nm-setting-tun.c
@@ -260,7 +260,8 @@ nm_setting_tun_class_init(NMSettingTunClass *klass)
PROP_OWNER,
NM_SETTING_PARAM_INFERRABLE,
NMSettingTunPrivate,
- owner);
+ owner,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingTun:group:
@@ -276,7 +277,8 @@ nm_setting_tun_class_init(NMSettingTunClass *klass)
PROP_GROUP,
NM_SETTING_PARAM_INFERRABLE,
NMSettingTunPrivate,
- group);
+ group,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingTun:pi:
diff --git a/src/libnm-core-impl/nm-setting-veth.c b/src/libnm-core-impl/nm-setting-veth.c
index 40e3c9613a..6b84233d01 100644
--- a/src/libnm-core-impl/nm-setting-veth.c
+++ b/src/libnm-core-impl/nm-setting-veth.c
@@ -146,7 +146,8 @@ nm_setting_veth_class_init(NMSettingVethClass *klass)
PROP_PEER,
NM_SETTING_PARAM_INFERRABLE,
NMSettingVeth,
- _priv.peer);
+ _priv.peer,
+ .direct_string_allow_empty = TRUE);
g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties);
diff --git a/src/libnm-core-impl/nm-setting-vlan.c b/src/libnm-core-impl/nm-setting-vlan.c
index a211d2e637..534ed71372 100644
--- a/src/libnm-core-impl/nm-setting-vlan.c
+++ b/src/libnm-core-impl/nm-setting-vlan.c
@@ -872,7 +872,8 @@ nm_setting_vlan_class_init(NMSettingVlanClass *klass)
PROP_PARENT,
NM_SETTING_PARAM_INFERRABLE,
NMSettingVlanPrivate,
- parent);
+ parent,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingVlan:id:
@@ -963,7 +964,8 @@ nm_setting_vlan_class_init(NMSettingVlanClass *klass)
NM_SETTING_PARAM_INFERRABLE,
NMSettingVlanPrivate,
protocol,
- .direct_string_is_refstr = TRUE);
+ .direct_string_is_refstr = TRUE,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingVlan:ingress-priority-map:
diff --git a/src/libnm-core-impl/nm-setting-vpn.c b/src/libnm-core-impl/nm-setting-vpn.c
index aa030626f7..b867d01860 100644
--- a/src/libnm-core-impl/nm-setting-vpn.c
+++ b/src/libnm-core-impl/nm-setting-vpn.c
@@ -1090,7 +1090,8 @@ nm_setting_vpn_class_init(NMSettingVpnClass *klass)
PROP_SERVICE_TYPE,
NM_SETTING_PARAM_NONE,
NMSettingVpnPrivate,
- service_type);
+ service_type,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingVpn:user-name:
@@ -1108,7 +1109,8 @@ nm_setting_vpn_class_init(NMSettingVpnClass *klass)
PROP_USER_NAME,
NM_SETTING_PARAM_NONE,
NMSettingVpnPrivate,
- user_name);
+ user_name,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingVpn:persistent:
diff --git a/src/libnm-core-impl/nm-setting-vxlan.c b/src/libnm-core-impl/nm-setting-vxlan.c
index 357a9ebd63..50abd883da 100644
--- a/src/libnm-core-impl/nm-setting-vxlan.c
+++ b/src/libnm-core-impl/nm-setting-vxlan.c
@@ -444,7 +444,8 @@ nm_setting_vxlan_class_init(NMSettingVxlanClass *klass)
PROP_PARENT,
NM_SETTING_PARAM_INFERRABLE,
NMSettingVxlanPrivate,
- parent);
+ parent,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingVxlan:id:
@@ -480,7 +481,8 @@ nm_setting_vxlan_class_init(NMSettingVxlanClass *klass)
NMSettingVxlanPrivate,
local,
.direct_set_string_ip_address_addr_family =
- AF_UNSPEC + 1);
+ AF_UNSPEC + 1,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingVxlan:remote:
@@ -499,7 +501,8 @@ nm_setting_vxlan_class_init(NMSettingVxlanClass *klass)
NMSettingVxlanPrivate,
remote,
.direct_set_string_ip_address_addr_family =
- AF_UNSPEC + 1);
+ AF_UNSPEC + 1,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingVxlan:source-port-min:
diff --git a/src/libnm-core-impl/nm-setting-wifi-p2p.c b/src/libnm-core-impl/nm-setting-wifi-p2p.c
index e8ce4bdc83..31dbea5c4d 100644
--- a/src/libnm-core-impl/nm-setting-wifi-p2p.c
+++ b/src/libnm-core-impl/nm-setting-wifi-p2p.c
@@ -201,7 +201,8 @@ nm_setting_wifi_p2p_class_init(NMSettingWifiP2PClass *setting_wifi_p2p_class)
PROP_PEER,
NM_SETTING_PARAM_NONE,
NMSettingWifiP2P,
- _priv.peer);
+ _priv.peer,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingWifiP2P:wps-method:
diff --git a/src/libnm-core-impl/nm-setting-wimax.c b/src/libnm-core-impl/nm-setting-wimax.c
index 37483a54ec..e68aeb3d51 100644
--- a/src/libnm-core-impl/nm-setting-wimax.c
+++ b/src/libnm-core-impl/nm-setting-wimax.c
@@ -175,7 +175,8 @@ nm_setting_wimax_class_init(NMSettingWimaxClass *klass)
NM_SETTING_PARAM_NONE,
NMSettingWimaxPrivate,
network_name,
- .is_deprecated = TRUE, );
+ .is_deprecated = TRUE,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingWimax:mac-address:
diff --git a/src/libnm-core-impl/nm-setting-wired.c b/src/libnm-core-impl/nm-setting-wired.c
index 82c3840ffa..e09fd70d94 100644
--- a/src/libnm-core-impl/nm-setting-wired.c
+++ b/src/libnm-core-impl/nm-setting-wired.c
@@ -1203,7 +1203,8 @@ nm_setting_wired_class_init(NMSettingWiredClass *klass)
PROP_PORT,
NM_SETTING_PARAM_NONE,
NMSettingWiredPrivate,
- port);
+ port,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingWired:speed:
@@ -1269,7 +1270,8 @@ nm_setting_wired_class_init(NMSettingWiredClass *klass)
PROP_DUPLEX,
NM_SETTING_PARAM_NONE,
NMSettingWiredPrivate,
- duplex);
+ duplex,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingWired:auto-negotiate:
@@ -1458,7 +1460,8 @@ nm_setting_wired_class_init(NMSettingWiredClass *klass)
PROP_GENERATE_MAC_ADDRESS_MASK,
NM_SETTING_PARAM_FUZZY_IGNORE,
NMSettingWiredPrivate,
- generate_mac_address_mask);
+ generate_mac_address_mask,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingWired:mac-address-blacklist:
@@ -1556,7 +1559,8 @@ nm_setting_wired_class_init(NMSettingWiredClass *klass)
PROP_S390_NETTYPE,
NM_SETTING_PARAM_INFERRABLE,
NMSettingWiredPrivate,
- s390_nettype);
+ s390_nettype,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingWired:s390-options: (type GHashTable(utf8,utf8))
@@ -1644,7 +1648,8 @@ nm_setting_wired_class_init(NMSettingWiredClass *klass)
PROP_WAKE_ON_LAN_PASSWORD,
NM_SETTING_PARAM_NONE,
NMSettingWiredPrivate,
- wol_password);
+ wol_password,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingWired:accept-all-mac-addresses:
diff --git a/src/libnm-core-impl/nm-setting-wireguard.c b/src/libnm-core-impl/nm-setting-wireguard.c
index f736a54496..1e7ed05b1d 100644
--- a/src/libnm-core-impl/nm-setting-wireguard.c
+++ b/src/libnm-core-impl/nm-setting-wireguard.c
@@ -2363,7 +2363,8 @@ nm_setting_wireguard_class_init(NMSettingWireGuardClass *klass)
NMSettingWireGuard,
_priv.private_key,
.direct_set_fcn.set_string =
- _set_string_fcn_public_key);
+ _set_string_fcn_public_key,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingWireGuard:private-key-flags:
diff --git a/src/libnm-core-impl/nm-setting-wireless-security.c b/src/libnm-core-impl/nm-setting-wireless-security.c
index dc9e28cb9f..e420b32b71 100644
--- a/src/libnm-core-impl/nm-setting-wireless-security.c
+++ b/src/libnm-core-impl/nm-setting-wireless-security.c
@@ -1420,7 +1420,8 @@ nm_setting_wireless_security_class_init(NMSettingWirelessSecurityClass *klass)
NM_SETTING_PARAM_REQUIRED,
NMSettingWirelessSecurityPrivate,
key_mgmt,
- .direct_set_string_ascii_strdown = TRUE);
+ .direct_set_string_ascii_strdown = TRUE,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingWirelessSecurity:wep-tx-keyidx:
@@ -1473,7 +1474,8 @@ nm_setting_wireless_security_class_init(NMSettingWirelessSecurityClass *klass)
NM_SETTING_PARAM_NONE,
NMSettingWirelessSecurityPrivate,
auth_alg,
- .direct_set_string_ascii_strdown = TRUE);
+ .direct_set_string_ascii_strdown = TRUE,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingWirelessSecurity:proto:
@@ -1591,7 +1593,8 @@ nm_setting_wireless_security_class_init(NMSettingWirelessSecurityClass *klass)
PROP_LEAP_USERNAME,
NM_SETTING_PARAM_NONE,
NMSettingWirelessSecurityPrivate,
- leap_username);
+ leap_username,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingWirelessSecurity:wep-key0:
@@ -1611,7 +1614,8 @@ nm_setting_wireless_security_class_init(NMSettingWirelessSecurityClass *klass)
PROP_WEP_KEY0,
NM_SETTING_PARAM_SECRET,
NMSettingWirelessSecurityPrivate,
- wep_key0);
+ wep_key0,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingWirelessSecurity:wep-key1:
@@ -1631,7 +1635,8 @@ nm_setting_wireless_security_class_init(NMSettingWirelessSecurityClass *klass)
PROP_WEP_KEY1,
NM_SETTING_PARAM_SECRET,
NMSettingWirelessSecurityPrivate,
- wep_key1);
+ wep_key1,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingWirelessSecurity:wep-key2:
@@ -1651,7 +1656,8 @@ nm_setting_wireless_security_class_init(NMSettingWirelessSecurityClass *klass)
PROP_WEP_KEY2,
NM_SETTING_PARAM_SECRET,
NMSettingWirelessSecurityPrivate,
- wep_key2);
+ wep_key2,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingWirelessSecurity:wep-key3:
@@ -1671,7 +1677,8 @@ nm_setting_wireless_security_class_init(NMSettingWirelessSecurityClass *klass)
PROP_WEP_KEY3,
NM_SETTING_PARAM_SECRET,
NMSettingWirelessSecurityPrivate,
- wep_key3);
+ wep_key3,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingWirelessSecurity:wep-key-flags:
@@ -1715,7 +1722,8 @@ nm_setting_wireless_security_class_init(NMSettingWirelessSecurityClass *klass)
PROP_PSK,
NM_SETTING_PARAM_SECRET,
NMSettingWirelessSecurityPrivate,
- psk);
+ psk,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingWirelessSecurity:psk-flags:
@@ -1757,7 +1765,8 @@ nm_setting_wireless_security_class_init(NMSettingWirelessSecurityClass *klass)
PROP_LEAP_PASSWORD,
NM_SETTING_PARAM_SECRET,
NMSettingWirelessSecurityPrivate,
- leap_password);
+ leap_password,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingWirelessSecurity:leap-password-flags:
diff --git a/src/libnm-core-impl/nm-setting-wireless.c b/src/libnm-core-impl/nm-setting-wireless.c
index 0bc72116b9..152bbde3d9 100644
--- a/src/libnm-core-impl/nm-setting-wireless.c
+++ b/src/libnm-core-impl/nm-setting-wireless.c
@@ -1413,7 +1413,8 @@ nm_setting_wireless_class_init(NMSettingWirelessClass *klass)
PROP_MODE,
NM_SETTING_PARAM_NONE,
NMSettingWirelessPrivate,
- mode);
+ mode,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingWireless:band:
@@ -1440,7 +1441,8 @@ nm_setting_wireless_class_init(NMSettingWirelessClass *klass)
PROP_BAND,
NM_SETTING_PARAM_NONE,
NMSettingWirelessPrivate,
- band);
+ band,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingWireless:channel:
@@ -1707,7 +1709,8 @@ nm_setting_wireless_class_init(NMSettingWirelessClass *klass)
PROP_GENERATE_MAC_ADDRESS_MASK,
NM_SETTING_PARAM_FUZZY_IGNORE,
NMSettingWirelessPrivate,
- generate_mac_address_mask);
+ generate_mac_address_mask,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingWireless:mac-address-blacklist:
diff --git a/src/libnm-core-impl/nm-setting-wpan.c b/src/libnm-core-impl/nm-setting-wpan.c
index 0bfbed7f9b..ba947a863d 100644
--- a/src/libnm-core-impl/nm-setting-wpan.c
+++ b/src/libnm-core-impl/nm-setting-wpan.c
@@ -255,7 +255,8 @@ nm_setting_wpan_class_init(NMSettingWpanClass *klass)
NMSettingWpanPrivate,
mac_address,
.direct_set_string_mac_address_len =
- IEEE802154_ADDR_LEN);
+ IEEE802154_ADDR_LEN,
+ .direct_string_allow_empty = TRUE);
/**
* NMSettingWpan:pan-id:
diff --git a/src/libnm-core-impl/nm-setting.c b/src/libnm-core-impl/nm-setting.c
index 224361fdfd..758338e5ce 100644
--- a/src/libnm-core-impl/nm-setting.c
+++ b/src/libnm-core-impl/nm-setting.c
@@ -2405,17 +2405,87 @@ nm_setting_verify(NMSetting *setting, NMConnection *connection, GError **error)
return result == NM_SETTING_VERIFY_SUCCESS || result == NM_SETTING_VERIFY_NORMALIZABLE;
}
+static gboolean
+_verify_properties(NMSetting *setting, GError **error)
+{
+ NMSettingClass *klass = NM_SETTING_GET_CLASS(setting);
+ const NMSettInfoSetting *sett_info = _nm_setting_class_get_sett_info(klass);
+ guint16 i;
+
+ if (!sett_info)
+ return TRUE;
+
+ for (i = 0; i < sett_info->property_infos_len; i++) {
+ const NMSettInfoProperty *property_info = &sett_info->property_infos[i];
+
+ switch (property_info->property_type->direct_type) {
+ case NM_VALUE_TYPE_BOOL:
+ case NM_VALUE_TYPE_BYTES:
+ case NM_VALUE_TYPE_STRV:
+ case NM_VALUE_TYPE_ENUM:
+ case NM_VALUE_TYPE_FLAGS:
+ case NM_VALUE_TYPE_INT32:
+ case NM_VALUE_TYPE_INT64:
+ case NM_VALUE_TYPE_NONE:
+ case NM_VALUE_TYPE_UINT32:
+ case NM_VALUE_TYPE_UINT64:
+ break;
+ case NM_VALUE_TYPE_STRING:
+ {
+ const char *val;
+
+ if (!property_info->direct_string_allow_empty
+ && (val = *((const char *const *)
+ _nm_setting_get_private_field(setting, sett_info, property_info)))
+ && val[0] == '\0') {
+ g_set_error_literal(error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("cannot be empty"));
+ g_prefix_error(error,
+ "%s.%s: ",
+ klass->setting_info->setting_name,
+ property_info->name);
+ return FALSE;
+ }
+ break;
+ }
+ default:
+ nm_assert_not_reached();
+ }
+ }
+
+ return TRUE;
+}
+
NMSettingVerifyResult
_nm_setting_verify(NMSetting *setting, NMConnection *connection, GError **error)
{
+ NMSettingClass *klass;
+ NMSettingVerifyResult r;
+
g_return_val_if_fail(NM_IS_SETTING(setting), NM_SETTING_VERIFY_ERROR);
g_return_val_if_fail(!connection || NM_IS_CONNECTION(connection), NM_SETTING_VERIFY_ERROR);
g_return_val_if_fail(!error || *error == NULL, NM_SETTING_VERIFY_ERROR);
- if (NM_SETTING_GET_CLASS(setting)->verify)
- return NM_SETTING_GET_CLASS(setting)->verify(setting, connection, error);
+ klass = NM_SETTING_GET_CLASS(setting);
- return NM_SETTING_VERIFY_SUCCESS;
+ if (!klass->verify)
+ return NM_SETTING_VERIFY_SUCCESS;
+
+ r = klass->verify(setting, connection, error);
+
+ if (r != NM_SETTING_VERIFY_ERROR) {
+ gs_free_error GError *local = NULL;
+
+ if (!_verify_properties(setting, &local)) {
+ g_clear_error(error);
+ g_propagate_error(error, g_steal_pointer(&local));
+ r = NM_SETTING_VERIFY_ERROR;
+ }
+ }
+
+ return r;
}
/**
diff --git a/src/libnm-core-impl/tests/test-general.c b/src/libnm-core-impl/tests/test-general.c
index a29ccec8ac..4acf33e0a4 100644
--- a/src/libnm-core-impl/tests/test-general.c
+++ b/src/libnm-core-impl/tests/test-general.c
@@ -2643,7 +2643,7 @@ test_setting_gsm_apn_bad_chars(void)
/* Make sure a valid APN works */
g_object_set(s_gsm, NM_SETTING_GSM_APN, "foobar123.-baz", NULL);
- g_assert(nm_setting_verify(NM_SETTING(s_gsm), NULL, NULL));
+ nmtst_assert_setting_verifies(s_gsm);
/* Random invalid chars */
g_object_set(s_gsm, NM_SETTING_GSM_APN, "@#%$@#%@#%", NULL);
@@ -2655,7 +2655,7 @@ test_setting_gsm_apn_bad_chars(void)
/* 0 characters long */
g_object_set(s_gsm, NM_SETTING_GSM_APN, "", NULL);
- g_assert(nm_setting_verify(NM_SETTING(s_gsm), NULL, NULL));
+ nmtst_assert_setting_verifies(s_gsm);
/* 65-character long */
g_object_set(s_gsm,
diff --git a/src/libnm-core-impl/tests/test-setting.c b/src/libnm-core-impl/tests/test-setting.c
index a279e3af9d..e4f3ab9fc1 100644
--- a/src/libnm-core-impl/tests/test-setting.c
+++ b/src/libnm-core-impl/tests/test-setting.c
@@ -4740,6 +4740,9 @@ test_setting_metadata(void)
}
if (sip->direct_strv_preserve_empty)
g_assert(sip->property_type->direct_type == NM_VALUE_TYPE_STRV);
+ if (sip->direct_string_allow_empty) {
+ g_assert(sip->property_type->direct_type == NM_VALUE_TYPE_STRING);
+ }
if (sip->direct_set_string_mac_address_len != 0) {
g_assert(NM_IN_SET(sip->property_type,
diff --git a/src/libnm-core-intern/nm-core-internal.h b/src/libnm-core-intern/nm-core-internal.h
index 1fc33550c8..8e2573370b 100644
--- a/src/libnm-core-intern/nm-core-internal.h
+++ b/src/libnm-core-intern/nm-core-internal.h
@@ -839,6 +839,23 @@ struct _NMSettInfoProperty {
/* Whether the string property is implemented as a (downcast) NMRefString. */
bool direct_string_is_refstr : 1;
+ /* Usually, string properties cannot be empty (because it's unclear how
+ * that relates to NULL and how to distinguish that in nmcli). In some
+ * cases, it's allowed however (e.g. "gsm.apm").
+ *
+ * The lack of this flag indicates to perform an additional check after
+ * verify(), that the string is not empty.
+ *
+ * In some cases, we can also normalize an empty value, in which case verify()
+ * also allows the string to be empty.
+ *
+ * FIXME: historically, many properties allowed to be empty. Hence, to
+ * preserve behavior this flag is also set for many properties where it
+ * maybe should not be set. We should review the use of this flag and clear
+ * it where possible. New properties generally should not allow empty
+ * strings (unless they have specific reasons). */
+ bool direct_string_allow_empty : 1;
+
/* Usually, for strv arrays (NM_VALUE_TYPE_STRV, NMValueStrv) there is little
* difference between NULL/unset and empty arrays. E.g. g_object_get() will
* return NULL and never an empty strv array.
diff --git a/src/libnm-glib-aux/nm-test-utils.h b/src/libnm-glib-aux/nm-test-utils.h
index 34b83beeef..2a6a5d3a5a 100644
--- a/src/libnm-glib-aux/nm-test-utils.h
+++ b/src/libnm-glib-aux/nm-test-utils.h
@@ -2566,20 +2566,21 @@ nmtst_assert_connection_unnormalizable(NMConnection *con,
g_clear_error(&error);
}
-static inline void
-nmtst_assert_setting_verifies(NMSetting *setting)
-{
- /* assert that the setting verifies without an error */
-
- GError *error = NULL;
- gboolean success;
-
- g_assert(NM_IS_SETTING(setting));
-
- success = nm_setting_verify(setting, NULL, &error);
- g_assert_no_error(error);
- g_assert(success);
-}
+#define nmtst_assert_setting_verifies(setting) \
+ G_STMT_START \
+ { \
+ NMSetting *_setting = NM_SETTING(setting); \
+ GError *_error = NULL; \
+ gboolean _success; \
+ \
+ /* assert that the setting verifies without an error */ \
+ \
+ g_assert(NM_IS_SETTING(_setting)); \
+ \
+ _success = nm_setting_verify(_setting, NULL, &_error); \
+ nmtst_assert_success(_success, _error); \
+ } \
+ G_STMT_END
#if defined(__NM_SIMPLE_CONNECTION_H__) && NM_CHECK_VERSION(1, 10, 0) \
&& (!defined(NM_VERSION_MAX_ALLOWED) || NM_VERSION_MAX_ALLOWED >= NM_VERSION_1_10)
diff --git a/src/libnmc-setting/settings-docs.h.in b/src/libnmc-setting/settings-docs.h.in
index be9a938508..77cde6620e 100644
--- a/src/libnmc-setting/settings-docs.h.in
+++ b/src/libnmc-setting/settings-docs.h.in
@@ -139,7 +139,7 @@
#define DESCRIBE_DOC_NM_SETTING_DCB_PRIORITY_GROUP_ID N_("An array of 8 uint values, where the array index corresponds to the User Priority (0 - 7) and the value indicates the Priority Group ID. Allowed Priority Group ID values are 0 - 7 or 15 for the unrestricted group.")
#define DESCRIBE_DOC_NM_SETTING_DCB_PRIORITY_STRICT_BANDWIDTH N_("An array of 8 boolean values, where the array index corresponds to the User Priority (0 - 7) and the value indicates whether or not the priority may use all of the bandwidth allocated to its assigned group.")
#define DESCRIBE_DOC_NM_SETTING_DCB_PRIORITY_TRAFFIC_CLASS N_("An array of 8 uint values, where the array index corresponds to the User Priority (0 - 7) and the value indicates the traffic class (0 - 7) to which the priority is mapped.")
-#define DESCRIBE_DOC_NM_SETTING_GSM_APN N_("The GPRS Access Point Name specifying the APN used when establishing a data session with the GSM-based network. The APN often determines how the user will be billed for their network usage and whether the user has access to the Internet or just a provider-specific walled-garden, so it is important to use the correct APN for the user's mobile broadband plan. The APN may only be composed of the characters a-z, 0-9, ., and - per GSM 03.60 Section 14.9.")
+#define DESCRIBE_DOC_NM_SETTING_GSM_APN N_("The GPRS Access Point Name specifying the APN used when establishing a data session with the GSM-based network. The APN often determines how the user will be billed for their network usage and whether the user has access to the Internet or just a provider-specific walled-garden, so it is important to use the correct APN for the user's mobile broadband plan. The APN may only be composed of the characters a-z, 0-9, ., and - per GSM 03.60 Section 14.9. If the APN is unset (the default) then it may be detected based on \"auto-config\" setting. The property can be explicitly set to the empty string to prevent that and use no APN.")
#define DESCRIBE_DOC_NM_SETTING_GSM_AUTO_CONFIG N_("When TRUE, the settings such as APN, username, or password will default to values that match the network the modem will register to in the Mobile Broadband Provider database.")
#define DESCRIBE_DOC_NM_SETTING_GSM_DEVICE_ID N_("The device unique identifier (as given by the WWAN management service) which this connection applies to. If given, the connection will only apply to the specified device.")
#define DESCRIBE_DOC_NM_SETTING_GSM_HOME_ONLY N_("When TRUE, only connections to the home network will be allowed. Connections to roaming networks will not be made.")
diff --git a/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in b/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in
index 99cf1b16c7..8806bf2550 100644
--- a/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in
+++ b/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in
@@ -1089,7 +1089,7 @@
values="none (0x0), agent-owned (0x1), not-saved (0x2), not-required (0x4)" />