Browse Source

Handle None enter_seed_callback() response

master
Kristaps Kaupe 2 years ago
parent
commit
8eb55be6e0
No known key found for this signature in database
GPG Key ID: 33E472FE870C7E5D
  1. 14
      scripts/joinmarket-qt.py
  2. 35
      src/jmclient/wallet_utils.py

14
scripts/joinmarket-qt.py

@ -1,5 +1,4 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
from typing import Optional
''' '''
Joinmarket GUI using PyQt for doing coinjoins. Joinmarket GUI using PyQt for doing coinjoins.
@ -23,6 +22,7 @@ Some widgets copied and modified from https://github.com/spesmilo/electrum
import sys, datetime, os, logging import sys, datetime, os, logging
import platform, json, threading, time import platform, json, threading, time
from optparse import OptionParser from optparse import OptionParser
from typing import Optional, Tuple
from PySide2 import QtCore from PySide2 import QtCore
@ -1921,7 +1921,7 @@ class JMMainWindow(QMainWindow):
"Private keys exported to: " + os.path.join(jm_single().datadir, "Private keys exported to: " + os.path.join(jm_single().datadir,
privkeys_fn) + '.json', title="Success") privkeys_fn) + '.json', title="Success")
def seedEntry(self): def seedEntry(self) -> Tuple[Optional[str], Optional[str]]:
d = QDialog(self) d = QDialog(self)
d.setModal(1) d.setModal(1)
d.setWindowTitle('Recover from mnemonic phrase') d.setWindowTitle('Recover from mnemonic phrase')
@ -2230,7 +2230,7 @@ class JMMainWindow(QMainWindow):
mbtype='info', mbtype='info',
title="Error") title="Error")
def getPassword(self): def getPassword(self) -> str:
pd = PasswordDialog() pd = PasswordDialog()
while True: while True:
for child in pd.findChildren(QLineEdit): for child in pd.findChildren(QLineEdit):
@ -2255,7 +2255,7 @@ class JMMainWindow(QMainWindow):
self.textpassword = str(pd.new_pw.text()) self.textpassword = str(pd.new_pw.text())
return self.textpassword.encode('utf-8') return self.textpassword.encode('utf-8')
def getWalletFileName(self): def getWalletFileName(self) -> str:
walletname, ok = QInputDialog.getText(self, 'Choose wallet name', walletname, ok = QInputDialog.getText(self, 'Choose wallet name',
'Enter wallet file name:', 'Enter wallet file name:',
QLineEdit.Normal, "wallet.jmdat") QLineEdit.Normal, "wallet.jmdat")
@ -2267,7 +2267,7 @@ class JMMainWindow(QMainWindow):
self.walletname = str(walletname) self.walletname = str(walletname)
return self.walletname return self.walletname
def displayWords(self, words, mnemonic_extension): def displayWords(self, words: str, mnemonic_extension: str) -> None:
mb = QMessageBox(self) mb = QMessageBox(self)
seed_recovery_warning = [ seed_recovery_warning = [
"WRITE DOWN THIS WALLET RECOVERY SEED.", "WRITE DOWN THIS WALLET RECOVERY SEED.",
@ -2282,13 +2282,13 @@ class JMMainWindow(QMainWindow):
mb.setStandardButtons(QMessageBox.Ok) mb.setStandardButtons(QMessageBox.Ok)
ret = mb.exec_() ret = mb.exec_()
def promptUseMnemonicExtension(self): def promptUseMnemonicExtension(self) -> bool:
msg = "Would you like to use a two-factor mnemonic recovery phrase?\nIf you don\'t know what this is press No." msg = "Would you like to use a two-factor mnemonic recovery phrase?\nIf you don\'t know what this is press No."
reply = QMessageBox.question(self, 'Use mnemonic extension?', reply = QMessageBox.question(self, 'Use mnemonic extension?',
msg, QMessageBox.Yes, QMessageBox.No) msg, QMessageBox.Yes, QMessageBox.No)
return reply == QMessageBox.Yes return reply == QMessageBox.Yes
def promptInputMnemonicExtension(self): def promptInputMnemonicExtension(self) -> Optional[str]:
mnemonic_extension, ok = QInputDialog.getText(self, mnemonic_extension, ok = QInputDialog.getText(self,
'Input Mnemonic Extension', 'Input Mnemonic Extension',
'Enter mnemonic Extension:', 'Enter mnemonic Extension:',

35
src/jmclient/wallet_utils.py

@ -9,7 +9,7 @@ from optparse import OptionParser
from numbers import Integral from numbers import Integral
from collections import Counter, defaultdict from collections import Counter, defaultdict
from itertools import islice, chain from itertools import islice, chain
from typing import Optional, Tuple from typing import Callable, Optional, Tuple
from jmclient import (get_network, WALLET_IMPLEMENTATIONS, Storage, podle, from jmclient import (get_network, WALLET_IMPLEMENTATIONS, Storage, podle,
jm_single, WalletError, BaseWallet, VolatileStorage, jm_single, WalletError, BaseWallet, VolatileStorage,
StoragePasswordError, is_segwit_mode, SegwitLegacyWallet, LegacyWallet, StoragePasswordError, is_segwit_mode, SegwitLegacyWallet, LegacyWallet,
@ -673,25 +673,25 @@ def wallet_display(wallet_service, showprivkey, displayall=False,
else: else:
return walletview return walletview
def cli_get_wallet_passphrase_check(): def cli_get_wallet_passphrase_check() -> Optional[str]:
password = get_password("Enter new passphrase to encrypt wallet: ") password = get_password("Enter new passphrase to encrypt wallet: ")
password2 = get_password("Reenter new passphrase to encrypt wallet: ") password2 = get_password("Reenter new passphrase to encrypt wallet: ")
if password != password2: if password != password2:
jmprint('ERROR. Passwords did not match', "error") jmprint('ERROR. Passwords did not match', "error")
return False return None
return password return password
def cli_get_wallet_file_name(defaultname="wallet.jmdat"): def cli_get_wallet_file_name(defaultname: str = "wallet.jmdat") -> str:
return input('Input wallet file name (default: ' + defaultname + '): ') return input(f'Input wallet file name (default: {defaultname}): ')
def cli_display_user_words(words, mnemonic_extension): def cli_display_user_words(words: str, mnemonic_extension: str) -> None:
text = 'Write down this wallet recovery mnemonic\n\n' + words +'\n' text = 'Write down this wallet recovery mnemonic\n\n' + words +'\n'
if mnemonic_extension: if mnemonic_extension:
text += '\nAnd this mnemonic extension: ' + mnemonic_extension.decode( text += '\nAnd this mnemonic extension: ' + mnemonic_extension.decode(
'utf-8') + '\n' 'utf-8') + '\n'
jmprint(text, "important") jmprint(text, "important")
def cli_user_mnemonic_entry(): def cli_user_mnemonic_entry() -> Tuple[Optional[str], Optional[str]]:
mnemonic_phrase = input("Input mnemonic recovery phrase: ") mnemonic_phrase = input("Input mnemonic recovery phrase: ")
mnemonic_extension = input("Input mnemonic extension, leave blank if there isnt one: ") mnemonic_extension = input("Input mnemonic extension, leave blank if there isnt one: ")
if len(mnemonic_extension.strip()) == 0: if len(mnemonic_extension.strip()) == 0:
@ -707,7 +707,7 @@ def cli_do_use_mnemonic_extension() -> bool:
jmprint("Not using mnemonic extension", "info") jmprint("Not using mnemonic extension", "info")
return False #no mnemonic extension return False #no mnemonic extension
def cli_get_mnemonic_extension(): def cli_get_mnemonic_extension() -> str:
jmprint("Note: This will be stored in a reversible way. Do not reuse!", jmprint("Note: This will be stored in a reversible way. Do not reuse!",
"info") "info")
return input("Enter mnemonic extension: ") return input("Enter mnemonic extension: ")
@ -721,10 +721,17 @@ def cli_do_support_fidelity_bonds() -> bool:
jmprint("Not supporting fidelity bonds", "info") jmprint("Not supporting fidelity bonds", "info")
return False return False
def wallet_generate_recover_bip39(method, walletspath, default_wallet_name, def wallet_generate_recover_bip39(method: str,
display_seed_callback, enter_seed_callback, enter_wallet_password_callback, walletspath: str,
enter_wallet_file_name_callback, enter_if_use_seed_extension, default_wallet_name: str,
enter_seed_extension_callback, enter_do_support_fidelity_bonds, mixdepth=DEFAULT_MIXDEPTH): display_seed_callback: Callable[[str, str], None],
enter_seed_callback: Optional[Callable[[], Tuple[Optional[str], Optional[str]]]],
enter_wallet_password_callback: Callable[[], str],
enter_wallet_file_name_callback: Callable[[], str],
enter_if_use_seed_extension: Optional[Callable[[], bool]],
enter_seed_extension_callback: Optional[Callable[[], Optional[str]]],
enter_do_support_fidelity_bonds: Callable[[], bool],
mixdepth: int = DEFAULT_MIXDEPTH) -> bool:
entropy = None entropy = None
mnemonic_extension = None mnemonic_extension = None
if method == "generate": if method == "generate":
@ -734,10 +741,10 @@ def wallet_generate_recover_bip39(method, walletspath, default_wallet_name,
return False return False
elif method == 'recover': elif method == 'recover':
words, mnemonic_extension = enter_seed_callback() words, mnemonic_extension = enter_seed_callback()
words = words.strip() words = words and words.strip()
mnemonic_extension = mnemonic_extension and mnemonic_extension.strip()
if not words: if not words:
return False return False
mnemonic_extension = mnemonic_extension and mnemonic_extension.strip()
try: try:
entropy = SegwitLegacyWallet.entropy_from_mnemonic(words) entropy = SegwitLegacyWallet.entropy_from_mnemonic(words)
except WalletError: except WalletError:

Loading…
Cancel
Save