diff options
| author | Thomas Haller <thaller@redhat.com> | 2020-03-26 16:39:51 +0100 |
|---|---|---|
| committer | Thomas Haller <thaller@redhat.com> | 2020-04-04 19:51:34 +0200 |
| commit | 7842da160622043e2c1c63b6f3ae87ff1bb608d1 (patch) | |
| tree | a92db5094fb12ab85687eb2154151fa76a421843 | |
| parent | 3d9d2ad6511ef27dd695c0611b5c3a01523e36a3 (diff) | |
| download | NetworkManager-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.c | 33 |
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); |
