[sugar/f15] NM 0.9 support

Peter Robinson pbrobinson at fedoraproject.org
Sun Sep 11 11:54:54 UTC 2011


commit 426805afa208bc80929a899fb5d4756af35d4afe
Author: Peter Robinson <pbrobinson at gmail.com>
Date:   Tue Sep 6 23:59:06 2011 +0100

    NM 0.9 support

 n2.patch             |   47 --
 nm09.patch           | 1560 ++++++++++++++++++++++++++++++++++++++++++++++++++
 sugar-nm09-new.patch |  660 ---------------------
 sugar.spec           |   73 ++--
 4 files changed, 1597 insertions(+), 743 deletions(-)
---
diff --git a/nm09.patch b/nm09.patch
new file mode 100644
index 0000000..8915a99
--- /dev/null
+++ b/nm09.patch
@@ -0,0 +1,1560 @@
+From 38062a307d1e0d3eaa3f9154ddc0219db61b18da Mon Sep 17 00:00:00 2001
+From: Daniel Drake <dsd at laptop.org>
+Date: Sun, 31 Jul 2011 17:06:14 +0100
+Subject: [PATCH] Simple NetworkManager-0.9 port
+
+Supports wifi (adhoc and infrastructure), and migration of Sugar's old
+wifi configuration.
+
+Mesh and modem support not yet working.
+---
+ extensions/deviceicon/network.py   |   74 +++--
+ src/jarabe/desktop/keydialog.py    |   20 +-
+ src/jarabe/desktop/meshbox.py      |   19 +-
+ src/jarabe/desktop/networkviews.py |  112 +++----
+ src/jarabe/model/adhoc.py          |   72 +++--
+ src/jarabe/model/network.py        |  609 +++++++++++++++++++-----------------
+ src/jarabe/model/olpcmesh.py       |   44 ++--
+ 7 files changed, 489 insertions(+), 461 deletions(-)
+
+diff --git a/extensions/deviceicon/network.py b/extensions/deviceicon/network.py
+index cf8bd08..33ffc92 100644
+--- a/extensions/deviceicon/network.py
++++ b/extensions/deviceicon/network.py
+@@ -54,10 +54,11 @@ _NM_PATH = '/org/freedesktop/NetworkManager'
+ _NM_DEVICE_IFACE = 'org.freedesktop.NetworkManager.Device'
+ _NM_WIRED_IFACE = 'org.freedesktop.NetworkManager.Device.Wired'
+ _NM_WIRELESS_IFACE = 'org.freedesktop.NetworkManager.Device.Wireless'
+-_NM_SERIAL_IFACE = 'org.freedesktop.NetworkManager.Device.Serial'
++_NM_MODEM_IFACE = 'org.freedesktop.NetworkManager.Device.Modem'
+ _NM_OLPC_MESH_IFACE = 'org.freedesktop.NetworkManager.Device.OlpcMesh'
+ _NM_ACCESSPOINT_IFACE = 'org.freedesktop.NetworkManager.AccessPoint'
+ _NM_ACTIVE_CONN_IFACE = 'org.freedesktop.NetworkManager.Connection.Active'
++_NM_GET_SETTINGS_CONN_IFACE = 'org.freedesktop.NetworkManager.Settings.Connection.GetSettings'
+ 
+ _GSM_STATE_NOT_READY = 0
+ _GSM_STATE_DISCONNECTED = 1
+@@ -522,11 +523,11 @@ class WirelessDeviceView(ToolButton):
+         if self._active_ap_op is not None:
+             state = self._device_state
+         else:
+-            state = network.DEVICE_STATE_UNKNOWN
++            state = network.NM_DEVICE_STATE_UNKNOWN
+ 
+         if self._mode != network.NM_802_11_MODE_ADHOC and \
+                 network.is_sugar_adhoc_network(self._name) == False:
+-            if state == network.DEVICE_STATE_ACTIVATED:
++            if state == network.NM_DEVICE_STATE_ACTIVATED:
+                 icon_name = '%s-connected' % 'network-wireless'
+             else:
+                 icon_name = 'network-wireless'
+@@ -536,20 +537,20 @@ class WirelessDeviceView(ToolButton):
+                 self._icon.props.icon_name = icon_name
+         else:
+             channel = network.frequency_to_channel(self._frequency)
+-            if state == network.DEVICE_STATE_ACTIVATED:
++            if state == network.NM_DEVICE_STATE_ACTIVATED:
+                 self._icon.props.icon_name = 'network-adhoc-%s-connected' \
+                         % channel
+             else:
+                 self._icon.props.icon_name = 'network-adhoc-%s' % channel
+             self._icon.props.base_color = profile.get_color()
+ 
+-        if state == network.DEVICE_STATE_PREPARE or \
+-           state == network.DEVICE_STATE_CONFIG or \
+-           state == network.DEVICE_STATE_NEED_AUTH or \
+-           state == network.DEVICE_STATE_IP_CONFIG:
++        if state == network.NM_DEVICE_STATE_PREPARE or \
++           state == network.NM_DEVICE_STATE_CONFIG or \
++           state == network.NM_DEVICE_STATE_NEED_AUTH or \
++           state == network.NM_DEVICE_STATE_IP_CONFIG:
+             self._palette.set_connecting()
+             self._icon.props.pulsing = True
+-        elif state == network.DEVICE_STATE_ACTIVATED:
++        elif state == network.NM_DEVICE_STATE_ACTIVATED:
+             address = self._device_props.Get(_NM_DEVICE_IFACE, 'Ip4Address')
+             self._palette.set_connected_with_frequency(self._frequency,
+                                                        address)
+@@ -652,15 +653,15 @@ class OlpcMeshDeviceView(ToolButton):
+     def _update(self):
+         state = self._device_state
+ 
+-        if state in [network.DEVICE_STATE_PREPARE,
+-                     network.DEVICE_STATE_CONFIG,
+-                     network.DEVICE_STATE_NEED_AUTH,
+-                     network.DEVICE_STATE_IP_CONFIG]:
++        if state in [network.NM_DEVICE_STATE_PREPARE,
++                     network.NM_DEVICE_STATE_CONFIG,
++                     network.NM_DEVICE_STATE_NEED_AUTH,
++                     network.NM_DEVICE_STATE_IP_CONFIG]:
+             self._icon.props.base_color = self._inactive_color
+             self._icon.props.pulse_color = profile.get_color()
+             self._palette.set_connecting()
+             self._icon.props.pulsing = True
+-        elif state == network.DEVICE_STATE_ACTIVATED:
++        elif state == network.NM_DEVICE_STATE_ACTIVATED:
+             address = self._device_props.Get(_NM_DEVICE_IFACE, 'Ip4Address')
+             self._palette.set_connected_with_channel(self._channel, address)
+             self._icon.props.base_color = profile.get_color()
+@@ -688,7 +689,7 @@ class OlpcMeshDeviceView(ToolButton):
+                 obj = self._bus.get_object(_NM_IFACE, ap_op)
+                 props = dbus.Interface(obj, dbus.PROPERTIES_IFACE)
+                 device_type = props.Get(_NM_DEVICE_IFACE, 'DeviceType')
+-                if device_type == network.DEVICE_TYPE_802_11_OLPC_MESH:
++                if device_type == network.NM_DEVICE_TYPE_OLPC_MESH:
+                     netmgr.DeactivateConnection(conn_o)
+                     break
+             except dbus.exceptions.DBusException:
+@@ -739,7 +740,7 @@ class GsmDeviceView(TrayIcon):
+         self._bus.add_signal_receiver(self.__ppp_stats_changed_cb,
+                                       signal_name='PppStats',
+                                       path=self._device.object_path,
+-                                      dbus_interface=_NM_SERIAL_IFACE)
++                                      dbus_interface=_NM_MODEM_IFACE)
+ 
+     def create_palette(self):
+         palette = GsmPalette()
+@@ -817,7 +818,7 @@ class GsmDeviceView(TrayIcon):
+     def _update_state(self, state, old_state, reason):
+         gsm_state = None
+ 
+-        if state is network.DEVICE_STATE_ACTIVATED:
++        if state is network.NM_DEVICE_STATE_ACTIVATED:
+             gsm_state = _GSM_STATE_CONNECTED
+             connection = network.find_gsm_connection()
+             if connection is not None:
+@@ -831,7 +832,7 @@ class GsmDeviceView(TrayIcon):
+                 if self._palette is not None:
+                     self._palette.connection_info_box.show()
+ 
+-        elif state is network.DEVICE_STATE_DISCONNECTED:
++        elif state is network.NM_DEVICE_STATE_DISCONNECTED:
+             gsm_state = _GSM_STATE_DISCONNECTED
+             self._connection_timestamp = 0
+             if self._connection_time_handler is not None:
+@@ -839,18 +840,18 @@ class GsmDeviceView(TrayIcon):
+             if self._palette is not None:
+                 self._palette.connection_info_box.hide()
+ 
+-        elif state in [network.DEVICE_STATE_UNMANAGED,
+-                       network.DEVICE_STATE_UNAVAILABLE,
+-                       network.DEVICE_STATE_UNKNOWN]:
++        elif state in [network.NM_DEVICE_STATE_UNMANAGED,
++                       network.NM_DEVICE_STATE_UNAVAILABLE,
++                       network.NM_DEVICE_STATE_UNKNOWN]:
+             gsm_state = _GSM_STATE_NOT_READY
+ 
+-        elif state in [network.DEVICE_STATE_PREPARE,
+-                       network.DEVICE_STATE_CONFIG,
+-                       network.DEVICE_STATE_IP_CONFIG,
+-                       network.DEVICE_STATE_NEED_AUTH]:
++        elif state in [network.NM_DEVICE_STATE_PREPARE,
++                       network.NM_DEVICE_STATE_CONFIG,
++                       network.NM_DEVICE_STATE_IP_CONFIG,
++                       network.NM_DEVICE_STATE_NEED_AUTH]:
+             gsm_state = _GSM_STATE_CONNECTING
+ 
+-        elif state == network.DEVICE_STATE_FAILED:
++        elif state == network.NM_DEVICE_STATE_FAILED:
+             gsm_state = _GSM_STATE_FAILED
+ 
+         if self._palette is not None:
+@@ -930,10 +931,10 @@ class MeshDeviceObserver(object):
+         self._update_state(new_state)
+ 
+     def _update_state(self, state):
+-        if state in (network.DEVICE_STATE_PREPARE, network.DEVICE_STATE_CONFIG,
+-                     network.DEVICE_STATE_NEED_AUTH,
+-                     network.DEVICE_STATE_IP_CONFIG,
+-                     network.DEVICE_STATE_ACTIVATED):
++        if state in (network.NM_DEVICE_STATE_PREPARE, network.NM_DEVICE_STATE_CONFIG,
++                     network.NM_DEVICE_STATE_NEED_AUTH,
++                     network.NM_DEVICE_STATE_IP_CONFIG,
++                     network.NM_DEVICE_STATE_ACTIVATED):
+             if self._device_view is not None:
+                 self._device_view.update_state(state)
+                 return
+@@ -980,7 +981,7 @@ class WiredDeviceObserver(object):
+         self._update_state(new_state)
+ 
+     def _update_state(self, state):
+-        if state == network.DEVICE_STATE_ACTIVATED:
++        if state == network.NM_DEVICE_STATE_ACTIVATED:
+             props = dbus.Interface(self._device, dbus.PROPERTIES_IFACE)
+             address = props.Get(_NM_DEVICE_IFACE, 'Ip4Address')
+             speed = props.Get(_NM_WIRED_IFACE, 'Speed')
+@@ -1044,18 +1045,21 @@ class NetworkManagerObserver(object):
+         props = dbus.Interface(nm_device, dbus.PROPERTIES_IFACE)
+ 
+         device_type = props.Get(_NM_DEVICE_IFACE, 'DeviceType')
+-        if device_type == network.DEVICE_TYPE_802_3_ETHERNET:
++        if device_type == network.NM_DEVICE_TYPE_ETHERNET:
+             device = WiredDeviceObserver(nm_device, self._tray)
+             self._devices[device_op] = device
+-        elif device_type == network.DEVICE_TYPE_802_11_WIRELESS:
++        elif device_type == network.NM_DEVICE_TYPE_WIFI:
+             device = WirelessDeviceObserver(nm_device, self._tray)
+             self._devices[device_op] = device
+-        elif device_type == network.DEVICE_TYPE_802_11_OLPC_MESH:
++        elif device_type == network.NM_DEVICE_TYPE_OLPC_MESH:
+             device = MeshDeviceObserver(nm_device, self._tray)
+             self._devices[device_op] = device
+-        elif device_type == network.DEVICE_TYPE_GSM_MODEM:
++        elif device_type == network.NM_DEVICE_TYPE_GSM:
+             device = GsmDeviceObserver(nm_device, self._tray)
+             self._devices[device_op] = device
++        elif device_type == network.NM_DEVICE_TYPE_CDMA:
++            device = CdmaDeviceObserver(nm_device, self._tray)
++            self._devices[device_op] = device
+ 
+     def __device_added_cb(self, device_op):
+         self._check_device(device_op)
+diff --git a/src/jarabe/desktop/keydialog.py b/src/jarabe/desktop/keydialog.py
+index 6241b9b..91e8bbe 100644
+--- a/src/jarabe/desktop/keydialog.py
++++ b/src/jarabe/desktop/keydialog.py
+@@ -22,7 +22,6 @@ import gtk
+ import dbus
+ 
+ from jarabe.model import network
+-from jarabe.model.network import Secrets
+ 
+ 
+ IW_AUTH_ALG_OPEN_SYSTEM = 'open'
+@@ -192,10 +191,9 @@ class WEPKeyDialog(KeyDialog):
+ 
+     def create_security(self):
+         (key, auth_alg) = self._get_security()
+-        secrets = Secrets(self._settings)
+-        secrets.wep_key = key
+-        secrets.auth_alg = auth_alg
+-        return secrets
++        self._settings['802-11-wireless-security']['wep-key0'] = key
++        self._settings['802-11-wireless-security']['auth-alg'] = auth_alg
++        return self._settings
+ 
+     def _update_response_sensitivity(self, ignored=None):
+         key = self._entry.get_text()
+@@ -272,9 +270,8 @@ class WPAKeyDialog(KeyDialog):
+         print 'Key: %s' % key
+ 
+     def create_security(self):
+-        secrets = Secrets(self._settings)
+-        secrets.psk = self._get_security()
+-        return secrets
++        self._settings['802-11-wireless-security']['psk'] = self._get_security()
++        return self._settings
+ 
+     def _update_response_sensitivity(self, ignored=None):
+         key = self._entry.get_text()
+@@ -301,21 +298,16 @@ def create(ssid, flags, wpa_flags, rsn_flags, dev_caps, settings, response):
+                                   dev_caps, settings, response)
+ 
+     key_dialog.connect('response', _key_dialog_response_cb)
+-    key_dialog.connect('destroy', _key_dialog_destroy_cb)
+     key_dialog.show_all()
+ 
+ 
+-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):
+     response = key_dialog.get_response_object()
+     secrets = None
+     if response_id == gtk.RESPONSE_OK:
+         secrets = key_dialog.create_security()
+ 
+-    if response_id in [gtk.RESPONSE_CANCEL, gtk.RESPONSE_NONE]:
++    if response_id in [gtk.RESPONSE_CANCEL, gtk.RESPONSE_NONE, gtk.RESPONSE_DELETE_EVENT]:
+         # key dialog dialog was canceled; send the error back to NM
+         response.set_error(CanceledKeyRequestError())
+     elif response_id == gtk.RESPONSE_OK:
+diff --git a/src/jarabe/desktop/meshbox.py b/src/jarabe/desktop/meshbox.py
+index 6d5bb48..607839b 100644
+--- a/src/jarabe/desktop/meshbox.py
++++ b/src/jarabe/desktop/meshbox.py
+@@ -290,7 +290,7 @@ class NetworkManagerObserver(object):
+ 
+     def __init__(self, box):
+         self._box = box
+-        self._bus = None
++        self._bus = dbus.SystemBus()
+         self._devices = {}
+         self._netmgr = None
+         self._olpc_mesh_device_o = None
+@@ -300,9 +300,7 @@ class NetworkManagerObserver(object):
+ 
+     def listen(self):
+         try:
+-            self._bus = dbus.SystemBus()
+-            obj = self._bus.get_object(_NM_SERVICE, _NM_PATH)
+-            self._netmgr = dbus.Interface(obj, _NM_IFACE)
++            self._netmgr = network.get_manager()
+         except dbus.DBusException:
+             logging.debug('%s service not available', _NM_SERVICE)
+             return
+@@ -320,9 +318,9 @@ class NetworkManagerObserver(object):
+                                       signal_name='PropertiesChanged',
+                                       dbus_interface=_NM_IFACE)
+ 
+-        settings = network.get_settings()
+-        if settings is not None:
+-            settings.secrets_request.connect(self.__secrets_request_cb)
++        secret_agent = network.get_secret_agent()
++        if secret_agent is not None:
++            secret_agent.secrets_request.connect(self.__secrets_request_cb)
+ 
+     def __secrets_request_cb(self, **kwargs):
+         # FIXME It would be better to do all of this async, but I cannot think
+@@ -342,8 +340,7 @@ class NetworkManagerObserver(object):
+                     for net in self._box.wireless_networks.values():
+                         if net.find_ap(ap_o) is not None:
+                             found = True
+-                            settings = kwargs['connection'].get_settings()
+-                            net.create_keydialog(settings, kwargs['response'])
++                            net.create_keydialog(kwargs['settings'], kwargs['response'])
+                 if not found:
+                     logging.error('Could not determine AP for specific object'
+                                   ' %s', conn_o)
+@@ -360,7 +357,7 @@ class NetworkManagerObserver(object):
+         props = dbus.Interface(device, dbus.PROPERTIES_IFACE)
+ 
+         device_type = props.Get(_NM_DEVICE_IFACE, 'DeviceType')
+-        if device_type == network.DEVICE_TYPE_802_11_WIRELESS:
++        if device_type == network.NM_DEVICE_TYPE_WIFI:
+             self._devices[device_o] = DeviceObserver(device)
+             self._devices[device_o].connect('access-point-added',
+                                             self.__ap_added_cb)
+@@ -368,7 +365,7 @@ class NetworkManagerObserver(object):
+                                             self.__ap_removed_cb)
+             if self._have_adhoc_networks:
+                 self._box.add_adhoc_networks(device)
+-        elif device_type == network.DEVICE_TYPE_802_11_OLPC_MESH:
++        elif device_type == network.NM_DEVICE_TYPE_OLPC_MESH:
+             self._olpc_mesh_device_o = device_o
+             self._box.enable_olpc_mesh(device)
+ 
+diff --git a/src/jarabe/desktop/networkviews.py b/src/jarabe/desktop/networkviews.py
+index 9948d3b..e8789a8 100644
+--- a/src/jarabe/desktop/networkviews.py
++++ b/src/jarabe/desktop/networkviews.py
+@@ -191,7 +191,7 @@ class WirelessNetworkView(CanvasPulsingIcon):
+                 network.is_sugar_adhoc_network(self._name):
+             channel = max([1] + [ap.channel for ap in
+                                  self._access_points.values()])
+-            if self._device_state == network.DEVICE_STATE_ACTIVATED and \
++            if self._device_state == network.NM_DEVICE_STATE_ACTIVATED and \
+                     self._active_ap is not None:
+                 icon_name = 'network-adhoc-%s-connected' % channel
+             else:
+@@ -200,7 +200,7 @@ class WirelessNetworkView(CanvasPulsingIcon):
+             icon = self._palette.props.icon
+             icon.props.icon_name = icon_name
+         else:
+-            if self._device_state == network.DEVICE_STATE_ACTIVATED and \
++            if self._device_state == network.NM_DEVICE_STATE_ACTIVATED and \
+                     self._active_ap is not None:
+                 icon_name = '%s-connected' % _AP_ICON_NAME
+             else:
+@@ -231,22 +231,19 @@ class WirelessNetworkView(CanvasPulsingIcon):
+         if self._active_ap is not None:
+             state = self._device_state
+         else:
+-            state = network.DEVICE_STATE_UNKNOWN
++            state = network.NM_DEVICE_STATE_UNKNOWN
+ 
+-        if state == network.DEVICE_STATE_PREPARE or \
+-           state == network.DEVICE_STATE_CONFIG or \
+-           state == network.DEVICE_STATE_NEED_AUTH or \
+-           state == network.DEVICE_STATE_IP_CONFIG:
++        if state == network.NM_DEVICE_STATE_PREPARE or \
++           state == network.NM_DEVICE_STATE_CONFIG or \
++           state == network.NM_DEVICE_STATE_NEED_AUTH or \
++           state == network.NM_DEVICE_STATE_IP_CONFIG:
+             if self._disconnect_item:
+                 self._disconnect_item.show()
+             self._connect_item.hide()
+             self._palette.props.secondary_text = _('Connecting...')
+             self.props.pulsing = True
+-        elif state == network.DEVICE_STATE_ACTIVATED:
+-            connection = network.find_connection_by_ssid(self._name)
+-            if connection is not None:
+-                if self._mode == network.NM_802_11_MODE_INFRA:
+-                    connection.set_connected()
++        elif state == network.NM_DEVICE_STATE_ACTIVATED:
++            network.set_connected()
+             if self._disconnect_item:
+                 self._disconnect_item.show()
+             self._connect_item.hide()
+@@ -316,7 +313,7 @@ class WirelessNetworkView(CanvasPulsingIcon):
+             return None
+ 
+         if (self._rsn_flags & network.NM_802_11_AP_SEC_KEY_MGMT_PSK) and \
+-                (self._device_caps & network.NM_802_11_DEVICE_CAP_RSN):
++                (self._device_caps & network.NM_WIFI_DEVICE_CAP_RSN):
+             # WPA2 PSK first
+             pairwise = self._add_ciphers_from_flags(self._rsn_flags, True)
+             group = self._add_ciphers_from_flags(self._rsn_flags, False)
+@@ -328,7 +325,7 @@ class WirelessNetworkView(CanvasPulsingIcon):
+             return wireless_security
+ 
+         if (self._wpa_flags & network.NM_802_11_AP_SEC_KEY_MGMT_PSK) and \
+-                (self._device_caps & network.NM_802_11_DEVICE_CAP_WPA):
++                (self._device_caps & network.NM_WIFI_DEVICE_CAP_WPA):
+             # WPA PSK
+             pairwise = self._add_ciphers_from_flags(self._wpa_flags, True)
+             group = self._add_ciphers_from_flags(self._wpa_flags, False)
+@@ -346,44 +343,38 @@ class WirelessNetworkView(CanvasPulsingIcon):
+         self._connect()
+ 
+     def _connect(self):
++        # Activate existing connection, if there is one
+         connection = network.find_connection_by_ssid(self._name)
+-        if connection is None:
+-            settings = Settings()
+-            settings.connection.id = 'Auto ' + self._name
+-            uuid = settings.connection.uuid = unique_id()
+-            settings.connection.type = '802-11-wireless'
+-            settings.wireless.ssid = self._name
+-
+-            if self._mode == network.NM_802_11_MODE_INFRA:
+-                settings.wireless.mode = 'infrastructure'
+-            elif self._mode == network.NM_802_11_MODE_ADHOC:
+-                settings.wireless.mode = 'adhoc'
+-                settings.wireless.band = 'bg'
+-                settings.ip4_config = IP4Config()
+-                settings.ip4_config.method = 'link-local'
+-
+-            wireless_security = self._get_security()
+-            settings.wireless_security = wireless_security
+-
+-            if wireless_security is not None:
+-                settings.wireless.security = '802-11-wireless-security'
+-
+-            connection = network.add_connection(uuid, settings)
+-
+-        obj = self._bus.get_object(_NM_SERVICE, _NM_PATH)
+-        netmgr = dbus.Interface(obj, _NM_IFACE)
+-
+-        netmgr.ActivateConnection(network.SETTINGS_SERVICE, connection.path,
+-                                  self._device.object_path,
+-                                  '/',
+-                                  reply_handler=self.__activate_reply_cb,
+-                                  error_handler=self.__activate_error_cb)
++        if connection:
++            logging.debug("Activating existing connection for %s", self._name)
++            connection.activate(self._device)
++            return
+ 
+-    def __activate_reply_cb(self, connection):
+-        logging.debug('Connection activated: %s', connection)
++        # Otherwise, create new connection and activate it
++        logging.debug("Creating new connection for %s", self._name)
++        settings = Settings()
++        settings.connection.id = str(self._name)
++        uuid = settings.connection.uuid = unique_id()
++        settings.connection.type = '802-11-wireless'
++        settings.wireless.ssid = self._name
+ 
+-    def __activate_error_cb(self, err):
+-        logging.error('Failed to activate connection: %s', err)
++        if self._mode == network.NM_802_11_MODE_INFRA:
++            settings.wireless.mode = 'infrastructure'
++            settings.connection.autoconnect = True
++        elif self._mode == network.NM_802_11_MODE_ADHOC:
++            settings.wireless.mode = 'adhoc'
++            settings.wireless.band = 'bg'
++            settings.ip4_config = IP4Config()
++            settings.ip4_config.method = 'link-local'
++
++        wireless_security = self._get_security()
++        settings.wireless_security = wireless_security
++
++        if wireless_security is not None:
++            settings.wireless.security = '802-11-wireless-security'
++
++        network.add_and_activate_connection(self._device, settings,
++                                            self.get_first_ap().model)
+ 
+     def set_filter(self, query):
+         self._filtered = self._name.lower().find(query) == -1
+@@ -430,6 +421,9 @@ class WirelessNetworkView(CanvasPulsingIcon):
+             return None
+         return self._access_points[ap_path]
+ 
++    def get_first_ap(self):
++        return self._access_points.values()[0]
++
+     def is_olpc_mesh(self):
+         return self._mode == network.NM_802_11_MODE_ADHOC \
+             and self.name == 'olpc-mesh'
+@@ -524,9 +518,9 @@ class SugarAdhocView(CanvasPulsingIcon):
+         if self._channel == channel:
+             state = device_state
+         else:
+-            state = network.DEVICE_STATE_UNKNOWN
++            state = network.NM_DEVICE_STATE_UNKNOWN
+ 
+-        if state == network.DEVICE_STATE_ACTIVATED:
++        if state == network.NM_DEVICE_STATE_ACTIVATED:
+             icon_name = '%s-connected' % (self._ICON_NAME + str(self._channel))
+         else:
+             icon_name = self._ICON_NAME + str(self._channel)
+@@ -536,16 +530,16 @@ class SugarAdhocView(CanvasPulsingIcon):
+             icon = self._palette.props.icon
+             icon.props.icon_name = icon_name
+ 
+-        if state in [network.DEVICE_STATE_PREPARE,
+-                     network.DEVICE_STATE_CONFIG,
+-                     network.DEVICE_STATE_NEED_AUTH,
+-                     network.DEVICE_STATE_IP_CONFIG]:
++        if state in [network.NM_DEVICE_STATE_PREPARE,
++                     network.NM_DEVICE_STATE_CONFIG,
++                     network.NM_DEVICE_STATE_NEED_AUTH,
++                     network.NM_DEVICE_STATE_IP_CONFIG]:
+             if self._disconnect_item:
+                 self._disconnect_item.show()
+             self._connect_item.hide()
+             self._palette.props.secondary_text = _('Connecting...')
+             self.props.pulsing = True
+-        elif state == network.DEVICE_STATE_ACTIVATED:
++        elif state == network.NM_DEVICE_STATE_ACTIVATED:
+             if self._disconnect_item:
+                 self._disconnect_item.show()
+             self._connect_item.hide()
+@@ -666,18 +660,18 @@ class OlpcMeshView(CanvasPulsingIcon):
+         if self._active:
+             state = self._device_state
+         else:
+-            state = network.DEVICE_STATE_UNKNOWN
++            state = network.NM_DEVICE_STATE_UNKNOWN
+ 
+-        if state in [network.DEVICE_STATE_PREPARE,
+-                     network.DEVICE_STATE_CONFIG,
+-                     network.DEVICE_STATE_NEED_AUTH,
+-                     network.DEVICE_STATE_IP_CONFIG]:
++        if state in [network.NM_DEVICE_STATE_PREPARE,
++                     network.NM_DEVICE_STATE_CONFIG,
++                     network.NM_DEVICE_STATE_NEED_AUTH,
++                     network.NM_DEVICE_STATE_IP_CONFIG]:
+             if self._disconnect_item:
+                 self._disconnect_item.show()
+             self._connect_item.hide()
+             self._palette.props.secondary_text = _('Connecting...')
+             self.props.pulsing = True
+-        elif state == network.DEVICE_STATE_ACTIVATED:
++        elif state == network.NM_DEVICE_STATE_ACTIVATED:
+             if self._disconnect_item:
+                 self._disconnect_item.show()
+             self._connect_item.hide()
+diff --git a/src/jarabe/model/adhoc.py b/src/jarabe/model/adhoc.py
+index 647bd8e..60a9231 100644
+--- a/src/jarabe/model/adhoc.py
++++ b/src/jarabe/model/adhoc.py
+@@ -70,13 +70,22 @@ class AdHocManager(gobject.GObject):
+         self._device = None
+         self._idle_source = 0
+         self._listening_called = 0
+-        self._device_state = network.DEVICE_STATE_UNKNOWN
++        self._device_state = network.NM_DEVICE_STATE_UNKNOWN
+ 
+         self._current_channel = None
+         self._networks = {self._CHANNEL_1: None,
+                           self._CHANNEL_6: None,
+                           self._CHANNEL_11: None}
+ 
++        self._connections = {}
++        for channel in (self._CHANNEL_1, self._CHANNEL_6, self._CHANNEL_11):
++            connection_id = self._get_connection_id(self._CHANNEL_1)
++            connection = network.find_connection_by_id(connection_id)
++            if connection:
++                self._connections[channel] = connection.get_path()
++            else:
++                self._connections[channel] = self._add_connection(channel)
++
+     def start_listening(self, device):
+         self._listening_called += 1
+         if self._listening_called > 1:
+@@ -137,6 +146,7 @@ class AdHocManager(gobject.GObject):
+     def _update_state(self):
+         self.emit('state-changed', self._current_channel, self._device_state)
+ 
++    # FIXME
+     def _have_configured_connections(self):
+         return len(network.get_settings().connections) > 0
+ 
+@@ -151,7 +161,7 @@ class AdHocManager(gobject.GObject):
+             self._AUTOCONNECT_TIMEOUT, self.__idle_check_cb)
+ 
+     def __idle_check_cb(self):
+-        if self._device_state == network.DEVICE_STATE_DISCONNECTED:
++        if self._device_state == network.NM_DEVICE_STATE_DISCONNECTED:
+             logging.debug('Connect to Ad-hoc network due to inactivity.')
+             self._autoconnect_adhoc()
+         else:
+@@ -164,13 +174,13 @@ class AdHocManager(gobject.GObject):
+ 
+         """
+         if self._networks[self._CHANNEL_1] is not None:
+-            self._connect(self._CHANNEL_1)
++            self.activate_channel(self._CHANNEL_1)
+         elif self._networks[self._CHANNEL_6] is not None:
+-            self._connect(self._CHANNEL_6)
++            self.activate_channel(self._CHANNEL_6)
+         elif self._networks[self._CHANNEL_11] is not None:
+-            self._connect(self._CHANNEL_11)
++            self.activate_channel(self._CHANNEL_11)
+         else:
+-            self._connect(self._CHANNEL_1)
++            self.activate_channel(self._CHANNEL_1)
+ 
+     def activate_channel(self, channel):
+         """Activate a sugar Ad-hoc network.
+@@ -179,35 +189,27 @@ class AdHocManager(gobject.GObject):
+         channel -- Channel to connect to (should be 1, 6, 11)
+ 
+         """
+-        self._connect(channel)
+-
+-    def _connect(self, channel):
+-        name = 'Ad-hoc Network %d' % channel
+-        connection = network.find_connection_by_ssid(name)
+-        if connection is None:
+-            settings = Settings()
+-            settings.connection.id = name
+-            settings.connection.uuid = unique_id()
+-            settings.connection.type = '802-11-wireless'
+-            settings.connection.autoconnect = True
+-            settings.wireless.ssid = dbus.ByteArray(name)
+-            settings.wireless.band = 'bg'
+-            settings.wireless.channel = channel
+-            settings.wireless.mode = 'adhoc'
+-            settings.ip4_config = IP4Config()
+-            settings.ip4_config.method = 'link-local'
+-
+-            connection = network.add_connection(name, settings)
+-
+-        obj = self._bus.get_object(_NM_SERVICE, _NM_PATH)
+-        netmgr = dbus.Interface(obj, _NM_IFACE)
+-
+-        netmgr.ActivateConnection(network.SETTINGS_SERVICE,
+-                                  connection.path,
+-                                  self._device.object_path,
+-                                  '/',
+-                                  reply_handler=self.__activate_reply_cb,
+-                                  error_handler=self.__activate_error_cb)
++        path = self._connections[channel]
++        network.activate_connection_by_path(path, self._device.object_path)
++
++    @staticmethod
++    def _get_connection_id(channel):
++        return 'Sugar Ad-hoc Network %d' % channel
++
++    def _add_connection(self, channel):
++        ssid = 'Ad-hoc Network %d' % channel
++        settings = Settings()
++        settings.connection.id = self._get_connection_id(channel)
++        settings.connection.uuid = unique_id()
++        settings.connection.type = '802-11-wireless'
++        settings.connection.autoconnect = False
++        settings.wireless.ssid = dbus.ByteArray(ssid)
++        settings.wireless.band = 'bg'
++        settings.wireless.channel = channel
++        settings.wireless.mode = 'adhoc'
++        settings.ip4_config = IP4Config()
++        settings.ip4_config.method = 'link-local'
++        return network.add_connection(settings)
+ 
+     def deactivate_active_channel(self):
+         """Deactivate the current active channel."""
+diff --git a/src/jarabe/model/network.py b/src/jarabe/model/network.py
+index f265ae4..fe2a35f 100644
+--- a/src/jarabe/model/network.py
++++ b/src/jarabe/model/network.py
+@@ -34,22 +34,38 @@ from sugar import dispatch
+ from sugar import env
+ from sugar.util import unique_id
+ 
+-
+-DEVICE_TYPE_802_3_ETHERNET = 1
+-DEVICE_TYPE_802_11_WIRELESS = 2
+-DEVICE_TYPE_GSM_MODEM = 3
+-DEVICE_TYPE_802_11_OLPC_MESH = 6
+-
+-DEVICE_STATE_UNKNOWN = 0
+-DEVICE_STATE_UNMANAGED = 1
+-DEVICE_STATE_UNAVAILABLE = 2
+-DEVICE_STATE_DISCONNECTED = 3
+-DEVICE_STATE_PREPARE = 4
+-DEVICE_STATE_CONFIG = 5
+-DEVICE_STATE_NEED_AUTH = 6
+-DEVICE_STATE_IP_CONFIG = 7
+-DEVICE_STATE_ACTIVATED = 8
+-DEVICE_STATE_FAILED = 9
++NM_STATE_UNKNOWN = 0
++NM_STATE_ASLEEP = 10
++NM_STATE_DISCONNECTED = 20
++NM_STATE_DISCONNECTING = 30
++NM_STATE_CONNECTING = 40
++NM_STATE_CONNECTED_LOCAL = 50
++NM_STATE_CONNECTED_SITE = 60
++NM_STATE_CONNECTED_GLOBAL = 70
++
++NM_DEVICE_TYPE_UNKNOWN = 0
++NM_DEVICE_TYPE_ETHERNET = 1
++NM_DEVICE_TYPE_WIFI = 2
++NM_DEVICE_TYPE_UNUSED1 = 3
++NM_DEVICE_TYPE_UNUSED2 = 4
++NM_DEVICE_TYPE_BT = 5
++NM_DEVICE_TYPE_OLPC_MESH = 6
++NM_DEVICE_TYPE_WIMAX = 7
++NM_DEVICE_TYPE_MODEM = 8
++
++NM_DEVICE_STATE_UNKNOWN = 0
++NM_DEVICE_STATE_UNMANAGED = 10
++NM_DEVICE_STATE_UNAVAILABLE = 20
++NM_DEVICE_STATE_DISCONNECTED = 30
++NM_DEVICE_STATE_PREPARE = 40
++NM_DEVICE_STATE_CONFIG = 50
++NM_DEVICE_STATE_NEED_AUTH = 60
++NM_DEVICE_STATE_IP_CONFIG = 70
++NM_DEVICE_STATE_IP_CHECK = 80
++NM_DEVICE_STATE_SECONDARIES = 90
++NM_DEVICE_STATE_ACTIVATED = 100
++NM_DEVICE_STATE_DEACTIVATING = 110
++NM_DEVICE_STATE_FAILED = 120
+ 
+ NM_CONNECTION_TYPE_802_11_WIRELESS = '802-11-wireless'
+ NM_CONNECTION_TYPE_GSM = 'gsm'
+@@ -57,15 +73,15 @@ NM_CONNECTION_TYPE_GSM = 'gsm'
+ NM_ACTIVE_CONNECTION_STATE_UNKNOWN = 0
+ NM_ACTIVE_CONNECTION_STATE_ACTIVATING = 1
+ NM_ACTIVE_CONNECTION_STATE_ACTIVATED = 2
+-
++NM_ACTIVE_CONNECTION_STATE_DEACTIVATING = 3
+ 
+ NM_DEVICE_STATE_REASON_UNKNOWN = 0
+ NM_DEVICE_STATE_REASON_NONE = 1
+ NM_DEVICE_STATE_REASON_NOW_MANAGED = 2
+ NM_DEVICE_STATE_REASON_NOW_UNMANAGED = 3
+ NM_DEVICE_STATE_REASON_CONFIG_FAILED = 4
+-NM_DEVICE_STATE_REASON_CONFIG_UNAVAILABLE = 5
+-NM_DEVICE_STATE_REASON_CONFIG_EXPIRED = 6
++NM_DEVICE_STATE_REASON_IP_CONFIG_UNAVAILABLE = 5
++NM_DEVICE_STATE_REASON_IP_CONFIG_EXPIRED = 6
+ NM_DEVICE_STATE_REASON_NO_SECRETS = 7
+ NM_DEVICE_STATE_REASON_SUPPLICANT_DISCONNECT = 8
+ NM_DEVICE_STATE_REASON_SUPPLICANT_CONFIG_FAILED = 9
+@@ -100,47 +116,66 @@ NM_DEVICE_STATE_REASON_SLEEPING = 37
+ NM_DEVICE_STATE_REASON_CONNECTION_REMOVED = 38
+ NM_DEVICE_STATE_REASON_USER_REQUESTED = 39
+ NM_DEVICE_STATE_REASON_CARRIER = 40
++NM_DEVICE_STATE_REASON_CONNECTION_ASSUMED = 41
++NM_DEVICE_STATE_REASON_SUPPLICANT_AVAILABLE = 42
++NM_DEVICE_STATE_REASON_MODEM_NOT_FOUND = 43
++NM_DEVICE_STATE_REASON_BT_FAILED = 44
++NM_DEVICE_STATE_REASON_LAST = 0xFFFF
+ 
+ NM_802_11_AP_FLAGS_NONE = 0x00000000
+ NM_802_11_AP_FLAGS_PRIVACY = 0x00000001
+ 
+-NM_802_11_AP_SEC_NONE = 0x00000000
+-NM_802_11_AP_SEC_PAIR_WEP40 = 0x00000001
+-NM_802_11_AP_SEC_PAIR_WEP104 = 0x00000002
+-NM_802_11_AP_SEC_PAIR_TKIP = 0x00000004
+-NM_802_11_AP_SEC_PAIR_CCMP = 0x00000008
+-NM_802_11_AP_SEC_GROUP_WEP40 = 0x00000010
+-NM_802_11_AP_SEC_GROUP_WEP104 = 0x00000020
+-NM_802_11_AP_SEC_GROUP_TKIP = 0x00000040
+-NM_802_11_AP_SEC_GROUP_CCMP = 0x00000080
+-NM_802_11_AP_SEC_KEY_MGMT_PSK = 0x00000100
+-NM_802_11_AP_SEC_KEY_MGMT_802_1X = 0x00000200
++NM_802_11_AP_SEC_NONE = 0x0
++NM_802_11_AP_SEC_PAIR_WEP40 = 0x1
++NM_802_11_AP_SEC_PAIR_WEP104 = 0x2
++NM_802_11_AP_SEC_PAIR_TKIP = 0x4
++NM_802_11_AP_SEC_PAIR_CCMP = 0x8
++NM_802_11_AP_SEC_GROUP_WEP40 = 0x10
++NM_802_11_AP_SEC_GROUP_WEP104 = 0x20
++NM_802_11_AP_SEC_GROUP_TKIP = 0x40
++NM_802_11_AP_SEC_GROUP_CCMP = 0x80
++NM_802_11_AP_SEC_KEY_MGMT_PSK = 0x100
++NM_802_11_AP_SEC_KEY_MGMT_802_1X = 0x200
+ 
+ NM_802_11_MODE_UNKNOWN = 0
+ NM_802_11_MODE_ADHOC = 1
+ NM_802_11_MODE_INFRA = 2
+ 
+-NM_802_11_DEVICE_CAP_NONE = 0x00000000
+-NM_802_11_DEVICE_CAP_CIPHER_WEP40 = 0x00000001
+-NM_802_11_DEVICE_CAP_CIPHER_WEP104 = 0x00000002
+-NM_802_11_DEVICE_CAP_CIPHER_TKIP = 0x00000004
+-NM_802_11_DEVICE_CAP_CIPHER_CCMP = 0x00000008
+-NM_802_11_DEVICE_CAP_WPA = 0x00000010
+-NM_802_11_DEVICE_CAP_RSN = 0x00000020
++NM_WIFI_DEVICE_CAP_NONE = 0x00000000
++NM_WIFI_DEVICE_CAP_CIPHER_WEP40 = 0x00000001
++NM_WIFI_DEVICE_CAP_CIPHER_WEP104 = 0x00000002
++NM_WIFI_DEVICE_CAP_CIPHER_TKIP = 0x00000004
++NM_WIFI_DEVICE_CAP_CIPHER_CCMP = 0x00000008
++NM_WIFI_DEVICE_CAP_WPA = 0x00000010
++NM_WIFI_DEVICE_CAP_RSN = 0x00000020
++
++NM_BT_CAPABILITY_NONE = 0x00000000
++NM_BT_CAPABILITY_DUN = 0x00000001
++NM_BT_CAPABILITY_NAP = 0x00000002
++
++NM_DEVICE_MODEM_CAPABILITY_NONE = 0x00000000
++NM_DEVICE_MODEM_CAPABILITY_POTS = 0x00000001
++NM_DEVICE_MODEM_CAPABILITY_CDMA_EVDO = 0x00000002
++NM_DEVICE_MODEM_CAPABILITY_GSM_UMTS = 0x00000004
++NM_DEVICE_MODEM_CAPABILITY_LTE = 0x00000008
+ 
+-SETTINGS_SERVICE = 'org.freedesktop.NetworkManagerUserSettings'
++SETTINGS_SERVICE = 'org.freedesktop.NetworkManager'
+ 
+ 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_SETTINGS_PATH = '/org/freedesktop/NetworkManager/Settings'
++NM_SETTINGS_IFACE = 'org.freedesktop.NetworkManager.Settings'
++NM_GETSETTINGS_IFACE = 'org.freedesktop.NetworkManager.Settings.Connection.GetSettings'
++NM_CONNECTION_IFACE = 'org.freedesktop.NetworkManager.Settings.Connection'
++NM_GETACCESSPOINT_IFACE = 'org.freedesktop.NetworkManager.Device.Wireless.GetAccessPoints'
+ NM_ACCESSPOINT_IFACE = 'org.freedesktop.NetworkManager.AccessPoint'
+ NM_ACTIVE_CONN_IFACE = 'org.freedesktop.NetworkManager.Connection.Active'
+ 
++NM_SECRET_AGENT_IFACE = 'org.freedesktop.NetworkManager.SecretAgent'
++NM_AGENT_MANAGER_IFACE = 'org.freedesktop.NetworkManager.AgentManager'
++
+ GSM_USERNAME_PATH = '/desktop/sugar/network/gsm/username'
+ GSM_PASSWORD_PATH = '/desktop/sugar/network/gsm/password'
+ GSM_NUMBER_PATH = '/desktop/sugar/network/gsm/number'
+@@ -148,8 +183,10 @@ GSM_APN_PATH = '/desktop/sugar/network/gsm/apn'
+ GSM_PIN_PATH = '/desktop/sugar/network/gsm/pin'
+ GSM_PUK_PATH = '/desktop/sugar/network/gsm/puk'
+ 
++_nm_manager = None
+ _nm_settings = None
+-_conn_counter = 0
++_secret_agent = None
++_connections = None
+ 
+ _nm_device_state_reason_description = None
+ 
+@@ -169,10 +206,10 @@ def get_error_by_reason(reason):
+                 _('The device is no longer managed.'),
+             NM_DEVICE_STATE_REASON_CONFIG_FAILED:
+                 _('The device could not be readied for configuration.'),
+-            NM_DEVICE_STATE_REASON_CONFIG_UNAVAILABLE:
++            NM_DEVICE_STATE_REASON_IP_CONFIG_UNAVAILABLE:
+                 _('IP configuration could not be reserved '
+                   '(no available address, timeout, etc).'),
+-            NM_DEVICE_STATE_REASON_CONFIG_EXPIRED:
++            NM_DEVICE_STATE_REASON_IP_CONFIG_EXPIRED:
+                 _('The IP configuration is no longer valid.'),
+             NM_DEVICE_STATE_REASON_NO_SECRETS:
+                 _('Secrets were required, but not provided.'),
+@@ -244,11 +281,48 @@ def get_error_by_reason(reason):
+             NM_DEVICE_STATE_REASON_USER_REQUESTED:
+                 _('A user or client requested the disconnection.'),
+             NM_DEVICE_STATE_REASON_CARRIER:
+-                _("The device's carrier/link changed.")}
++                _("The device's carrier/link changed."),
++            NM_DEVICE_STATE_REASON_CONNECTION_ASSUMED:
++                _("The device's existing connection was assumed."),
++            NM_DEVICE_STATE_REASON_SUPPLICANT_AVAILABLE:
++                _("The supplicant is now available."),
++            NM_DEVICE_STATE_REASON_MODEM_NOT_FOUND:
++                _("The modem could not be found."),
++            NM_DEVICE_STATE_REASON_BT_FAILED:
++                _("The Bluetooth connection failed or timed out."),
++            NM_DEVICE_STATE_REASON_LAST:
++                _("Unused."),
++        }
+ 
+     return _nm_device_state_reason_description[reason]
+ 
+ 
++def get_nm_state_by_reason(reason):
++    global _nm_state_reason_description
++
++    if _nm_state_reason_description is None:
++        _nm_state_reason_description = {
++            NM_STATE_UNKNOWN:
++                _('networking state is unknown.'),
++            NM_STATE_ASLEEP:
++                _('networking is not enabled.'),
++            NM_STATE_DISCONNECTED:
++                _('there is no active network connection.'),
++            NM_STATE_DISCONNECTING:
++                _('network connections are being cleaned up.'),
++            NM_STATE_CONNECTING:
++                _('a network connection is being started.'),
++            NM_STATE_CONNECTED_LOCAL:
++                _('there is only local IPv4 and/or IPv6 connectivity.'),
++            NM_STATE_CONNECTED_SITE:
++                _('there is only site-wide IPv4 and/or IPv6 connectivity.'),
++            NM_STATE_CONNECTED_GLOBAL:
++                _('there is global IPv4 and/or IPv6 Internet connectivity.'),
++        }
++
++    return _nm_state_reason_description[reason]
++
++
+ def frequency_to_channel(frequency):
+     """Returns the channel matching a given radio channel frequency. If a
+     frequency is not in the dictionary channel 1 will be returned.
+@@ -288,6 +362,9 @@ class WirelessSecurity(object):
+         self.proto = None
+         self.group = None
+         self.pairwise = None
++        self.wep_key = None
++        self.psk = None
++        self.auth_alg = None
+ 
+     def get_dict(self):
+         wireless_security = {}
+@@ -299,6 +376,12 @@ class WirelessSecurity(object):
+             wireless_security['pairwise'] = self.pairwise
+         if self.group is not None:
+             wireless_security['group'] = self.group
++        if self.wep_key is not None:
++            wireless_security['wep-key0'] = self.wep_key
++        if self.psk is not None:
++            wireless_security['psk'] = self.psk
++        if self.auth_alg is not None:
++            wireless_security['auth-alg'] = self.auth_alg
+         return wireless_security
+ 
+ 
+@@ -343,7 +426,7 @@ class OlpcMesh(object):
+         return ret
+ 
+ 
+-class Connection(object):
++class ConnectionSettings(object):
+     def __init__(self):
+         self.id = None
+         self.uuid = None
+@@ -415,7 +498,7 @@ class Gsm(object):
+ 
+ class Settings(object):
+     def __init__(self, wireless_cfg=None):
+-        self.connection = Connection()
++        self.connection = ConnectionSettings()
+         self.ip4_config = None
+         self.wireless_security = None
+ 
+@@ -436,35 +519,9 @@ class Settings(object):
+         return settings
+ 
+ 
+-class Secrets(object):
+-    def __init__(self, settings):
+-        self.settings = settings
+-        self.wep_key = None
+-        self.psk = None
+-        self.auth_alg = None
+-
+-    def get_dict(self):
+-        # 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:
+-            settings['802-11-wireless-security']['wep-key0'] = self.wep_key
+-        if self.psk is not None:
+-            settings['802-11-wireless-security']['psk'] = self.psk
+-        if self.auth_alg is not None:
+-            settings['802-11-wireless-security']['auth-alg'] = self.auth_alg
+-
+-        return settings
+-
+-
+ class SettingsGsm(object):
+     def __init__(self):
+-        self.connection = Connection()
++        self.connection = ConnectionSettings()
+         self.ip4_config = IP4Config()
+         self.serial = Serial()
+         self.ppp = Ppp()
+@@ -499,200 +556,65 @@ class SecretsGsm(object):
+         return {'gsm': secrets}
+ 
+ 
+-class NMSettings(dbus.service.Object):
+-    def __init__(self):
+-        bus = dbus.SystemBus()
+-        bus_name = dbus.service.BusName(SETTINGS_SERVICE, bus=bus)
+-        dbus.service.Object.__init__(self, bus_name, NM_SETTINGS_PATH)
+-
+-        self.connections = {}
+-        self.secrets_request = dispatch.Signal()
+-
+-    @dbus.service.method(dbus_interface=NM_SETTINGS_IFACE,
+-                         in_signature='', out_signature='ao')
+-    def ListConnections(self):
+-        return self.connections.values()
+-
+-    @dbus.service.signal(NM_SETTINGS_IFACE, signature='o')
+-    def NewConnection(self, connection_path):
+-        pass
+-
+-    def add_connection(self, uuid, conn):
+-        self.connections[uuid] = conn
+-        conn.secrets_request.connect(self.__secrets_request_cb)
+-        self.NewConnection(conn.path)
+-
+-    def __secrets_request_cb(self, sender, **kwargs):
+-        self.secrets_request.send(self, connection=sender,
+-                                  response=kwargs['response'])
+-
+-    def clear_wifi_connections(self):
+-        for uuid in self.connections.keys():
+-            conn = self.connections[uuid]
+-            if conn._settings.connection.type == \
+-               NM_CONNECTION_TYPE_802_11_WIRELESS:
+-                conn.Removed()
+-                self.connections.pop(uuid)
+-
+-
+ 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
++    def __init__(self, reply_cb, error_cb):
+         self._reply_cb = reply_cb
+         self._error_cb = error_cb
+ 
+     def set_secrets(self, secrets):
+-        self._connection.set_secrets(secrets)
+-        self._reply_cb(secrets.get_dict())
++        self._reply_cb(secrets)
+ 
+     def set_error(self, error):
+         self._error_cb(error)
+ 
+ 
+-class NMSettingsConnection(dbus.service.Object):
+-    def __init__(self, path, settings, secrets):
+-        bus = dbus.SystemBus()
+-        bus_name = dbus.service.BusName(SETTINGS_SERVICE, bus=bus)
+-        dbus.service.Object.__init__(self, bus_name, path)
+-
+-        self.path = path
++def set_connected():
++    try:
++        # try to flush resolver cache - SL#1940
++        # ctypes' syntactic sugar does not work
++        # so we must get the func ptr explicitly
++        libc = ctypes.CDLL('libc.so.6')
++        res_init = getattr(libc, '__res_init')
++        res_init(None)
++    except:
++        # pylint: disable=W0702
++        logging.exception('Error calling libc.__res_init')
++
++# https://socsvn.freebsd.org/socsvn/soc2011/kulakov_ad/src/tests/test-secret-agent.py
++class SecretAgent(dbus.service.Object):
++    def __init__(self):
++        self._bus = dbus.SystemBus()
++        dbus.service.Object.__init__(self, self._bus, "/org/freedesktop/NetworkManager/SecretAgent")
+         self.secrets_request = dispatch.Signal()
++        proxy = dbus.SystemBus().get_object("org.freedesktop.NetworkManager",
++                               "/org/freedesktop/NetworkManager/AgentManager")
++        proxy.Register("org.sugarlabs.sugar", dbus_interface=NM_AGENT_MANAGER_IFACE)
+ 
+-        self._settings = settings
+-        self._secrets = secrets
+-
+-    @dbus.service.signal(dbus_interface=NM_CONNECTION_IFACE,
+-                         signature='')
+-    def Removed(self):
+-        pass
+-
+-    @dbus.service.signal(dbus_interface=NM_CONNECTION_IFACE,
+-                         signature='a{sa{sv}}')
+-    def Updated(self, settings):
+-        pass
+-
+-    def set_connected(self):
+-        if self._settings.connection.type == NM_CONNECTION_TYPE_GSM:
+-            self._settings.connection.timestamp = int(time.time())
+-        elif not self._settings.connection.autoconnect:
+-            self._settings.connection.autoconnect = True
+-            self._settings.connection.timestamp = int(time.time())
+-            if (self._settings.connection.type ==
+-                    NM_CONNECTION_TYPE_802_11_WIRELESS):
+-                self.Updated(self._settings.get_dict())
+-                self.save()
+-
+-        try:
+-            # try to flush resolver cache - SL#1940
+-            # ctypes' syntactic sugar does not work
+-            # so we must get the func ptr explicitly
+-            libc = ctypes.CDLL('libc.so.6')
+-            res_init = getattr(libc, '__res_init')
+-            res_init(None)
+-        except:
+-            # 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 == \
+-           NM_CONNECTION_TYPE_802_11_WIRELESS:
+-            self.save()
+-
+-    def get_settings(self):
+-        return self._settings
+-
+-    def save(self):
+-        config_path = _get_wifi_connections_path()
+ 
+-        config = ConfigParser.ConfigParser()
+-        try:
+-            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 = self._settings.connection.id
+-
+-            if identifier not in config.sections():
+-                config.add_section(identifier)
+-            config.set(identifier, 'type', self._settings.connection.type)
+-            config.set(identifier, 'ssid', self._settings.wireless.ssid)
+-            config.set(identifier, 'uuid', self._settings.connection.uuid)
+-            config.set(identifier, 'autoconnect',
+-                       self._settings.connection.autoconnect)
+-            if self._settings.connection.timestamp is not None:
+-                config.set(identifier, 'timestamp',
+-                           self._settings.connection.timestamp)
+-            if self._settings.wireless_security is not None:
+-                if self._settings.wireless_security.key_mgmt is not None:
+-                    config.set(identifier, 'key-mgmt',
+-                               self._settings.wireless_security.key_mgmt)
+-                if self._settings.wireless_security.proto is not None:
+-                    config.set(identifier, 'proto',
+-                               self._settings.wireless_security.proto)
+-                if self._settings.wireless_security.pairwise is not None:
+-                    config.set(identifier, 'pairwise',
+-                               self._settings.wireless_security.pairwise)
+-                if self._settings.wireless_security.group is not None:
+-                    config.set(identifier, 'group',
+-                               self._settings.wireless_security.group)
+-                if self._settings.wireless.security is not None:
+-                    config.set(identifier, 'security',
+-                               self._settings.wireless.security)
+-            if self._secrets is not None:
+-                if self._settings.wireless_security.key_mgmt == 'none':
+-                    config.set(identifier, 'key', self._secrets.wep_key)
+-                    config.set(identifier, 'auth-alg', self._secrets.auth_alg)
+-                elif self._settings.wireless_security.key_mgmt == 'wpa-psk':
+-                    config.set(identifier, 'key', self._secrets.psk)
+-        except ConfigParser.Error, e:
+-            logging.exception('Error constructing %s', identifier)
+-        else:
+-            f = open(config_path, 'w')
+-            try:
+-                config.write(f)
+-            except ConfigParser.Error:
+-                logging.exception('Can not write %s', config_path)
+-            f.close()
+-
+-    @dbus.service.method(dbus_interface=NM_CONNECTION_IFACE,
+-                         in_signature='', out_signature='a{sa{sv}}')
+-    def GetSettings(self):
+-        return self._settings.get_dict()
+-
+-    @dbus.service.method(dbus_interface=NM_SECRETS_IFACE,
++    @dbus.service.method(NM_SECRET_AGENT_IFACE,
+                          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 request_new=%s',
+-                      self.path, request_new)
+-        if self._settings.connection.type is not NM_CONNECTION_TYPE_GSM:
+-            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, response=response)
+-                except Exception:
+-                    logging.exception('Error requesting the secrets via'
+-                                      ' dialog')
+-            else:
+-                reply(self._secrets.get_dict())
+-        else:
++                         in_signature='a{sa{sv}}osasb',
++                         out_signature='a{sa{sv}}',
++                         sender_keyword='sender',
++                         byte_arrays=True)
++    def GetSecrets(self, settings, connection_path, setting_name, hints, request_new, reply, error, sender=None):
++        if not sender:
++            raise NotAuthorizedException("Internal error: couldn't get sender")
++        uid = self._bus.get_unix_user(sender)
++        if uid != 0:
++            raise NotAuthorizedException("UID %d not authorized" % uid)
++
++        if setting_name == '802-11-wireless-security':
++            logging.warn("detected wifi")
++            response = SecretsResponse(reply, error)
++            try:
++                self.secrets_request.send(self, settings=settings, response=response)
++            except Exception:
++                logging.exception('Error requesting the secrets via dialog')
++        else: # FIXME GSM
+             if not request_new:
+                 reply(self._secrets.get_dict())
+             else:
+@@ -807,59 +729,174 @@ class AccessPoint(gobject.GObject):
+                                          path=self.model.object_path,
+                                          dbus_interface=NM_ACCESSPOINT_IFACE)
+ 
++def get_manager():
++    global _nm_manager
++    if _nm_manager is None:
++        obj = dbus.SystemBus().get_object(NM_SERVICE, NM_PATH)
++        _nm_manager = dbus.Interface(obj, NM_IFACE)
++    return _nm_manager
+ 
+ def get_settings():
+     global _nm_settings
+     if _nm_settings is None:
+-        try:
+-            _nm_settings = NMSettings()
+-        except dbus.DBusException:
+-            logging.exception('Cannot create the UserSettings service.')
+-        load_connections()
++        obj = dbus.SystemBus().get_object(NM_SERVICE, NM_SETTINGS_PATH)
++        _nm_settings = dbus.Interface(obj, NM_SETTINGS_IFACE)
++        migrate_old_wifi_connections()
+     return _nm_settings
+ 
++def get_secret_agent():
++    global _secret_agent
++    if _secret_agent is None:
++        _secret_agent = SecretAgent()
++    return _secret_agent
+ 
+-def find_connection_by_ssid(ssid):
+-    connections = get_settings().connections
++class Connection(gobject.GObject):
++    __gsignals__ = {
++        'removed': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ()),
++    }
++
++    def __init__(self, bus, path):
++        gobject.GObject.__init__(self)
++        obj = bus.get_object(NM_SERVICE, path)
++        self._connection = dbus.Interface(obj, NM_CONNECTION_IFACE)
++        self._removed_handle = self._connection.connect_to_signal(
++            'Removed', self.__removed_cb)
++        self._updated_handle = self._connection.connect_to_signal(
++            'Updated', self.__updated_cb)
++        self._settings = self._connection.GetSettings(byte_arrays=True)
++
++    def __updated_cb(self):
++        self._settings = self._connection.GetSettings(byte_arrays=True)
++
++    def __removed_cb(self):
++        self._updated_handle.remove()
++        self._removed_handle.remove()
++        self.emit('removed')
++
++    def get_settings(self, stype):
++        if not stype:
++            return self._settings
++        elif stype in self._settings:
++            return self._settings[stype]
++        else:
++            return None
++
++    def __activate_reply_cb(self, connection):
++        logging.debug('Connection activated: %s', connection)
++
++    def __activate_error_cb(self, err):
++        logging.error('Failed to activate connection: %s', err)
++
++    def activate(self, device_o):
++        activate_connection_by_path(self.get_path(), device_o)
++
++    def get_ssid(self):
++        wifi_settings = self.get_settings('802-11-wireless')
++        if wifi_settings and 'ssid' in wifi_settings:
++            return wifi_settings['ssid']
++        else:
++            return None
+ 
+-    for conn_index in connections:
+-        connection = connections[conn_index]
+-        if connection._settings.connection.type == \
+-           NM_CONNECTION_TYPE_802_11_WIRELESS and \
+-           connection._settings.wireless.ssid == ssid:
++    def get_id(self):
++        return self.get_settings('connection')['id']
++
++    def get_path(self):
++        return self._connection.object_path
++
++class Connections(object):
++    def __init__(self):
++        self._bus = dbus.SystemBus()
++        self._connections = []
++
++        settings = get_settings()
++        settings.connect_to_signal('NewConnection', self.__new_connection_cb)
++
++        connections_o = settings.ListConnections()
++        for connection_o in connections_o:
++            self.__monitor_connection(connection_o)
++
++    def get_connections_list(self):
++        return self._connections
++
++    def __monitor_connection(self, connection_o):
++        connection = Connection(self._bus, connection_o)
++        connection.connect('removed', self.__connection_removed_cb)
++        self._connections.append(connection)
++
++    def __new_connection_cb(self, connection_o):
++        self.__monitor_connection(connection_o)
++
++    def __connection_removed_cb(self, connection):
++        self._connections.remove(connection)
++        logging.warning("removed connection: %s", connection._connection.object_path)
++
++
++def get_connections():
++    global _connections
++    if _connections is None:
++         _connections = Connections()
++    return _connections
++
++def find_connection_by_ssid(ssid):
++    # FIXME: this check should be more extensive.
++    # it should look at mode (infra/adhoc), band, security, and really
++    # anything that is stored in the settings.
++    connections = get_connections().get_connections_list()
++    for connection in connections:
++        if connection.get_ssid() == ssid:
+             return connection
++    return None
+ 
++def find_connection_by_id(search_id):
++    connections = get_connections().get_connections_list()
++    for connection in connections:
++        if connection.get_id() == search_id:
++            return connection
+     return None
+ 
++def add_connection(settings):
++    return _nm_settings.AddConnection(settings.get_dict())
+ 
+-def add_connection(uuid, settings, secrets=None):
+-    global _conn_counter
++def __activate_reply_cb(connection):
++    logging.debug('Activating connection: %s', connection)
+ 
+-    path = NM_SETTINGS_PATH + '/' + str(_conn_counter)
+-    _conn_counter += 1
++def __activate_error_cb(err):
++    logging.error('Failed to activate connection: %s', err)
+ 
+-    conn = NMSettingsConnection(path, settings, secrets)
+-    _nm_settings.add_connection(uuid, conn)
+-    return conn
++def activate_connection_by_path(connection, device_o):
++    netmgr = dbus.SystemBus().get_object(NM_SERVICE, NM_PATH)
++    get_manager().ActivateConnection(connection,
++                                     device_o,
++                                     '/',
++                                     reply_handler=__activate_reply_cb,
++                                     error_handler=__activate_error_cb)
+ 
++def __add_activate_reply_cb(path, connection):
++    logging.warning('Activated connection: %s %s', path, connection)
++
++def __add_activate_error_cb(err):
++    logging.error('Failed to add connection: %s', err)
++
++def add_and_activate_connection(device_o, settings, specific_object):
++    get_manager().AddAndActivateConnection(settings.get_dict(), device_o,
++                                           specific_object,
++                                           reply_handler=__add_activate_reply_cb,
++                                           error_handler=__add_activate_error_cb)
+ 
+ def _get_wifi_connections_path():
+     profile_path = env.get_profile_path()
+     return os.path.join(profile_path, 'nm', 'connections.cfg')
+ 
+ 
+-def _create_wifi_connections(config_path):
+-    if not os.path.exists(os.path.dirname(config_path)):
+-        os.makedirs(os.path.dirname(config_path), 0755)
+-    f = open(config_path, 'w')
+-    f.close()
+-
++def migrate_old_wifi_connections():
++    """
++    Migrate connections.cfg from Sugar-0.94 and previous to NetworkManager
++    system-wide connections
++    """
+ 
+-def load_wifi_connections():
+     config_path = _get_wifi_connections_path()
+-
+     if not os.path.exists(config_path):
+-        _create_wifi_connections(config_path)
++        return
+ 
+     config = ConfigParser.ConfigParser()
+     try:
+@@ -887,9 +924,7 @@ def load_wifi_connections():
+                 timestamp = int(config.get(section, 'timestamp'))
+                 settings.connection.timestamp = timestamp
+ 
+-            secrets = None
+             if config.has_option(section, 'key-mgmt'):
+-                secrets = Secrets(settings)
+                 settings.wireless_security = WirelessSecurity()
+                 mgmt = config.get(section, 'key-mgmt')
+                 settings.wireless_security.key_mgmt = mgmt
+@@ -897,11 +932,11 @@ def load_wifi_connections():
+                 settings.wireless.security = security
+                 key = config.get(section, 'key')
+                 if mgmt == 'none':
+-                    secrets.wep_key = key
++                    settings.wireless_security.wep_key = key
+                     auth_alg = config.get(section, 'auth-alg')
+-                    secrets.auth_alg = auth_alg
++                    settings.wireless_security.auth_alg = auth_alg
+                 elif mgmt == 'wpa-psk':
+-                    secrets.psk = key
++                    settings.wireless_security.psk = key
+                     if config.has_option(section, 'proto'):
+                         value = config.get(section, 'proto')
+                         settings.wireless_security.proto = value
+@@ -914,7 +949,9 @@ def load_wifi_connections():
+         except ConfigParser.Error:
+             logging.exception('Error reading section')
+         else:
+-            add_connection(uuid, settings, secrets)
++            add_connection(settings)
++
++    os.unlink(config_path)
+ 
+ 
+ def load_gsm_connection():
+diff --git a/src/jarabe/model/olpcmesh.py b/src/jarabe/model/olpcmesh.py
+index f070100..34496b1 100644
+--- a/src/jarabe/model/olpcmesh.py
++++ b/src/jarabe/model/olpcmesh.py
+@@ -33,17 +33,19 @@ _NM_OLPC_MESH_IFACE = 'org.freedesktop.NetworkManager.Device.OlpcMesh'
+ 
+ _XS_ANYCAST = '\xc0\x27\xc0\x27\xc0\x00'
+ 
+-DEVICE_STATE_UNKNOWN = 0
+-DEVICE_STATE_UNMANAGED = 1
+-DEVICE_STATE_UNAVAILABLE = 2
+-DEVICE_STATE_DISCONNECTED = 3
+-DEVICE_STATE_PREPARE = 4
+-DEVICE_STATE_CONFIG = 5
+-DEVICE_STATE_NEED_AUTH = 6
+-DEVICE_STATE_IP_CONFIG = 7
+-DEVICE_STATE_ACTIVATED = 8
+-DEVICE_STATE_FAILED = 9
+-
++NM_DEVICE_STATE_UNKNOWN = 0
++NM_DEVICE_STATE_UNMANAGED = 10
++NM_DEVICE_STATE_UNAVAILABLE = 20
++NM_DEVICE_STATE_DISCONNECTED = 30
++NM_DEVICE_STATE_PREPARE = 40
++NM_DEVICE_STATE_CONFIG = 50
++NM_DEVICE_STATE_NEED_AUTH = 60
++NM_DEVICE_STATE_IP_CONFIG = 70
++NM_DEVICE_STATE_IP_CHECK = 80
++NM_DEVICE_STATE_SECONDARIES = 90
++NM_DEVICE_STATE_ACTIVATED = 100
++NM_DEVICE_STATE_DEACTIVATING = 110
++NM_DEVICE_STATE_FAILED = 120
+ 
+ class OlpcMeshManager(object):
+     def __init__(self, mesh_device):
+@@ -79,8 +81,8 @@ class OlpcMeshManager(object):
+                                       dbus_interface=_NM_DEVICE_IFACE)
+ 
+         self._idle_source = 0
+-        self._mesh_device_state = DEVICE_STATE_UNKNOWN
+-        self._eth_device_state = DEVICE_STATE_UNKNOWN
++        self._mesh_device_state = NM_DEVICE_STATE_UNKNOWN
++        self._eth_device_state = NM_DEVICE_STATE_UNKNOWN
+ 
+         if self._have_configured_connections():
+             self._start_automesh_timer()
+@@ -123,8 +125,8 @@ class OlpcMeshManager(object):
+         self._eth_device_state = new_state
+         self._maybe_schedule_idle_check()
+ 
+-        if new_state >= DEVICE_STATE_PREPARE \
+-                and new_state <= DEVICE_STATE_ACTIVATED \
++        if new_state >= NM_DEVICE_STATE_PREPARE \
++                and new_state <= NM_DEVICE_STATE_ACTIVATED \
+                 and len(self._connection_queue) > 0:
+             self._connection_queue = []
+ 
+@@ -132,20 +134,20 @@ class OlpcMeshManager(object):
+         self._mesh_device_state = new_state
+         self._maybe_schedule_idle_check()
+ 
+-        if new_state == DEVICE_STATE_FAILED:
++        if new_state == NM_DEVICE_STATE_FAILED:
+             self._try_next_connection_from_queue()
+-        elif new_state == DEVICE_STATE_ACTIVATED \
++        elif new_state == NM_DEVICE_STATE_ACTIVATED \
+                 and len(self._connection_queue) > 0:
+             self._empty_connection_queue()
+ 
+     def _maybe_schedule_idle_check(self):
+-        if self._mesh_device_state == DEVICE_STATE_DISCONNECTED \
+-                and self._eth_device_state == DEVICE_STATE_DISCONNECTED:
++        if self._mesh_device_state == NM_DEVICE_STATE_DISCONNECTED \
++                and self._eth_device_state == NM_DEVICE_STATE_DISCONNECTED:
+             self._start_automesh_timer()
+ 
+     def _idle_check(self):
+-        if self._mesh_device_state == DEVICE_STATE_DISCONNECTED \
+-                and self._eth_device_state == DEVICE_STATE_DISCONNECTED:
++        if self._mesh_device_state == NM_DEVICE_STATE_DISCONNECTED \
++                and self._eth_device_state == NM_DEVICE_STATE_DISCONNECTED:
+             logging.debug('starting automesh due to inactivity')
+             self._start_automesh()
+         return False
+-- 
+1.7.6
+
diff --git a/sugar.spec b/sugar.spec
index 049328b..7760c77 100644
--- a/sugar.spec
+++ b/sugar.spec
@@ -3,13 +3,12 @@
 Summary: Constructionist learning platform
 Name: sugar
 Version: 0.92.4
