electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

qt.py (2752B)


      1 from functools import partial
      2 
      3 from PyQt5.QtCore import pyqtSignal
      4 from PyQt5.QtWidgets import QInputDialog, QLabel, QVBoxLayout, QLineEdit
      5 
      6 from electrum.i18n import _
      7 from electrum.plugin import hook
      8 from electrum.wallet import Standard_Wallet
      9 from electrum.gui.qt.util import WindowModalDialog
     10 
     11 from .ledger import LedgerPlugin, Ledger_Client
     12 from ..hw_wallet.qt import QtHandlerBase, QtPluginBase
     13 from ..hw_wallet.plugin import only_hook_if_libraries_available
     14 
     15 
     16 class Plugin(LedgerPlugin, QtPluginBase):
     17     icon_unpaired = "ledger_unpaired.png"
     18     icon_paired = "ledger.png"
     19 
     20     def create_handler(self, window):
     21         return Ledger_Handler(window)
     22 
     23     @only_hook_if_libraries_available
     24     @hook
     25     def receive_menu(self, menu, addrs, wallet):
     26         if type(wallet) is not Standard_Wallet:
     27             return
     28         keystore = wallet.get_keystore()
     29         if type(keystore) == self.keystore_class and len(addrs) == 1:
     30             def show_address():
     31                 keystore.thread.add(partial(self.show_address, wallet, addrs[0]))
     32             menu.addAction(_("Show on Ledger"), show_address)
     33 
     34 class Ledger_Handler(QtHandlerBase):
     35     setup_signal = pyqtSignal()
     36     auth_signal = pyqtSignal(object, object)
     37 
     38     def __init__(self, win):
     39         super(Ledger_Handler, self).__init__(win, 'Ledger')
     40         self.setup_signal.connect(self.setup_dialog)
     41         self.auth_signal.connect(self.auth_dialog)
     42 
     43     def word_dialog(self, msg):
     44         response = QInputDialog.getText(self.top_level_window(), "Ledger Wallet Authentication", msg, QLineEdit.Password)
     45         if not response[1]:
     46             self.word = None
     47         else:
     48             self.word = str(response[0])
     49         self.done.set()
     50 
     51     def message_dialog(self, msg):
     52         self.clear_dialog()
     53         self.dialog = dialog = WindowModalDialog(self.top_level_window(), _("Ledger Status"))
     54         l = QLabel(msg)
     55         vbox = QVBoxLayout(dialog)
     56         vbox.addWidget(l)
     57         dialog.show()
     58 
     59     def auth_dialog(self, data, client: 'Ledger_Client'):
     60         try:
     61             from .auth2fa import LedgerAuthDialog
     62         except ImportError as e:
     63             self.message_dialog(repr(e))
     64             return
     65         dialog = LedgerAuthDialog(self, data, client=client)
     66         dialog.exec_()
     67         self.word = dialog.pin
     68         self.done.set()
     69 
     70     def get_auth(self, data, *, client: 'Ledger_Client'):
     71         self.done.clear()
     72         self.auth_signal.emit(data, client)
     73         self.done.wait()
     74         return self.word
     75 
     76     def get_setup(self):
     77         self.done.clear()
     78         self.setup_signal.emit()
     79         self.done.wait()
     80         return
     81 
     82     def setup_dialog(self):
     83         self.show_error(_('Initialization of Ledger HW devices is currently disabled.'))