def __init__(self, exchanger): QWidget.__init__(self) self.exchanger = exchanger self.setWindowTitle('Electrum - ' + _('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 __init__(self, win): QWidget.__init__(self) self.win = win self.setWindowTitle('Electrum-FTC - '+_('Payment Request')) self.setMinimumSize(800, 250) self.address = '' self.label = '' self.amount = 0 self.setFocusPolicy(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 show_tx_qrcode(self, data, title): if not data: return d = QDialog(self.gui) d.setModal(1) d.setWindowTitle(title) d.setMinimumSize(250, 525) vbox = QVBoxLayout() qrw = QRCodeWidget(data) vbox.addWidget(qrw, 0) hbox = QHBoxLayout() hbox.addStretch(1) def print_qr(self): filename = "qrcode.bmp" electrum_gui.bmp.save_qrcode(qrw.qr, filename) QMessageBox.information( None, _('Message'), _("QR code saved to file") + " " + filename, _('OK')) 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, 1) d.setLayout(vbox) d.exec_()
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 account_detail(self, k, vbox): print "detail for %s" % (k) account = self.wallet.accounts[k] account_dump = account.dump() xpub = cryptocorp.SerializeExtendedPublicKey( 2, "00000000".decode('hex'), 0, account_dump['c'].decode('hex'), account_dump['cK'].decode('hex')) vbox.addWidget(QLabel(_("Extended Public Key:"))) xpub_line = QLabel(xpub) xpub_line.setTextInteractionFlags(Qt.TextSelectableByMouse) vbox.addWidget(xpub_line) qrw = QRCodeWidget(xpub) vbox.addWidget(qrw)
def request_otp_dialog(self, window, _id, otp_secret): vbox = QVBoxLayout() if otp_secret is not None: uri = "otpauth://totp/%s?secret=%s" % ('trustedcoin.com', otp_secret) l = QLabel( "Please scan the following QR code in Google Authenticator. You may as well use the following key: %s" % otp_secret) l.setWordWrap(True) vbox.addWidget(l) qrw = QRCodeWidget(uri) vbox.addWidget(qrw, 1) msg = _('Then, enter your Google Authenticator code:') else: label = QLabel( "This wallet is already registered with Trustedcoin. " "To finalize wallet creation, please enter your Google Authenticator Code. " ) label.setWordWrap(1) vbox.addWidget(label) msg = _('Google Authenticator code:') hbox = QHBoxLayout() hbox.addWidget(WWLabel(msg)) pw = AmountEdit(None, is_int=True) pw.setFocus(True) pw.setMaximumWidth(50) hbox.addWidget(pw) vbox.addLayout(hbox) cb_lost = QCheckBox(_("I have lost my Google Authenticator account")) cb_lost.setToolTip( _("Check this box to request a new secret. You will need to retype your seed." )) vbox.addWidget(cb_lost) cb_lost.setVisible(otp_secret is None) def set_enabled(): b = True if cb_lost.isChecked() else len(pw.text()) == 6 window.next_button.setEnabled(b) pw.textChanged.connect(set_enabled) cb_lost.toggled.connect(set_enabled) window.exec_layout(vbox, next_enabled=False, raise_on_cancel=False) return pw.get_amount(), cb_lost.isChecked()
def setup_google_auth(self, window, _id, otp_secret): vbox = QVBoxLayout() if otp_secret is not None: uri = "otpauth://totp/%s?secret=%s" % ('trustedcoin.com', otp_secret) l = QLabel( "Please scan the following QR code in Google Authenticator. You may as well use the following key: %s" % otp_secret) l.setWordWrap(True) vbox.addWidget(l) qrw = QRCodeWidget(uri) vbox.addWidget(qrw, 1) msg = _('Then, enter your Google Authenticator code:') else: label = QLabel( "This wallet is already registered, but it was never authenticated. To finalize your registration, please enter your Google Authenticator Code. If you do not have this code, delete the wallet file and start a new registration" ) label.setWordWrap(1) vbox.addWidget(label) msg = _('Google Authenticator code:') hbox = QHBoxLayout() hbox.addWidget(WWLabel(msg)) pw = AmountEdit(None, is_int=True) pw.setFocus(True) pw.setMaximumWidth(50) hbox.addWidget(pw) vbox.addLayout(hbox) def set_enabled(): window.next_button.setEnabled(len(pw.text()) == 6) pw.textChanged.connect(set_enabled) while True: if not window.set_main_layout( vbox, next_enabled=False, raise_on_cancel=False): return False otp = pw.get_amount() try: server.auth(_id, otp) return True except: window.show_message(_('Incorrect password')) pw.setText('')
def setup_google_auth(self, window, _id, otp_secret): vbox = QVBoxLayout() window.set_layout(vbox) if otp_secret is not None: uri = "otpauth://totp/%s?secret=%s" % ('trustedcoin.com', otp_secret) vbox.addWidget( QLabel("Please scan this QR code in Google Authenticator.")) qrw = QRCodeWidget(uri) vbox.addWidget(qrw, 1) msg = _('Then, enter your Google Authenticator code:') else: label = QLabel( "This wallet is already registered, but it was never authenticated. To finalize your registration, please enter your Google Authenticator Code. If you do not have this code, delete the wallet file and start a new registration" ) label.setWordWrap(1) vbox.addWidget(label) msg = _('Google Authenticator code:') hbox = QHBoxLayout() hbox.addWidget(QLabel(msg)) pw = AmountEdit(None, is_int=True) pw.setFocus(True) hbox.addWidget(pw) hbox.addStretch(1) vbox.addLayout(hbox) b = OkButton(window, _('Next')) b.setEnabled(False) vbox.addLayout(Buttons(CancelButton(window), b)) pw.textChanged.connect(lambda: b.setEnabled(len(pw.text()) == 6)) while True: if not window.exec_(): return False otp = pw.get_amount() try: server.auth(_id, otp) return True except: QMessageBox.information(self.window, _('Message'), _('Incorrect password'), _('OK')) pw.setText('')
def echo_dialog(self): self.d = QDialog(None) self.d.setModal(1) self.d.setWindowTitle(_("Digital Bitbox 2FA Verification")) self.d.setWindowFlags(self.d.windowFlags() | Qt.WindowStaysOnTopHint) text0 = QLabel(_("2FA Verification QR Code:")) text1 = QLabel(_("To continue: press and hold the touch button.\nTo cancel: Push the touch button briefly.")) qrw = QRCodeWidget(self.data) hbox = QHBoxLayout() hbox.addStretch(1) vbox = QVBoxLayout(self.d) vbox.addWidget(text0) vbox.addWidget(qrw, 1) vbox.addWidget(text1) vbox.addLayout(hbox) self.d.setLayout(vbox) self.d.show() self.waiting = True self.done.set()
def __init__(self, handler, data): '''Ask user for 2nd factor authentication. Support text, security card and paired mobile methods. Use last method from settings, but support new pairing and downgrade. ''' QDialog.__init__(self, handler.top_level_window()) self.handler = handler self.txdata = data self.idxs = self.txdata[ 'keycardData'] if self.txdata['confirmationType'] > 1 else '' self.setMinimumWidth(600) self.setWindowTitle(_("Ledger Wallet Authentication")) self.cfg = copy.deepcopy(self.handler.win.wallet.get_keystore().cfg) self.dongle = self.handler.win.wallet.get_keystore().get_client( ).dongle self.ws = None self.pin = '' self.devmode = self.getDevice2FAMode() if self.devmode == 0x11 or self.txdata['confirmationType'] == 1: self.cfg['mode'] = 0 vbox = QVBoxLayout() self.setLayout(vbox) def on_change_mode(idx): if idx < 2 and self.ws: self.ws.stop() self.ws = None self.cfg[ 'mode'] = 0 if self.devmode == 0x11 else idx if idx > 0 else 1 if self.cfg['mode'] > 1 and self.cfg['pair'] and not self.ws: self.req_validation() if self.cfg['mode'] > 0: self.handler.win.wallet.get_keystore().cfg = self.cfg self.handler.win.wallet.save_keystore() self.update_dlg() def add_pairing(): self.do_pairing() def return_pin(): self.pin = self.pintxt.text( ) if self.txdata['confirmationType'] == 1 else self.cardtxt.text() if self.cfg['mode'] == 1: self.pin = ''.join(chr(int(str(i), 16)) for i in self.pin) self.accept() self.modebox = QWidget() modelayout = QHBoxLayout() self.modebox.setLayout(modelayout) modelayout.addWidget(QLabel(_("Method:"))) self.modes = QComboBox() modelayout.addWidget(self.modes, 2) self.addPair = QPushButton(_("Pair")) self.addPair.setMaximumWidth(60) modelayout.addWidget(self.addPair) modelayout.addStretch(1) self.modebox.setMaximumHeight(50) vbox.addWidget(self.modebox) self.populate_modes() self.modes.currentIndexChanged.connect(on_change_mode) self.addPair.clicked.connect(add_pairing) self.helpmsg = QTextEdit() self.helpmsg.setStyleSheet( "QTextEdit { background-color: lightgray; }") self.helpmsg.setReadOnly(True) vbox.addWidget(self.helpmsg) self.pinbox = QWidget() pinlayout = QHBoxLayout() self.pinbox.setLayout(pinlayout) self.pintxt = QLineEdit() self.pintxt.setEchoMode(2) self.pintxt.setMaxLength(4) self.pintxt.returnPressed.connect(return_pin) pinlayout.addWidget(QLabel(_("Enter PIN:"))) pinlayout.addWidget(self.pintxt) pinlayout.addWidget(QLabel(_("NOT DEVICE PIN - see above"))) pinlayout.addStretch(1) self.pinbox.setVisible(self.cfg['mode'] == 0) vbox.addWidget(self.pinbox) self.cardbox = QWidget() card = QVBoxLayout() self.cardbox.setLayout(card) self.addrtext = QTextEdit() self.addrtext.setStyleSheet( "QTextEdit { color:blue; background-color:lightgray; padding:15px 10px; border:none; font-size:20pt; }" ) self.addrtext.setReadOnly(True) self.addrtext.setMaximumHeight(120) card.addWidget(self.addrtext) def pin_changed(s): if len(s) < len(self.idxs): i = self.idxs[len(s)] addr = self.txdata['address'] addr = addr[:i] + '<u><b>' + addr[i:i + 1] + '</u></b>' + addr[i + 1:] self.addrtext.setHtml(str(addr)) else: self.addrtext.setHtml(_("Press Enter")) pin_changed('') cardpin = QHBoxLayout() cardpin.addWidget(QLabel(_("Enter PIN:"))) self.cardtxt = QLineEdit() self.cardtxt.setEchoMode(2) self.cardtxt.setMaxLength(len(self.idxs)) self.cardtxt.textChanged.connect(pin_changed) self.cardtxt.returnPressed.connect(return_pin) cardpin.addWidget(self.cardtxt) cardpin.addWidget(QLabel(_("NOT DEVICE PIN - see above"))) cardpin.addStretch(1) card.addLayout(cardpin) self.cardbox.setVisible(self.cfg['mode'] == 1) vbox.addWidget(self.cardbox) self.pairbox = QWidget() pairlayout = QVBoxLayout() self.pairbox.setLayout(pairlayout) pairhelp = QTextEdit(helpTxt[5]) pairhelp.setStyleSheet("QTextEdit { background-color: lightgray; }") pairhelp.setReadOnly(True) pairlayout.addWidget(pairhelp, 1) self.pairqr = QRCodeWidget() pairlayout.addWidget(self.pairqr, 4) self.pairbox.setVisible(False) vbox.addWidget(self.pairbox) self.update_dlg() if self.cfg['mode'] > 1 and not self.ws: self.req_validation()
def new_account_dialog(self): dialog = QDialog(self.window) dialog.setModal(1) dialog.setWindowTitle(_("New Account")) vbox = QVBoxLayout() vbox.addWidget(QLabel(_('Account name') + ':')) e = QLineEdit() vbox.addWidget(e) msg = _("Please fill in the fields below for Oracle accounts:") l = QLabel(msg) l.setWordWrap(True) vbox.addWidget(l) vbox.addWidget(QLabel(_('Email (optional)') + ':')) email = QLineEdit() vbox.addWidget(email) vbox.addWidget(QLabel(_('Phone (optional)') + ':')) phone = QLineEdit() vbox.addWidget(phone) vbox.addWidget(QLabel(_('Velocity limit') + ':')) velocity_1 = QLineEdit("0.002") vbox.addWidget(velocity_1) vbox.addWidget(QLabel(_('Delay') + ':')) delay_2 = QLineEdit("60") vbox.addWidget(delay_2) hbox = QHBoxLayout() vbox1 = QVBoxLayout() hbox.addLayout(vbox) hbox.addLayout(vbox1) vbox1.addWidget(QLabel(_('Backup Key (xpub)') + ':')) #backup = QLineEdit() backup = QLineEdit( 'xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH' ) vbox1.addWidget(backup) def fill_from_qr(button): res = self.scanner.scan_qr() if res is None: return if not res.startswith("xpub"): QMessageBox.warning(self.gui.main_window, _('Error'), _('Not an extended public key'), _('OK')) backup.setText(res) if self.scanner and self.scanner.is_enabled(): b = QPushButton(_("Scan QR code")) b.clicked.connect(fill_from_qr) vbox1.addWidget(b) vbox1.addWidget(QLabel(_('OTP (optional)') + ':')) otp = QLineEdit() vbox1.addWidget(otp) qrw = QRCodeWidget() vbox1.addWidget(qrw) otp_secret = b32encode( ("%030x" % (SystemRandom().getrandbits(120))).decode('hex')) print otp_secret def check_name(): if (str(e.text()) != ""): qrw.set_addr("otpauth://totp/Digital-Oracle-%s?secret=%s" % (e.text(), otp_secret)) else: qrw.set_addr("") qrw.update_qr() e.textChanged.connect(check_name) check_name() vbox.addLayout(ok_cancel_buttons(dialog)) dialog.setLayout(hbox) r = dialog.exec_() if not r: return name = str(e.text()) if not name: return email_text = str(email.text()) phone_text = str(phone.text()) velocity_1_text = str(velocity_1.text()) delay_2_text = str(delay_2.text()) backup_text = str(backup.text()) otp_text = str(otp.text()) parameters = { 'levels': [ { 'value': float(velocity_1_text), 'asset': 'BTC', 'period': 60, }, { 'delay': (int(delay_2_text) if delay_2_text != "" else None) }, ], } if phone_text and phone_text != "": parameters['levels'][1]['calls'] = ['phone', 'email'] # TODO if otp_text and otp_text != "": parameters['authenticator'] = { 'firstValue': otp_text, 'secret': otp_secret, 'type': 'totp' } parameters['levels'][1]['verifications'] = ['otp'] pii = {"phone": phone_text, "email": email_text} if backup_text: i = self.wallet.next_oracle_account() my_key = self.wallet.oracle_account(i)[0] oracle_url = cryptocorp.make_keychain(self.base_url(), my_key, backup_text, parameters, pii) self.wallet.create_oracle_account(oracle_url, backup_text, i, name) else: self.wallet.create_pending_account('1', name) self.window.update_receive_tab() self.window.tabs.setCurrentIndex(2)