From 290a06616973ecce8523cad10b0c839dc4ef91df Mon Sep 17 00:00:00 2001 From: ThomasV Date: Mon, 9 Apr 2012 11:38:21 +0200 Subject: [PATCH] create wallet in android, enhance password dialogs --- client/electrum4a.py | 95 +++++++++++++++++++++++++++----------------- client/wallet.py | 5 ++- 2 files changed, 61 insertions(+), 39 deletions(-) diff --git a/client/electrum4a.py b/client/electrum4a.py index 4788933bb..ce9842d07 100755 --- a/client/electrum4a.py +++ b/client/electrum4a.py @@ -351,7 +351,9 @@ settings_layout = make_layout(""" def get_history_values(n): values = [] h = wallet.get_tx_history() - for i in range(n): + + length = min(n, len(h)) + for i in range(length): line = h[-i-1] v = line['value'] try: @@ -500,48 +502,63 @@ def pay_to(recipient, amount, fee, label): def recover(): - if not modal_question("Wallet not found","restore from seed?"): + + droid.dialogCreateAlert("Wallet not found","Do you want to create a new wallet, or restore an existing one?") + droid.dialogSetPositiveButtonText('Create') + droid.dialogSetNeutralButtonText('Restore') + droid.dialogSetNegativeButtonText('Cancel') + droid.dialogShow() + response = droid.dialogGetResponse().result + droid.dialogDismiss() + if response.get('which') == 'negative': exit(1) - if modal_question("Input method",None,'QR Code', 'mnemonic'): - code = droid.scanBarcode() - r = code.result - if r: - seed = r['extras']['SCAN_RESULT'] - else: - exit(1) + is_recovery = response.get('which') == 'neutral' + + if not is_recovery: + wallet.new_seed(None) else: - m = modal_input('Mnemonic','please enter your code') - try: - seed = mnemonic.mn_decode(m.split(' ')) - except: - modal_dialog('error: could not decode this seed') - exit(1) + if modal_question("Input method",None,'QR Code', 'mnemonic'): + code = droid.scanBarcode() + r = code.result + if r: + seed = r['extras']['SCAN_RESULT'] + else: + exit(1) + else: + m = modal_input('Mnemonic','please enter your code') + try: + seed = mnemonic.mn_decode(m.split(' ')) + except: + modal_dialog('error: could not decode this seed') + exit(1) - if not modal_question('Seed', seed ): - exit(1) + wallet.seed = str(seed) - wallet.seed = str(seed) - wallet.init_mpk( wallet.seed ) + modal_dialog('Your seed is:', wallet.seed) + modal_dialog('Mnemonic code:', ' '.join(mnemonic.mn_encode(wallet.seed)) ) - change_password_dialog() - - droid.dialogCreateSpinnerProgress("Electrum", "recovering wallet...") + msg = "recovering wallet..." if is_recovery else "creating wallet..." + droid.dialogCreateSpinnerProgress("Electrum", msg) droid.dialogShow() + + wallet.init_mpk( wallet.seed ) WalletSynchronizer(wallet,True).start() wallet.update() - wallet.save() + droid.dialogDismiss() droid.vibrate() - if wallet.is_found(): - # history and addressbook - wallet.update_tx_history() - wallet.fill_addressbook() - modal_dialog("recovery successful") - else: - if not modal_question("no transactions found for this seed","do you want to keep this wallet?"): - exit(1) + if is_recovery: + if wallet.is_found(): + wallet.update_tx_history() + wallet.fill_addressbook() + modal_dialog("recovery successful") + else: + if not modal_question("no transactions found for this seed","do you want to keep this wallet?"): + exit(1) + + change_password_dialog() wallet.save() @@ -761,8 +778,8 @@ def seed_dialog(): def change_password_dialog(): if wallet.use_encryption: - password = droid.dialogGetPassword('Current password').result - if not password: return + password = droid.dialogGetPassword('Your wallet is encrypted').result + if password is None: return else: password = None @@ -773,16 +790,20 @@ def change_password_dialog(): 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') + if new_password == None: return + if new_password != '': + password2 = droid.dialogGetPassword('Confirm new password').result + if new_password != password2: + modal_dialog('error','passwords do not match') + return + wallet.update_password(seed, new_password) if new_password: modal_dialog('Password updated','your wallet is encrypted') else: - modal_dialog('Password removed','your wallet is not encrypted') + modal_dialog('No password','your wallet is not encrypted') def settings_loop(): diff --git a/client/wallet.py b/client/wallet.py index 906b53677..d30bea715 100644 --- a/client/wallet.py +++ b/client/wallet.py @@ -340,7 +340,7 @@ class Wallet: def new_seed(self, password): seed = "%032x"%ecdsa.util.randrange( pow(2,128) ) - self.init_mpk(seed) + #self.init_mpk(seed) # encrypt self.seed = self.pw_encode( seed, password ) @@ -850,7 +850,8 @@ class Wallet: return target, signing_addr, auth_name def update_password(self, seed, new_password): - self.use_encryption = (new_password != '') + if new_password == '': new_password = None + self.use_encryption = (new_password != None) self.seed = self.pw_encode( seed, new_password) for k in self.imported_keys.keys(): a = self.imported_keys[k]