summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2019-01-13 21:23:02 +0100
committerThomas Haller <thaller@redhat.com>2019-01-22 16:30:23 +0100
commit08a0f682e192b4288170171bb89727d944555d4c (patch)
tree6d2125da4508f9a927e11b4751889973885d668e
parent2210d4514eb9f9dec5ca55415cc8b8dd0f9afefc (diff)
downloadNetworkManager-08a0f682e192b4288170171bb89727d944555d4c.tar.gz
libnm: always call clear_secrets() function for all properties
And merge it with the version that uses no flags. Previously, clear_secrets(_with_flags()) was only implemented by NMSettingVpn. All other settings would only consider GObject-based properties. As we will add secrets that have no GObject property, call the virtual function always, so that the setting can hook into this (for WireGuard peers).
-rw-r--r--libnm-core/nm-setting-vpn.c52
-rw-r--r--libnm-core/nm-setting.c87
-rw-r--r--libnm-core/nm-setting.h10
3 files changed, 80 insertions, 69 deletions
diff --git a/libnm-core/nm-setting-vpn.c b/libnm-core/nm-setting-vpn.c
index 581c70d02a..1371140ec4 100644
--- a/libnm-core/nm-setting-vpn.c
+++ b/libnm-core/nm-setting-vpn.c
@@ -813,29 +813,43 @@ compare_property (const NMSettInfoSetting *sett_info,
}
static gboolean
-clear_secrets_with_flags (NMSetting *setting,
- GParamSpec *pspec,
- NMSettingClearSecretsWithFlagsFn func,
- gpointer user_data)
+clear_secrets (const NMSettInfoSetting *sett_info,
+ guint property_idx,
+ NMSetting *setting,
+ NMSettingClearSecretsWithFlagsFn func,
+ gpointer user_data)
{
NMSettingVpnPrivate *priv = NM_SETTING_VPN_GET_PRIVATE (setting);
+ GParamSpec *prop_spec = sett_info->property_infos[property_idx].param_spec;
GHashTableIter iter;
const char *secret;
gboolean changed = TRUE;
- if (priv->secrets == NULL)
+ if ( !prop_spec
+ || !NM_FLAGS_HAS (prop_spec->flags, NM_SETTING_PARAM_SECRET))
+ return FALSE;
+
+ nm_assert (nm_streq (prop_spec->name, NM_SETTING_VPN_SECRETS));
+
+ if (!priv->secrets)
return FALSE;
- /* Iterate through secrets hash and check each entry */
g_hash_table_iter_init (&iter, priv->secrets);
while (g_hash_table_iter_next (&iter, (gpointer) &secret, NULL)) {
- NMSettingSecretFlags flags = NM_SETTING_SECRET_FLAG_NONE;
- nm_setting_get_secret_flags (setting, secret, &flags, NULL);
- if (func (setting, secret, flags, user_data) == TRUE) {
- g_hash_table_iter_remove (&iter);
- changed = TRUE;
- }
+ if (func) {
+ NMSettingSecretFlags flags = NM_SETTING_SECRET_FLAG_NONE;
+
+ if (!nm_setting_get_secret_flags (setting, secret, &flags, NULL))
+ nm_assert_not_reached ();
+
+ if (!func (setting, secret, flags, user_data))
+ continue;
+ } else
+ nm_assert (nm_setting_get_secret_flags (setting, secret, NULL, NULL));
+
+ g_hash_table_iter_remove (&iter);
+ changed = TRUE;
}
if (changed)
@@ -963,13 +977,13 @@ nm_setting_vpn_class_init (NMSettingVpnClass *klass)
object_class->set_property = set_property;
object_class->finalize = finalize;
- setting_class->verify = verify;
- setting_class->update_one_secret = update_one_secret;
- setting_class->get_secret_flags = get_secret_flags;
- setting_class->set_secret_flags = set_secret_flags;
- setting_class->need_secrets = need_secrets;
- setting_class->compare_property = compare_property;
- setting_class->clear_secrets_with_flags = clear_secrets_with_flags;
+ setting_class->verify = verify;
+ setting_class->update_one_secret = update_one_secret;
+ setting_class->get_secret_flags = get_secret_flags;
+ setting_class->set_secret_flags = set_secret_flags;
+ setting_class->need_secrets = need_secrets;
+ setting_class->compare_property = compare_property;
+ setting_class->clear_secrets = clear_secrets;
/**
* NMSettingVpn:service-type:
diff --git a/libnm-core/nm-setting.c b/libnm-core/nm-setting.c
index b00f0ab981..976f7f0085 100644
--- a/libnm-core/nm-setting.c
+++ b/libnm-core/nm-setting.c
@@ -1841,34 +1841,42 @@ _nm_setting_aggregate (NMSetting *setting,
}
static gboolean
-clear_secrets_with_flags (NMSetting *setting,
- GParamSpec *pspec,
- NMSettingClearSecretsWithFlagsFn func,
- gpointer user_data)
+clear_secrets (const NMSettInfoSetting *sett_info,
+ guint property_idx,
+ NMSetting *setting,
+ NMSettingClearSecretsWithFlagsFn func,
+ gpointer user_data)
{
NMSettingSecretFlags flags = NM_SETTING_SECRET_FLAG_NONE;
- gboolean changed = FALSE;
+ GParamSpec *param_spec = sett_info->property_infos[property_idx].param_spec;
- g_return_val_if_fail (!NM_IS_SETTING_VPN (setting), FALSE);
+ if (!param_spec)
+ return FALSE;
- /* Clear the secret if the user function says to do so */
- if (!nm_setting_get_secret_flags (setting, pspec->name, &flags, NULL))
- g_return_val_if_reached (FALSE);
+ if (!NM_FLAGS_HAS (param_spec->flags, NM_SETTING_PARAM_SECRET))
+ return FALSE;
- if (func (setting, pspec->name, flags, user_data) == TRUE) {
- GValue value = G_VALUE_INIT;
+ if (func) {
+ if (!nm_setting_get_secret_flags (setting, param_spec->name, &flags, NULL))
+ nm_assert_not_reached ();
+ if (!func (setting, param_spec->name, flags, user_data))
+ return FALSE;
+ } else
+ nm_assert (nm_setting_get_secret_flags (setting, param_spec->name, NULL, NULL));
- g_value_init (&value, pspec->value_type);
- g_object_get_property (G_OBJECT (setting), pspec->name, &value);
- if (!g_param_value_defaults (pspec, &value)) {
- g_param_value_set_default (pspec, &value);
- g_object_set_property (G_OBJECT (setting), pspec->name, &value);
- changed = TRUE;
- }
- g_value_unset (&value);
+ {
+ nm_auto_unset_gvalue GValue value = G_VALUE_INIT;
+
+ g_value_init (&value, param_spec->value_type);
+ g_object_get_property (G_OBJECT (setting), param_spec->name, &value);
+ if (g_param_value_defaults (param_spec, &value))
+ return FALSE;
+
+ g_param_value_set_default (param_spec, &value);
+ g_object_set_property (G_OBJECT (setting), param_spec->name, &value);
}
- return changed;
+ return TRUE;
}
/**
@@ -1890,36 +1898,23 @@ _nm_setting_clear_secrets (NMSetting *setting,
const NMSettInfoSetting *sett_info;
gboolean changed = FALSE;
guint i;
+ gboolean (*my_clear_secrets) (const struct _NMSettInfoSetting *sett_info,
+ guint property_idx,
+ NMSetting *setting,
+ NMSettingClearSecretsWithFlagsFn func,
+ gpointer user_data);
g_return_val_if_fail (NM_IS_SETTING (setting), FALSE);
+ my_clear_secrets = NM_SETTING_GET_CLASS (setting)->clear_secrets;
+
sett_info = _nm_setting_class_get_sett_info (NM_SETTING_GET_CLASS (setting));
for (i = 0; i < sett_info->property_infos_len; i++) {
- GParamSpec *prop_spec = sett_info->property_infos[i].param_spec;
-
- if (!prop_spec)
- continue;
-
- if (!NM_FLAGS_HAS (prop_spec->flags, NM_SETTING_PARAM_SECRET))
- continue;
-
- if (func) {
- changed |= NM_SETTING_GET_CLASS (setting)->clear_secrets_with_flags (setting,
- prop_spec,
- func,
- user_data);
- } else {
- GValue value = G_VALUE_INIT;
-
- g_value_init (&value, prop_spec->value_type);
- g_object_get_property (G_OBJECT (setting), prop_spec->name, &value);
- if (!g_param_value_defaults (prop_spec, &value)) {
- g_param_value_set_default (prop_spec, &value);
- g_object_set_property (G_OBJECT (setting), prop_spec->name, &value);
- changed = TRUE;
- }
- g_value_unset (&value);
- }
+ changed |= my_clear_secrets (sett_info,
+ i,
+ setting,
+ func,
+ user_data);
}
return changed;
}
@@ -2575,7 +2570,7 @@ nm_setting_class_init (NMSettingClass *setting_class)
setting_class->get_secret_flags = get_secret_flags;
setting_class->set_secret_flags = set_secret_flags;
setting_class->compare_property = compare_property;
- setting_class->clear_secrets_with_flags = clear_secrets_with_flags;
+ setting_class->clear_secrets = clear_secrets;
setting_class->duplicate_copy_properties = duplicate_copy_properties;
/**
diff --git a/libnm-core/nm-setting.h b/libnm-core/nm-setting.h
index dfdb6cf177..0f0ac8f382 100644
--- a/libnm-core/nm-setting.h
+++ b/libnm-core/nm-setting.h
@@ -200,10 +200,12 @@ typedef struct {
NMSettingSecretFlags flags,
GError **error);
- gboolean (*clear_secrets_with_flags) (NMSetting *setting,
- GParamSpec *pspec,
- NMSettingClearSecretsWithFlagsFn func,
- gpointer user_data);
+ /*< private >*/
+ gboolean (*clear_secrets) (const struct _NMSettInfoSetting *sett_info,
+ guint property_idx,
+ NMSetting *setting,
+ NMSettingClearSecretsWithFlagsFn func,
+ gpointer user_data);
/* compare_property() returns a ternary, where DEFAULT means that the property should not
* be compared due to the compare @flags. A TRUE/FALSE result means that the property is