diff options
Diffstat (limited to 'libnm-core/nm-setting-vpn.c')
| -rw-r--r-- | libnm-core/nm-setting-vpn.c | 76 |
1 files changed, 62 insertions, 14 deletions
diff --git a/libnm-core/nm-setting-vpn.c b/libnm-core/nm-setting-vpn.c index 1371140e..20a0ae14 100644 --- a/libnm-core/nm-setting-vpn.c +++ b/libnm-core/nm-setting-vpn.c @@ -23,8 +23,6 @@ #include "nm-setting-vpn.h" -#include <string.h> -#include <errno.h> #include <stdlib.h> #include "nm-utils/nm-secret-utils.h" @@ -206,7 +204,7 @@ 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 + * @out_length: (allow-none) (out): the length of the returned array * * Retrieves every data key inside @setting, as an array. * @@ -383,7 +381,7 @@ 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 + * @out_length: (allow-none) (out): the length of the returned array * * Retrieves every secret key inside @setting, as an array. * @@ -449,20 +447,17 @@ nm_setting_vpn_foreach_secret (NMSettingVpn *setting, foreach_item_helper (setting, TRUE, func, user_data); } -gboolean -_nm_setting_vpn_aggregate (NMSettingVpn *setting, - NMConnectionAggregateType type, - gpointer arg) +static gboolean +aggregate (NMSetting *setting, + int type_i, + gpointer arg) { - NMSettingVpnPrivate *priv; + NMSettingVpnPrivate *priv = NM_SETTING_VPN_GET_PRIVATE (setting); + NMConnectionAggregateType type = type_i; NMSettingSecretFlags secret_flags; const char *key_name; GHashTableIter iter; - g_return_val_if_fail (NM_IS_SETTING_VPN (setting), FALSE); - - priv = NM_SETTING_VPN_GET_PRIVATE (setting); - switch (type) { case NM_CONNECTION_AGGREGATE_ANY_SECRETS: @@ -687,6 +682,57 @@ update_one_secret (NMSetting *setting, const char *key, GVariant *value, GError return success; } +static void +for_each_secret (NMSetting *setting, + const char *secret_name, + GVariant *val, + gboolean remove_non_secrets, + _NMConnectionForEachSecretFunc callback, + gpointer callback_data, + GVariantBuilder *setting_builder) +{ + GVariantBuilder vpn_secrets_builder; + GVariantIter vpn_secrets_iter; + const char *vpn_secret_name; + const char *secret; + + if (!nm_streq (secret_name, NM_SETTING_VPN_SECRETS)) { + NM_SETTING_CLASS (nm_setting_vpn_parent_class)->for_each_secret (setting, + secret_name, + val, + remove_non_secrets, + callback, + callback_data, + setting_builder); + return; + } + + if (!g_variant_is_of_type (val, G_VARIANT_TYPE ("a{ss}"))) { + /* invalid type. Silently ignore the secrets as we cannot find out the + * secret-flags. */ + return; + } + + /* Iterate through each secret from the VPN dict in the overall secrets dict */ + g_variant_builder_init (&vpn_secrets_builder, G_VARIANT_TYPE ("a{ss}")); + g_variant_iter_init (&vpn_secrets_iter, val); + while (g_variant_iter_next (&vpn_secrets_iter, "{&s&s}", &vpn_secret_name, &secret)) { + NMSettingSecretFlags secret_flags = NM_SETTING_SECRET_FLAG_NONE; + + /* we ignore the return value of get_secret_flags. The function may determine + * that this is not a secret, based on having not secret-flags and no secrets. + * But we have the secret at hand. We know it would be a valid secret, if we + * only add it to the VPN settings. */ + nm_setting_get_secret_flags (setting, vpn_secret_name, &secret_flags, NULL); + + if (callback (secret_flags, callback_data)) + g_variant_builder_add (&vpn_secrets_builder, "{ss}", vpn_secret_name, secret); + } + + g_variant_builder_add (setting_builder, "{sv}", + secret_name, g_variant_builder_end (&vpn_secrets_builder)); +} + static gboolean get_secret_flags (NMSetting *setting, const char *secret_name, @@ -717,7 +763,7 @@ get_secret_flags (NMSetting *setting, return TRUE; } - i64 = _nm_utils_ascii_str_to_int64 (flags_val, 10, 0, NM_SETTING_SECRET_FLAGS_ALL, -1); + i64 = _nm_utils_ascii_str_to_int64 (flags_val, 10, 0, NM_SETTING_SECRET_FLAG_ALL, -1); if ( i64 == -1 || !_nm_setting_secret_flags_valid (i64)) { /* The flags keys is set to an unexpected value. That is a configuration @@ -979,11 +1025,13 @@ nm_setting_vpn_class_init (NMSettingVpnClass *klass) setting_class->verify = verify; setting_class->update_one_secret = update_one_secret; + setting_class->for_each_secret = for_each_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; + setting_class->aggregate = aggregate; /** * NMSettingVpn:service-type: |