2006-03-03 Dan Williams <dcbw@redhat.com>
Fix a crash if an "Other wireless network" was chosen, failed, then chosen again from the applet's menu. If the other network wasn't noticed in a scan, it wouldn't have any capabilities, but would still be listed because the user forced the network. To fix this, we set sensible capabilities on the forced network, which will get overwritten with the correct ones if the network shows up later in a scan. * src/nm-ap-security.h - Add a new "get_default_capabilities_func" member to the NMAPSecurity class * src/nm-ap-security.c - (nm_ap_security_get_default_capabilities): new function * src/nm-ap-security.c src/nm-ap-security-wep.c src/nm-ap-security-wpa-psk.c src/nm-ap-security-wpa-eap.c - Implement get_default_capabilities_func() for all, which uses the information contained in a specific NMAPSecurity object to determine default AP capabilites necessary to support that object As a secondary measure, we now prune artificial access points that fail to be activated right away. The thing failed, and we have no scan data for it, so it's pretty much useless since security information is only saved in the applets when a connection is successful. * src/NetworkManagerAPList.c - (nm_ap_list_merge_scanned_ap): mark any ap noticed in a scan not artificial. If we see it, it's no longer a figment of the user's imagination :) * src/NetworkManagerPolicy.c - (nm_policy_activation_failed): send along the failed AP if we have it * src/nm-device-802-11-wireless.c - (real_activation_failure_handler): remove artificial APs from the device list, because activation failed git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@1542 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
This commit is contained in:
43
ChangeLog
43
ChangeLog
@@ -1,3 +1,46 @@
|
|||||||
|
2006-03-03 Dan Williams <dcbw@redhat.com>
|
||||||
|
|
||||||
|
Fix a crash if an "Other wireless network" was chosen, failed, then
|
||||||
|
chosen again from the applet's menu. If the other network wasn't
|
||||||
|
noticed in a scan, it wouldn't have any capabilities, but would still
|
||||||
|
be listed because the user forced the network. To fix this, we set
|
||||||
|
sensible capabilities on the forced network, which will get overwritten
|
||||||
|
with the correct ones if the network shows up later in a scan.
|
||||||
|
|
||||||
|
* src/nm-ap-security.h
|
||||||
|
- Add a new "get_default_capabilities_func" member to the
|
||||||
|
NMAPSecurity class
|
||||||
|
|
||||||
|
* src/nm-ap-security.c
|
||||||
|
- (nm_ap_security_get_default_capabilities): new function
|
||||||
|
|
||||||
|
* src/nm-ap-security.c
|
||||||
|
src/nm-ap-security-wep.c
|
||||||
|
src/nm-ap-security-wpa-psk.c
|
||||||
|
src/nm-ap-security-wpa-eap.c
|
||||||
|
- Implement get_default_capabilities_func() for all, which
|
||||||
|
uses the information contained in a specific NMAPSecurity
|
||||||
|
object to determine default AP capabilites necessary
|
||||||
|
to support that object
|
||||||
|
|
||||||
|
As a secondary measure, we now prune artificial access points that fail
|
||||||
|
to be activated right away. The thing failed, and we have no scan data for
|
||||||
|
it, so it's pretty much useless since security information is only saved
|
||||||
|
in the applets when a connection is successful.
|
||||||
|
|
||||||
|
* src/NetworkManagerAPList.c
|
||||||
|
- (nm_ap_list_merge_scanned_ap): mark any ap noticed in a scan
|
||||||
|
not artificial. If we see it, it's no longer a figment of the
|
||||||
|
user's imagination :)
|
||||||
|
|
||||||
|
* src/NetworkManagerPolicy.c
|
||||||
|
- (nm_policy_activation_failed): send along the failed AP if we
|
||||||
|
have it
|
||||||
|
|
||||||
|
* src/nm-device-802-11-wireless.c
|
||||||
|
- (real_activation_failure_handler): remove artificial APs from
|
||||||
|
the device list, because activation failed
|
||||||
|
|
||||||
2006-03-02 Robert Love <rml@novell.com>
|
2006-03-02 Robert Love <rml@novell.com>
|
||||||
|
|
||||||
Add support for retrieving both the per-device speed and the
|
Add support for retrieving both the per-device speed and the
|
||||||
|
@@ -480,6 +480,11 @@ gboolean nm_ap_list_merge_scanned_ap (NMDevice80211Wireless *dev, NMAccessPointL
|
|||||||
nm_ap_set_last_seen (list_ap, merge_ap_seen);
|
nm_ap_set_last_seen (list_ap, merge_ap_seen);
|
||||||
nm_ap_set_broadcast (list_ap, nm_ap_get_broadcast (merge_ap));
|
nm_ap_set_broadcast (list_ap, nm_ap_get_broadcast (merge_ap));
|
||||||
|
|
||||||
|
/* If the AP is noticed in a scan, it's automatically no longer
|
||||||
|
* artificial, since it clearly exists somewhere.
|
||||||
|
*/
|
||||||
|
nm_ap_set_artificial (list_ap, FALSE);
|
||||||
|
|
||||||
/* Have to change AP's name _after_ dbus signal for old network name
|
/* Have to change AP's name _after_ dbus signal for old network name
|
||||||
* has gone out.
|
* has gone out.
|
||||||
*/
|
*/
|
||||||
@@ -511,6 +516,11 @@ gboolean nm_ap_list_merge_scanned_ap (NMDevice80211Wireless *dev, NMAccessPointL
|
|||||||
}
|
}
|
||||||
nm_ap_set_last_seen (list_ap, merge_ap_seen);
|
nm_ap_set_last_seen (list_ap, merge_ap_seen);
|
||||||
nm_ap_set_broadcast (list_ap, nm_ap_get_broadcast (merge_ap));
|
nm_ap_set_broadcast (list_ap, nm_ap_get_broadcast (merge_ap));
|
||||||
|
|
||||||
|
/* If the AP is noticed in a scan, it's automatically no longer
|
||||||
|
* artificial, since it clearly exists somewhere.
|
||||||
|
*/
|
||||||
|
nm_ap_set_artificial (list_ap, FALSE);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@@ -113,6 +113,7 @@ static gboolean nm_policy_activation_failed (NMActRequest *req)
|
|||||||
{
|
{
|
||||||
NMDevice * dev = NULL;
|
NMDevice * dev = NULL;
|
||||||
NMData * data = NULL;
|
NMData * data = NULL;
|
||||||
|
NMAccessPoint *ap = NULL;
|
||||||
|
|
||||||
g_return_val_if_fail (req != NULL, FALSE);
|
g_return_val_if_fail (req != NULL, FALSE);
|
||||||
|
|
||||||
@@ -124,8 +125,11 @@ static gboolean nm_policy_activation_failed (NMActRequest *req)
|
|||||||
|
|
||||||
nm_device_activation_failure_handler (dev, req);
|
nm_device_activation_failure_handler (dev, req);
|
||||||
|
|
||||||
|
if (nm_device_is_802_11_wireless (dev))
|
||||||
|
ap = nm_act_request_get_ap (req);
|
||||||
|
|
||||||
nm_info ("Activation (%s) failed.", nm_device_get_iface (dev));
|
nm_info ("Activation (%s) failed.", nm_device_get_iface (dev));
|
||||||
nm_dbus_schedule_device_status_change_signal (data, dev, NULL, DEVICE_ACTIVATION_FAILED);
|
nm_dbus_schedule_device_status_change_signal (data, dev, ap, DEVICE_ACTIVATION_FAILED);
|
||||||
|
|
||||||
nm_device_deactivate (dev);
|
nm_device_deactivate (dev);
|
||||||
nm_schedule_state_change_signal_broadcast (data);
|
nm_schedule_state_change_signal_broadcast (data);
|
||||||
|
@@ -140,6 +140,25 @@ out:
|
|||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static guint32
|
||||||
|
real_get_default_capabilities (NMAPSecurity *instance)
|
||||||
|
{
|
||||||
|
guint32 caps = NM_802_11_CAP_NONE;
|
||||||
|
|
||||||
|
switch (nm_ap_security_get_we_cipher (instance))
|
||||||
|
{
|
||||||
|
case IW_AUTH_CIPHER_WEP40:
|
||||||
|
caps |= (NM_802_11_CAP_PROTO_WEP | NM_802_11_CAP_CIPHER_WEP40);
|
||||||
|
break;
|
||||||
|
case IW_AUTH_CIPHER_WEP104:
|
||||||
|
caps |= (NM_802_11_CAP_PROTO_WEP | NM_802_11_CAP_CIPHER_WEP104);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return caps;
|
||||||
|
}
|
||||||
|
|
||||||
static NMAPSecurity *
|
static NMAPSecurity *
|
||||||
real_copy_constructor (NMAPSecurity *instance)
|
real_copy_constructor (NMAPSecurity *instance)
|
||||||
{
|
{
|
||||||
@@ -167,6 +186,7 @@ nm_ap_security_wep_class_init (NMAPSecurityWEPClass *klass)
|
|||||||
par_class->copy_constructor_func = real_copy_constructor;
|
par_class->copy_constructor_func = real_copy_constructor;
|
||||||
par_class->serialize_func = real_serialize;
|
par_class->serialize_func = real_serialize;
|
||||||
par_class->write_supplicant_config_func = real_write_supplicant_config;
|
par_class->write_supplicant_config_func = real_write_supplicant_config;
|
||||||
|
par_class->get_default_capabilities_func = real_get_default_capabilities;
|
||||||
|
|
||||||
g_type_class_add_private (object_class, sizeof (NMAPSecurityWEPPrivate));
|
g_type_class_add_private (object_class, sizeof (NMAPSecurityWEPPrivate));
|
||||||
}
|
}
|
||||||
|
@@ -84,7 +84,6 @@ nm_ap_security_wpa_eap_new_deserialize (DBusMessageIter *iter)
|
|||||||
security->priv->private_key_file = g_strdup (private_key_file);
|
security->priv->private_key_file = g_strdup (private_key_file);
|
||||||
security->priv->client_cert_file = g_strdup (client_cert_file);
|
security->priv->client_cert_file = g_strdup (client_cert_file);
|
||||||
security->priv->ca_cert_file = g_strdup (ca_cert_file);
|
security->priv->ca_cert_file = g_strdup (ca_cert_file);
|
||||||
security->priv->wpa_version = wpa_version;
|
|
||||||
|
|
||||||
if (wpa_version == IW_AUTH_WPA_VERSION_WPA2)
|
if (wpa_version == IW_AUTH_WPA_VERSION_WPA2)
|
||||||
nm_ap_security_set_description (NM_AP_SECURITY (security), _("WPA2 Enterprise"));
|
nm_ap_security_set_description (NM_AP_SECURITY (security), _("WPA2 Enterprise"));
|
||||||
@@ -282,6 +281,22 @@ out:
|
|||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static guint32
|
||||||
|
real_get_default_capabilities (NMAPSecurity *instance)
|
||||||
|
{
|
||||||
|
NMAPSecurityWPA_EAP *self = NM_AP_SECURITY_WPA_EAP (instance);
|
||||||
|
guint32 caps = NM_802_11_CAP_NONE;
|
||||||
|
|
||||||
|
if (self->priv->wpa_version == IW_AUTH_WPA_VERSION_WPA)
|
||||||
|
caps |= NM_802_11_CAP_PROTO_WPA | NM_802_11_CAP_CIPHER_TKIP;
|
||||||
|
else if (self->priv->wpa_version == IW_AUTH_WPA_VERSION_WPA2)
|
||||||
|
caps |= NM_802_11_CAP_PROTO_WPA2 | NM_802_11_CAP_CIPHER_CCMP;
|
||||||
|
|
||||||
|
if (self->priv->key_mgmt == IW_AUTH_KEY_MGMT_802_1X)
|
||||||
|
caps |= NM_802_11_CAP_KEY_MGMT_802_1X;
|
||||||
|
|
||||||
|
return caps;
|
||||||
|
}
|
||||||
|
|
||||||
static NMAPSecurity *
|
static NMAPSecurity *
|
||||||
real_copy_constructor (NMAPSecurity *instance)
|
real_copy_constructor (NMAPSecurity *instance)
|
||||||
@@ -332,6 +347,7 @@ nm_ap_security_wpa_eap_class_init (NMAPSecurityWPA_EAPClass *klass)
|
|||||||
par_class->copy_constructor_func = real_copy_constructor;
|
par_class->copy_constructor_func = real_copy_constructor;
|
||||||
par_class->serialize_func = real_serialize;
|
par_class->serialize_func = real_serialize;
|
||||||
par_class->write_supplicant_config_func = real_write_supplicant_config;
|
par_class->write_supplicant_config_func = real_write_supplicant_config;
|
||||||
|
par_class->get_default_capabilities_func = real_get_default_capabilities;
|
||||||
|
|
||||||
g_type_class_add_private (object_class, sizeof (NMAPSecurityWPA_EAPPrivate));
|
g_type_class_add_private (object_class, sizeof (NMAPSecurityWPA_EAPPrivate));
|
||||||
}
|
}
|
||||||
|
@@ -210,6 +210,30 @@ out:
|
|||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static guint32
|
||||||
|
real_get_default_capabilities (NMAPSecurity *instance)
|
||||||
|
{
|
||||||
|
NMAPSecurityWPA_PSK * self = NM_AP_SECURITY_WPA_PSK (instance);
|
||||||
|
guint32 caps = NM_802_11_CAP_NONE;
|
||||||
|
int we_cipher = nm_ap_security_get_we_cipher (instance);
|
||||||
|
|
||||||
|
if (we_cipher == IW_AUTH_CIPHER_TKIP)
|
||||||
|
caps |= NM_802_11_CAP_CIPHER_TKIP;
|
||||||
|
else if (we_cipher == IW_AUTH_CIPHER_CCMP)
|
||||||
|
caps |= NM_802_11_CAP_CIPHER_CCMP;
|
||||||
|
else if (we_cipher == NM_AUTH_TYPE_WPA_PSK_AUTO)
|
||||||
|
caps |= (NM_802_11_CAP_CIPHER_TKIP | NM_802_11_CAP_CIPHER_CCMP);
|
||||||
|
|
||||||
|
if (self->priv->wpa_version == IW_AUTH_WPA_VERSION_WPA)
|
||||||
|
caps |= NM_802_11_CAP_PROTO_WPA;
|
||||||
|
else if (self->priv->wpa_version == IW_AUTH_WPA_VERSION_WPA2)
|
||||||
|
caps |= NM_802_11_CAP_PROTO_WPA2;
|
||||||
|
|
||||||
|
if (self->priv->key_mgt == IW_AUTH_KEY_MGMT_PSK)
|
||||||
|
caps |= NM_802_11_CAP_KEY_MGMT_PSK;
|
||||||
|
return caps;
|
||||||
|
}
|
||||||
|
|
||||||
static NMAPSecurity *
|
static NMAPSecurity *
|
||||||
real_copy_constructor (NMAPSecurity *instance)
|
real_copy_constructor (NMAPSecurity *instance)
|
||||||
{
|
{
|
||||||
@@ -239,6 +263,7 @@ nm_ap_security_wpa_psk_class_init (NMAPSecurityWPA_PSKClass *klass)
|
|||||||
par_class->copy_constructor_func = real_copy_constructor;
|
par_class->copy_constructor_func = real_copy_constructor;
|
||||||
par_class->serialize_func = real_serialize;
|
par_class->serialize_func = real_serialize;
|
||||||
par_class->write_supplicant_config_func = real_write_supplicant_config;
|
par_class->write_supplicant_config_func = real_write_supplicant_config;
|
||||||
|
par_class->get_default_capabilities_func = real_get_default_capabilities;
|
||||||
|
|
||||||
g_type_class_add_private (object_class, sizeof (NMAPSecurityWPA_PSKPrivate));
|
g_type_class_add_private (object_class, sizeof (NMAPSecurityWPA_PSKPrivate));
|
||||||
}
|
}
|
||||||
|
@@ -142,6 +142,15 @@ nm_ap_security_new_from_ap (NMAccessPoint *ap)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
guint32
|
||||||
|
nm_ap_security_get_default_capabilities (NMAPSecurity *self)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail (self != NULL, NM_802_11_CAP_PROTO_NONE);
|
||||||
|
|
||||||
|
return NM_AP_SECURITY_GET_CLASS (self)->get_default_capabilities_func (self);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
nm_ap_security_write_supplicant_config (NMAPSecurity *self,
|
nm_ap_security_write_supplicant_config (NMAPSecurity *self,
|
||||||
struct wpa_ctrl *ctrl,
|
struct wpa_ctrl *ctrl,
|
||||||
@@ -223,6 +232,12 @@ real_write_supplicant_config (NMAPSecurity *self,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static guint32
|
||||||
|
real_get_default_capabilities (NMAPSecurity *self)
|
||||||
|
{
|
||||||
|
return NM_802_11_CAP_PROTO_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
nm_ap_security_get_we_cipher (NMAPSecurity *self)
|
nm_ap_security_get_we_cipher (NMAPSecurity *self)
|
||||||
{
|
{
|
||||||
@@ -360,6 +375,7 @@ nm_ap_security_class_init (NMAPSecurityClass *klass)
|
|||||||
klass->copy_constructor_func = real_copy_constructor;
|
klass->copy_constructor_func = real_copy_constructor;
|
||||||
klass->serialize_func = real_serialize;
|
klass->serialize_func = real_serialize;
|
||||||
klass->write_supplicant_config_func = real_write_supplicant_config;
|
klass->write_supplicant_config_func = real_write_supplicant_config;
|
||||||
|
klass->get_default_capabilities_func = real_get_default_capabilities;
|
||||||
|
|
||||||
g_type_class_add_private (object_class, sizeof (NMAPSecurityPrivate));
|
g_type_class_add_private (object_class, sizeof (NMAPSecurityPrivate));
|
||||||
}
|
}
|
||||||
|
@@ -68,6 +68,8 @@ struct _NMAPSecurityClass
|
|||||||
struct wpa_ctrl *ctrl,
|
struct wpa_ctrl *ctrl,
|
||||||
int nwid,
|
int nwid,
|
||||||
gboolean user_created);
|
gboolean user_created);
|
||||||
|
|
||||||
|
guint32 (*get_default_capabilities_func)(NMAPSecurity *self);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -93,6 +95,8 @@ gboolean nm_ap_security_write_supplicant_config (NMAPSecurity *self,
|
|||||||
|
|
||||||
const char * nm_ap_security_get_description (NMAPSecurity *self);
|
const char * nm_ap_security_get_description (NMAPSecurity *self);
|
||||||
|
|
||||||
|
guint32 nm_ap_security_get_default_capabilities (NMAPSecurity *self);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* NM_AP_SECURITY_H */
|
#endif /* NM_AP_SECURITY_H */
|
||||||
|
@@ -699,6 +699,10 @@ nm_device_802_11_wireless_get_activation_ap (NMDevice80211Wireless *self,
|
|||||||
nm_ap_set_essid (ap, essid);
|
nm_ap_set_essid (ap, essid);
|
||||||
nm_ap_set_artificial (ap, TRUE);
|
nm_ap_set_artificial (ap, TRUE);
|
||||||
nm_ap_set_broadcast (ap, FALSE);
|
nm_ap_set_broadcast (ap, FALSE);
|
||||||
|
/* Ensure the AP has some capabilities. They will get overwritten
|
||||||
|
* with the correct ones next time the AP is seen in a scan.
|
||||||
|
*/
|
||||||
|
nm_ap_set_capabilities (ap, nm_ap_security_get_default_capabilities (security));
|
||||||
nm_ap_list_append_ap (dev_ap_list, ap);
|
nm_ap_list_append_ap (dev_ap_list, ap);
|
||||||
nm_ap_unref (ap);
|
nm_ap_unref (ap);
|
||||||
}
|
}
|
||||||
@@ -2783,6 +2787,7 @@ real_activation_failure_handler (NMDevice *dev,
|
|||||||
NMActRequest *req)
|
NMActRequest *req)
|
||||||
{
|
{
|
||||||
NMData * app_data;
|
NMData * app_data;
|
||||||
|
NMDevice80211Wireless * self = NM_DEVICE_802_11_WIRELESS (dev);
|
||||||
NMAccessPoint * ap;
|
NMAccessPoint * ap;
|
||||||
|
|
||||||
app_data = nm_act_request_get_data (req);
|
app_data = nm_act_request_get_data (req);
|
||||||
@@ -2790,10 +2795,26 @@ real_activation_failure_handler (NMDevice *dev,
|
|||||||
|
|
||||||
if ((ap = nm_act_request_get_ap (req)))
|
if ((ap = nm_act_request_get_ap (req)))
|
||||||
{
|
{
|
||||||
/* Add the AP to the invalid list and force a best ap update */
|
if (nm_ap_get_artificial (ap))
|
||||||
|
{
|
||||||
|
NMAccessPointList * dev_list;
|
||||||
|
|
||||||
|
/* Artificial APs are ones that don't show up in scans,
|
||||||
|
* but which the user explicitly attempted to connect to.
|
||||||
|
* However, if we fail on one of these, remove it from the
|
||||||
|
* list because we don't have any scan or capability info
|
||||||
|
* for it, and they are pretty much useless.
|
||||||
|
*/
|
||||||
|
dev_list = nm_device_802_11_wireless_ap_list_get (self);
|
||||||
|
nm_ap_list_remove_ap (dev_list, ap);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Add the AP to the invalid list */
|
||||||
nm_ap_set_invalid (ap, TRUE);
|
nm_ap_set_invalid (ap, TRUE);
|
||||||
nm_ap_list_append_ap (app_data->invalid_ap_list, ap);
|
nm_ap_list_append_ap (app_data->invalid_ap_list, ap);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
nm_info ("Activation (%s) failed for access point (%s)", nm_device_get_iface (dev),
|
nm_info ("Activation (%s) failed for access point (%s)", nm_device_get_iface (dev),
|
||||||
ap ? nm_ap_get_essid (ap) : "(none)");
|
ap ? nm_ap_get_essid (ap) : "(none)");
|
||||||
|
Reference in New Issue
Block a user