Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/jarabe
diff options
context:
space:
mode:
authorSascha Silbe <silbe@activitycentral.com>2011-01-21 18:10:35 (GMT)
committer Sascha Silbe <sascha-pgp@silbe.org>2011-02-05 15:25:05 (GMT)
commitbb0f646342903cdd1e9e5d4379fcade668c92d5e (patch)
tree1d681efba2220f901a34f9b243ccb05fa855d77d /src/jarabe
parentcbba08f28bc461f06da56d27bca058900c090139 (diff)
fix network disconnect (SL#1608, SL#1802)
User interface changes: - enable the disconnect button on the access point menu in the neighbourhood view, (rather than the button doing nothing), - fix the disconnect button on the wireless device icon in the frame so that the disconnection remains effective [1], (rather than disconnecting and then reconnecting automatically), Based on a patch by James Cameron <quozl@laptop.org>. [1] http://mail.gnome.org/archives/networkmanager-list/2011-January/msg00007.html Signed-off-by: Sascha Silbe <silbe@activitycentral.com>
Diffstat (limited to 'src/jarabe')
-rw-r--r--src/jarabe/desktop/networkviews.py8
-rw-r--r--src/jarabe/model/network.py37
2 files changed, 44 insertions, 1 deletions
diff --git a/src/jarabe/desktop/networkviews.py b/src/jarabe/desktop/networkviews.py
index 4282a75..5e0a809 100644
--- a/src/jarabe/desktop/networkviews.py
+++ b/src/jarabe/desktop/networkviews.py
@@ -265,7 +265,13 @@ class WirelessNetworkView(CanvasPulsingIcon):
self.props.base_color = self._color
def _disconnect_activate_cb(self, item):
- pass
+ if self._mode == network.NM_802_11_MODE_INFRA:
+ connection = network.find_connection_by_ssid(self._name)
+ if connection:
+ connection.disable_autoconnect()
+
+ ap_paths = self._access_points.keys()
+ network.disconnect_access_points(ap_paths)
def _add_ciphers_from_flags(self, flags, pairwise):
ciphers = []
diff --git a/src/jarabe/model/network.py b/src/jarabe/model/network.py
index 037f90f..847fa80 100644
--- a/src/jarabe/model/network.py
+++ b/src/jarabe/model/network.py
@@ -130,11 +130,16 @@ NM_802_11_DEVICE_CAP_RSN = 0x00000020
SETTINGS_SERVICE = 'org.freedesktop.NetworkManagerUserSettings'
+NM_SERVICE = 'org.freedesktop.NetworkManager'
+NM_IFACE = 'org.freedesktop.NetworkManager'
+NM_PATH = '/org/freedesktop/NetworkManager'
+NM_DEVICE_IFACE = 'org.freedesktop.NetworkManager.Device'
NM_SETTINGS_PATH = '/org/freedesktop/NetworkManagerSettings'
NM_SETTINGS_IFACE = 'org.freedesktop.NetworkManagerSettings'
NM_CONNECTION_IFACE = 'org.freedesktop.NetworkManagerSettings.Connection'
NM_SECRETS_IFACE = 'org.freedesktop.NetworkManagerSettings.Connection.Secrets'
NM_ACCESSPOINT_IFACE = 'org.freedesktop.NetworkManager.AccessPoint'
+NM_ACTIVE_CONN_IFACE = 'org.freedesktop.NetworkManager.Connection.Active'
GSM_USERNAME_PATH = '/desktop/sugar/network/gsm/username'
GSM_PASSWORD_PATH = '/desktop/sugar/network/gsm/password'
@@ -591,6 +596,14 @@ class NMSettingsConnection(dbus.service.Object):
# pylint: disable=W0702
logging.exception('Error calling libc.__res_init')
+ def disable_autoconnect(self):
+ if self._settings.connection.type != NM_CONNECTION_TYPE_GSM and \
+ self._settings.connection.autoconnect:
+ self._settings.connection.autoconnect = False
+ self._settings.connection.timestamp = None
+ self.Updated(self._settings.get_dict())
+ self.save()
+
def set_secrets(self, secrets):
self._secrets = secrets
if self._settings.connection.type == \
@@ -968,3 +981,27 @@ def clear_wifi_connections():
config_path = _get_wifi_connections_path()
_create_wifi_connections(config_path)
+
+
+def disconnect_access_points(ap_paths):
+ """
+ Disconnect all devices connected to any of the given access points.
+ """
+ bus = dbus.SystemBus()
+ netmgr_obj = bus.get_object(NM_SERVICE, NM_PATH)
+ netmgr = dbus.Interface(netmgr_obj, NM_IFACE)
+ netmgr_props = dbus.Interface(netmgr, dbus.PROPERTIES_IFACE)
+ active_connection_paths = netmgr_props.Get(NM_IFACE, 'ActiveConnections')
+
+ for conn_path in active_connection_paths:
+ conn_obj = bus.get_object(NM_IFACE, conn_path)
+ conn_props = dbus.Interface(conn_obj, dbus.PROPERTIES_IFACE)
+ ap_path = conn_props.Get(NM_ACTIVE_CONN_IFACE, 'SpecificObject')
+ if ap_path == '/' or ap_path not in ap_paths:
+ continue
+
+ dev_paths = conn_props.Get(NM_ACTIVE_CONN_IFACE, 'Devices')
+ for dev_path in dev_paths:
+ dev_obj = bus.get_object(NM_SERVICE, dev_path)
+ dev = dbus.Interface(dev_obj, NM_DEVICE_IFACE)
+ dev.Disconnect()