URI: 
       tkivy.py - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
       tkivy.py (4377B)
       ---
            1 #!/usr/bin/env python
            2 #
            3 # Electrum - Lightweight Bitcoin Client
            4 # Copyright (C) 2015 Thomas Voegtlin
            5 #
            6 # Permission is hereby granted, free of charge, to any person
            7 # obtaining a copy of this software and associated documentation files
            8 # (the "Software"), to deal in the Software without restriction,
            9 # including without limitation the rights to use, copy, modify, merge,
           10 # publish, distribute, sublicense, and/or sell copies of the Software,
           11 # and to permit persons to whom the Software is furnished to do so,
           12 # subject to the following conditions:
           13 #
           14 # The above copyright notice and this permission notice shall be
           15 # included in all copies or substantial portions of the Software.
           16 #
           17 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
           18 # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
           19 # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
           20 # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
           21 # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
           22 # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
           23 # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
           24 # SOFTWARE.
           25 
           26 from functools import partial
           27 from threading import Thread
           28 import re
           29 from decimal import Decimal
           30 
           31 from kivy.clock import Clock
           32 
           33 from electrum.i18n import _
           34 from electrum.plugin import hook
           35 from .trustedcoin import TrustedCoinPlugin, server, KIVY_DISCLAIMER, TrustedCoinException, ErrorConnectingServer
           36 
           37 
           38 
           39 class Plugin(TrustedCoinPlugin):
           40 
           41     disclaimer_msg = KIVY_DISCLAIMER
           42 
           43     def __init__(self, parent, config, name):
           44         super().__init__(parent, config, name)
           45 
           46     @hook
           47     def load_wallet(self, wallet, window):
           48         if not isinstance(wallet, self.wallet_class):
           49             return
           50         self.start_request_thread(wallet)
           51 
           52     def go_online_dialog(self, wizard):
           53         # we skip this step on android
           54         wizard.run('accept_terms_of_use')
           55 
           56     def prompt_user_for_otp(self, wallet, tx, on_success, on_failure):
           57         from ...gui.kivy.uix.dialogs.label_dialog import LabelDialog
           58         msg = _('Please enter your Google Authenticator code')
           59         d = LabelDialog(msg, '', lambda otp: self.on_otp(wallet, tx, otp, on_success, on_failure))
           60         d.open()
           61 
           62     def on_otp(self, wallet, tx, otp, on_success, on_failure):
           63         try:
           64             wallet.on_otp(tx, otp)
           65         except TrustedCoinException as e:
           66             if e.status_code == 400:  # invalid OTP
           67                 Clock.schedule_once(lambda dt: on_failure(_('Invalid one-time password.')))
           68             else:
           69                 Clock.schedule_once(lambda dt, bound_e=e: on_failure(_('Error') + ':\n' + str(bound_e)))
           70         except Exception as e:
           71             Clock.schedule_once(lambda dt, bound_e=e: on_failure(_('Error') + ':\n' + str(bound_e)))
           72         else:
           73             on_success(tx)
           74 
           75     def accept_terms_of_use(self, wizard):
           76         def handle_error(msg, e):
           77             wizard.show_error(msg + ':\n' + repr(e))
           78             wizard.terminate(aborted=True)
           79         try:
           80             tos = server.get_terms_of_service()
           81         except ErrorConnectingServer as e:
           82             Clock.schedule_once(lambda dt, bound_e=e: handle_error(_('Error connecting to server'), bound_e))
           83         except Exception as e:
           84             Clock.schedule_once(lambda dt, bound_e=e: handle_error(_('Error'), bound_e))
           85         else:
           86             f = lambda x: self.read_email(wizard)
           87             wizard.tos_dialog(tos=tos, run_next=f)
           88 
           89     def read_email(self, wizard):
           90         f = lambda x: self.create_remote_key(x, wizard)
           91         wizard.email_dialog(run_next=f)
           92 
           93     def request_otp_dialog(self, wizard, short_id, otp_secret, xpub3):
           94         f = lambda otp, reset: self.check_otp(wizard, short_id, otp_secret, xpub3, otp, reset)
           95         wizard.otp_dialog(otp_secret=otp_secret, run_next=f)
           96 
           97     @hook
           98     def abort_send(self, window):
           99         wallet = window.wallet
          100         if not isinstance(wallet, self.wallet_class):
          101             return
          102         if wallet.can_sign_without_server():
          103             return
          104         if wallet.billing_info is None:
          105             self.start_request_thread(wallet)
          106             Clock.schedule_once(
          107                 lambda dt: window.show_error(_('Requesting account info from TrustedCoin server...') + '\n' +
          108                                              _('Please try again.')))
          109             return True
          110         return False