-Release: 1%{?dist}
+Release: 2%{?dist}
 URL: http://sugarlabs.org/
 License: GPLv2+
 Group: User Interface/Desktops
 Source0: http://download.sugarlabs.org/sources/sucrose/glucose/%{name}/%{name}-%{version}.tar.bz2
-Patch0:  sugar-nm09-new.patch
-Patch1:  n2.patch
+Patch0:  nm09.patch
 
 BuildRequires: gettext
 BuildRequires: GConf2-devel
@@ -65,7 +64,6 @@ multiple instances of sugar.
 %prep
 %setup -q
 %patch0 -p1 -b .nm09
-%patch1 -p1 -b .n2
 
 %build
 %configure
@@ -146,107 +144,110 @@ fi
 %{_datadir}/icons/hicolor/scalable/apps/sugar-xo.svg
 
 %changelog
-* Mon Jul 25 2011 Peter Robinson <pbrobinson at gmail.com> - 0.92.4-1
+* Tue Sep  6 2011 Peter Robinson <pbrobinson at fedoraproject.org> - 0.92.4-2
+- New NM 0.9 patch
+
+* Mon Jul 25 2011 Peter Robinson <pbrobinson at fedoraproject.org> - 0.92.4-1
 - 0.92.4
 
-* Fri Jul  8 2011 Peter Robinson <pbrobinson at gmail.com> - 0.92.3-1
+* Fri Jul  8 2011 Peter Robinson <pbrobinson at fedoraproject.org> - 0.92.3-1
 - 0.92.3
 
