From b5c3269266a19a4e3717278d406aeb4a598a294c Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Wed, 21 Dec 2005 21:08:00 +0000 Subject: [PATCH] 2005-12-21 Dan Williams * gnome/applet/nm-gconf-wso* - Make the serialize functions return gboolean rather than int * gnome/applet/nm-gconf-wso.c - (nm_gconf_wso_dispose, nm_gconf_wso_finalize): fix up parent class handling so we don't segfault * src/NetworkManagerAP.[ch] - (nm_ap_get_capabilities): new function, return capabilities now that something can use them - (nm_ap_set_encrypted): assume that an access point supports both WEP104 and WEP40 if its set encrypted. FIXME: can we even tell whether it just supports WEP40? * src/NetworkManagerDevice.c - (ap_need_key): resurrect and update for the New World Order - (nm_device_wireless_get_activation_ap): if we're not given security info to use, create some based on access point capabilities * src/nm-ap-security-wep.c - (nm_ap_security_wep_new_from_ap): create a new object based on a certain access point's capabilities * src/nm-ap-security.c - (nm_ap_security_new_from_ap): delegate creation of a new object based on access point capabilities to a subclass - (nm_ap_security_copy_properties): don't segfault if we don't have a key yet * src/nm-dbus-nm.c - (nm_dbus_nm_set_active_device): provide more informative output when errors occur. Also construct security info for a given access point if we weren't given any git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@1219 4912f4e0-d625-0410-9fb7-b9a5a253dbdc --- ChangeLog | 38 ++++++++++++++++++++++++++++ gnome/applet/nm-gconf-wso-wep.c | 10 ++++---- gnome/applet/nm-gconf-wso-wpa-psk.c | 10 ++++---- gnome/applet/nm-gconf-wso.c | 36 +++++++++++++++----------- gnome/applet/nm-gconf-wso.h | 8 +++--- src/NetworkManagerAP.c | 13 ++++++++-- src/NetworkManagerAP.h | 2 ++ src/NetworkManagerDevice.c | 39 ++++++++++++++++++----------- src/nm-ap-security-wep.c | 33 +++++++++++++++++++++--- src/nm-ap-security-wep.h | 3 +++ src/nm-ap-security.c | 39 ++++++++++++++++++++++++++++- src/nm-ap-security.h | 3 +++ src/nm-dbus-nm.c | 30 ++++++++++++++++------ 13 files changed, 207 insertions(+), 57 deletions(-) diff --git a/ChangeLog b/ChangeLog index f589c808b9..1285c5dab3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,41 @@ +2005-12-21 Dan Williams + + * gnome/applet/nm-gconf-wso* + - Make the serialize functions return gboolean + rather than int + + * gnome/applet/nm-gconf-wso.c + - (nm_gconf_wso_dispose, nm_gconf_wso_finalize): fix up + parent class handling so we don't segfault + + * src/NetworkManagerAP.[ch] + - (nm_ap_get_capabilities): new function, return capabilities + now that something can use them + - (nm_ap_set_encrypted): assume that an access point supports + both WEP104 and WEP40 if its set encrypted. FIXME: can + we even tell whether it just supports WEP40? + + * src/NetworkManagerDevice.c + - (ap_need_key): resurrect and update for the New World Order + - (nm_device_wireless_get_activation_ap): if we're not given + security info to use, create some based on access point + capabilities + + * src/nm-ap-security-wep.c + - (nm_ap_security_wep_new_from_ap): create a new object + based on a certain access point's capabilities + + * src/nm-ap-security.c + - (nm_ap_security_new_from_ap): delegate creation of a new + object based on access point capabilities to a subclass + - (nm_ap_security_copy_properties): don't segfault if we + don't have a key yet + + * src/nm-dbus-nm.c + - (nm_dbus_nm_set_active_device): provide more informative + output when errors occur. Also construct security info + for a given access point if we weren't given any + 2005-12-21 Žygimantas Beručka * configure.in: Added Lithuanian to ALL_LINGUAS. diff --git a/gnome/applet/nm-gconf-wso-wep.c b/gnome/applet/nm-gconf-wso-wep.c index bd4d4ffdcc..a3556b492c 100644 --- a/gnome/applet/nm-gconf-wso-wep.c +++ b/gnome/applet/nm-gconf-wso-wep.c @@ -95,7 +95,7 @@ out: return security; } -static int +static gboolean real_serialize_dbus (NMGConfWSO *instance, DBusMessageIter *iter) { NMGConfWSOWEP * self = NM_GCONF_WSO_WEP (instance); @@ -103,11 +103,11 @@ real_serialize_dbus (NMGConfWSO *instance, DBusMessageIter *iter) if (!nmu_security_serialize_wep (iter, nm_gconf_wso_get_key (instance), self->priv->auth_algorithm)) - return -1; - return 0; + return FALSE; + return TRUE; } -static int +static gboolean real_serialize_gconf (NMGConfWSO *instance, GConfClient *client, const char *network) { NMGConfWSOWEP *self = NM_GCONF_WSO_WEP (instance); @@ -117,7 +117,7 @@ real_serialize_gconf (NMGConfWSO *instance, GConfClient *client, const char *net gconf_client_set_int (client, key, self->priv->auth_algorithm, NULL); g_free (key); - return 0; + return TRUE; } static void diff --git a/gnome/applet/nm-gconf-wso-wpa-psk.c b/gnome/applet/nm-gconf-wso-wpa-psk.c index 9fe95b3fb6..433078f17f 100644 --- a/gnome/applet/nm-gconf-wso-wpa-psk.c +++ b/gnome/applet/nm-gconf-wso-wpa-psk.c @@ -106,7 +106,7 @@ out: return security; } -static int +static gboolean real_serialize_dbus (NMGConfWSO *instance, DBusMessageIter *iter) { NMGConfWSOWPA_PSK * self = NM_GCONF_WSO_WPA_PSK (instance); @@ -115,11 +115,11 @@ real_serialize_dbus (NMGConfWSO *instance, DBusMessageIter *iter) nm_gconf_wso_get_key (instance), self->priv->wpa_version, self->priv->key_mgt)) - return -1; - return 0; + return FALSE; + return TRUE; } -static int +static gboolean real_serialize_gconf (NMGConfWSO *instance, GConfClient *client, const char *network) { NMGConfWSOWPA_PSK * self = NM_GCONF_WSO_WPA_PSK (instance); @@ -133,7 +133,7 @@ real_serialize_gconf (NMGConfWSO *instance, GConfClient *client, const char *net gconf_client_set_int (client, key, self->priv->key_mgt, NULL); g_free (key); - return 0; + return TRUE; } static void diff --git a/gnome/applet/nm-gconf-wso.c b/gnome/applet/nm-gconf-wso.c index 681c257242..c3a8a28be6 100644 --- a/gnome/applet/nm-gconf-wso.c +++ b/gnome/applet/nm-gconf-wso.c @@ -44,8 +44,6 @@ struct _NMGConfWSOPrivate gboolean dispose_has_run; }; -static GObjectClass *parent_class = NULL; - static NMGConfWSO * nm_gconf_wso_new (int we_cipher) { @@ -225,16 +223,16 @@ nm_gconf_wso_get_key (NMGConfWSO *self) return self->priv->key; } -int +gboolean nm_gconf_wso_serialize_dbus (NMGConfWSO *self, DBusMessageIter *iter) { dbus_int32_t dbus_we_cipher; - g_return_val_if_fail (self != NULL, -1); - g_return_val_if_fail (iter != NULL, -1); + g_return_val_if_fail (self != NULL, FALSE); + g_return_val_if_fail (iter != NULL, FALSE); if (self->priv->dispose_has_run) - return -1; + return FALSE; /* First arg: WE cipher (INT32) */ dbus_we_cipher = (dbus_int32_t) self->priv->we_cipher; @@ -243,18 +241,18 @@ nm_gconf_wso_serialize_dbus (NMGConfWSO *self, DBusMessageIter *iter) return NM_GCONF_WSO_GET_CLASS (self)->serialize_dbus_func (self, iter); } -int +gboolean nm_gconf_wso_serialize_gconf (NMGConfWSO *self, GConfClient *client, const char *network) { dbus_int32_t dbus_we_cipher; char * key; - g_return_val_if_fail (self != NULL, -1); - g_return_val_if_fail (client != NULL, -1); - g_return_val_if_fail (network != NULL, -1); + g_return_val_if_fail (self != NULL, FALSE); + g_return_val_if_fail (client != NULL, FALSE); + g_return_val_if_fail (network != NULL, FALSE); if (self->priv->dispose_has_run) - return -1; + return FALSE; key = g_strdup_printf ("%s/%s/we_cipher", GCONF_PATH_WIRELESS_NETWORKS, network); gconf_client_set_int (client, key, self->priv->we_cipher, NULL); @@ -277,7 +275,9 @@ nm_gconf_wso_init (NMGConfWSO * self) static void nm_gconf_wso_dispose (GObject *object) { - NMGConfWSO *self = (NMGConfWSO *) object; + NMGConfWSO * self = (NMGConfWSO *) object; + NMGConfWSOClass * klass; + GObjectClass * parent_class; if (self->priv->dispose_has_run) /* If dispose did already run, return. */ @@ -294,19 +294,25 @@ nm_gconf_wso_dispose (GObject *object) */ /* Chain up to the parent class */ - G_OBJECT_CLASS (parent_class)->dispose (object); + klass = NM_GCONF_WSO_CLASS (g_type_class_peek (NM_TYPE_GCONF_WSO)); + parent_class = G_OBJECT_CLASS (g_type_class_peek_parent (klass)); + parent_class->dispose (object); } static void nm_gconf_wso_finalize (GObject *object) { - NMGConfWSO *self = (NMGConfWSO *) object; + NMGConfWSO * self = (NMGConfWSO *) object; + NMGConfWSOClass * klass; + GObjectClass * parent_class; /* Complete object destruction */ g_free (self->priv->key); /* Chain up to the parent class */ - G_OBJECT_CLASS (parent_class)->finalize (object); + klass = NM_GCONF_WSO_CLASS (g_type_class_peek (NM_TYPE_GCONF_WSO)); + parent_class = G_OBJECT_CLASS (g_type_class_peek_parent (klass)); + parent_class->finalize (object); } diff --git a/gnome/applet/nm-gconf-wso.h b/gnome/applet/nm-gconf-wso.h index 89ed44f0c3..a36d389aa3 100644 --- a/gnome/applet/nm-gconf-wso.h +++ b/gnome/applet/nm-gconf-wso.h @@ -54,9 +54,9 @@ struct _NMGConfWSOClass GObjectClass parent; /* class members */ - int (*serialize_dbus_func) (NMGConfWSO *self, DBusMessageIter *iter); + gboolean (*serialize_dbus_func) (NMGConfWSO *self, DBusMessageIter *iter); - int (*serialize_gconf_func) (NMGConfWSO *self, GConfClient *client, const char *network); + gboolean (*serialize_gconf_func) (NMGConfWSO *self, GConfClient *client, const char *network); }; @@ -74,8 +74,8 @@ const char * nm_gconf_wso_get_key (NMGConfWSO *self); void nm_gconf_wso_set_key (NMGConfWSO *self, const char *key, int key_len); -int nm_gconf_wso_serialize_dbus (NMGConfWSO *self, DBusMessageIter *iter); +gboolean nm_gconf_wso_serialize_dbus (NMGConfWSO *self, DBusMessageIter *iter); -int nm_gconf_wso_serialize_gconf (NMGConfWSO *self, GConfClient *client, const char *network); +gboolean nm_gconf_wso_serialize_gconf (NMGConfWSO *self, GConfClient *client, const char *network); #endif /* NM_GCONF_WSO_H */ diff --git a/src/NetworkManagerAP.c b/src/NetworkManagerAP.c index bbe77ecda2..d64734ca72 100644 --- a/src/NetworkManagerAP.c +++ b/src/NetworkManagerAP.c @@ -201,6 +201,14 @@ void nm_ap_set_essid (NMAccessPoint *ap, const char * essid) } +guint32 nm_ap_get_capabilities (NMAccessPoint *ap) +{ + g_return_val_if_fail (ap != NULL, -1); + + return ap->capabilities; +} + + /* * Get/set functions for encrypted flag * @@ -216,12 +224,13 @@ gboolean nm_ap_get_encrypted (const NMAccessPoint *ap) void nm_ap_set_encrypted (NMAccessPoint *ap, gboolean privacy) { +#define ALL_WEP (NM_802_11_CAP_PROTO_WEP | NM_802_11_CAP_CIPHER_WEP104 | NM_802_11_CAP_CIPHER_WEP40) g_return_if_fail (ap != NULL); if (privacy) - ap->capabilities |= NM_802_11_CAP_PROTO_WEP; + ap->capabilities |= ALL_WEP; else - ap->capabilities &= ~NM_802_11_CAP_PROTO_WEP; + ap->capabilities &= ~ALL_WEP; } /* diff --git a/src/NetworkManagerAP.h b/src/NetworkManagerAP.h index 9db33f0274..7f7cf6a1cb 100644 --- a/src/NetworkManagerAP.h +++ b/src/NetworkManagerAP.h @@ -43,6 +43,8 @@ void nm_ap_set_timestamp (NMAccessPoint *ap, const GTimeVal *timestamp); char * nm_ap_get_essid (const NMAccessPoint *ap); void nm_ap_set_essid (NMAccessPoint *ap, const char *essid); +guint32 nm_ap_get_capabilities (NMAccessPoint *ap); + gboolean nm_ap_get_encrypted (const NMAccessPoint *ap); void nm_ap_set_encrypted (NMAccessPoint *ap, gboolean privacy); diff --git a/src/NetworkManagerDevice.c b/src/NetworkManagerDevice.c index a56ed385a0..da237b7202 100644 --- a/src/NetworkManagerDevice.c +++ b/src/NetworkManagerDevice.c @@ -2483,15 +2483,17 @@ static gboolean nm_device_wireless_wait_for_link (NMDevice *dev, const char *ess } -#if 0 static gboolean ap_need_key (NMDevice *dev, NMAccessPoint *ap) { - char *essid; - gboolean need_key = FALSE; + char * essid; + gboolean need_key = FALSE; + NMAPSecurity * security; g_return_val_if_fail (ap != NULL, FALSE); essid = nm_ap_get_essid (ap); + security = nm_ap_get_security (ap); + g_assert (security); if (!nm_ap_get_encrypted (ap)) { @@ -2500,7 +2502,7 @@ static gboolean ap_need_key (NMDevice *dev, NMAccessPoint *ap) } else { - if (nm_ap_is_enc_key_valid (ap)) + if (nm_ap_security_get_key (security)) { nm_info ("Activation (%s/wireless): access point '%s' " "is encrypted, and a key exists. No new key needed.", @@ -2510,15 +2512,13 @@ static gboolean ap_need_key (NMDevice *dev, NMAccessPoint *ap) { nm_info ("Activation (%s/wireless): access point '%s' " "is encrypted, but NO valid key exists. New key needed.", - nm_device_get_iface (dev), - essid ? essid : "(null)"); + nm_device_get_iface (dev), essid ? essid : "(null)"); need_key = TRUE; } } return need_key; } -#endif /* @@ -2549,14 +2549,11 @@ static void nm_device_wireless_configure (NMActRequest *req) nm_info ("Activation (%s/wireless) Stage 2 (Device Configure) will connect to access point '%s'.", nm_device_get_iface (dev), nm_ap_get_essid (ap)); -#if 0 -// FIXME if (ap_need_key (dev, ap)) { nm_dbus_get_user_key_for_network (data->dbus_connection, req, FALSE); return; } -#endif while (success == FALSE) { @@ -2574,7 +2571,7 @@ static void nm_device_wireless_configure (NMActRequest *req) if (!link) { - nm_debug ("Activation (%s/wireless): no hardware link to '%s'.", + nm_info ("Activation (%s/wireless): no hardware link to '%s'.", nm_device_get_iface (dev), nm_ap_get_essid (ap) ? nm_ap_get_essid (ap) : "(none)"); nm_policy_schedule_activation_failed (req); break; @@ -3641,7 +3638,6 @@ NMAccessPoint * nm_device_wireless_get_activation_ap (NMDevice *dev, const char g_return_val_if_fail (dev != NULL, NULL); g_return_val_if_fail (dev->app_data != NULL, NULL); g_return_val_if_fail (essid != NULL, NULL); - g_return_val_if_fail (security != NULL, NULL); nm_debug ("Forcing AP '%s'", essid); @@ -3650,8 +3646,18 @@ NMAccessPoint * nm_device_wireless_get_activation_ap (NMDevice *dev, const char */ if (!(ap = nm_ap_list_get_ap_by_essid (nm_device_ap_list_get (dev), essid))) { - /* Okay, the card didn't see it in the scan, Cisco cards sometimes do this. - * So we make a "fake" access point and add it to the scan list. + /* We need security information from the user if the network they + * request isn't in our scan list. + */ + if (!security) + { + nm_warning ("%s: tried to manually connect to network '%s' without " + "providing security information!", __func__, essid); + return NULL; + } + + /* User chose a network we haven't seen in a scan, so create a + * "fake" access point and add it to yhe scan list. */ ap = nm_ap_new (); nm_ap_set_essid (ap, essid); @@ -3665,7 +3671,12 @@ NMAccessPoint * nm_device_wireless_get_activation_ap (NMDevice *dev, const char * the User Knows What's Best. */ nm_ap_list_remove_ap_by_essid (dev->app_data->invalid_ap_list, nm_ap_get_essid (ap)); + + /* If we didn't get any security info, make some up. */ + if (!security) + security = nm_ap_security_new_from_ap (ap); } + g_assert (security); nm_ap_set_security (ap, security); return ap; diff --git a/src/nm-ap-security-wep.c b/src/nm-ap-security-wep.c index 7e437e40be..aea2397be2 100644 --- a/src/nm-ap-security-wep.c +++ b/src/nm-ap-security-wep.c @@ -37,6 +37,17 @@ struct _NMAPSecurityWEPPrivate int auth_algorithm; }; +static void set_description (NMAPSecurityWEP *security) +{ + NMAPSecurity * parent = NM_AP_SECURITY (security); + + if (nm_ap_security_get_we_cipher (parent) == IW_AUTH_CIPHER_WEP40) + nm_ap_security_set_description (parent, _("40-bit WEP")); + else + nm_ap_security_set_description (parent, _("104-bit WEP")); + +} + NMAPSecurityWEP * nm_ap_security_wep_new_deserialize (DBusMessageIter *iter, int we_cipher) { @@ -58,15 +69,29 @@ nm_ap_security_wep_new_deserialize (DBusMessageIter *iter, int we_cipher) nm_ap_security_set_key (NM_AP_SECURITY (security), key, key_len); security->priv->auth_algorithm = auth_algorithm; - if (we_cipher == IW_AUTH_CIPHER_WEP40) - nm_ap_security_set_description (NM_AP_SECURITY (security), _("40-bit WEP")); - else - nm_ap_security_set_description (NM_AP_SECURITY (security), _("104-bit WEP")); + set_description (security); out: return security; } +NMAPSecurityWEP * +nm_ap_security_wep_new_from_ap (NMAccessPoint *ap, int we_cipher) +{ + NMAPSecurityWEP * security = NULL; + + g_return_val_if_fail (ap != NULL, NULL); + g_return_val_if_fail ((we_cipher == IW_AUTH_CIPHER_WEP40) || (we_cipher == IW_AUTH_CIPHER_WEP104), NULL); + + security = g_object_new (NM_TYPE_AP_SECURITY_WEP, NULL); + nm_ap_security_set_we_cipher (NM_AP_SECURITY (security), we_cipher); + security->priv->auth_algorithm = IW_AUTH_ALG_OPEN_SYSTEM; + + set_description (security); + + return security; +} + static int real_serialize (NMAPSecurity *instance, DBusMessageIter *iter) { diff --git a/src/nm-ap-security-wep.h b/src/nm-ap-security-wep.h index 0908b155c6..8cbdfc95bb 100644 --- a/src/nm-ap-security-wep.h +++ b/src/nm-ap-security-wep.h @@ -55,4 +55,7 @@ GType nm_ap_security_wep_get_type (void); NMAPSecurityWEP * nm_ap_security_wep_new_deserialize (DBusMessageIter *iter, int we_cipher); +struct NMAccessPoint; +NMAPSecurityWEP * nm_ap_security_wep_new_from_ap (struct NMAccessPoint *ap, int we_cipher); + #endif /* NM_AP_SECURITY_WEP_H */ diff --git a/src/nm-ap-security.c b/src/nm-ap-security.c index d68cda436a..ffd9d50cec 100644 --- a/src/nm-ap-security.c +++ b/src/nm-ap-security.c @@ -95,6 +95,42 @@ out: return security; } + +#define WPA2_CCMP_PSK (NM_802_11_CAP_PROTO_WPA2 | NM_802_11_CAP_CIPHER_CCMP | NM_802_11_CAP_KEY_MGMT_PSK) +#define WPA2_TKIP_PSK (NM_802_11_CAP_PROTO_WPA2 | NM_802_11_CAP_CIPHER_TKIP | NM_802_11_CAP_KEY_MGMT_PSK) +#define WPA_TKIP_PSK (NM_802_11_CAP_PROTO_WPA | NM_802_11_CAP_CIPHER_TKIP | NM_802_11_CAP_KEY_MGMT_PSK) +#define WEP_WEP104 (NM_802_11_CAP_PROTO_WEP | NM_802_11_CAP_CIPHER_WEP104) +#define WEP_WEP40 (NM_802_11_CAP_PROTO_WEP | NM_802_11_CAP_CIPHER_WEP40) +NMAPSecurity * +nm_ap_security_new_from_ap (NMAccessPoint *ap) +{ + NMAPSecurity * security = NULL; + guint32 caps; + + g_return_val_if_fail (ap != NULL, NULL); + + /* Deteremine best encryption algorithm to use */ + caps = nm_ap_get_capabilities (ap); + +/* + if (caps & WPA2_CCMP_PSK) + stuff + else if (caps & WPA2_TKIP_PSK) + stuff + else if (caps & WPA_TKIP_PSK) + stuff + else +*/ + if (caps & WEP_WEP104) + security = NM_AP_SECURITY (nm_ap_security_wep_new_from_ap (ap, IW_AUTH_CIPHER_WEP104)); + else if (caps & WEP_WEP40) + security = NM_AP_SECURITY (nm_ap_security_wep_new_from_ap (ap, IW_AUTH_CIPHER_WEP40)); + else if (!nm_ap_get_encrypted (ap)) + security = nm_ap_security_new (IW_AUTH_CIPHER_NONE); + + return security; +} + void nm_ap_security_write_wpa_supplicant_config (NMAPSecurity *self, int fd) { @@ -246,7 +282,8 @@ nm_ap_security_copy_properties (NMAPSecurity *self, NMAPSecurity *dst) g_return_if_fail (self != dst); nm_ap_security_set_we_cipher (dst, self->priv->we_cipher); - nm_ap_security_set_key (dst, self->priv->key, strlen (self->priv->key)); + if (self->priv->key) + nm_ap_security_set_key (dst, self->priv->key, strlen (self->priv->key)); nm_ap_security_set_description (dst, self->priv->description); } diff --git a/src/nm-ap-security.h b/src/nm-ap-security.h index 4128370848..4b530721a5 100644 --- a/src/nm-ap-security.h +++ b/src/nm-ap-security.h @@ -47,6 +47,7 @@ struct _NMAPSecurity }; struct NMDevice; +struct NMAccessPoint; struct _NMAPSecurityClass { @@ -69,6 +70,8 @@ NMAPSecurity * nm_ap_security_new_copy (NMAPSecurity *self); NMAPSecurity * nm_ap_security_new_deserialize (DBusMessageIter *iter); +NMAPSecurity * nm_ap_security_new_from_ap (struct NMAccessPoint *ap); + int nm_ap_security_get_we_cipher (NMAPSecurity *self); const char * nm_ap_security_get_key (NMAPSecurity *self); diff --git a/src/nm-dbus-nm.c b/src/nm-dbus-nm.c index 1a994e7670..e1fea2cd21 100644 --- a/src/nm-dbus-nm.c +++ b/src/nm-dbus-nm.c @@ -202,7 +202,8 @@ static DBusMessage *nm_dbus_nm_set_active_device (DBusConnection *connection, DB if (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_OBJECT_PATH) { - reply = nm_dbus_create_error_message (message, NM_DBUS_INTERFACE, INVALID_ARGS_ERROR, INVALID_ARGS_MESSAGE); + nm_warning ("%s:%d (%s): Invalid arguments (first arg type was not OBJECT_PATH).", + __FILE__, __LINE__, __func__); goto out; } @@ -216,6 +217,7 @@ static DBusMessage *nm_dbus_nm_set_active_device (DBusConnection *connection, DB { reply = nm_dbus_create_error_message (message, NM_DBUS_INTERFACE, "DeviceNotFound", "The requested network device does not exist."); + nm_warning ("%s:%d (%s): Invalid device (device not found).", __FILE__, __LINE__, __func__); goto out; } @@ -226,22 +228,30 @@ static DBusMessage *nm_dbus_nm_set_active_device (DBusConnection *connection, DB if (!dbus_message_iter_next (&iter) || (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_STRING)) { - reply = nm_dbus_create_error_message (message, NM_DBUS_INTERFACE, INVALID_ARGS_ERROR, INVALID_ARGS_MESSAGE); + nm_warning ("%s:%d (%s): Invalid argument type (essid).", __FILE__, __LINE__, __func__); goto out; } /* grab ssid and ensure validity */ dbus_message_iter_get_basic (&iter, &essid); - if (!essid || (strlen (essid) <= 0) || !dbus_message_iter_next (&iter)) + if (!essid || (strlen (essid) <= 0)) { - reply = nm_dbus_create_error_message (message, NM_DBUS_INTERFACE, INVALID_ARGS_ERROR, INVALID_ARGS_MESSAGE); + nm_warning ("%s:%d (%s): Invalid argument (essid).", __FILE__, __LINE__, __func__); goto out; } - if (!(security = nm_ap_security_new_deserialize (&iter))) + /* If there's security information, we use that. If not, we + * make some up from the scan list. + */ + if (dbus_message_iter_has_next (&iter)) { - reply = nm_dbus_create_error_message (message, NM_DBUS_INTERFACE, INVALID_ARGS_ERROR, INVALID_ARGS_MESSAGE); - goto out; + if (!(security = nm_ap_security_new_deserialize (&iter))) + { + /* There was security info, but it was invalid */ + reply = nm_dbus_create_error_message (message, NM_DBUS_INTERFACE, INVALID_ARGS_ERROR, INVALID_ARGS_MESSAGE); + nm_warning ("%s:%d (%s): Invalid argument (wireless security info).", __FILE__, __LINE__, __func__); + goto out; + } } /* Set up the wireless-specific activation request properties */ @@ -260,6 +270,12 @@ static DBusMessage *nm_dbus_nm_set_active_device (DBusConnection *connection, DB nm_policy_schedule_device_activation (nm_act_request_new (data->data, dev, ap, TRUE)); out: + if (!reply) + { + reply = nm_dbus_create_error_message (message, NM_DBUS_INTERFACE, + INVALID_ARGS_ERROR, INVALID_ARGS_MESSAGE); + } + return reply; }