commit 2436c4f904565eb4a22c2dd8f50a32e946d9717b
parent 04c7d2b4552862de0d6a985d2859d7ebbdcdb993
Author: ThomasV <thomasv@electrum.org>
Date: Mon, 15 Feb 2016 16:25:59 +0100
rm authenticator script (replaced by new android app
Diffstat:
1 file changed, 0 insertions(+), 359 deletions(-)
diff --git a/scripts/authenticator.py b/scripts/authenticator.py
@@ -1,359 +0,0 @@
-#!/usr/bin/env python
-#
-# Electrum - lightweight Bitcoin client
-# Copyright (C) 2015 Thomas Voegtlin
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-
-
-
-from __future__ import absolute_import
-
-import android
-import sys
-import os
-import imp
-import base64
-
-script_dir = os.path.dirname(os.path.realpath(__file__))
-sys.path.insert(0, os.path.join(script_dir, 'packages'))
-
-import qrcode
-
-imp.load_module('electrum', *imp.find_module('lib'))
-
-from electrum import SimpleConfig, Wallet, WalletStorage, format_satoshis
-from electrum import util
-from electrum.transaction import Transaction
-from electrum.bitcoin import base_encode, base_decode
-
-def modal_dialog(title, msg = None):
- droid.dialogCreateAlert(title,msg)
- droid.dialogSetPositiveButtonText('OK')
- droid.dialogShow()
- droid.dialogGetResponse()
- droid.dialogDismiss()
-
-def modal_input(title, msg, value = None, etype=None):
- droid.dialogCreateInput(title, msg, value, etype)
- droid.dialogSetPositiveButtonText('OK')
- droid.dialogSetNegativeButtonText('Cancel')
- droid.dialogShow()
- response = droid.dialogGetResponse()
- result = response.result
- droid.dialogDismiss()
-
- if result is None:
- return modal_input(title, msg, value, etype)
-
- if result.get('which') == 'positive':
- return result.get('value')
-
-def modal_question(q, msg, pos_text = 'OK', neg_text = 'Cancel'):
- droid.dialogCreateAlert(q, msg)
- droid.dialogSetPositiveButtonText(pos_text)
- droid.dialogSetNegativeButtonText(neg_text)
- droid.dialogShow()
- response = droid.dialogGetResponse()
- result = response.result
- droid.dialogDismiss()
-
- if result is None:
- return modal_question(q, msg, pos_text, neg_text)
-
- return result.get('which') == 'positive'
-
-
-
-
-
-def make_layout(s):
- content = """
-
- <LinearLayout
- android:id="@+id/zz"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:background="#ff222222">
-
- <TextView
- android:id="@+id/textElectrum"
- android:text="Electrum Authenticator"
- android:textSize="7pt"
- android:textColor="#ff4444ff"
- android:gravity="left"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- />
- </LinearLayout>
-
- %s """%s
-
-
- return """<?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/background"
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="#ff000022">
-
- %s
- </LinearLayout>"""%content
-
-
-
-
-
-
-def qr_layout(title):
- title_view= """
- <TextView android:id="@+id/addrTextView"
- android:layout_width="match_parent"
- android:layout_height="50"
- android:text="%s"
- android:textAppearance="?android:attr/textAppearanceLarge"
- android:gravity="center_vertical|center_horizontal|center">
- </TextView>"""%title
-
- image_view="""
- <ImageView
- android:id="@+id/qrView"
- android:gravity="center"
- android:layout_width="match_parent"
- android:antialias="false"
- android:src=""
- />
- """
- return make_layout(title_view + image_view)
-
-
-
-
-
-
-
-
-
-
-def add_menu():
- droid.clearOptionsMenu()
- droid.addOptionsMenuItem("Seed", "seed", None,"")
- droid.addOptionsMenuItem("Public Key", "xpub", None,"")
- droid.addOptionsMenuItem("Transaction", "scan", None,"")
- droid.addOptionsMenuItem("Password", "password", None,"")
-
-
-
-def make_bitmap(data):
- # fixme: this is highly inefficient
- import qrcode
- from electrum import bmp
- qr = qrcode.QRCode()
- qr.add_data(data)
- bmp.save_qrcode(qr,"/sdcard/sl4a/qrcode.bmp")
-
-
-droid = android.Android()
-wallet = None
-
-class Authenticator:
-
- def __init__(self):
- global wallet
- self.qr_data = None
- storage = WalletStorage('/sdcard/electrum/authenticator')
- if not storage.file_exists:
-
- action = self.restore_or_create()
- if not action:
- exit()
- password = droid.dialogGetPassword('Choose a password').result
- if password:
- password2 = droid.dialogGetPassword('Confirm password').result
- if password != password2:
- modal_dialog('Error', 'Passwords do not match')
- exit()
- else:
- password = None
- if action == 'create':
- wallet = Wallet(storage)
- seed = wallet.make_seed()
- modal_dialog('Your seed is:', seed)
- elif action == 'import':
- seed = self.seed_dialog()
- if not seed:
- exit()
- if not Wallet.is_seed(seed):
- exit()
- wallet = Wallet.from_seed(seed, password, storage)
- else:
- exit()
-
- wallet.add_seed(seed, password)
- wallet.create_master_keys(password)
- wallet.create_main_account(password)
- else:
- wallet = Wallet(storage)
-
- def restore_or_create(self):
- droid.dialogCreateAlert("Seed not found", "Do you want to create a new seed, or to import it?")
- droid.dialogSetPositiveButtonText('Create')
- droid.dialogSetNeutralButtonText('Import')
- droid.dialogSetNegativeButtonText('Cancel')
- droid.dialogShow()
- response = droid.dialogGetResponse().result
- droid.dialogDismiss()
- if not response: return
- if response.get('which') == 'negative':
- return
- return 'import' if response.get('which') == 'neutral' else 'create'
-
- def seed_dialog(self):
- if modal_question("Enter your seed", "Input method", 'QR Code', 'mnemonic'):
- code = droid.scanBarcode()
- r = code.result
- if r:
- seed = r['extras']['SCAN_RESULT']
- else:
- return
- else:
- seed = modal_input('Mnemonic', 'Please enter your seed phrase')
- return str(seed)
-
- def show_qr(self, data):
- path = "/sdcard/sl4a/qrcode.bmp"
- if data:
- droid.dialogCreateSpinnerProgress("please wait")
- droid.dialogShow()
- try:
- make_bitmap(data)
- finally:
- droid.dialogDismiss()
- else:
- with open(path, 'w') as f: f.write('')
- droid.fullSetProperty("qrView", "src", 'file://'+path)
- self.qr_data = data
-
- def show_title(self, title):
- droid.fullSetProperty("addrTextView","text", title)
-
- def get_password(self):
- if wallet.use_encryption:
- password = droid.dialogGetPassword('Password').result
- try:
- wallet.check_password(password)
- except:
- return False
- return password
-
- def main(self):
- add_menu()
- welcome = 'Use the menu to scan a transaction.'
- droid.fullShow(qr_layout(welcome))
- while True:
- event = droid.eventWait().result
- if not event:
- continue
- elif event["name"] == "key":
- if event["data"]["key"] == '4':
- if self.qr_data:
- self.show_qr(None)
- self.show_title(welcome)
- else:
- break
-
- elif event["name"] == "seed":
- password = self.get_password()
- if password is False:
- modal_dialog('Error','incorrect password')
- continue
- seed = wallet.get_mnemonic(password)
- modal_dialog('Your seed is', seed)
-
- elif event["name"] == "password":
- self.change_password_dialog()
-
- elif event["name"] == "xpub":
- mpk = wallet.get_master_public_key()
- self.show_qr(mpk)
- self.show_title('master public key')
- droid.setClipboard(mpk)
- droid.makeToast("Master public key copied to clipboard")
-
- elif event["name"] == "scan":
- r = droid.scanBarcode()
- r = r.result
- if not r:
- continue
- data = r['extras']['SCAN_RESULT']
- data = base_decode(data.encode('utf8'), None, base=43)
- data = ''.join(chr(ord(b)) for b in data).encode('hex')
- tx = Transaction(data)
- #except:
- # modal_dialog('Error', 'Cannot parse transaction')
- # continue
- if not wallet.can_sign(tx):
- modal_dialog('Error', 'Cannot sign this transaction')
- continue
- lines = map(lambda x: x[0] + u'\t\t' + format_satoshis(x[1]) if x[1] else x[0], tx.get_outputs())
- if not modal_question('Sign?', '\n'.join(lines)):
- continue
- password = self.get_password()
- if password is False:
- modal_dialog('Error','incorrect password')
- continue
- droid.dialogCreateSpinnerProgress("Signing")
- droid.dialogShow()
- wallet.sign_transaction(tx, password)
- droid.dialogDismiss()
- data = base_encode(str(tx).decode('hex'), base=43)
- self.show_qr(data)
- self.show_title('Signed Transaction')
-
- droid.makeToast("Bye!")
-
-
- def change_password_dialog(self):
- if wallet.use_encryption:
- password = droid.dialogGetPassword('Your seed is encrypted').result
- if password is None:
- return
- else:
- password = None
- try:
- wallet.check_password(password)
- except Exception:
- modal_dialog('Error', 'Incorrect password')
- return
- new_password = droid.dialogGetPassword('Choose a password').result
- 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(password, new_password)
- if new_password:
- modal_dialog('Password updated', 'Your seed is encrypted')
- else:
- modal_dialog('No password', 'Your seed is not encrypted')
-
-
-
-if __name__ == "__main__":
- a = Authenticator()
- a.main()