about summary refs log tree commit diff
path: root/libnm-core/nm-setting-vpn.c
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2018-05-11 22:08:45 +0200
committerMichael Biebl <biebl@debian.org>2018-05-11 22:08:45 +0200
commitee9c73a923909e23a649407be77e25235d769e25 (patch)
treee21c923621fa278e737da693df9eb60ea31a6067 /libnm-core/nm-setting-vpn.c
parentf60117b41d5433be1b4a96d82cd11d0c3dce9b63 (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.c130
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