From d9c879433832575d7cb76ab59d40a8453680a519 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 19 Mar 2019 11:59:25 +0100 Subject: [PATCH] cli: support validating multilist entries for remove-by-value --- clients/common/nm-meta-setting-desc.c | 57 ++++++++++++++++++--------- clients/common/nm-meta-setting-desc.h | 6 +++ 2 files changed, 44 insertions(+), 19 deletions(-) diff --git a/clients/common/nm-meta-setting-desc.c b/clients/common/nm-meta-setting-desc.c index 66001548bc..b6469173e8 100644 --- a/clients/common/nm-meta-setting-desc.c +++ b/clients/common/nm-meta-setting-desc.c @@ -1631,6 +1631,30 @@ vpn_data_item (const char *key, const char *value, gpointer user_data) g_string_append_printf (ret_str, "%s = %s", key, value); } +static const char * +_multilist_do_validate (const NMMetaPropertyInfo *property_info, + gboolean for_set /* else for remove */, + NMSetting *setting, + const char *item, + GError **error) +{ + if (property_info->property_typ_data->values_static) { + nm_assert (!property_info->property_typ_data->subtype.multilist.validate_fcn); + return nmc_string_is_valid (item, + (const char **) property_info->property_typ_data->values_static, + error); + } + if ( property_info->property_typ_data->subtype.multilist.validate_fcn + && !( for_set + ? property_info->property_typ_data->subtype.multilist.no_validate_add + : property_info->property_typ_data->subtype.multilist.no_validate_remove_by_value)) { + return property_info->property_typ_data->subtype.multilist.validate_fcn (item, + error); + } + + return item; +} + static gboolean _set_fcn_multilist (ARGS_SET_FCN) { @@ -1645,18 +1669,15 @@ _set_fcn_multilist (ARGS_SET_FCN) for (i = 0; strv[i]; i++) { const char *item = strv[i]; - if (property_info->property_typ_data->values_static) { - item = nmc_string_is_valid (item, - (const char **) property_info->property_typ_data->values_static, - error); - if (!item) - return FALSE; - } else if (property_info->property_typ_data->subtype.multilist.validate_fcn) { - item = property_info->property_typ_data->subtype.multilist.validate_fcn (item, - error); - if (!item) - return FALSE; - } + item = nm_str_skip_leading_spaces (item); + if (item[0] == '\0') + continue; + + g_strchomp ((char *) item); + + item = _multilist_do_validate (property_info, TRUE, setting, item, error); + if (!item) + return FALSE; property_info->property_typ_data->subtype.multilist.add_fcn (setting, item); } @@ -1690,13 +1711,9 @@ _remove_fcn_multilist (ARGS_REMOVE_FCN) value = nm_strstrip_avoid_copy (value, &value_to_free); - if (property_info->property_typ_data->values_static) { - value = nmc_string_is_valid (value, - (const char **) property_info->property_typ_data->values_static, - error); - if (!value) - return FALSE; - } + value = _multilist_do_validate (property_info, FALSE, setting, value, error); + if (!value) + return FALSE; property_info->property_typ_data->subtype.multilist.remove_by_value_fcn (setting, value); return TRUE; @@ -5534,6 +5551,7 @@ static const NMMetaPropertyInfo *const property_infos_IP4_CONFIG[] = { .remove_by_idx_fcn_s = MULTILIST_REMOVE_BY_IDX_FCN_S (NMSettingIPConfig, nm_setting_ip_config_remove_dns_search), .remove_by_value_fcn = MULTILIST_REMOVE_BY_VALUE_FCN (NMSettingIPConfig, nm_setting_ip_config_remove_dns_search_by_value), .validate_fcn = _multilist_validate_fcn_is_domain, + .no_validate_remove_by_value = TRUE, ), ), ), @@ -5709,6 +5727,7 @@ static const NMMetaPropertyInfo *const property_infos_IP6_CONFIG[] = { .remove_by_idx_fcn_s = MULTILIST_REMOVE_BY_IDX_FCN_S (NMSettingIPConfig, nm_setting_ip_config_remove_dns_search), .remove_by_value_fcn = MULTILIST_REMOVE_BY_VALUE_FCN (NMSettingIPConfig, nm_setting_ip_config_remove_dns_search_by_value), .validate_fcn = _multilist_validate_fcn_is_domain, + .no_validate_remove_by_value = TRUE, ), ), ), diff --git a/clients/common/nm-meta-setting-desc.h b/clients/common/nm-meta-setting-desc.h index 3d8a3bb13b..2319c19e09 100644 --- a/clients/common/nm-meta-setting-desc.h +++ b/clients/common/nm-meta-setting-desc.h @@ -276,6 +276,12 @@ struct _NMMetaPropertyTypData { void (*remove_by_idx_fcn_u32) (NMSetting *setting, guint32 idx); void (*remove_by_idx_fcn_s) (NMSetting *setting, int idx); gboolean (*remove_by_value_fcn) (NMSetting *setting, const char *item); + + /* if TRUE, validate_fcn() is ignored for add_fcn(). */ + bool no_validate_add:1; + + /* if TRUE, validate_fcn() is ignored for remove_by_value(). */ + bool no_validate_remove_by_value:1; } multilist; struct { gboolean (*add_fcn) (NMSetting *setting,