NetworkManager r4314 - in trunk: . libnm-util src src/vpn-manager
- From: dcbw svn gnome org
- To: svn-commits-list gnome org
- Subject: NetworkManager r4314 - in trunk: . libnm-util src src/vpn-manager
- Date: Thu, 20 Nov 2008 15:44:57 +0000 (UTC)
Author: dcbw
Date: Thu Nov 20 15:44:57 2008
New Revision: 4314
URL: http://svn.gnome.org/viewvc/NetworkManager?rev=4314&view=rev
Log:
2008-11-20 Dan Williams <dcbw redhat com>
* libnm-util/libnm-util.ver
libnm-util/nm-setting.c
libnm-util/nm-setting.h
- Add NMSetting errors
- (nm_setting_update_secrets): return errors
* libnm-util/nm-connection.c
libnm-util/nm-connection.h
- (nm_connection_update_secrets): return errors
* libnm-util/nm-setting-vpn.c
src/nm-activation-request.c
src/vpn-manager/nm-vpn-connection.c
- Handle update secrets errors
Modified:
trunk/ChangeLog
trunk/libnm-util/libnm-util.ver
trunk/libnm-util/nm-connection.c
trunk/libnm-util/nm-connection.h
trunk/libnm-util/nm-setting-vpn.c
trunk/libnm-util/nm-setting.c
trunk/libnm-util/nm-setting.h
trunk/src/nm-activation-request.c
trunk/src/vpn-manager/nm-vpn-connection.c
Modified: trunk/libnm-util/libnm-util.ver
==============================================================================
--- trunk/libnm-util/libnm-util.ver (original)
+++ trunk/libnm-util/libnm-util.ver Thu Nov 20 15:44:57 2008
@@ -84,6 +84,8 @@
nm_setting_connection_get_read_only;
nm_setting_duplicate;
nm_setting_enumerate_values;
+ nm_setting_error_get_type;
+ nm_setting_error_quark;
nm_setting_new_from_hash;
nm_setting_get_name;
nm_setting_get_type;
Modified: trunk/libnm-util/nm-connection.c
==============================================================================
--- trunk/libnm-util/nm-connection.c (original)
+++ trunk/libnm-util/nm-connection.c Thu Nov 20 15:44:57 2008
@@ -597,6 +597,7 @@
* @setting_name: the setting object name to which the secrets apply
* @secrets: a #GHashTable mapping string:#GValue of setting property names and
* secrets
+ * @error: location to store error, or %NULL
*
* Update the specified setting's secrets, given a hash table of secrets
* intended for that setting (deserialized from D-Bus for example).
@@ -607,24 +608,31 @@
gboolean
nm_connection_update_secrets (NMConnection *connection,
const char *setting_name,
- GHashTable *secrets)
+ GHashTable *secrets,
+ GError **error)
{
NMSetting *setting;
+ gboolean success;
g_return_val_if_fail (connection != NULL, FALSE);
g_return_val_if_fail (NM_IS_CONNECTION (connection), FALSE);
g_return_val_if_fail (setting_name != NULL, FALSE);
g_return_val_if_fail (secrets != NULL, FALSE);
+ if (error)
+ g_return_val_if_fail (*error == NULL, FALSE);
setting = nm_connection_get_setting (connection, nm_connection_lookup_setting_type (setting_name));
if (!setting) {
- g_warning ("Unhandled settings object for secrets update.");
+ g_set_error (error, NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_CONNECTION_SETTING_NOT_FOUND,
+ "%s", setting_name);
return FALSE;
}
- nm_setting_update_secrets (setting, secrets);
- g_signal_emit (connection, signals[SECRETS_UPDATED], 0, setting_name);
- return TRUE;
+ success = nm_setting_update_secrets (setting, secrets, error);
+ if (success)
+ g_signal_emit (connection, signals[SECRETS_UPDATED], 0, setting_name);
+ return success;
}
static gint
Modified: trunk/libnm-util/nm-connection.h
==============================================================================
--- trunk/libnm-util/nm-connection.h (original)
+++ trunk/libnm-util/nm-connection.h Thu Nov 20 15:44:57 2008
@@ -115,7 +115,8 @@
gboolean nm_connection_update_secrets (NMConnection *connection,
const char *setting_name,
- GHashTable *secrets);
+ GHashTable *secrets,
+ GError **error);
void nm_connection_set_scope (NMConnection *connection,
NMConnectionScope scope);
Modified: trunk/libnm-util/nm-setting-vpn.c
==============================================================================
--- trunk/libnm-util/nm-setting-vpn.c (original)
+++ trunk/libnm-util/nm-setting-vpn.c Thu Nov 20 15:44:57 2008
@@ -1,5 +1,4 @@
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
-
/*
* Dan Williams <dcbw redhat com>
* Tambet Ingo <tambet gmail com>
@@ -237,16 +236,23 @@
return TRUE;
}
-static void
-update_one_secret (NMSetting *setting, const char *key, GValue *value)
+static gboolean
+update_one_secret (NMSetting *setting, const char *key, GValue *value, GError **error)
{
NMSettingVPNPrivate *priv = NM_SETTING_VPN_GET_PRIVATE (setting);
- g_return_if_fail (key != NULL);
- g_return_if_fail (value != NULL);
- g_return_if_fail (G_VALUE_HOLDS_STRING (value));
+ g_return_val_if_fail (key != NULL, FALSE);
+ g_return_val_if_fail (value != NULL, FALSE);
+
+ if (!G_VALUE_HOLDS_STRING (value)) {
+ g_set_error (error, NM_SETTING_ERROR,
+ NM_SETTING_ERROR_PROPERTY_TYPE_MISMATCH,
+ "%s", key);
+ return FALSE;
+ }
g_hash_table_insert (priv->secrets, g_strdup (key), g_value_dup_string (value));
+ return FALSE;
}
static void
Modified: trunk/libnm-util/nm-setting.c
==============================================================================
--- trunk/libnm-util/nm-setting.c (original)
+++ trunk/libnm-util/nm-setting.c Thu Nov 20 15:44:57 2008
@@ -29,6 +29,48 @@
#include "nm-setting-connection.h"
#include "nm-utils.h"
+/**
+ * nm_setting_error_quark:
+ *
+ * Registers an error quark for #NMSetting if necessary.
+ *
+ * Returns: the error quark used for NMSetting errors.
+ **/
+GQuark
+nm_setting_error_quark (void)
+{
+ static GQuark quark;
+
+ if (G_UNLIKELY (!quark))
+ quark = g_quark_from_static_string ("nm-setting-error-quark");
+ return quark;
+}
+
+/* This should really be standard. */
+#define ENUM_ENTRY(NAME, DESC) { NAME, "" #NAME "", DESC }
+
+GType
+nm_setting_error_get_type (void)
+{
+ static GType etype = 0;
+
+ if (etype == 0) {
+ static const GEnumValue values[] = {
+ /* Unknown error. */
+ ENUM_ENTRY (NM_SETTING_ERROR_UNKNOWN, "UnknownError"),
+ /* The property was not found. */
+ ENUM_ENTRY (NM_SETTING_ERROR_PROPERTY_NOT_FOUND, "PropertyNotFound"),
+ /* The property was not a secret. */
+ ENUM_ENTRY (NM_SETTING_ERROR_PROPERTY_NOT_SECRET, "PropertyNotSecret"),
+ /* The property type didn't match the required property type. */
+ ENUM_ENTRY (NM_SETTING_ERROR_PROPERTY_TYPE_MISMATCH, "PropertyTypeMismatch"),
+ { 0, 0, 0 }
+ };
+ etype = g_enum_register_static ("NMSettingError", values);
+ }
+ return etype;
+}
+
G_DEFINE_ABSTRACT_TYPE (NMSetting, nm_setting, G_TYPE_OBJECT)
#define NM_SETTING_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING, NMSettingPrivate))
@@ -435,51 +477,93 @@
return secrets;
}
-static void
-update_one_secret (NMSetting *setting, const char *key, GValue *value)
+typedef struct {
+ NMSetting *setting;
+ GError **error;
+} UpdateSecretsInfo;
+
+static gboolean
+update_one_secret (NMSetting *setting, const char *key, GValue *value, GError **error)
{
GParamSpec *prop_spec;
GValue transformed_value = { 0 };
+ gboolean success = FALSE;
prop_spec = g_object_class_find_property (G_OBJECT_GET_CLASS (setting), key);
if (!prop_spec) {
- nm_warning ("Ignoring invalid secret '%s'.", key);
- return;
+ g_set_error (error,
+ NM_SETTING_ERROR,
+ NM_SETTING_ERROR_PROPERTY_NOT_FOUND,
+ "%s", key);
+ return FALSE;
}
if (!(prop_spec->flags & NM_SETTING_PARAM_SECRET)) {
- nm_warning ("Ignoring secret '%s' as it's not marked as a secret.", key);
- return;
+ g_set_error (error,
+ NM_SETTING_ERROR,
+ NM_SETTING_ERROR_PROPERTY_NOT_SECRET,
+ "%s", key);
+ return FALSE;
}
- if (g_value_type_compatible (G_VALUE_TYPE (value), G_PARAM_SPEC_VALUE_TYPE (prop_spec)))
+ if (g_value_type_compatible (G_VALUE_TYPE (value), G_PARAM_SPEC_VALUE_TYPE (prop_spec))) {
g_object_set_property (G_OBJECT (setting), prop_spec->name, value);
- else if (g_value_transform (value, &transformed_value)) {
+ success = TRUE;
+ } else if (g_value_transform (value, &transformed_value)) {
g_object_set_property (G_OBJECT (setting), prop_spec->name, &transformed_value);
g_value_unset (&transformed_value);
+ success = TRUE;
} else {
- nm_warning ("Ignoring secret property '%s' with invalid type (%s)",
- key, G_VALUE_TYPE_NAME (value));
+ g_set_error (error,
+ NM_SETTING_ERROR,
+ NM_SETTING_ERROR_PROPERTY_TYPE_MISMATCH,
+ "%s", key);
}
+ return success;
}
static void
update_one_cb (gpointer key, gpointer val, gpointer user_data)
{
- NMSetting *setting = (NMSetting *) user_data;
+ UpdateSecretsInfo *info = user_data;
const char *secret_key = (const char *) key;
GValue *secret_value = (GValue *) val;
- NM_SETTING_GET_CLASS (setting)->update_one_secret (setting, secret_key, secret_value);
+ if (*(info->error) == NULL)
+ NM_SETTING_GET_CLASS (info->setting)->update_one_secret (info->setting, secret_key, secret_value, info->error);
}
-void
-nm_setting_update_secrets (NMSetting *setting, GHashTable *secrets)
+/**
+ * nm_setting_update_secrets:
+ * @setting: the #NMSetting
+ * @secrets: a #GHashTable mapping string:#GValue of setting property names and
+ * secrets
+ * @error: location to store error, or %NULL
+ *
+ * Update the setting's secrets, given a hash table of secrets intended for that
+ * setting (deserialized from D-Bus for example).
+ *
+ * Returns: TRUE if the secrets were successfully updated and the connection
+ * is valid, FALSE on failure or if the setting was never added to the connection
+ **/
+gboolean
+nm_setting_update_secrets (NMSetting *setting, GHashTable *secrets, GError **error)
{
- g_return_if_fail (NM_IS_SETTING (setting));
- g_return_if_fail (secrets != NULL);
+ UpdateSecretsInfo *info;
+
+ g_return_val_if_fail (setting != NULL, FALSE);
+ g_return_val_if_fail (NM_IS_SETTING (setting), FALSE);
+ g_return_val_if_fail (secrets != NULL, FALSE);
+ if (error)
+ g_return_val_if_fail (*error == NULL, FALSE);
+
+ info = g_malloc0 (sizeof (UpdateSecretsInfo));
+ info->setting = setting;
+ info->error = error;
+ g_hash_table_foreach (secrets, update_one_cb, info);
+ g_free (info);
- g_hash_table_foreach (secrets, update_one_cb, setting);
+ return *(info->error) ? FALSE : TRUE;
}
char *
Modified: trunk/libnm-util/nm-setting.h
==============================================================================
--- trunk/libnm-util/nm-setting.h (original)
+++ trunk/libnm-util/nm-setting.h Thu Nov 20 15:44:57 2008
@@ -38,6 +38,20 @@
#define NM_IS_SETTING_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), NM_TYPE_SETTING))
#define NM_SETTING_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SETTING, NMSettingClass))
+typedef enum
+{
+ NM_SETTING_ERROR_UNKNOWN = 0,
+ NM_SETTING_ERROR_PROPERTY_NOT_FOUND,
+ NM_SETTING_ERROR_PROPERTY_NOT_SECRET,
+ NM_SETTING_ERROR_PROPERTY_TYPE_MISMATCH
+} NMSettingError;
+
+#define NM_TYPE_SETTING_ERROR (nm_setting_error_get_type ())
+GType nm_setting_error_get_type (void);
+
+#define NM_SETTING_ERROR nm_setting_error_quark ()
+GQuark nm_setting_error_quark (void);
+
#define NM_SETTING_PARAM_SERIALIZE (1 << (0 + G_PARAM_USER_SHIFT))
#define NM_SETTING_PARAM_REQUIRED (1 << (1 + G_PARAM_USER_SHIFT))
#define NM_SETTING_PARAM_SECRET (1 << (2 + G_PARAM_USER_SHIFT))
@@ -59,9 +73,10 @@
GPtrArray *(*need_secrets) (NMSetting *setting);
- void (*update_one_secret) (NMSetting *setting,
+ gboolean (*update_one_secret) (NMSetting *setting,
const char *key,
- GValue *value);
+ GValue *value,
+ GError **error);
} NMSettingClass;
typedef void (*NMSettingValueIterFn) (NMSetting *setting,
@@ -90,13 +105,15 @@
/* Match all attributes exactly */
NM_SETTING_COMPARE_FLAG_EXACT = 0x00000000,
- /* Match only important attributes, like SSID, type, security settings, etc */
+ /* Match only important attributes, like SSID, type, security settings, etc;
+ * For example, does not match connection ID or UUID.
+ */
NM_SETTING_COMPARE_FLAG_FUZZY = 0x00000001,
/* Ignore the connection ID */
NM_SETTING_COMPARE_FLAG_IGNORE_ID = 0x00000002,
- /* Ignore secrets */
+ /* Ignore connection secrets */
NM_SETTING_COMPARE_FLAG_IGNORE_SECRETS = 0x00000004
} NMSettingCompareFlags;
@@ -114,8 +131,9 @@
/* Secrets */
void nm_setting_clear_secrets (NMSetting *setting);
GPtrArray *nm_setting_need_secrets (NMSetting *setting);
-void nm_setting_update_secrets (NMSetting *setting,
- GHashTable *secrets);
+gboolean nm_setting_update_secrets (NMSetting *setting,
+ GHashTable *secrets,
+ GError **error);
G_END_DECLS
Modified: trunk/src/nm-activation-request.c
==============================================================================
--- trunk/src/nm-activation-request.c (original)
+++ trunk/src/nm-activation-request.c Thu Nov 20 15:44:57 2008
@@ -409,6 +409,7 @@
{
GType type;
NMSetting *setting = NULL;
+ GError *error = NULL;
/* Check whether a complete & valid NMSetting object was returned. If
* yes, replace the setting object in the connection. If not, just try
@@ -441,8 +442,14 @@
if (setting)
nm_connection_add_setting (connection, setting);
- else
- nm_connection_update_secrets (connection, key, setting_hash);
+ else {
+ if (!nm_connection_update_secrets (connection, key, setting_hash, &error)) {
+ nm_warning ("Failed to update connection secrets: %d %s",
+ error ? error->code : -1,
+ error && error->message ? error->message : "(none)");
+ g_clear_error (&error);
+ }
+ }
*updated = g_slist_append (*updated, (gpointer) key);
}
Modified: trunk/src/vpn-manager/nm-vpn-connection.c
==============================================================================
--- trunk/src/vpn-manager/nm-vpn-connection.c (original)
+++ trunk/src/vpn-manager/nm-vpn-connection.c Thu Nov 20 15:44:57 2008
@@ -780,11 +780,17 @@
{
NMConnection *connection = NM_CONNECTION (user_data);
GHashTable *secrets = (GHashTable *) data;
+ GError *error = NULL;
if (strcmp (key, NM_SETTING_VPN_SETTING_NAME))
return;
- nm_connection_update_secrets (connection, NM_SETTING_VPN_SETTING_NAME, secrets);
+ if (!nm_connection_update_secrets (connection, NM_SETTING_VPN_SETTING_NAME, secrets, &error)) {
+ nm_warning ("Failed to update VPN secrets: %d %s",
+ error ? error->code : -1,
+ error && error->message ? error->message : "(none)");
+ g_clear_error (&error);
+ }
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]