diff options
| author | Michael Biebl <biebl@debian.org> | 2018-05-11 22:08:45 +0200 |
|---|---|---|
| committer | Michael Biebl <biebl@debian.org> | 2018-05-11 22:08:45 +0200 |
| commit | ee9c73a923909e23a649407be77e25235d769e25 (patch) | |
| tree | e21c923621fa278e737da693df9eb60ea31a6067 /libnm-core/nm-setting-vpn.c | |
| parent | f60117b41d5433be1b4a96d82cd11d0c3dce9b63 (diff) | |
New upstream version 1.10.8 upstream/1.10.8
Diffstat (limited to 'libnm-core/nm-setting-vpn.c')
| -rw-r--r-- | libnm-core/nm-setting-vpn.c | 130 |
1 files changed, 37 insertions, 93 deletions
diff --git a/libnm-core/nm-setting-vpn.c b/libnm-core/nm-setting-vpn.c index a921f51f..34607252 100644 --- a/libnm-core/nm-setting-vpn.c +++ b/libnm-core/nm-setting-vpn.c @@ -216,30 +216,6 @@ nm_setting_vpn_get_data_item (NMSettingVpn *setting, const char *key) } /** - * nm_setting_vpn_get_data_keys: - * @setting: the #NMSettingVpn - * @out_length: (allow-none): (out): the length of the returned array - * - * Retrieves every data key inside @setting, as an array. - * - * Returns: (array length=out_length) (transfer container): a - * %NULL-terminated array containing each data key or %NULL if - * there are no data items. - * - * Since: 1.12 - */ -const char ** -nm_setting_vpn_get_data_keys (NMSettingVpn *setting, - guint *out_length) -{ - g_return_val_if_fail (NM_IS_SETTING_VPN (setting), NULL); - - return nm_utils_strdict_get_keys (NM_SETTING_VPN_GET_PRIVATE (setting)->data, - TRUE, - out_length); -} - -/** * nm_setting_vpn_remove_data_item: * @setting: the #NMSettingVpn * @key: the name of the data item to remove @@ -264,52 +240,32 @@ nm_setting_vpn_remove_data_item (NMSettingVpn *setting, const char *key) } static void -foreach_item_helper (NMSettingVpn *self, - gboolean is_secrets, +foreach_item_helper (GHashTable *hash, NMVpnIterFunc func, gpointer user_data) { - NMSettingVpnPrivate *priv; - guint len, i; - gs_strfreev char **keys = NULL; - GHashTable *hash; + GList *keys, *liter; + GSList *copied = NULL, *siter; - nm_assert (NM_IS_SETTING_VPN (self)); - nm_assert (func); + g_return_if_fail (hash != NULL); - priv = NM_SETTING_VPN_GET_PRIVATE (self); + /* Grab keys and copy them so that the callback func can modify + * the hash table items if it wants to. + */ + keys = g_hash_table_get_keys (hash); + for (liter = keys; liter; liter = g_list_next (liter)) + copied = g_slist_prepend (copied, g_strdup (liter->data)); + copied = g_slist_reverse (copied); + g_list_free (keys); - if (is_secrets) { - keys = (char **) nm_setting_vpn_get_secret_keys (self, &len); - hash = priv->secrets; - } else { - keys = (char **) nm_setting_vpn_get_data_keys (self, &len); - hash = priv->data; - } + for (siter = copied; siter; siter = g_slist_next (siter)) { + gpointer value; - if (!len) { - nm_assert (!keys); - return; + value = g_hash_table_lookup (hash, siter->data); + func (siter->data, value, user_data); } - for (i = 0; i < len; i++) { - nm_assert (keys[i]); - keys[i] = g_strdup (keys[i]); - } - nm_assert (!keys[i]); - - for (i = 0; i < len; i++) { - const char *value; - - value = g_hash_table_lookup (hash, keys[i]); - /* NOTE: note that we call the function with a clone of @key, - * not with the actual key from the dictionary. - * - * The @value on the other hand, is actually inside our dictionary, - * it's not a clone. However, it might be %NULL, in case the key was - * deleted while iterating. */ - func (keys[i], value, user_data); - } + g_slist_free_full (copied, g_free); } /** @@ -328,9 +284,8 @@ nm_setting_vpn_foreach_data_item (NMSettingVpn *setting, gpointer user_data) { g_return_if_fail (NM_IS_SETTING_VPN (setting)); - g_return_if_fail (func); - foreach_item_helper (setting, FALSE, func, user_data); + foreach_item_helper (NM_SETTING_VPN_GET_PRIVATE (setting)->data, func, user_data); } /** @@ -393,30 +348,6 @@ nm_setting_vpn_get_secret (NMSettingVpn *setting, const char *key) } /** - * nm_setting_vpn_get_secret_keys: - * @setting: the #NMSettingVpn - * @out_length: (allow-none): (out): the length of the returned array - * - * Retrieves every secret key inside @setting, as an array. - * - * Returns: (array length=out_length) (transfer container): a - * %NULL-terminated array containing each secret key or %NULL if - * there are no secrets. - * - * Since: 1.12 - */ -const char ** -nm_setting_vpn_get_secret_keys (NMSettingVpn *setting, - guint *out_length) -{ - g_return_val_if_fail (NM_IS_SETTING_VPN (setting), NULL); - - return nm_utils_strdict_get_keys (NM_SETTING_VPN_GET_PRIVATE (setting)->secrets, - TRUE, - out_length); -} - -/** * nm_setting_vpn_remove_secret: * @setting: the #NMSettingVpn * @key: the name of the secret to remove @@ -456,9 +387,8 @@ nm_setting_vpn_foreach_secret (NMSettingVpn *setting, gpointer user_data) { g_return_if_fail (NM_IS_SETTING_VPN (setting)); - g_return_if_fail (func); - foreach_item_helper (setting, TRUE, func, user_data); + foreach_item_helper (NM_SETTING_VPN_GET_PRIVATE (setting)->secrets, func, user_data); } /** @@ -789,12 +719,22 @@ clear_secrets_with_flags (NMSetting *setting, } static void +destroy_one_secret (gpointer data) +{ + char *secret = (char *) data; + + /* Don't leave the secret lying around in memory */ + memset (secret, 0, strlen (secret)); + g_free (secret); +} + +static void nm_setting_vpn_init (NMSettingVpn *setting) { NMSettingVpnPrivate *priv = NM_SETTING_VPN_GET_PRIVATE (setting); - priv->data = g_hash_table_new_full (nm_str_hash, g_str_equal, g_free, g_free); - priv->secrets = g_hash_table_new_full (nm_str_hash, g_str_equal, g_free, (GDestroyNotify) nm_free_secret); + priv->data = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + priv->secrets = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, destroy_one_secret); } static void @@ -945,10 +885,12 @@ nm_setting_vpn_class_init (NMSettingVpnClass *setting_class) G_PARAM_STATIC_STRINGS)); /** - * NMSettingVpn:data: (type GHashTable(utf8,utf8)): + * NMSettingVpn:data: * * Dictionary of key/value pairs of VPN plugin specific data. Both keys and * values must be strings. + * + * Type: GHashTable(utf8,utf8) **/ /* ---keyfile--- * property: data @@ -970,10 +912,12 @@ nm_setting_vpn_class_init (NMSettingVpnClass *setting_class) _nm_utils_strdict_from_dbus); /** - * NMSettingVpn:secrets: (type GHashTable(utf8,utf8)): + * NMSettingVpn:secrets: * * Dictionary of key/value pairs of VPN plugin specific secrets like * passwords or private keys. Both keys and values must be strings. + * + * Type: GHashTable(utf8,utf8) **/ /* ---keyfile--- * property: secrets |