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.'))