From cf8fd967f72bdddcdc335395dde4678aec721cf5 Mon Sep 17 00:00:00 2001
From: Daniel Drake <dsd@laptop.org>
Date: Fri, 4 Dec 2009 14:07:28 +0000
Subject: [PATCH] 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.
---
src/jarabe/desktop/keydialog.py | 24 ++++++++++++++----------
src/jarabe/desktop/meshbox.py | 6 +++---
src/jarabe/model/network.py | 24 +++++++++++++++++-------
3 files changed, 34 insertions(+), 20 deletions(-)
diff --git a/src/jarabe/desktop/keydialog.py b/src/jarabe/desktop/keydialog.py
index 8b8f0bf..14b549e 100644
a
|
b
|
class CanceledKeyRequestError(dbus.DBusException): |
62 | 62 | self._dbus_error_name = network.NM_SETTINGS_IFACE + '.CanceledError' |
63 | 63 | |
64 | 64 | class KeyDialog(gtk.Dialog): |
65 | | def __init__(self, ssid, flags, wpa_flags, rsn_flags, dev_caps, response): |
| 65 | def __init__(self, ssid, flags, wpa_flags, rsn_flags, dev_caps, settings, |
| 66 | response): |
66 | 67 | gtk.Dialog.__init__(self, flags=gtk.DIALOG_MODAL) |
67 | 68 | self.set_title("Wireless Key Required") |
68 | 69 | |
| 70 | self._settings = settings |
69 | 71 | self._response = response |
70 | 72 | self._entry = None |
71 | 73 | self._ssid = ssid |
… |
… |
WEP_HEX = 2 |
110 | 112 | WEP_ASCII = 3 |
111 | 113 | |
112 | 114 | class WEPKeyDialog(KeyDialog): |
113 | | def __init__(self, ssid, flags, wpa_flags, rsn_flags, dev_caps, response): |
| 115 | def __init__(self, ssid, flags, wpa_flags, rsn_flags, dev_caps, settings, |
| 116 | response): |
114 | 117 | KeyDialog.__init__(self, ssid, flags, wpa_flags, rsn_flags, |
115 | | dev_caps, response) |
| 118 | dev_caps, settings, response) |
116 | 119 | |
117 | 120 | # WEP key type |
118 | 121 | self.key_store = gtk.ListStore(str, int) |
… |
… |
class WEPKeyDialog(KeyDialog): |
180 | 183 | |
181 | 184 | def create_security(self): |
182 | 185 | (key, auth_alg) = self._get_security() |
183 | | secrets = Secrets() |
| 186 | secrets = Secrets(self._settings) |
184 | 187 | secrets.wep_key = key |
185 | 188 | secrets.auth_alg = auth_alg |
186 | 189 | return secrets |
… |
… |
class WEPKeyDialog(KeyDialog): |
206 | 209 | self.set_response_sensitive(gtk.RESPONSE_OK, valid) |
207 | 210 | |
208 | 211 | class WPAKeyDialog(KeyDialog): |
209 | | def __init__(self, ssid, flags, wpa_flags, rsn_flags, dev_caps, response): |
| 212 | def __init__(self, ssid, flags, wpa_flags, rsn_flags, dev_caps, settings, |
| 213 | response): |
210 | 214 | KeyDialog.__init__(self, ssid, flags, wpa_flags, rsn_flags, |
211 | | dev_caps, response) |
| 215 | dev_caps, settings, response) |
212 | 216 | self.add_key_entry() |
213 | 217 | |
214 | 218 | self.store = gtk.ListStore(str) |
… |
… |
class WPAKeyDialog(KeyDialog): |
258 | 262 | print "Key: %s" % key |
259 | 263 | |
260 | 264 | def create_security(self): |
261 | | secrets = Secrets() |
| 265 | secrets = Secrets(self._settings) |
262 | 266 | secrets.psk = self._get_security() |
263 | 267 | return secrets |
264 | 268 | |
… |
… |
class WPAKeyDialog(KeyDialog): |
276 | 280 | self.set_response_sensitive(gtk.RESPONSE_OK, valid) |
277 | 281 | return False |
278 | 282 | |
279 | | def create(ssid, flags, wpa_flags, rsn_flags, dev_caps, response): |
| 283 | def create(ssid, flags, wpa_flags, rsn_flags, dev_caps, settings, response): |
280 | 284 | if wpa_flags == network.NM_802_11_AP_SEC_NONE and \ |
281 | 285 | rsn_flags == network.NM_802_11_AP_SEC_NONE: |
282 | 286 | key_dialog = WEPKeyDialog(ssid, flags, wpa_flags, rsn_flags, |
283 | | dev_caps, response) |
| 287 | dev_caps, settings, response) |
284 | 288 | else: |
285 | 289 | key_dialog = WPAKeyDialog(ssid, flags, wpa_flags, rsn_flags, |
286 | | dev_caps, response) |
| 290 | dev_caps, settings, response) |
287 | 291 | |
288 | 292 | key_dialog.connect("response", _key_dialog_response_cb) |
289 | 293 | key_dialog.connect("destroy", _key_dialog_destroy_cb) |
diff --git a/src/jarabe/desktop/meshbox.py b/src/jarabe/desktop/meshbox.py
index 9fee736..4ade8a1 100644
a
|
b
|
class WirelessNetworkView(CanvasPulsingIcon): |
373 | 373 | self._update_state() |
374 | 374 | self._update_color() |
375 | 375 | |
376 | | def create_keydialog(self, response): |
| 376 | def create_keydialog(self, settings, response): |
377 | 377 | keydialog.create(self._name, self._flags, self._wpa_flags, |
378 | | self._rsn_flags, self._device_caps, response) |
| 378 | self._rsn_flags, self._device_caps, settings, response) |
379 | 379 | |
380 | 380 | def update_strength(self): |
381 | 381 | if self._active_ap is not None: |
… |
… |
class NetworkManagerObserver(object): |
702 | 702 | for net in self._box.wireless_networks.values(): |
703 | 703 | if net.find_ap(ap_o) is not None: |
704 | 704 | found = True |
705 | | net.create_keydialog(kwargs['response']) |
| 705 | net.create_keydialog(kwargs['connection'].get_settings(), kwargs['response']) |
706 | 706 | if not found: |
707 | 707 | logging.error('Could not determine AP for' |
708 | 708 | ' specific object %s' % conn_o) |
diff --git a/src/jarabe/model/network.py b/src/jarabe/model/network.py
index 78770ce..3b30178 100644
a
|
b
|
class Settings(object): |
164 | 164 | return settings |
165 | 165 | |
166 | 166 | class Secrets(object): |
167 | | def __init__(self): |
| 167 | def __init__(self, settings): |
| 168 | self.settings = settings |
168 | 169 | self.wep_key = None |
169 | 170 | self.psk = None |
170 | 171 | self.auth_alg = None |
171 | 172 | |
172 | 173 | def get_dict(self): |
173 | | secrets = {} |
| 174 | # Although we could just return the keys here, we instead return all |
| 175 | # of the network settings so that we can apply any late decisions made |
| 176 | # by the user (e.g. if they selected shared key authentication). see |
| 177 | # http://bugs.sugarlabs.org/ticket/1602 |
| 178 | settings = self.settings.get_dict() |
| 179 | if '802-11-wireless-security' not in settings: |
| 180 | settings['802-11-wireless-security'] = {} |
174 | 181 | |
175 | 182 | if self.wep_key is not None: |
176 | | secrets['wep-key0'] = self.wep_key |
| 183 | settings['802-11-wireless-security']['wep-key0'] = self.wep_key |
177 | 184 | if self.psk is not None: |
178 | | secrets['psk'] = self.psk |
| 185 | settings['802-11-wireless-security']['psk'] = self.psk |
179 | 186 | if self.auth_alg is not None: |
180 | | secrets['auth-alg'] = self.auth_alg |
| 187 | settings['802-11-wireless-security']['auth-alg'] = self.auth_alg |
181 | 188 | |
182 | | return {'802-11-wireless-security': secrets} |
| 189 | return settings |
183 | 190 | |
184 | 191 | class NMSettings(dbus.service.Object): |
185 | 192 | def __init__(self): |
… |
… |
class NMSettingsConnection(dbus.service.Object): |
246 | 253 | self._secrets = secrets |
247 | 254 | self.save() |
248 | 255 | |
| 256 | def get_settings(self): |
| 257 | return self._settings |
| 258 | |
249 | 259 | def save(self): |
250 | 260 | profile_path = env.get_profile_path() |
251 | 261 | config_path = os.path.join(profile_path, 'nm', 'connections.cfg') |
… |
… |
def load_connections(): |
498 | 508 | |
499 | 509 | secrets = None |
500 | 510 | if config.has_option(section, 'key-mgmt'): |
501 | | secrets = Secrets() |
| 511 | secrets = Secrets(settings) |
502 | 512 | settings.wireless_security = WirelessSecurity() |
503 | 513 | mgmt = config.get(section, 'key-mgmt') |
504 | 514 | settings.wireless_security.key_mgmt = mgmt |