From 481847df791fe585bee3d307e3405b63745dfc4b Mon Sep 17 00:00:00 2001 From: Daniel Drake Date: Fri, 04 Dec 2009 14:07:28 +0000 Subject: Send all network settings to NetworkManager in secrets response (#1602) This fixes shared key authentication with WEP networks. Thanks to Dan Williams for suggesting the solution. --- (limited to 'src/jarabe') diff --git a/src/jarabe/desktop/keydialog.py b/src/jarabe/desktop/keydialog.py index 8b8f0bf..1e6d17a 100644 --- a/src/jarabe/desktop/keydialog.py +++ b/src/jarabe/desktop/keydialog.py @@ -1,4 +1,5 @@ # Copyright (C) 2006-2007 Red Hat, Inc. +# Copyright (C) 2009 One Laptop per Child # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -62,10 +63,12 @@ class CanceledKeyRequestError(dbus.DBusException): self._dbus_error_name = network.NM_SETTINGS_IFACE + '.CanceledError' class KeyDialog(gtk.Dialog): - def __init__(self, ssid, flags, wpa_flags, rsn_flags, dev_caps, response): + def __init__(self, ssid, flags, wpa_flags, rsn_flags, dev_caps, settings, + response): gtk.Dialog.__init__(self, flags=gtk.DIALOG_MODAL) self.set_title("Wireless Key Required") + self._settings = settings self._response = response self._entry = None self._ssid = ssid @@ -110,9 +113,10 @@ WEP_HEX = 2 WEP_ASCII = 3 class WEPKeyDialog(KeyDialog): - def __init__(self, ssid, flags, wpa_flags, rsn_flags, dev_caps, response): + def __init__(self, ssid, flags, wpa_flags, rsn_flags, dev_caps, settings, + response): KeyDialog.__init__(self, ssid, flags, wpa_flags, rsn_flags, - dev_caps, response) + dev_caps, settings, response) # WEP key type self.key_store = gtk.ListStore(str, int) @@ -180,7 +184,7 @@ class WEPKeyDialog(KeyDialog): def create_security(self): (key, auth_alg) = self._get_security() - secrets = Secrets() + secrets = Secrets(self._settings) secrets.wep_key = key secrets.auth_alg = auth_alg return secrets @@ -206,9 +210,10 @@ class WEPKeyDialog(KeyDialog): self.set_response_sensitive(gtk.RESPONSE_OK, valid) class WPAKeyDialog(KeyDialog): - def __init__(self, ssid, flags, wpa_flags, rsn_flags, dev_caps, response): + def __init__(self, ssid, flags, wpa_flags, rsn_flags, dev_caps, settings, + response): KeyDialog.__init__(self, ssid, flags, wpa_flags, rsn_flags, - dev_caps, response) + dev_caps, settings, response) self.add_key_entry() self.store = gtk.ListStore(str) @@ -258,7 +263,7 @@ class WPAKeyDialog(KeyDialog): print "Key: %s" % key def create_security(self): - secrets = Secrets() + secrets = Secrets(self._settings) secrets.psk = self._get_security() return secrets @@ -276,14 +281,14 @@ class WPAKeyDialog(KeyDialog): self.set_response_sensitive(gtk.RESPONSE_OK, valid) return False -def create(ssid, flags, wpa_flags, rsn_flags, dev_caps, response): +def create(ssid, flags, wpa_flags, rsn_flags, dev_caps, settings, response): if wpa_flags == network.NM_802_11_AP_SEC_NONE and \ rsn_flags == network.NM_802_11_AP_SEC_NONE: key_dialog = WEPKeyDialog(ssid, flags, wpa_flags, rsn_flags, - dev_caps, response) + dev_caps, settings, response) else: key_dialog = WPAKeyDialog(ssid, flags, wpa_flags, rsn_flags, - dev_caps, response) + dev_caps, settings, response) key_dialog.connect("response", _key_dialog_response_cb) key_dialog.connect("destroy", _key_dialog_destroy_cb) diff --git a/src/jarabe/desktop/meshbox.py b/src/jarabe/desktop/meshbox.py index 9fee736..2c58fe6 100644 --- a/src/jarabe/desktop/meshbox.py +++ b/src/jarabe/desktop/meshbox.py @@ -1,5 +1,6 @@ # Copyright (C) 2006-2007 Red Hat, Inc. # Copyright (C) 2009 Tomeu Vizoso, Simon Schampijer +# Copyright (C) 2009 One Laptop per Child # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -373,9 +374,9 @@ class WirelessNetworkView(CanvasPulsingIcon): self._update_state() self._update_color() - def create_keydialog(self, response): + def create_keydialog(self, settings, response): keydialog.create(self._name, self._flags, self._wpa_flags, - self._rsn_flags, self._device_caps, response) + self._rsn_flags, self._device_caps, settings, response) def update_strength(self): if self._active_ap is not None: @@ -702,7 +703,8 @@ class NetworkManagerObserver(object): for net in self._box.wireless_networks.values(): if net.find_ap(ap_o) is not None: found = True - net.create_keydialog(kwargs['response']) + settings = kwargs['connection'].get_settings() + net.create_keydialog(settings, kwargs['response']) if not found: logging.error('Could not determine AP for' ' specific object %s' % conn_o) diff --git a/src/jarabe/model/network.py b/src/jarabe/model/network.py index 78770ce..10b73ab 100644 --- a/src/jarabe/model/network.py +++ b/src/jarabe/model/network.py @@ -1,5 +1,6 @@ # Copyright (C) 2008 Red Hat, Inc. # Copyright (C) 2009 Tomeu Vizoso, Simon Schampijer +# Copyright (C) 2009 One Laptop per Child # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -164,22 +165,29 @@ class Settings(object): return settings class Secrets(object): - def __init__(self): + def __init__(self, settings): + self.settings = settings self.wep_key = None self.psk = None self.auth_alg = None def get_dict(self): - secrets = {} + # Although we could just return the keys here, we instead return all + # of the network settings so that we can apply any late decisions made + # by the user (e.g. if they selected shared key authentication). see + # http://bugs.sugarlabs.org/ticket/1602 + settings = self.settings.get_dict() + if '802-11-wireless-security' not in settings: + settings['802-11-wireless-security'] = {} if self.wep_key is not None: - secrets['wep-key0'] = self.wep_key + settings['802-11-wireless-security']['wep-key0'] = self.wep_key if self.psk is not None: - secrets['psk'] = self.psk + settings['802-11-wireless-security']['psk'] = self.psk if self.auth_alg is not None: - secrets['auth-alg'] = self.auth_alg + settings['802-11-wireless-security']['auth-alg'] = self.auth_alg - return {'802-11-wireless-security': secrets} + return settings class NMSettings(dbus.service.Object): def __init__(self): @@ -246,6 +254,9 @@ class NMSettingsConnection(dbus.service.Object): self._secrets = secrets self.save() + def get_settings(self): + return self._settings + def save(self): profile_path = env.get_profile_path() config_path = os.path.join(profile_path, 'nm', 'connections.cfg') @@ -498,7 +509,7 @@ def load_connections(): secrets = None if config.has_option(section, 'key-mgmt'): - secrets = Secrets() + secrets = Secrets(settings) settings.wireless_security = WirelessSecurity() mgmt = config.get(section, 'key-mgmt') settings.wireless_security.key_mgmt = mgmt -- cgit v0.9.1