From 092a6535e03d68803b585f7dcfb99dd9e2e2c8e4 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Mon, 31 Jan 2011 12:41:54 -0600 Subject: [PATCH] libnm-util: add generic functions for getting/setting secret flags And remove the VPN-specific ones. It's useful to have this stuff be generic and the functionality wasn't really VPN-specific anyway. --- libnm-util/libnm-util.ver | 4 +- libnm-util/nm-setting-vpn.c | 122 +++++++++++++++--------------------- libnm-util/nm-setting-vpn.h | 10 +-- libnm-util/nm-setting.c | 116 ++++++++++++++++++++++++++++++++++ libnm-util/nm-setting.h | 67 +++++++++++++------- 5 files changed, 214 insertions(+), 105 deletions(-) diff --git a/libnm-util/libnm-util.ver b/libnm-util/libnm-util.ver index b7b94f81e6..1f98a083d2 100644 --- a/libnm-util/libnm-util.ver +++ b/libnm-util/libnm-util.ver @@ -268,6 +268,8 @@ global: nm_setting_serial_get_parity; nm_setting_serial_get_stopbits; nm_setting_serial_get_send_delay; + nm_setting_get_secret_flags; + nm_setting_set_secret_flags; nm_setting_to_hash; nm_setting_to_string; nm_setting_update_secrets; @@ -280,14 +282,12 @@ global: nm_setting_vpn_foreach_secret; nm_setting_vpn_get_data_item; nm_setting_vpn_get_secret; - nm_setting_vpn_get_secret_flags; nm_setting_vpn_get_service_type; nm_setting_vpn_get_type; nm_setting_vpn_get_user_name; nm_setting_vpn_new; nm_setting_vpn_remove_data_item; nm_setting_vpn_remove_secret; - nm_setting_vpn_set_secret_flags; nm_setting_wimax_error_get_type; nm_setting_wimax_error_quark; nm_setting_wimax_get_type; diff --git a/libnm-util/nm-setting-vpn.c b/libnm-util/nm-setting-vpn.c index 87e58182ff..aa064f3152 100644 --- a/libnm-util/nm-setting-vpn.c +++ b/libnm-util/nm-setting-vpn.c @@ -230,75 +230,6 @@ nm_setting_vpn_foreach_secret (NMSettingVPN *setting, (GHFunc) func, user_data); } -/** - * nm_setting_vpn_get_secret_flags: - * @setting: a #NMSettingVPN - * @secret_name: the secret key name to get flags for - * @out_flags: on success, the flags for the secret @secret_name - * - * For a given VPN secret, retrieves the #NMSettingSecretFlags describing how to - * handle that secret. - * - * Returns: TRUE on success (if the secret flags data item was found), FALSE if - * the secret flags data item was not found - */ -gboolean -nm_setting_vpn_get_secret_flags (NMSettingVPN *setting, - const char *secret_name, - NMSettingSecretFlags *out_flags) -{ - char *flags_key; - unsigned long tmp; - gboolean success = FALSE; - gpointer val; - - g_return_val_if_fail (NM_IS_SETTING_VPN (setting), FALSE); - g_return_val_if_fail (secret_name != NULL, FALSE); - g_return_val_if_fail (out_flags != NULL, FALSE); - - flags_key = g_strdup_printf ("%s-flags", secret_name); - g_assert (flags_key); - if (g_hash_table_lookup_extended (NM_SETTING_VPN_GET_PRIVATE (setting)->data, - flags_key, - NULL, - &val)) { - errno = 0; - tmp = strtoul ((const char *) val, NULL, 10); - if ((errno == 0) && (tmp <= NM_SETTING_SECRET_FLAGS_ALL)) { - success = TRUE; - *out_flags = (guint32) tmp; - } - } - g_free (flags_key); - return success; -} - -/** - * nm_setting_vpn_set_secret_flags: - * @setting: a #NMSettingVPN - * @secret_name: the secret key name to set flags for - * @flags: the flags for the secret - * - * For a given VPN secret, sets the #NMSettingSecretFlags describing how to - * handle that secret. - */ -void -nm_setting_vpn_set_secret_flags (NMSettingVPN *setting, - const char *secret_name, - NMSettingSecretFlags flags) -{ - char *key_name, *str_val; - - g_return_if_fail (NM_IS_SETTING_VPN (setting)); - g_return_if_fail (secret_name != NULL); - - key_name = g_strdup_printf ("%s-flags", secret_name); - g_assert (key_name); - str_val = g_strdup_printf ("%u", flags); - g_assert (str_val); - g_hash_table_insert (NM_SETTING_VPN_GET_PRIVATE (setting)->data, key_name, str_val); -} - static gboolean verify (NMSetting *setting, GSList *all_settings, GError **error) { @@ -361,6 +292,54 @@ update_one_secret (NMSetting *setting, const char *key, GValue *value, GError ** return TRUE; } +static gboolean +get_secret_flags (NMSetting *setting, + const char *secret_name, + NMSettingSecretFlags *out_flags, + GError **error) +{ + NMSettingVPNPrivate *priv = NM_SETTING_VPN_GET_PRIVATE (setting); + gboolean success = FALSE; + char *flags_key; + gpointer val; + unsigned long tmp; + + flags_key = g_strdup_printf ("%s-flags", secret_name); + if (g_hash_table_lookup_extended (priv->data, flags_key, NULL, &val)) { + errno = 0; + tmp = strtoul ((const char *) val, NULL, 10); + if ((errno == 0) && (tmp <= NM_SETTING_SECRET_FLAGS_ALL)) { + *out_flags = (guint32) tmp; + success = TRUE; + } else { + g_set_error (error, + NM_SETTING_ERROR, + NM_SETTING_ERROR_PROPERTY_TYPE_MISMATCH, + "Failed to convert '%s' value '%s' to uint", + flags_key, (const char *) val); + } + } else { + g_set_error (error, + NM_SETTING_ERROR, + NM_SETTING_ERROR_PROPERTY_NOT_FOUND, + "Secret flags property '%s' not found", flags_key); + } + g_free (flags_key); + return success; +} + +static gboolean +set_secret_flags (NMSetting *setting, + const char *secret_name, + NMSettingSecretFlags flags, + GError **error) +{ + g_hash_table_insert (NM_SETTING_VPN_GET_PRIVATE (setting)->data, + g_strdup_printf ("%s-flags", secret_name), + g_strdup_printf ("%u", flags)); + return TRUE; +} + static void destroy_one_secret (gpointer data) { @@ -474,8 +453,11 @@ nm_setting_vpn_class_init (NMSettingVPNClass *setting_class) object_class->set_property = set_property; object_class->get_property = get_property; object_class->finalize = finalize; - parent_class->verify = verify; + + parent_class->verify = verify; parent_class->update_one_secret = update_one_secret; + parent_class->get_secret_flags = get_secret_flags; + parent_class->set_secret_flags = set_secret_flags; /* Properties */ /** diff --git a/libnm-util/nm-setting-vpn.h b/libnm-util/nm-setting-vpn.h index 8dea7c7440..bb203560f9 100644 --- a/libnm-util/nm-setting-vpn.h +++ b/libnm-util/nm-setting-vpn.h @@ -19,7 +19,7 @@ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. * - * (C) Copyright 2007 - 2008 Red Hat, Inc. + * (C) Copyright 2007 - 2011 Red Hat, Inc. * (C) Copyright 2007 - 2008 Novell, Inc. */ @@ -103,14 +103,6 @@ void nm_setting_vpn_foreach_secret (NMSettingVPN *setting, NMVPNIterFunc func, gpointer user_data); -gboolean nm_setting_vpn_get_secret_flags (NMSettingVPN *setting, - const char *secret_name, - NMSettingSecretFlags *out_flags); - -void nm_setting_vpn_set_secret_flags (NMSettingVPN *setting, - const char *secret_name, - NMSettingSecretFlags flags); - G_END_DECLS #endif /* NM_SETTING_VPN_H */ diff --git a/libnm-util/nm-setting.c b/libnm-util/nm-setting.c index 8d4b295fa4..31d9c9d186 100644 --- a/libnm-util/nm-setting.c +++ b/libnm-util/nm-setting.c @@ -570,6 +570,120 @@ nm_setting_update_secrets (NMSetting *setting, GHashTable *secrets, GError **err return !!tmp_error; } +static gboolean +is_secret_prop (NMSetting *setting, const char *secret_name, GError **error) +{ + GParamSpec *pspec; + + pspec = g_object_class_find_property (G_OBJECT_CLASS (setting), secret_name); + if (!pspec) { + g_set_error (error, + NM_SETTING_ERROR, + NM_SETTING_ERROR_PROPERTY_NOT_FOUND, + "Secret %s not provided by this setting", secret_name); + return FALSE; + } + + if (!(pspec->flags & NM_SETTING_PARAM_SECRET)) { + g_set_error (error, + NM_SETTING_ERROR, + NM_SETTING_ERROR_PROPERTY_NOT_SECRET, + "Property %s is not a secret", secret_name); + return FALSE; + } + + return TRUE; +} + +static gboolean +get_secret_flags (NMSetting *setting, + const char *secret_name, + NMSettingSecretFlags *out_flags, + GError **error) +{ + char *flags_prop; + NMSettingSecretFlags flags = NM_SETTING_SECRET_FLAG_SYSTEM_OWNED; + + g_return_val_if_fail (is_secret_prop (setting, secret_name, error), FALSE); + + flags_prop = g_strdup_printf ("%s-flags", secret_name); + g_object_get (G_OBJECT (setting), flags_prop, &flags, NULL); + g_free (flags_prop); + + if (out_flags) + *out_flags = flags; + return TRUE; +} + +/** + * nm_setting_get_secret_flags: + * @setting: the #NMSetting + * @secret_name: the secret key name to get flags for + * @out_flags: on success, the #NMSettingSecretFlags for the secret + * @error: location to store error, or %NULL + * + * For a given secret, retrieves the #NMSettingSecretFlags describing how to + * handle that secret. + * + * Returns: TRUE on success (if the given secret name was a valid property of + * this setting, and if that property is secret), FALSE if not + **/ +gboolean +nm_setting_get_secret_flags (NMSetting *setting, + const char *secret_name, + NMSettingSecretFlags *out_flags, + GError **error) +{ + g_return_val_if_fail (setting != NULL, FALSE); + g_return_val_if_fail (NM_IS_SETTING (setting), FALSE); + g_return_val_if_fail (secret_name != NULL, FALSE); + + return NM_SETTING_GET_CLASS (setting)->get_secret_flags (setting, secret_name, out_flags, error); +} + +static gboolean +set_secret_flags (NMSetting *setting, + const char *secret_name, + NMSettingSecretFlags flags, + GError **error) +{ + char *flags_prop; + + g_return_val_if_fail (is_secret_prop (setting, secret_name, error), FALSE); + + flags_prop = g_strdup_printf ("%s-flags", secret_name); + g_object_set (G_OBJECT (setting), flags_prop, flags, NULL); + g_free (flags_prop); + return TRUE; +} + +/** + * nm_setting_set_secret_flags: + * @setting: the #NMSetting + * @secret_name: the secret key name to set flags for + * @flags: the #NMSettingSecretFlags for the secret + * @error: location to store error, or %NULL + * + * For a given secret, retrieves the #NMSettingSecretFlags describing how to + * handle that secret. + * + * Returns: TRUE on success (if the given secret name was a valid property of + * this setting, and if that property is secret), FALSE if not + **/ +gboolean +nm_setting_set_secret_flags (NMSetting *setting, + const char *secret_name, + NMSettingSecretFlags flags, + GError **error) +{ + g_return_val_if_fail (setting != NULL, FALSE); + g_return_val_if_fail (NM_IS_SETTING (setting), FALSE); + g_return_val_if_fail (secret_name != NULL, FALSE); + g_return_val_if_fail (flags & NM_SETTING_SECRET_FLAGS_ALL, FALSE); + + return NM_SETTING_GET_CLASS (setting)->set_secret_flags (setting, secret_name, flags, error); +} + /** * nm_setting_to_string: * @setting: the #NMSetting @@ -726,6 +840,8 @@ nm_setting_class_init (NMSettingClass *setting_class) object_class->finalize = finalize; setting_class->update_one_secret = update_one_secret; + setting_class->get_secret_flags = get_secret_flags; + setting_class->set_secret_flags = set_secret_flags; /* Properties */ diff --git a/libnm-util/nm-setting.h b/libnm-util/nm-setting.h index 2790d8b5aa..bf2c63f00e 100644 --- a/libnm-util/nm-setting.h +++ b/libnm-util/nm-setting.h @@ -83,6 +83,29 @@ GQuark nm_setting_error_quark (void); #define NM_SETTING_NAME "name" +/** + * NMSettingSecretFlags: + * @NM_SETTING_SECRET_FLAG_SYTSEM_OWNED: the system is responsible for providing + * and storing this secret (default) + * @NM_SETTING_SECRET_FLAG_AGENT_OWNED: a user secret agent is responsible + * for providing and storing this secret; when it is required agents will be + * asked to retrieve it + * @NM_SETTING_SECRET_FLAG_NOT_SAVED: this secret should not be saved, but + * should be requested from the user each time it is needed + * + * These flags indicate specific behavior related to handling of a secret. Each + * secret has a corresponding set of these flags which indicate how the secret + * is to be stored and/or requested when it is needed. + * + **/ +typedef enum { + NM_SETTING_SECRET_FLAG_SYSTEM_OWNED = 0x00000000, + NM_SETTING_SECRET_FLAG_AGENT_OWNED = 0x00000001, + NM_SETTING_SECRET_FLAG_NOT_SAVED = 0x00000002 + + /* NOTE: if adding flags, update nm-setting-private.h as well */ +} NMSettingSecretFlags; + /** * NMSetting: * @@ -108,6 +131,16 @@ typedef struct { GValue *value, GError **error); + gboolean (*get_secret_flags) (NMSetting *setting, + const char *secret_name, + NMSettingSecretFlags *out_flags, + GError **error); + + gboolean (*set_secret_flags) (NMSetting *setting, + const char *secret_name, + NMSettingSecretFlags flags, + GError **error); + /* Padding for future expansion */ void (*_reserved1) (void); void (*_reserved2) (void); @@ -185,36 +218,22 @@ void nm_setting_enumerate_values (NMSetting *setting, char *nm_setting_to_string (NMSetting *setting); /* Secrets */ - -/** - * NMSettingSecretFlags: - * @NM_SETTING_SECRET_FLAG_SYTSEM_OWNED: the system is responsible for providing - * and storing this secret (default) - * @NM_SETTING_SECRET_FLAG_AGENT_OWNED: a user secret agent is responsible - * for providing and storing this secret; when it is required agents will be - * asked to retrieve it - * @NM_SETTING_SECRET_FLAG_NOT_SAVED: this secret should not be saved, but - * should be requested from the user each time it is needed - * - * These flags indicate specific behavior related to handling of a secret. Each - * secret has a corresponding set of these flags which indicate how the secret - * is to be stored and/or requested when it is needed. - * - **/ -typedef enum { - NM_SETTING_SECRET_FLAG_SYSTEM_OWNED = 0x00000000, - NM_SETTING_SECRET_FLAG_AGENT_OWNED = 0x00000001, - NM_SETTING_SECRET_FLAG_NOT_SAVED = 0x00000002 - - /* NOTE: if adding flags, update nm-setting-private.h as well */ -} NMSettingSecretFlags; - void nm_setting_clear_secrets (NMSetting *setting); GPtrArray *nm_setting_need_secrets (NMSetting *setting); gboolean nm_setting_update_secrets (NMSetting *setting, GHashTable *secrets, GError **error); +gboolean nm_setting_get_secret_flags (NMSetting *setting, + const char *secret_name, + NMSettingSecretFlags *out_flags, + GError **error); + +gboolean nm_setting_set_secret_flags (NMSetting *setting, + const char *secret_name, + NMSettingSecretFlags flags, + GError **error); + G_END_DECLS #endif /* NM_SETTING_H */