diff options
author | Thomas Haller <thaller@redhat.com> | 2019-01-13 21:23:02 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2019-01-22 16:30:23 +0100 |
commit | 08a0f682e192b4288170171bb89727d944555d4c (patch) | |
tree | 6d2125da4508f9a927e11b4751889973885d668e /libnm-core/nm-setting-vpn.c | |
parent | 2210d4514eb9f9dec5ca55415cc8b8dd0f9afefc (diff) | |
download | NetworkManager-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).
Diffstat (limited to 'libnm-core/nm-setting-vpn.c')
-rw-r--r-- | libnm-core/nm-setting-vpn.c | 52 |
1 files changed, 33 insertions, 19 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: |