mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager
synced 2024-10-06 16:21:50 +00:00
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:
parent
562246cb80
commit
092a6535e0
|
@ -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;
|
||||
|
|
|
@ -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 */
|
||||
/**
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 */
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in a new issue