passwords
authorThomasV <thomasv@gitorious>
Thu, 5 Apr 2012 19:28:38 +0000 (21:28 +0200)
committerThomasV <thomasv@gitorious>
Thu, 5 Apr 2012 19:28:38 +0000 (21:28 +0200)
client/electrum4a.py

index 9c756b6..46f803c 100755 (executable)
@@ -23,13 +23,13 @@ from interface import WalletSynchronizer
 from wallet import Wallet
 from wallet import format_satoshis
 from decimal import Decimal
-
+import mnemonic
 
 import datetime
 
 
 
-def modal_dialog(title, msg):
+def modal_dialog(title, msg = ''):
     droid.dialogCreateAlert(title,msg)
     droid.dialogSetPositiveButtonText('OK')
     droid.dialogShow()
@@ -273,21 +273,6 @@ payto_layout = make_layout("""
 
 settings_layout = make_layout("""
 
-        <TextView android:id="@+id/feeTextView" 
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content" 
-                android:text="Fee:"
-                android:textAppearance="?android:attr/textAppearanceLarge" 
-                android:gravity="left">
-        </TextView>
-
-        <EditText android:id="@+id/fee"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content" 
-                android:tag="Tag Me" 
-                android:inputType="numberDecimal">
-        </EditText>
-
         <TextView android:id="@+id/serverTextView" 
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content" 
@@ -320,6 +305,20 @@ settings_layout = make_layout("""
 
         </LinearLayout>
 
+        <TextView android:id="@+id/feeTextView" 
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content" 
+                android:text="Fee:"
+                android:textAppearance="?android:attr/textAppearanceLarge" 
+                android:gravity="left">
+        </TextView>
+
+        <EditText android:id="@+id/fee"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content" 
+                android:tag="Tag Me" 
+                android:inputType="numberDecimal">
+        </EditText>
 
         <Button android:id="@+id/buttonSave" android:layout_width="wrap_content"
                 android:layout_height="wrap_content" android:text="Save"></Button>
@@ -488,11 +487,14 @@ def recover():
     else:
         exit(1)
 
-    if not modal_question('Seed', seed):
+    if not modal_question('Seed', seed ):
         exit(1)
 
     wallet.seed = str(seed)
     wallet.init_mpk( wallet.seed )
+
+    change_password_dialog()
+
     droid.dialogCreateSpinnerProgress("Electrum", "recovering wallet...")
     droid.dialogShow()
     WalletSynchronizer(wallet,True).start()
@@ -505,10 +507,11 @@ def recover():
         # history and addressbook
         wallet.update_tx_history()
         wallet.fill_addressbook()
-        wallet.save()
         modal_dialog("recovery successful")
     else:
-        modal_dialog("no transactions found for this seed")
+        if not modal_question("no transactions found for this seed","do you want to keep this wallet?"):
+            exit(1)
+    wallet.save()
 
 
 
@@ -655,6 +658,43 @@ def server_dialog(plist):
         return response
 
 
+def seed_dialog():
+    if wallet.use_encryption:
+        password  = droid.dialogGetPassword('Password').result
+        if not password: return
+    else:
+        password = None
+    
+    try:
+        seed = wallet.pw_decode( wallet.seed, password)
+    except:
+        modal_dialog('error','incorrect password')
+        return
+
+    modal_dialog('Your seed is',seed)
+    modal_dialog('Mnemonic code:', ' '.join(mnemonic.mn_encode(seed)) )
+
+def change_password_dialog():
+    if wallet.use_encryption:
+        password  = droid.dialogGetPassword('Current password').result
+        if not password: return
+    else:
+        password = None
+
+    try:
+        seed = wallet.pw_decode( wallet.seed, password)
+    except:
+        modal_dialog('error','incorrect password')
+        return
+
+    new_password  = droid.dialogGetPassword('Choose a password').result
+    password2  = droid.dialogGetPassword('Confirm new password').result
+    if new_password != password2:
+        modal_dialog('error','passwords do not match')
+        return
+
+    if new_password:
+        wallet.update_password(seed, new_password)
 
 
 def settings_loop():
@@ -696,8 +736,8 @@ def settings_loop():
                     if server:
                         droid.fullSetProperty("server","text",server)
 
-            elif id=="buttonSave":
 
+            elif id=="buttonSave":
                 droid.fullQuery()
                 srv = droid.fullQueryDetail("server").result.get('text')
                 fee = droid.fullQueryDetail("fee").result.get('text')
@@ -714,20 +754,22 @@ def settings_loop():
                 except:
                     modal_dialog('error','invalid fee value')
 
-                out = 'main'
+        elif event["name"] in menu_commands:
+            out = event["name"]
 
-                    
-            elif id=="buttonCancel":
-                out = 'main'
+        elif event["name"] == 'password':
+            change_password_dialog()
+
+        elif event["name"] == 'seed':
+            seed_dialog()
+
+        elif event["name"] == 'cancel':
+            out = 'main'
 
         elif event["name"] == "key":
             if event["data"]["key"] == '4':
                 out = 'main'
 
-        elif event["name"] in menu_commands:
-            out = event["name"]
-
     return out
 
                 
@@ -743,7 +785,6 @@ wallet.set_path("/sdcard/electrum.dat")
 wallet.read()
 if not wallet.file_exists:
     recover()
-    exit(1)
 else:
     WalletSynchronizer(wallet,True).start()
 
@@ -765,11 +806,13 @@ def add_menu(s):
         #droid.addOptionsMenuItem("Edit label","editcontact",None,"")
         #droid.addOptionsMenuItem("Delete","removecontact",None,"")
     elif s == 'settings':
-        droid.addOptionsMenuItem("Save","save",None,"")
-        droid.addOptionsMenuItem("Cancel","cancel",None,"")
+        droid.addOptionsMenuItem("Password","password",None,"")
+        droid.addOptionsMenuItem("Seed","seed",None,"")
+
         
 
 
+
 while True:
     add_menu(s)
     if s == 'main':