-* Thu Jun  9 2011 Peter Robinson <pbrobinson at gmail.com> - 0.92.2-1
+* Thu Jun  9 2011 Peter Robinson <pbrobinson at fedoraproject.org> - 0.92.2-1
 - 0.92.2
 
-* Wed Jun  8 2011 Peter Robinson <pbrobinson at gmail.com> - 0.92.1-6
+* Wed Jun  8 2011 Peter Robinson <pbrobinson at fedoraproject.org> - 0.92.1-6
 - Add an extra NM patch
 
-* Tue May 24 2011 Peter Robinson <pbrobinson at gmail.com> - 0.92.1-5
+* Tue May 24 2011 Peter Robinson <pbrobinson at fedoraproject.org> - 0.92.1-5
 - Add patch for NM-0.9 (thanks to John Dulaney for his assistance)
 
-* Tue May 17 2011 Peter Robinson <pbrobinson at gmail.com> - 0.92.1-4
+* Tue May 17 2011 Peter Robinson <pbrobinson at fedoraproject.org> - 0.92.1-4
 - Drop previous patch, in wider testing it breaks more than it fixes
 
-* Mon Apr 25 2011 Peter Robinson <pbrobinson at gmail.com> - 0.92.1-3
+* Mon Apr 25 2011 Peter Robinson <pbrobinson at fedoraproject.org> - 0.92.1-3
 - Add patch to fix jabber online status b.sl.o #2483
 
