Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/jarabe
diff options
context:
space:
mode:
authorDaniel Drake <dsd@laptop.org>2009-12-04 14:07:28 (GMT)
committer Daniel Drake <dsd@laptop.org>2009-12-07 13:53:23 (GMT)
commit481847df791fe585bee3d307e3405b63745dfc4b (patch)
tree9197f9ee4d6b50c79e1907f68ace5379436194d6 /src/jarabe
parentb66765b7d652d9e0fd99fc264400af63f4d1bd29 (diff)
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.
Diffstat (limited to 'src/jarabe')
-rw-r--r--src/jarabe/desktop/keydialog.py25
-rw-r--r--src/jarabe/desktop/meshbox.py8
-rw-r--r--src/jarabe/model/network.py25
3 files changed, 38 insertions, 20 deletions
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