From e1ba962fe184fbbef2c06ebadfff063e932120fb Mon Sep 17 00:00:00 2001 From: SomberNight Date: Fri, 14 Dec 2018 23:59:26 +0100 Subject: [PATCH] revealer: clean-up prev and fixes --- electrum/gui/qt/main_window.py | 1 - electrum/plugins/revealer/qt.py | 57 ++++++++++++++++++++------------- 2 files changed, 35 insertions(+), 23 deletions(-) diff --git a/electrum/gui/qt/main_window.py b/electrum/gui/qt/main_window.py index 31d67a80c..0db7fa05c 100644 --- a/electrum/gui/qt/main_window.py +++ b/electrum/gui/qt/main_window.py @@ -2014,7 +2014,6 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError): self.status_button = StatusBarButton(QIcon(":icons/status_disconnected.png"), _("Network"), lambda: self.gui_object.show_network_dialog(self)) sb.addPermanentWidget(self.status_button) run_hook('create_status_bar', sb) - run_hook('revealer_hook', sb) self.setStatusBar(sb) def update_lock_icon(self): diff --git a/electrum/plugins/revealer/qt.py b/electrum/plugins/revealer/qt.py index b846a1993..5ffca429f 100644 --- a/electrum/plugins/revealer/qt.py +++ b/electrum/plugins/revealer/qt.py @@ -21,7 +21,7 @@ from PyQt5.QtPrintSupport import QPrinter from electrum.plugin import BasePlugin, hook from electrum.i18n import _ -from electrum.util import to_bytes, make_dir +from electrum.util import to_bytes, make_dir, InvalidPassword, UserCancelled from electrum.gui.qt.util import * from electrum.gui.qt.qrtextedit import ScanQRTextEdit from electrum.gui.qt.main_window import StatusBarButton @@ -30,6 +30,8 @@ from .hmac_drbg import DRBG class Plugin(BasePlugin): + MAX_PLAINTEXT_LEN = 189 # chars + def __init__(self, parent, config, name): BasePlugin.__init__(self, parent, config, name) self.base_dir = config.electrum_path()+'/revealer/' @@ -51,9 +53,13 @@ class Plugin(BasePlugin): self.rawnoise = False make_dir(self.base_dir) + self.extension = False + @hook - def revealer_hook(self, parent): - parent.addPermanentWidget(StatusBarButton(QIcon(':icons/revealer.png'), "Revealer"+_(" secret backup utility"), partial(self.setup_dialog, parent))) + def create_status_bar(self, parent): + b = StatusBarButton(QIcon(':icons/revealer.png'), "Revealer "+_("secret backup utility"), + partial(self.setup_dialog, parent)) + parent.addPermanentWidget(b) def requires_settings(self): return True @@ -72,18 +78,13 @@ class Plugin(BasePlugin): if self.wallet.has_keystore_encryption(): password = self.password_dialog(parent=self.d.parent()) if not password: - return + raise UserCancelled() keystore = self.wallet.get_keystore() - try: - self.cseed = keystore.get_seed(password) - if keystore.get_passphrase(password): - self.extension = True - else: - self.extension = False - except Exception: - traceback.print_exc(file=sys.stdout) + if not keystore or not keystore.has_seed(): return + self.extension = bool(keystore.get_passphrase(password)) + return keystore.get_seed(password) def setup_dialog(self, window): self.wallet = window.parent().wallet @@ -191,7 +192,8 @@ class Plugin(BasePlugin): dialog.close() def ext_warning(self, dialog): - dialog.show_message(''.join(["",_("Warning: "), "", _("your seed extension will ")+""+_("not")+""+_(" be included in the encrypted backup.")])) + dialog.show_message(''.join(["",_("Warning"), ": ", + _("your seed extension will not be included in the encrypted backup.")])) dialog.close() def bdone(self, dialog): @@ -202,11 +204,11 @@ class Plugin(BasePlugin): def customtxt_limits(self): txt = self.text.text() self.max_chars.setVisible(False) - self.char_count.setText("("+str(len(txt))+"/189)") + self.char_count.setText(f"({len(txt)}/{self.MAX_PLAINTEXT_LEN})") if len(txt)>0: self.ctext.setEnabled(True) - if len(txt) > 189: - self.text.setPlainText(self.text.toPlainText()[:189]) + if len(txt) > self.MAX_PLAINTEXT_LEN: + self.text.setPlainText(txt[:self.MAX_PLAINTEXT_LEN]) self.max_chars.setVisible(True) def t(self): @@ -236,12 +238,12 @@ class Plugin(BasePlugin): grid = QGridLayout() self.vbox.addLayout(grid) - cprint = QPushButton(_("Encrypt ")+self.wallet_name+_("'s seed")) + cprint = QPushButton(_("Encrypt {}'s seed").format(self.wallet_name)) cprint.setMaximumWidth(250) cprint.clicked.connect(partial(self.seed_img, True)) self.vbox.addWidget(cprint) self.vbox.addSpacing(1) - self.vbox.addWidget(WWLabel(""+_("OR ")+""+_("type a custom alphanumerical secret below:"))) + self.vbox.addWidget(WWLabel(""+_("OR")+" "+_("type a custom alphanumerical secret below:"))) self.text = ScanQRTextEdit() self.text.setTabChangesFocus(True) self.text.setMaximumHeight(70) @@ -250,7 +252,9 @@ class Plugin(BasePlugin): self.char_count = WWLabel("") self.char_count.setAlignment(Qt.AlignRight) self.vbox.addWidget(self.char_count) - self.max_chars = WWLabel("" + _("This version supports a maximum of 189 characters.")+"") + self.max_chars = WWLabel("" + + _("This version supports a maximum of {} characters.").format(self.MAX_PLAINTEXT_LEN) + +"") self.vbox.addWidget(self.max_chars) self.max_chars.setVisible(False) self.ctext = QPushButton(_("Encrypt custom secret")) @@ -269,8 +273,17 @@ class Plugin(BasePlugin): def seed_img(self, is_seed = True): if is_seed: - self.get_seed() - txt = self.cseed.upper() + try: + cseed = self.get_seed() + except UserCancelled: + return + except InvalidPassword as e: + self.d.show_error(str(e)) + return + if not cseed: + self.d.show_message(_("This wallet has no seed")) + return + txt = cseed.upper() else: txt = self.txt.upper() @@ -335,7 +348,7 @@ class Plugin(BasePlugin): entropy = binascii.unhexlify(str(format(self.noise_seed, '032x'))) code_id = binascii.unhexlify(self.version + self.code_id) - print (self.hex_noise) + drbg = DRBG(entropy + code_id) noise_array=bin(int.from_bytes(drbg.generate(1929), 'big'))[2:]