-* Mon Apr 25 2011 Peter Robinson <pbrobinson at gmail.com> - 0.92.1-2
+* Mon Apr 25 2011 Peter Robinson <pbrobinson at fedoraproject.org> - 0.92.1-2
 - Fix the sugar desktop icon in emulator
 
-* Thu Apr 14 2011 Peter Robinson <pbrobinson at gmail.com> - 0.92.1-1
+* Thu Apr 14 2011 Peter Robinson <pbrobinson at fedoraproject.org> - 0.92.1-1
 - 0.92.1 release
 
 * Tue Mar 01 2011 Simon Schampijer <simon at laptop.org> - 0.92.0-2
 - added upower (battery status indicator) and ConsoleKit
   (logged users information) as runtime dependencies
 
-* Mon Feb 28 2011 Peter Robinson <pbrobinson at gmail.com> - 0.92.0-1
+* Mon Feb 28 2011 Peter Robinson <pbrobinson at fedoraproject.org> - 0.92.0-1
 - 0.92.0 release
 
 * Wed Feb 09 2011 Fedora Release Engineering <rel-eng at lists.fedoraproject.org> - 0.90.3-5
 - Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
 
-* Sat Jan 29 2011 Peter Robinson <pbrobinson at gmail.com> - 0.90.3-4
+* Sat Jan 29 2011 Peter Robinson <pbrobinson at fedoraproject.org> - 0.90.3-4
 - Drop patch to enable sugar-settings-manager
 
