summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2020-03-26 16:39:51 +0100
committerThomas Haller <thaller@redhat.com>2020-04-04 19:51:34 +0200
commit7842da160622043e2c1c63b6f3ae87ff1bb608d1 (patch)
treea92db5094fb12ab85687eb2154151fa76a421843
parent3d9d2ad6511ef27dd695c0611b5c3a01523e36a3 (diff)
downloadNetworkManager-7842da160622043e2c1c63b6f3ae87ff1bb608d1.tar.gz
libnm: convert vpn-secrets to D-Bus in stable order
We should generate the GVariant in a stable manner. That implies to sort the keys first. Also, don't use the NM_SETTING_VPN_SECRETS getter, which first needs to clone all secrets.
-rw-r--r--libnm-core/nm-setting-vpn.c33
1 files changed, 17 insertions, 16 deletions
diff --git a/libnm-core/nm-setting-vpn.c b/libnm-core/nm-setting-vpn.c
index ab712fdaad..baca3f3222 100644
--- a/libnm-core/nm-setting-vpn.c
+++ b/libnm-core/nm-setting-vpn.c
@@ -964,29 +964,30 @@ vpn_secrets_to_dbus (const NMSettInfoSetting *sett_info,
NMConnectionSerializationFlags flags,
const NMConnectionSerializationOptions *options)
{
- gs_unref_hashtable GHashTable *secrets = NULL;
- const char *property_name = sett_info->property_infos[property_idx].name;
+ NMSettingVpnPrivate *priv = NM_SETTING_VPN_GET_PRIVATE (setting);
GVariantBuilder builder;
- GHashTableIter iter;
- const char *key, *value;
- NMSettingSecretFlags secret_flags;
+ gs_free const char **keys = NULL;
+ guint i, len;
if (NM_FLAGS_HAS (flags, NM_CONNECTION_SERIALIZE_NO_SECRETS))
return NULL;
g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{ss}"));
- g_object_get (setting, property_name, &secrets, NULL);
-
- if (secrets) {
- g_hash_table_iter_init (&iter, secrets);
- while (g_hash_table_iter_next (&iter, (gpointer *) &key, (gpointer *) &value)) {
- if (NM_FLAGS_HAS (flags, NM_CONNECTION_SERIALIZE_WITH_SECRETS_AGENT_OWNED)) {
- if ( !nm_setting_get_secret_flags (setting, key, &secret_flags, NULL)
- || !NM_FLAGS_HAS (secret_flags, NM_SETTING_SECRET_FLAG_AGENT_OWNED))
- continue;
- }
- g_variant_builder_add (&builder, "{ss}", key, value);
+
+ keys = nm_utils_strdict_get_keys (priv->secrets, TRUE, &len);
+ for (i = 0; i < len; i++) {
+ const char *key = keys[i];
+ NMSettingSecretFlags secret_flags;
+
+ if (NM_FLAGS_HAS (flags, NM_CONNECTION_SERIALIZE_WITH_SECRETS_AGENT_OWNED)) {
+ if ( !nm_setting_get_secret_flags (setting, key, &secret_flags, NULL)
+ || !NM_FLAGS_HAS (secret_flags, NM_SETTING_SECRET_FLAG_AGENT_OWNED))
+ continue;
}
+ g_variant_builder_add (&builder,
+ "{ss}",
+ key,
+ g_hash_table_lookup (priv->secrets, key));
}
return g_variant_builder_end (&builder);