From 90fd5ad6f6331df967880acdd549025966a13067 Mon Sep 17 00:00:00 2001
From: latu <latu@localhost.localdomain>
Date: Thu, 11 Feb 2010 10:43:52 -0200
Subject: [PATCH 2/3] Pin Puk Configuration
Organization: Sugar Labs Foundation

---
 extensions/cpsection/modemconfiguration/model.py |   19 ++++++++-
 extensions/cpsection/modemconfiguration/view.py  |   51 +++++++++++++++++++---
 extensions/deviceicon/network.py                 |   14 ++++++-
 src/jarabe/model/network.py                      |   21 ++++++---
 4 files changed, 91 insertions(+), 14 deletions(-)
 mode change 100644 => 100755 extensions/cpsection/modemconfiguration/model.py

diff --git a/extensions/cpsection/modemconfiguration/model.py b/extensions/cpsection/modemconfiguration/model.py
old mode 100644
new mode 100755
index f96e88f..2545ce1
--- a/extensions/cpsection/modemconfiguration/model.py
+++ b/extensions/cpsection/modemconfiguration/model.py
@@ -17,7 +17,8 @@
 import gconf
 
 from jarabe.model.network import GSM_USERNAME_PATH, GSM_PASSWORD_PATH, \
-                                 GSM_NUMBER_PATH, GSM_APN_PATH
+                                 GSM_NUMBER_PATH, GSM_APN_PATH, GSM_PIN_PATH, \
+                                 GSM_PUK_PATH
 
 def get_username():
     client = gconf.client_get_default()
@@ -35,6 +36,14 @@ def get_apn():
     client = gconf.client_get_default()
     return client.get_string(GSM_APN_PATH) or ''
 
+def get_pin():
+    client = gconf.client_get_default()
+    return client.get_string(GSM_PIN_PATH) or ''
+
+def get_puk():
+    client = gconf.client_get_default()
+    return client.get_string(GSM_PUK_PATH) or ''
+
 def set_username(username):
     client = gconf.client_get_default()
     client.set_string(GSM_USERNAME_PATH, username)
@@ -51,3 +60,11 @@ def set_apn(apn):
     client = gconf.client_get_default()
     client.set_string(GSM_APN_PATH, apn)
 
+def set_pin(pin):
+    client = gconf.client_get_default()
+    client.set_string(GSM_PIN_PATH, pin)
+
+def set_puk(puk):
+    client = gconf.client_get_default()
+    client.set_string(GSM_PUK_PATH, puk)
+
diff --git a/extensions/cpsection/modemconfiguration/view.py b/extensions/cpsection/modemconfiguration/view.py
index d66f1d5..2445005 100644
--- a/extensions/cpsection/modemconfiguration/view.py
+++ b/extensions/cpsection/modemconfiguration/view.py
@@ -94,7 +94,7 @@ class UsernameEntry(EntryWithLabel):
         return self._model.get_username()
 
     def set_value(self, username):
-        return self._model.set_username(username)
+        self._model.set_username(username)
 
 class PasswordEntry(EntryWithLabel):
     def __init__(self, model):
@@ -105,7 +105,7 @@ class PasswordEntry(EntryWithLabel):
         return self._model.get_password()
 
     def set_value(self, password):
-        return self._model.set_password(password)
+        self._model.set_password(password)
 
 class NumberEntry(EntryWithLabel):
     def __init__(self, model):
@@ -116,7 +116,7 @@ class NumberEntry(EntryWithLabel):
         return self._model.get_number()
 
     def set_value(self, number):
-        return self._model.set_number(number)
+        self._model.set_number(number)
 
 class ApnEntry(EntryWithLabel):
     def __init__(self, model):
@@ -127,7 +127,30 @@ class ApnEntry(EntryWithLabel):
         return self._model.get_apn()
 
     def set_value(self, apn):
-        return self._model.set_apn(apn)
+        self._model.set_apn(apn)
+
+class PinEntry(EntryWithLabel):
+    def __init__(self, model):
+        EntryWithLabel.__init__(self, _('PIN:'))
+        self._model = model
+
+    def get_value(self):
+        return self._model.get_pin()
+
+    def set_value(self, pin):
+        self._model.set_pin(pin)
+
+class PukEntry(EntryWithLabel):
+    def __init__(self, model):
+        EntryWithLabel.__init__(self, _('PUK:'))
+        self._model = model
+
+    def get_value(self):
+        return self._model.get_puk()
+
+    def set_value(self, puk):
+        self._model.set_puk(puk)
+
 
 class ModemConfiguration(SectionView):
     def __init__(self, model, alerts=None):
@@ -163,6 +186,18 @@ class ModemConfiguration(SectionView):
         self.pack_start(self._apn_entry, expand=False)
         self._apn_entry.show()
 
+        self._pin_entry = PinEntry(model)
+        self._pin_entry.connect('notify::is-valid',
+                                self.__notify_is_valid_cb)
+        self.pack_start(self._pin_entry, expand=False)
+        self._pin_entry.show()
+        
+        self._puk_entry = PukEntry(model)
+        self._puk_entry.connect('notify::is-valid',
+                                self.__notify_is_valid_cb)
+        self.pack_start(self._puk_entry, expand=False)        
+        self._puk_entry.show()
+
         self.setup()
 
     def setup(self):
@@ -170,6 +205,8 @@ class ModemConfiguration(SectionView):
         self._password_entry.set_text_from_model()
         self._number_entry.set_text_from_model()
         self._apn_entry.set_text_from_model()