-* Sat Jan 29 2011 Peter Robinson <pbrobinson at gmail.com> - 0.90.3-3
+* Sat Jan 29 2011 Peter Robinson <pbrobinson at fedoraproject.org> - 0.90.3-3
 - bump build
 
-* Mon Nov  1 2010 Peter Robinson <pbrobinson at gmail.com> - 0.90.3-2
+* Mon Nov  1 2010 Peter Robinson <pbrobinson at fedoraproject.org> - 0.90.3-2
 - add gnome-keyring-pam as dep to fix prompt
 
-* Fri Oct 15 2010 Peter Robinson <pbrobinson at gmail.com> - 0.90.3-1
+* Fri Oct 15 2010 Peter Robinson <pbrobinson at fedoraproject.org> - 0.90.3-1
 - 0.90.3 release
 
-* Tue Oct  5 2010 Peter Robinson <pbrobinson at gmail.com> - 0.90.2-1
+* Tue Oct  5 2010 Peter Robinson <pbrobinson at fedoraproject.org> - 0.90.2-1
 - 0.90.2 release
 
-* Fri Oct  1 2010 Peter Robinson <pbrobinson at gmail.com> - 0.90.1-1
+* Fri Oct  1 2010 Peter Robinson <pbrobinson at fedoraproject.org> - 0.90.1-1
 - 0.90.1 stable release
 
