diff options
author | Dan Williams <dcbw@redhat.com> | 2009-06-11 00:39:12 -0400 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2009-06-11 00:39:12 -0400 |
commit | c9067d8fedf6f6f2d530fd68bbfca7ce68638d38 (patch) | |
tree | 79fdb0fae57ca74b51a647b0485ecaf5f91ac580 /src/nm-activation-request.c | |
parent | 69eccdae34d85cadb20233aab6069f64385eef81 (diff) |
everything: use libgudev instead of HAL; merge NM and nm-system-settings
The only thing that doesn't work yet is the system-settings service's
"auto eth" connections for ethernet devices that don't have an existing
connection. Might also have issues with unmanaged devices that can't
provide a MAC address until they are brought up, but we'll see.
Diffstat (limited to 'src/nm-activation-request.c')
-rw-r--r-- | src/nm-activation-request.c | 252 |
1 files changed, 56 insertions, 196 deletions
diff --git a/src/nm-activation-request.c b/src/nm-activation-request.c index 9775041db6..c919c5e710 100644 --- a/src/nm-activation-request.c +++ b/src/nm-activation-request.c @@ -36,9 +36,12 @@ #include "nm-active-connection.h" #include "nm-dbus-glib-types.h" -#include "nm-manager.h" /* FIXME! */ -G_DEFINE_TYPE (NMActRequest, nm_act_request, G_TYPE_OBJECT) +static void secrets_provider_interface_init (NMSecretsProviderInterface *sp_interface_class); + +G_DEFINE_TYPE_EXTENDED (NMActRequest, nm_act_request, G_TYPE_OBJECT, 0, + G_IMPLEMENT_INTERFACE (NM_TYPE_SECRETS_PROVIDER_INTERFACE, + secrets_provider_interface_init)) #define NM_ACT_REQUEST_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_ACT_REQUEST, NMActRequestPrivate)) @@ -61,7 +64,7 @@ typedef struct { gboolean disposed; NMConnection *connection; - DBusGProxyCall *secrets_call; + guint32 secrets_call_id; char *specific_object; NMDevice *device; @@ -178,24 +181,6 @@ nm_act_request_init (NMActRequest *req) } static void -cleanup_secrets_dbus_call (NMActRequest *self) -{ - NMActRequestPrivate *priv = NM_ACT_REQUEST_GET_PRIVATE (self); - DBusGProxy *proxy; - - g_return_if_fail (priv->connection != NULL); - g_return_if_fail (NM_IS_CONNECTION (priv->connection)); - - proxy = g_object_get_data (G_OBJECT (priv->connection), NM_MANAGER_CONNECTION_SECRETS_PROXY_TAG); - g_assert (proxy); - - if (priv->secrets_call) { - dbus_g_proxy_cancel_call (proxy, priv->secrets_call); - priv->secrets_call = NULL; - } -} - -static void dispose (GObject *object) { NMActRequestPrivate *priv = NM_ACT_REQUEST_GET_PRIVATE (object); @@ -212,8 +197,6 @@ dispose (GObject *object) G_CALLBACK (device_state_changed), NM_ACT_REQUEST (object)); - cleanup_secrets_dbus_call (NM_ACT_REQUEST (object)); - /* Clear any share rules */ nm_act_request_set_shared (NM_ACT_REQUEST (object), FALSE); @@ -275,7 +258,7 @@ get_property (GObject *object, guint prop_id, break; case PROP_DEVICES: devices = g_ptr_array_sized_new (1); - g_ptr_array_add (devices, g_strdup (nm_device_get_udi (priv->device))); + g_ptr_array_add (devices, g_strdup (nm_device_get_path (priv->device))); g_value_take_boxed (value, devices); break; case PROP_STATE: @@ -363,7 +346,7 @@ nm_act_request_class_init (NMActRequestClass *req_class) g_signal_new ("connection-secrets-updated", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (NMActRequestClass, connection_secrets_updated), + G_STRUCT_OFFSET (NMActRequestClass, secrets_updated), NULL, NULL, _nm_marshal_VOID__OBJECT_POINTER_UINT, G_TYPE_NONE, 3, @@ -373,7 +356,7 @@ nm_act_request_class_init (NMActRequestClass *req_class) g_signal_new ("connection-secrets-failed", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (NMActRequestClass, connection_secrets_failed), + G_STRUCT_OFFSET (NMActRequestClass, secrets_failed), NULL, NULL, _nm_marshal_VOID__OBJECT_STRING_UINT, G_TYPE_NONE, 3, @@ -386,30 +369,17 @@ nm_act_request_class_init (NMActRequestClass *req_class) nm_active_connection_install_type_info (object_class); } -typedef struct GetSecretsInfo { - NMActRequest *req; - char *setting_name; - RequestSecretsCaller caller; -} GetSecretsInfo; - -static void -free_get_secrets_info (gpointer data) -{ - GetSecretsInfo *info = (GetSecretsInfo *) data; - - g_free (info->setting_name); - g_free (info); -} - -static void -update_one_setting (const char* setting_name, - GHashTable *setting_hash, - NMConnection *connection, - GSList **updated) +static gboolean +secrets_update_setting (NMSecretsProviderInterface *interface, + const char *setting_name, + GHashTable *new) { - GType type; + NMActRequestPrivate *priv = NM_ACT_REQUEST_GET_PRIVATE (interface); NMSetting *setting = NULL; GError *error = NULL; + GType type; + + g_return_val_if_fail (priv->connection != NULL, FALSE); /* Check whether a complete & valid NMSetting object was returned. If * yes, replace the setting object in the connection. If not, just try @@ -417,9 +387,9 @@ update_one_setting (const char* setting_name, */ type = nm_connection_lookup_setting_type (setting_name); if (type == 0) - return; + return FALSE; - setting = nm_setting_new_from_hash (type, setting_hash); + setting = nm_setting_new_from_hash (type, new); if (setting) { NMSetting *s_8021x = NULL; GSList *all_settings = NULL; @@ -427,7 +397,7 @@ update_one_setting (const char* setting_name, /* The wireless-security setting might need the 802.1x setting in * the all_settings argument of the verify function. Ugh. */ - s_8021x = nm_connection_get_setting (connection, NM_TYPE_SETTING_802_1X); + s_8021x = nm_connection_get_setting (priv->connection, NM_TYPE_SETTING_802_1X); if (s_8021x) all_settings = g_slist_append (all_settings, s_8021x); @@ -441,9 +411,9 @@ update_one_setting (const char* setting_name, } if (setting) - nm_connection_add_setting (connection, setting); + nm_connection_add_setting (priv->connection, setting); else { - if (!nm_connection_update_secrets (connection, setting_name, setting_hash, &error)) { + if (!nm_connection_update_secrets (priv->connection, setting_name, new, &error)) { nm_warning ("Failed to update connection secrets: %d %s", error ? error->code : -1, error && error->message ? error->message : "(none)"); @@ -451,166 +421,56 @@ update_one_setting (const char* setting_name, } } - *updated = g_slist_append (*updated, (gpointer) setting_name); + return TRUE; } static void -add_one_key_to_list (gpointer key, gpointer data, gpointer user_data) +secrets_result (NMSecretsProviderInterface *interface, + const char *setting_name, + RequestSecretsCaller caller, + const GSList *updated, + GError *error) { - GSList **list = (GSList **) user_data; - - *list = g_slist_append (*list, key); -} - -static gint -settings_order_func (gconstpointer a, gconstpointer b) -{ - /* Just ensure the 802.1x setting gets processed _before_ the - * wireless-security one. - */ - - if ( !strcmp (a, NM_SETTING_802_1X_SETTING_NAME) - && !strcmp (b, NM_SETTING_WIRELESS_SECURITY_SETTING_NAME)) - return -1; + NMActRequest *self = NM_ACT_REQUEST (interface); + NMActRequestPrivate *priv = NM_ACT_REQUEST_GET_PRIVATE (self); - if ( !strcmp (a, NM_SETTING_WIRELESS_SECURITY_SETTING_NAME) - && !strcmp (b, NM_SETTING_802_1X_SETTING_NAME)) - return 1; + g_return_if_fail (priv->connection != NULL); - return 0; + if (error) { + g_signal_emit (self, signals[CONNECTION_SECRETS_FAILED], 0, + priv->connection, setting_name, caller); + } else { + g_signal_emit (self, signals[CONNECTION_SECRETS_UPDATED], 0, + priv->connection, updated, caller); + } } static void -get_secrets_cb (DBusGProxy *proxy, DBusGProxyCall *call, gpointer user_data) +secrets_provider_interface_init (NMSecretsProviderInterface *sp_interface_class) { - GetSecretsInfo *info = (GetSecretsInfo *) user_data; - GError *err = NULL; - GHashTable *settings = NULL; - NMActRequestPrivate *priv = NULL; - GSList *keys = NULL, *iter; - GSList *updated = NULL; - - g_return_if_fail (info != NULL); - g_return_if_fail (info->req); - g_return_if_fail (info->setting_name); - - priv = NM_ACT_REQUEST_GET_PRIVATE (info->req); - - g_return_if_fail (call == priv->secrets_call); - priv->secrets_call = NULL; - - if (!dbus_g_proxy_end_call (proxy, call, &err, - DBUS_TYPE_G_MAP_OF_MAP_OF_VARIANT, &settings, - G_TYPE_INVALID)) { - nm_warning ("Couldn't get connection secrets: %s.", err->message); - g_error_free (err); - g_signal_emit (info->req, - signals[CONNECTION_SECRETS_FAILED], - 0, - priv->connection, - info->setting_name, - info->caller); - return; - } - - if (g_hash_table_size (settings) == 0) { - // FIXME: some better way to handle invalid message? - nm_warning ("GetSecrets call returned but no secrets were found."); - goto out; - } - - g_hash_table_foreach (settings, add_one_key_to_list, &keys); - keys = g_slist_sort (keys, settings_order_func); - for (iter = keys; iter; iter = g_slist_next (iter)) { - GHashTable *setting_hash; - - setting_hash = g_hash_table_lookup (settings, iter->data); - if (setting_hash) { - update_one_setting ((const char *) iter->data, - setting_hash, - priv->connection, - &updated); - } else - nm_warning ("Couldn't get setting secrets for '%s'", (const char *) iter->data); - } - g_slist_free (keys); - - if (g_slist_length (updated)) { - g_signal_emit (info->req, - signals[CONNECTION_SECRETS_UPDATED], - 0, - priv->connection, - updated, - info->caller); - } else { - nm_warning ("No secrets updated because not valid settings were received!"); - } - -out: - g_slist_free (updated); - g_hash_table_destroy (settings); + /* interface implementation */ + sp_interface_class->update_setting = secrets_update_setting; + sp_interface_class->result = secrets_result; } gboolean -nm_act_request_request_connection_secrets (NMActRequest *self, - const char *setting_name, - gboolean request_new, - RequestSecretsCaller caller, - const char *hint1, - const char *hint2) +nm_act_request_get_secrets (NMActRequest *self, + const char *setting_name, + gboolean request_new, + RequestSecretsCaller caller, + const char *hint1, + const char *hint2) { - DBusGProxy *secrets_proxy; - GetSecretsInfo *info = NULL; - NMActRequestPrivate *priv = NULL; - GPtrArray *hints = NULL; - + g_return_val_if_fail (self, FALSE); g_return_val_if_fail (NM_IS_ACT_REQUEST (self), FALSE); - g_return_val_if_fail (setting_name != NULL, FALSE); - - priv = NM_ACT_REQUEST_GET_PRIVATE (self); - - cleanup_secrets_dbus_call (self); - - info = g_malloc0 (sizeof (GetSecretsInfo)); - g_return_val_if_fail (info != NULL, FALSE); - - info->req = self; - info->caller = caller; - info->setting_name = g_strdup (setting_name); - - /* Empty for now */ - hints = g_ptr_array_sized_new (2); - - if (hint1) - g_ptr_array_add (hints, g_strdup (hint1)); - if (hint2) - g_ptr_array_add (hints, g_strdup (hint2)); - - secrets_proxy = g_object_get_data (G_OBJECT (priv->connection), NM_MANAGER_CONNECTION_SECRETS_PROXY_TAG); - g_assert (secrets_proxy); - - priv->secrets_call = dbus_g_proxy_begin_call_with_timeout (secrets_proxy, "GetSecrets", - get_secrets_cb, - info, - free_get_secrets_info, - G_MAXINT32, - G_TYPE_STRING, setting_name, - DBUS_TYPE_G_ARRAY_OF_STRING, hints, - G_TYPE_BOOLEAN, request_new, - G_TYPE_INVALID); - g_ptr_array_free (hints, TRUE); - if (!priv->secrets_call) { - nm_warning ("Could not call get secrets"); - goto error; - } - - return TRUE; -error: - if (info) - free_get_secrets_info (info); - cleanup_secrets_dbus_call (self); - return FALSE; + return nm_secrets_provider_interface_get_secrets (NM_SECRETS_PROVIDER_INTERFACE (self), + nm_act_request_get_connection (self), + setting_name, + request_new, + caller, + hint1, + hint2); } NMConnection * |