From 1a6f58bf3649242292499e20ce0ffbcad5886b8f Mon Sep 17 00:00:00 2001 From: Simon Schampijer Date: Wed, 29 Oct 2008 13:17:07 +0000 Subject: Add intermediate object to report the secrets back from the dialog --- (limited to 'src') diff --git a/src/jarabe/desktop/keydialog.py b/src/jarabe/desktop/keydialog.py index ed9449e..ed50d55 100644 --- a/src/jarabe/desktop/keydialog.py +++ b/src/jarabe/desktop/keydialog.py @@ -87,12 +87,11 @@ class CanceledKeyRequestError(dbus.DBusException): self._dbus_error_name = network.NM_SETTINGS_IFACE + '.CanceledError' class KeyDialog(gtk.Dialog): - def __init__(self, ssid, caps, async_cb, async_err_cb): + def __init__(self, ssid, caps, response): gtk.Dialog.__init__(self, flags=gtk.DIALOG_MODAL) self.set_title("Wireless Key Required") - self._async_cb = async_cb - self._async_err_cb = async_err_cb + self._response = response self._entry = None self._ssid = ssid self._caps = caps @@ -126,16 +125,16 @@ class KeyDialog(gtk.Dialog): def create_security(self): raise NotImplementedError - def get_callbacks(self): - return (self._async_cb, self._async_err_cb) + def get_response_object(self): + return self._response WEP_PASSPHRASE = 1 WEP_HEX = 2 WEP_ASCII = 3 class WEPKeyDialog(KeyDialog): - def __init__(self, ssid, caps, async_cb, async_err_cb): - KeyDialog.__init__(self, ssid, caps, async_cb, async_err_cb) + def __init__(self, ssid, caps, response): + KeyDialog.__init__(self, ssid, caps, response) # WEP key type self.key_store = gtk.ListStore(str, int) @@ -233,8 +232,8 @@ class WEPKeyDialog(KeyDialog): self.set_response_sensitive(gtk.RESPONSE_OK, valid) class WPAKeyDialog(KeyDialog): - def __init__(self, ssid, caps, async_cb, async_err_cb): - KeyDialog.__init__(self, ssid, caps, async_cb, async_err_cb) + def __init__(self, ssid, caps, response): + KeyDialog.__init__(self, ssid, caps, response) self.add_key_entry() self.store = gtk.ListStore(str, int) @@ -313,13 +312,13 @@ class WPAKeyDialog(KeyDialog): self.set_response_sensitive(gtk.RESPONSE_OK, valid) return False -def create(ssid, caps, async_cb, async_err_cb): +def create(ssid, caps, response): if (caps & NM_802_11_CAP_CIPHER_TKIP or caps & NM_802_11_CAP_CIPHER_CCMP) \ and (caps & NM_802_11_CAP_PROTO_WPA or \ caps & NM_802_11_CAP_PROTO_WPA2): - key_dialog = WPAKeyDialog(ssid, caps, async_cb, async_err_cb) + key_dialog = WPAKeyDialog(ssid, caps, response) else: - key_dialog = WEPKeyDialog(ssid, caps, async_cb, async_err_cb) + key_dialog = WEPKeyDialog(ssid, caps, response) key_dialog.connect("response", _key_dialog_response_cb) key_dialog.connect("destroy", _key_dialog_destroy_cb) @@ -329,18 +328,18 @@ def _key_dialog_destroy_cb(key_dialog, data=None): _key_dialog_response_cb(key_dialog, gtk.RESPONSE_CANCEL) def _key_dialog_response_cb(key_dialog, response_id): - (async_cb, async_err_cb) = key_dialog.get_callbacks() + response = key_dialog.get_response_object() security = None if response_id == gtk.RESPONSE_OK: security = key_dialog.create_security() if response_id in [gtk.RESPONSE_CANCEL, gtk.RESPONSE_NONE]: # key dialog dialog was canceled; send the error back to NM - async_err_cb(CanceledKeyRequestError()) + response.set_error(CanceledKeyRequestError()) elif response_id == gtk.RESPONSE_OK: if not security: raise RuntimeError("Invalid security arguments.") - async_cb(security) + response.set_secrets(security) else: raise RuntimeError("Unhandled key dialog response %d" % response_id) diff --git a/src/jarabe/desktop/meshbox.py b/src/jarabe/desktop/meshbox.py index d5e3b04..3519dda 100644 --- a/src/jarabe/desktop/meshbox.py +++ b/src/jarabe/desktop/meshbox.py @@ -141,7 +141,6 @@ class AccessPointView(CanvasPulsingIcon): self._update_state() def _update_properties(self, props): - logging.debug(props) if 'Ssid' in props: self._name = props['Ssid'] if 'Strength' in props: @@ -273,8 +272,8 @@ class AccessPointView(CanvasPulsingIcon): self._greyed_out = self._name.lower().find(query) == -1 self._update_state() - def create_keydialog(self, reply, error): - keydialog.create(self._name, self._wpa_flags, reply, error) + def create_keydialog(self, response): + keydialog.create(self._name, self._wpa_flags, response) def disconnect(self): self._bus.remove_signal_receiver(self.__ap_properties_changed_cb, @@ -553,7 +552,7 @@ class NetworkManagerObserver(object): ap_o = props.Get(_NM_ACTIVE_CONN_IFACE, 'SpecificObject') ap_view = self._box.access_points[ap_o] - ap_view.create_keydialog(kwargs['reply'], kwargs['error']) + ap_view.create_keydialog(kwargs['response']) def __get_devices_reply_cb(self, devices_o): for dev_o in devices_o: diff --git a/src/jarabe/model/network.py b/src/jarabe/model/network.py index 791a3ea..d311174 100644 --- a/src/jarabe/model/network.py +++ b/src/jarabe/model/network.py @@ -71,8 +71,23 @@ class NMSettings(dbus.service.Object): def __secrets_request_cb(self, sender, **kwargs): self.secrets_request.send(self, connection=sender, - reply=kwargs['reply'], - error=kwargs['error']) + response=kwargs['response']) + +class SecretsResponse(object): + ''' Intermediate object to report the secrets from the dialog + back to the connection object and which will inform NM + ''' + def __init__(self, connection, reply_cb, error_cb): + self._connection = connection + self._reply_cb = reply_cb + self._error_cb = error_cb + + def set_secrets(self, secrets): + self._connection.set_secrets(secrets) + self._reply_cb(secrets) + + def set_error(self, error): + self._error_cb(error) class NMSettingsConnection(dbus.service.Object): def __init__(self, path, settings, secrets): @@ -86,6 +101,9 @@ class NMSettingsConnection(dbus.service.Object): self._settings = settings self._secrets = secrets + def set_secrets(self, secrets): + self._secrets = secrets + @dbus.service.method(dbus_interface=NM_CONNECTION_IFACE, in_signature='', out_signature='a{sa{sv}}') def GetSettings(self): @@ -95,13 +113,16 @@ class NMSettingsConnection(dbus.service.Object): async_callbacks=('reply', 'error'), in_signature='sasb', out_signature='a{sa{sv}}') def GetSecrets(self, setting_name, hints, request_new, reply, error): - logging.debug('Secrets requested for connection %s', self.path) + logging.debug('Secrets requested for connection %s request_new=%s' + % (self.path, request_new)) if request_new or self._secrets is None: + # request_new is for example the case when the pw on the AP changes + response = SecretsResponse(self, reply, error) try: - self.secrets_request.send(self, reply=reply, error=error) + self.secrets_request.send(self, response=response) except Exception, e: - logging.error(e) + logging.error('Error requesting the secrets via dialog: %s' % e) else: reply(self._secrets) -- cgit v0.9.1