-* Wed Sep 29 2010 Peter Robinson <pbrobinson at gmail.com> - 0.90.0-1
+* Wed Sep 29 2010 Peter Robinson <pbrobinson at fedoraproject.org> - 0.90.0-1
 - 0.90.0 stable release
 
-* Tue Sep 21 2010 Peter Robinson <pbrobinson at gmail.com> - 0.89.10-1
+* Tue Sep 21 2010 Peter Robinson <pbrobinson at fedoraproject.org> - 0.89.10-1
 - New upstream devel 0.89.10 release
 
-* Sat Sep 18 2010 Peter Robinson <pbrobinson at gmail.com> - 0.89.9-1
+* Sat Sep 18 2010 Peter Robinson <pbrobinson at fedoraproject.org> - 0.89.9-1
 - New upstream devel 0.89.9 release
 
-* Fri Sep  3 2010 Peter Robinson <pbrobinson at gmail.com> - 0.89.8-1
+* Fri Sep  3 2010 Peter Robinson <pbrobinson at fedoraproject.org> - 0.89.8-1
 - New upstream devel 0.89.8 release
 
-* Tue Aug 31 2010 Peter Robinson <pbrobinson at gmail.com> - 0.89.7-1
+* Tue Aug 31 2010 Peter Robinson <pbrobinson at fedoraproject.org> - 0.89.7-1
 - New upstream devel 0.89.7 release
 
