[Sugar-devel] [DESIGN] [PATCH sugar] Add support for removing connections / forgetting network credentials
Sascha Silbe
silbe at activitycentral.com
Sun Jun 26 15:38:03 EDT 2011
Let the user remove the settings for individual networks in addition to the
all-or-nothing approach "Discard network history" in the Control Panel.
Signed-off-by: Sascha Silbe <silbe at activitycentral.com>
---
First shot at the "Forget this favourite network" option we discussed
at [1]. There's a screenshot at [2]. What do you think of it?
Do we want to expose this easy way to destroy your network
configuration, barring you from further access until you reentered the
credentials? OTOH the "Discard network history" button is even worse in
this respect, albeit a bit more hidden. In the long run we should
version all configuration changes (pervasive undo/redo), but we're not
there yet.
Regarding implementation details: The backend code is going to die soon
anyway since NM 0.9 only has system connections.
[1] http://meeting.sugarlabs.org/sugar-meeting/meetings/2011-06-05T16:17:34#i_2671243
[2] http://wiki.sugarlabs.org/go/File:Sugar-ap-forget.png
src/jarabe/desktop/networkviews.py | 22 ++++++++++++++++++++
src/jarabe/model/network.py | 39 ++++++++++++++++++++++++++++++++++++
2 files changed, 61 insertions(+), 0 deletions(-)
diff --git a/src/jarabe/desktop/networkviews.py b/src/jarabe/desktop/networkviews.py
index a9fa4d3..da98088 100644
--- a/src/jarabe/desktop/networkviews.py
+++ b/src/jarabe/desktop/networkviews.py
@@ -66,6 +66,7 @@ class WirelessNetworkView(CanvasPulsingIcon):
self._palette_icon = None
self._disconnect_item = None
self._connect_item = None
+ self._forget_item = None
self._greyed_out = False
self._name = initial_ap.name
self._mode = initial_ap.mode
@@ -142,6 +143,12 @@ class WirelessNetworkView(CanvasPulsingIcon):
self._disconnect_activate_cb)
p.menu.append(self._disconnect_item)
+ label = glib.markup_escape_text(_('Forget this favorite network'))
+ self._forget_item = MenuItem(label, 'list-remove')
+ self._forget_item.connect('activate',
+ self.__forget_activate_cb)
+ p.menu.append(self._forget_item)
+
return p
def __device_state_changed_cb(self, new_state, old_state, reason):
@@ -217,15 +224,19 @@ class WirelessNetworkView(CanvasPulsingIcon):
if network.find_connection_by_ssid(self._name) is not None:
self.props.badge_name = 'emblem-favorite'
self._palette_icon.props.badge_name = 'emblem-favorite'
+ self._forget_item.show()
elif self._flags == network.NM_802_11_AP_FLAGS_PRIVACY:
self.props.badge_name = 'emblem-locked'
self._palette_icon.props.badge_name = 'emblem-locked'
+ self._forget_item.hide()
else:
self.props.badge_name = None
self._palette_icon.props.badge_name = None
+ self._forget_item.hide()
else:
self.props.badge_name = None
self._palette_icon.props.badge_name = None
+ self._forget_item.hide()
def _update_state(self):
if self._active_ap is not None:
@@ -275,6 +286,17 @@ class WirelessNetworkView(CanvasPulsingIcon):
ap_paths = self._access_points.keys()
network.disconnect_access_points(ap_paths)
+ def __forget_activate_cb(self, item):
+ if self._mode != network.NM_802_11_MODE_INFRA:
+ return
+
+ connection = network.find_connection_by_ssid(self._name)
+ if not connection:
+ return
+
+ network.remove_connection(connection)
+ self._update_badge()
+
def _add_ciphers_from_flags(self, flags, pairwise):
ciphers = []
if pairwise:
diff --git a/src/jarabe/model/network.py b/src/jarabe/model/network.py
index f265ae4..f034e77 100644
--- a/src/jarabe/model/network.py
+++ b/src/jarabe/model/network.py
@@ -522,6 +522,41 @@ class NMSettings(dbus.service.Object):
conn.secrets_request.connect(self.__secrets_request_cb)
self.NewConnection(conn.path)
+ def remove_connection(self, connection):
+ connection_type = connection._settings.connection.type
+ uuid = connection._settings.connection.uuid
+ del self.connections[uuid]
+ if connection_type == NM_CONNECTION_TYPE_802_11_WIRELESS:
+ connection.Removed()
+
+ self._remove_from_config(connection)
+
+ def _remove_from_config(self, connection):
+ config_path = _get_wifi_connections_path()
+ config = ConfigParser.ConfigParser()
+
+ try:
+ if not config.read(config_path):
+ logging.error('Error reading the nm config file')
+ return
+ except ConfigParser.ParsingError:
+ logging.exception('Error reading the nm config file')
+ return
+
+ identifier = connection._settings.connection.id
+ if identifier not in config.sections():
+ return
+
+ config.remove_section(identifier)
+
+ f = open(config_path, 'w')
+ try:
+ config.write(f)
+ except ConfigParser.Error:
+ logging.exception('Can not write %s', config_path)
+
+ f.close()
+
def __secrets_request_cb(self, sender, **kwargs):
self.secrets_request.send(self, connection=sender,
response=kwargs['response'])
@@ -843,6 +878,10 @@ def add_connection(uuid, settings, secrets=None):
return conn
+def remove_connection(connection):
+ _nm_settings.remove_connection(connection)
+
+
def _get_wifi_connections_path():
profile_path = env.get_profile_path()
return os.path.join(profile_path, 'nm', 'connections.cfg')
--
1.7.2.5
More information about the Sugar-devel
mailing list