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.
This commit is contained in:
Dan Williams 2011-01-31 12:41:54 -06:00
parent 562246cb80
commit 092a6535e0
5 changed files with 214 additions and 105 deletions

View file

@ -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;

View file

@ -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 */
/**

View file

@ -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 */

View file

@ -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 */

View file

@ -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 */