-* Mon Aug 30 2010 Peter Robinson <pbrobinson at gmail.com> - 0.89.6-1
+* Mon Aug 30 2010 Peter Robinson <pbrobinson at fedoraproject.org> - 0.89.6-1
 - New upstream devel 0.89.6 release
 
-* Fri Aug 27 2010 Peter Robinson <pbrobinson at gmail.com> - 0.89.5-1
+* Fri Aug 27 2010 Peter Robinson <pbrobinson at fedoraproject.org> - 0.89.5-1
 - New upstream devel 0.89.5 release
 
-* Tue Aug 25 2010 Peter Robinson <pbrobinson at gmail.com> - 0.89.4-1
+* Tue Aug 25 2010 Peter Robinson <pbrobinson at fedoraproject.org> - 0.89.4-1
 - New upstream devel 0.89.4 release
 
-* Wed Aug 17 2010 Peter Robinson <pbrobinson at gmail.com> - 0.89.3-1
+* Wed Aug 17 2010 Peter Robinson <pbrobinson at fedoraproject.org> - 0.89.3-1
 - New upstream devel 0.89.3 release
 
-* Wed Aug  4 2010 Peter Robinson <pbrobinson at gmail.com> - 0.89.2-1
+* Wed Aug  4 2010 Peter Robinson <pbrobinson at fedoraproject.org> - 0.89.2-1
 - New upstream devel 0.89.2 release
 
 * Thu Jul 22 2010 David Malcolm <dmalcolm at redhat.com> - 0.89.1-2
 - Rebuilt for https://fedoraproject.org/wiki/Features/Python_2.7/MassRebuild
 
