def ignore_all_version(self): self.setText("") self.config.set_key("last_seen_version", "9.9.9", True) QMessageBox.information( self, _("Preference saved"), _("No more notifications about version updates will be shown.")) self.dialog.done(0)
def mouseReleaseEvent(self, event): dialog = QDialog(self) dialog.setWindowTitle(_('Electrum update')) dialog.setModal(1) main_layout = QGridLayout() main_layout.addWidget( QLabel( _("A new version of Electrum is available:") + " " + self.latest_version), 0, 0, 1, 3) ignore_version = QPushButton(_("Ignore this version")) ignore_version.clicked.connect(self.ignore_this_version) ignore_all_versions = QPushButton(_("Ignore all versions")) ignore_all_versions.clicked.connect(self.ignore_all_version) open_website = QPushButton(_("Goto download page")) open_website.clicked.connect(self.open_website) main_layout.addWidget(ignore_version, 1, 0) main_layout.addWidget(ignore_all_versions, 1, 1) main_layout.addWidget(open_website, 1, 2) dialog.setLayout(main_layout) self.dialog = dialog if not dialog.exec_(): return
def ignore_this_version(self): self.setText("") self.config.set_key("last_seen_version", self.latest_version, True) QMessageBox.information( self, _("Preference saved"), _("Notifications about this update will not be shown again.")) self.dialog.done(0)
def setup_google_auth(self, window, _id, otp_secret): uri = "otpauth://totp/%s?secret=%s" % ('trustedcoin.com', otp_secret) vbox = QVBoxLayout() window.set_layout(vbox) vbox.addWidget( QLabel("Please scan this QR code in Google Authenticator.")) qrw = QRCodeWidget(uri) vbox.addWidget(qrw, 1) #vbox.addWidget(QLabel(data), 0, Qt.AlignHCenter) hbox = QHBoxLayout() msg = _('Then, enter your Google Authenticator code:') hbox.addWidget(QLabel(msg)) pw = AmountEdit(None, is_int=True) pw.setFocus(True) hbox.addWidget(pw) hbox.addStretch(1) vbox.addLayout(hbox) hbox, b = ok_cancel_buttons2(window, _('Next')) b.setEnabled(False) vbox.addLayout(hbox) pw.textChanged.connect(lambda: b.setEnabled(len(pw.text()) == 6)) window.exec_() otp = pw.get_amount() try: server.auth(_id, otp) except: self.window.show_message('Incorrect password, aborting') return return True
def qr_input(self): from electrum_peseta import qrscanner try: data = qrscanner.scan_qr(self.win.config) except BaseException, e: QMessageBox.warning(self, _('Error'), _(e), _('OK')) return ""
def __init__(self, transaction_id, parent): super(TransactionWindow, self).__init__() self.tx_id = str(transaction_id) self.parent = parent self.setModal(True) self.resize(200, 100) self.setWindowTitle(_("Transaction successfully sent")) self.layout = QGridLayout(self) history_label = "%s\n%s" % ( _("Your transaction has been sent."), _("Please enter a label for this transaction for future reference." )) self.layout.addWidget(QLabel(history_label)) self.label_edit = QLineEdit() self.label_edit.setPlaceholderText(_("Transaction label")) self.label_edit.setObjectName("label_input") self.label_edit.setAttribute(Qt.WA_MacShowFocusRect, 0) self.label_edit.setFocusPolicy(Qt.ClickFocus) self.layout.addWidget(self.label_edit) self.save_button = QPushButton(_("Save")) self.layout.addWidget(self.save_button) self.save_button.clicked.connect(self.set_label) self.exec_()
def add_io(self, vbox): if self.tx.locktime > 0: vbox.addWidget(QLabel("LockTime: %d\n" % self.tx.locktime)) vbox.addWidget(QLabel(_("Inputs"))) def format_input(x): if x.get('is_coinbase'): return 'coinbase' else: _hash = x.get('prevout_hash') return _hash[0:8] + '...' + _hash[-8:] + ":%d" % x.get( 'prevout_n') + u'\t' + "%s" % x.get('address') lines = map(format_input, self.tx.inputs) i_text = QTextEdit() i_text.setFont(QFont(MONOSPACE_FONT)) i_text.setText('\n'.join(lines)) i_text.setReadOnly(True) i_text.setMaximumHeight(100) vbox.addWidget(i_text) vbox.addWidget(QLabel(_("Outputs"))) lines = map( lambda x: x[0] + u'\t\t' + self.parent.format_amount(x[1]) if x[1] else x[0], self.tx.get_outputs()) o_text = QTextEdit() o_text.setFont(QFont(MONOSPACE_FONT)) o_text.setText('\n'.join(lines)) o_text.setReadOnly(True) o_text.setMaximumHeight(100) vbox.addWidget(o_text)
def build_tray_menu(self): m = QMenu() m.addAction(_("Show/Hide"), self.show_or_hide) m.addAction(_("Dark/Light"), self.toggle_tray_icon) m.addSeparator() m.addAction(_("Exit Electrum-PESETA"), self.close) self.tray.setContextMenu(m)
def settings_dialog(self): def check_for_api_key(api_key): if api_key and len(api_key) > 12: self.config.set_key("plugin_label_api_key", str(self.auth_token_edit.text())) self.upload.setEnabled(True) self.download.setEnabled(True) self.accept.setEnabled(True) else: self.upload.setEnabled(False) self.download.setEnabled(False) self.accept.setEnabled(False) d = QDialog() layout = QGridLayout(d) layout.addWidget(QLabel("API Key: "), 0, 0) self.auth_token_edit = QLineEdit(self.auth_token()) self.auth_token_edit.textChanged.connect(check_for_api_key) layout.addWidget(QLabel("Label sync options: "), 2, 0) layout.addWidget(self.auth_token_edit, 0, 1, 1, 2) decrypt_key_text = QLineEdit(self.encode_password) decrypt_key_text.setReadOnly(True) layout.addWidget(decrypt_key_text, 1, 1) layout.addWidget(QLabel("Decryption key: "), 1, 0) layout.addWidget( HelpButton( "This key can be used on the LabElectrum website to decrypt your data in case you want to review it online." ), 1, 2) self.upload = QPushButton("Force upload") self.upload.clicked.connect(self.full_push) layout.addWidget(self.upload, 2, 1) self.download = QPushButton("Force download") self.download.clicked.connect(self.full_pull) layout.addWidget(self.download, 2, 2) c = QPushButton(_("Cancel")) c.clicked.connect(d.reject) self.accept = QPushButton(_("Done")) self.accept.clicked.connect(d.accept) layout.addWidget(c, 3, 1) layout.addWidget(self.accept, 3, 2) check_for_api_key(self.auth_token()) self.window.labelsChanged.connect(self.done_processing) if d.exec_(): return True else: return False
def save(self): name = 'signed_%s.txn' % ( self.tx.hash()[0:8]) if self.tx.is_complete() else 'unsigned.txn' fileName = self.parent.getSaveFileName( _("Select where to save your signed transaction"), name, "*.txn") if fileName: with open(fileName, "w+") as f: f.write(json.dumps(self.tx.as_dict(), indent=4) + '\n') self.show_message(_("Transaction saved successfully"))
def callback_PassphraseRequest(self, msg): confirmed, p, passphrase = self.password_dialog() if not confirmed: QMessageBox.critical(None, _('Error'), _("Password request canceled"), _('OK')) return proto.Cancel() if passphrase is None: passphrase = '' # Even blank string is valid Trezor passphrase return proto.PassphraseAck(passphrase=passphrase)
def verify_seed(self, seed, sid, func=None): r = self.enter_seed_dialog(MSG_VERIFY_SEED, sid, func) if not r: return if prepare_seed(r) != prepare_seed(seed): QMessageBox.warning(None, _('Error'), _('Incorrect seed'), _('OK')) return False else: return True
def give_error(self, message, clear_client=False): if not self.signing: QMessageBox.warning(QDialog(), _('Warning'), _(message), _('OK')) else: self.signing = False if clear_client and self.client is not None: self.client.bad = True self.device_checked = False raise Exception(message)
def installwizard_restore(self, wizard, storage): if storage.get('wallet_type') != 'trezor': return wallet = TrezorWallet(storage) try: wallet.create_main_account(None) except BaseException as e: QMessageBox.information(None, _('Error'), str(e), _('OK')) return return wallet
def __init__(self, parent, seed, imported_keys): QDialog.__init__(self, parent) self.setModal(1) self.setMinimumWidth(400) self.setWindowTitle('Electrum-PESETA' + ' - ' + _('Seed')) vbox = show_seed_box(seed) if imported_keys: vbox.addWidget(QLabel("<b>"+_("WARNING")+":</b> " + _("Your wallet contains imported keys. These keys cannot be recovered from seed.") + "</b><p>")) vbox.addLayout(close_button(self)) self.setLayout(vbox)
def ok_cancel_buttons(dialog): row_layout = QHBoxLayout() row_layout.addStretch(1) ok_button = QPushButton(_("OK")) row_layout.addWidget(ok_button) ok_button.clicked.connect(dialog.accept) cancel_button = QPushButton(_("Cancel")) row_layout.addWidget(cancel_button) cancel_button.clicked.connect(dialog.reject) return row_layout
def __init__(self, owner=None): self.owner = owner self.editing = False QTreeWidget.__init__(self, owner) self.setColumnCount(3) self.setHeaderLabels([_("Address"), _("Label"), _("Used")]) self.setIndentation(0) self.hide_used = True self.setColumnHidden(2, True)
def append(self, address, amount, date): if address is None: address = _("Unknown") if amount is None: amount = _("Unknown") if date is None: date = _("Unknown") item = QTreeWidgetItem([amount, address, date]) if float(amount) < 0: item.setForeground(0, QBrush(QColor("#BC1E1E"))) self.insertTopLevelItem(0, item)
def ok_cancel_buttons2(dialog, ok_label=None, cancel_label=None): hbox = QHBoxLayout() hbox.addStretch(1) b = QPushButton(cancel_label or _('Cancel')) hbox.addWidget(b) b.clicked.connect(dialog.reject) b = QPushButton(ok_label or _("OK")) hbox.addWidget(b) b.clicked.connect(dialog.accept) b.setDefault(True) return hbox, b
def export_history_dialog(self, d, hbox): self.wallet = d.wallet history = self.wallet.get_tx_history() if len(history) > 0: b = QPushButton(_("Preview plot")) hbox.addWidget(b) b.clicked.connect(lambda: self.do_plot(self.wallet)) else: b = QPushButton(_("No history to plot")) hbox.addWidget(b)
def close(self): self.d.accept() if self.error: QMessageBox.warning(self.parent, _('Error'), self.error, _('OK')) else: if self.on_success: if type(self.result) is not tuple: self.result = (self.result, ) self.on_success(*self.result) if self.on_complete: self.on_complete()
def before_send(self): ''' Change URL to address before making a send. IMPORTANT: return False to continue execution of the send return True to stop execution of the send ''' if self.win.payto_e.is_multiline( ): # only supports single line entries atm return False url = str(self.win.payto_e.toPlainText()) url = url.replace( '@', '.') # support email-style addresses, per the OA standard if ('.' in url) and (not '<' in url) and (not ' ' in url): if not OA_READY: # handle a failed DNSPython load QMessageBox.warning( self.win, _('Error'), 'Could not load DNSPython libraries, please ensure they are available and/or Electrum has been built correctly', _('OK')) return False else: return False data = self.resolve(url) if not data: return True (address, name) = data self.win.payto_e.setText(url + ' <' + address + '>') if not self.validate_dnssec(url): msgBox = QMessageBox() msgBox.setText( _('WARNING: the address ' + address + ' could not be validated via an additional security check, DNSSEC, and thus may not be correct.' )) msgBox.setInformativeText(_('Do you wish to continue?')) msgBox.setStandardButtons(QMessageBox.Cancel | QMessageBox.Ok) msgBox.setDefaultButton(QMessageBox.Cancel) reply = msgBox.exec_() if reply != QMessageBox.Ok: return True if self.config.get('openalias_autoadd') == 'checked': self.win.wallet.add_contact(address, name) return False
def create_extended_seed(self, wallet, window): seed = wallet.make_seed() if not window.show_seed(seed, None): return if not window.verify_seed(seed, None, self.seed_func): return password = window.password_dialog() wallet.storage.put('seed_version', wallet.seed_version, True) wallet.storage.put('use_encryption', password is not None, True) words = seed.split() n = len(words) / 2 wallet.add_cosigner_seed(' '.join(words[0:n]), 'x1/', password) wallet.add_cosigner_xpub(' '.join(words[n:]), 'x2/') msg = [ _('Your wallet file is:') + " %s" % os.path.abspath(wallet.storage.path), _('You need to be online in order to complete the creation of your wallet.' ), _('If you generated your seed on an offline computer, click on "%s" to close this window, move your wallet file to an online computer and reopen it with Electrum.' ) % _('Close'), _('If you are online, click on "%s" to continue.') % _('Next') ] return window.question('\n\n'.join(msg), no_label=_('Close'), yes_label=_('Next'))
def question(self, msg, yes_label=_('OK'), no_label=_('Cancel'), icon=None): vbox = QVBoxLayout() self.set_layout(vbox) if icon: logo = QLabel() logo.setPixmap(icon) vbox.addWidget(logo) label = QLabel(msg) label.setWordWrap(True) vbox.addWidget(label) vbox.addStretch(1) vbox.addLayout(ok_cancel_buttons(self, yes_label, no_label)) if not self.exec_(): return None return True
def __init__(self, data, parent=None, title="", show_text=False): QDialog.__init__(self, parent) d = self d.setWindowTitle(title) vbox = QVBoxLayout() qrw = QRCodeWidget(data) vbox.addWidget(qrw, 1) if show_text: text = QTextEdit() text.setText(data) text.setReadOnly(True) vbox.addWidget(text) hbox = QHBoxLayout() hbox.addStretch(1) config = electrum.get_config() if config: filename = os.path.join(config.path, "qrcode.bmp") def print_qr(): bmp.save_qrcode(qrw.qr, filename) QMessageBox.information( None, _('Message'), _("QR code saved to file") + " " + filename, _('OK')) def copy_to_clipboard(): bmp.save_qrcode(qrw.qr, filename) QApplication.clipboard().setImage(QImage(filename)) QMessageBox.information(None, _('Message'), _("QR code saved to clipboard"), _('OK')) b = QPushButton(_("Copy")) hbox.addWidget(b) b.clicked.connect(copy_to_clipboard) b = QPushButton(_("Save")) hbox.addWidget(b) b.clicked.connect(print_qr) b = QPushButton(_("Close")) hbox.addWidget(b) b.clicked.connect(d.accept) b.setDefault(True) vbox.addLayout(hbox) d.setLayout(vbox)
def __init__(self, win): QWidget.__init__(self) self.win = win self.setWindowTitle('Electrum-PESETA - ' + _('Invoice')) self.setMinimumSize(800, 250) self.address = '' self.label = '' self.amount = 0 self.setFocusPolicy(QtCore.Qt.NoFocus) main_box = QHBoxLayout() self.qrw = QRCodeWidget() main_box.addWidget(self.qrw, 1) vbox = QVBoxLayout() main_box.addLayout(vbox) self.address_label = QLabel("") #self.address_label.setFont(QFont(MONOSPACE_FONT)) vbox.addWidget(self.address_label) self.label_label = QLabel("") vbox.addWidget(self.label_label) self.amount_label = QLabel("") vbox.addWidget(self.amount_label) vbox.addStretch(1) self.setLayout(main_box)
def multi_seed_dialog(self, n): vbox = QVBoxLayout() vbox1, seed_e1 = seed_dialog.enter_seed_box(MSG_ENTER_SEED_OR_MPK, self, 'hot') vbox.addLayout(vbox1) entries = [seed_e1] for i in range(n): vbox2, seed_e2 = seed_dialog.enter_seed_box( MSG_ENTER_SEED_OR_MPK, self, 'cold') vbox.addLayout(vbox2) entries.append(seed_e2) vbox.addStretch(1) hbox, button = ok_cancel_buttons2(self, _('Next')) vbox.addLayout(hbox) button.setEnabled(False) f = lambda: button.setEnabled( map(lambda e: self.is_any(self.get_seed_text(e)), entries) == [True] * len(entries)) for e in entries: e.textChanged.connect(f) self.set_layout(vbox) if not self.exec_(): return return map(lambda e: self.get_seed_text(e), entries)
def multi_mpk_dialog(self, xpub_hot, n): vbox = QVBoxLayout() vbox0, seed_e0 = seed_dialog.enter_seed_box(MSG_SHOW_MPK, self, 'hot') vbox.addLayout(vbox0) seed_e0.setText(xpub_hot) seed_e0.setReadOnly(True) entries = [] for i in range(n): vbox2, seed_e2 = seed_dialog.enter_seed_box( MSG_ENTER_COLD_MPK, self, 'cold') vbox.addLayout(vbox2) entries.append(seed_e2) vbox.addStretch(1) hbox, button = ok_cancel_buttons2(self, _('Next')) vbox.addLayout(hbox) button.setEnabled(False) f = lambda: button.setEnabled( map(lambda e: Wallet.is_xpub(self.get_seed_text(e)), entries) == [True] * len(entries)) for e in entries: e.textChanged.connect(f) self.set_layout(vbox) if not self.exec_(): return return map(lambda e: self.get_seed_text(e), entries)
def __init__(self, config, name): BasePlugin.__init__(self, config, name) self._is_available = self._init() self._requires_settings = True self.wallet = None electrum.wallet.wallet_types.append( ('hardware', 'trezor', _("Trezor wallet"), TrezorWallet))
def on_receive(self): if self.wallet.use_encryption: password = self.win.password_dialog( 'An encrypted transaction was retrieved from cosigning pool.\nPlease enter your password to decrypt it.' ) if not password: return else: password = None if not self.win.question( _("An encrypted transaction was retrieved from cosigning pool.\nDo you want to open it now?" )): return message = self.listener.message key = self.listener.keyname xprv = self.wallet.get_master_private_key(key, password) if not xprv: return try: k = pesetacoin.deserialize_xkey(xprv)[-1].encode('hex') EC = pesetacoin.EC_KEY(k.decode('hex')) message = EC.decrypt_message(message) except Exception as e: traceback.print_exc(file=sys.stdout) self.win.show_message(str(e)) return self.listener.clear() tx = transaction.Transaction.deserialize(message) self.win.show_transaction(tx)