+        self._pin_entry.set_text_from_model()
+        self._puk_entry.set_text_from_model()
 
         self.needs_restart = False
 
@@ -180,8 +217,10 @@ class ModemConfiguration(SectionView):
         if self._username_entry.is_valid and \
             self._password_entry.is_valid and \
                 self._number_entry.is_valid and \
-                    self._apn_entry.is_valid:
-                        self.props.is_valid = True
+                    self._apn_entry.is_valid and \
+                        self._pin_entry.is_valid and \
+                            self._puk_entry.is_valid:
+                                self.props.is_valid = True
         else:
             self.props.is_valid = False
 
diff --git a/extensions/deviceicon/network.py b/extensions/deviceicon/network.py
index 8fd141a..58b268d 100644
--- a/extensions/deviceicon/network.py
+++ b/extensions/deviceicon/network.py
@@ -58,6 +58,7 @@ _GSM_STATE_NOT_READY = 0
 _GSM_STATE_DISCONNECTED = 1
 _GSM_STATE_CONNECTING = 2
 _GSM_STATE_CONNECTED = 3
+_GSM_STATE_NEED_AUTH = 4
 
 def frequency_to_channel(frequency):
     ftoc = { 2412: 1, 2417: 2, 2422: 3, 2427: 4,
@@ -239,6 +240,11 @@ class GsmPalette(Palette):
         elif self._current_state == _GSM_STATE_CONNECTED:
             self._toggle_state_item.get_child().set_label(_('Disconnect'))
             self.props.secondary_text = _('Connected')
+            
+        elif self._current_state == _GSM_STATE_NEED_AUTH:
+            self._toggle_state_item.get_child().set_label(_('Sim requires Pin/Puk'))
+            self.props.secondary_text = _('Authentication Error')
+            
         else:
             raise ValueError('Invalid GSM state while updating label and ' \
                              'text, %s' % str(self._current_state))
@@ -252,6 +258,8 @@ class GsmPalette(Palette):
             self.emit('gsm-disconnect')
         elif self._current_state == _GSM_STATE_CONNECTED:
             self.emit('gsm-disconnect')
+        elif self._current_state == _GSM_STATE_NEED_AUTH:
+            self.emit('gsm-disconnect')
         else:
             raise ValueError('Invalid GSM state while emitting signal, %s' % \
                              str(self._current_state))
@@ -620,6 +628,7 @@ class GsmDeviceView(TrayIcon):
         raise RuntimeError('Error when disconnecting gsm device, %s' % error)
 
     def __state_changed_cb(self, new_state, old_state, reason):
+        logging.debug('State: %s to %s, reason %s', old_state, new_state, reason)
         self._update_state(int(new_state))
 
     def __current_state_check_cb(self, properties):
@@ -646,7 +655,10 @@ class GsmDeviceView(TrayIcon):
                        network.DEVICE_STATE_CONFIG,
                        network.DEVICE_STATE_IP_CONFIG]:
             gsm_state = _GSM_STATE_CONNECTING
-
+            
+        elif state in [network.DEVICE_STATE_NEED_AUTH]:
+            gsm_state = _GSM_STATE_NEED_AUTH
+            
         if self._palette is not None:
             self._palette.set_state(gsm_state)
 
diff --git a/src/jarabe/model/network.py b/src/jarabe/model/network.py
index cf75e25..476ee07 100644
--- a/src/jarabe/model/network.py
+++ b/src/jarabe/model/network.py
@@ -91,6 +91,8 @@ GSM_USERNAME_PATH = '/sugar/network/gsm/
 GSM_PASSWORD_PATH = '/sugar/network/gsm/password'
 GSM_NUMBER_PATH = '/sugar/network/gsm/number'
 GSM_APN_PATH = '/sugar/network/gsm/apn'
+GSM_PIN_PATH = '/sugar/network/gsm/pin'
+GSM_PUK_PATH = '/sugar/network/gsm/puk'
 
 _nm_settings = None
 _conn_counter = 0
@@ -261,11 +263,17 @@ class SettingsGsm(object):
 class SecretsGsm(object):
     def __init__(self):
         self.password = None
-
+        self.pin = None
+        self.puk = None
+        
     def get_dict(self):
         secrets = {}
         if self.password is not None:
             secrets['password'] = self.password
+        if self.pin is not None:
+            secrets['pin'] = self.pin
+        if self.puk is not None:    
+            secrets['puk'] = self.puk
         return {'gsm': secrets}
 
 class NMSettings(dbus.service.Object):
@@ -657,17 +665,17 @@ def clear_connections():
     f.close()
 
 def load_gsm_connection():
-    settings = SettingsGsm()
-    secrets = SecretsGsm()
-
     client = gconf.client_get_default()
+
+    settings = SettingsGsm()
     settings.gsm.username = client.get_string(GSM_USERNAME_PATH) or ''
     settings.gsm.number = client.get_string(GSM_NUMBER_PATH) or ''
     settings.gsm.apn = client.get_string(GSM_APN_PATH) or ''
-    password = client.get_string(GSM_PASSWORD_PATH) or ''
 
-    if password:
-        secrets.password = password
+    secrets = SecretsGsm()
+    secrets.pin = client.get_string(GSM_PIN_PATH) or ''
+    secrets.puk = client.get_string(GSM_PUK_PATH) or ''
+    secrets.password = client.get_string(GSM_PASSWORD_PATH) or ''
 
     settings.connection.id = 'gsm'
     settings.connection.type = NM_CONNECTION_TYPE_GSM
-- 
1.6.6.1