-* Wed Jul 14 2010 Peter Robinson <pbrobinson at gmail.com> - 0.89.1-1
+* Wed Jul 14 2010 Peter Robinson <pbrobinson at fedoraproject.org> - 0.89.1-1
 - New upstream devel 0.89.1 release
 
-* Thu Jun  3 2010 Peter Robinson <pbrobinson at gmail.com> - 0.88.1-1
+* Thu Jun  3 2010 Peter Robinson <pbrobinson at fedoraproject.org> - 0.88.1-1
 - New upstream stable 0.88.1 release
 
-* Sat May 30 2010 Peter Robinson <pbrobinson at gmail.com> - 0.88.0-3
+* Sat May 30 2010 Peter Robinson <pbrobinson at fedoraproject.org> - 0.88.0-3
 - Bump build
 
-* Sat May 30 2010 Peter Robinson <pbrobinson at gmail.com> - 0.88.0-2
+* Sat May 30 2010 Peter Robinson <pbrobinson at fedoraproject.org> - 0.88.0-2
 - Clean up some descriptions 
 
-* Tue Mar 20 2010 Peter Robinson <pbrobinson at gmail.com> - 0.88.0-1
+* Tue Mar 20 2010 Peter Robinson <pbrobinson at fedoraproject.org> - 0.88.0-1
 - New upstream stable 0.88.0 release
 
 * Wed Mar 10 2010 Sebastian Dziallas <sebastian at when.com> - 0.87.8-1
@@ -267,7 +268,7 @@ fi
 * Tue Jan 12 2010 Sebastian Dziallas <sebastian at when.com> - 0.87.3-1
 - New upstream release
 
-* Sat Jan  9 2010 Peter Robinson <pbrobinson at gmail.com> - 0.87.2-2
+* Sat Jan  9 2010 Peter Robinson <pbrobinson at fedoraproject.org> - 0.87.2-2
 - Updated to the new python sysarch spec file reqs
 
 * Wed Dec 23 2009 Sebastian Dziallas <sebastian at when.com> - 0.87.2-1


More information about the scm-commits mailing list