From fa0d48415f3945e9d1ccccb68ac7f6b41cf3fdc0 Mon Sep 17 00:00:00 2001 From: Craig Raw Date: Tue, 4 Aug 2026 15:55:45 +0200 Subject: [PATCH] reject extended private keys when creating a terminal watch only wallet, and show import errors --- .../terminal/wallet/NewWalletDialog.java | 3 +- .../terminal/wallet/WatchOnlyDialog.java | 31 ++++++++++--------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/sparrowwallet/sparrow/terminal/wallet/NewWalletDialog.java b/src/main/java/com/sparrowwallet/sparrow/terminal/wallet/NewWalletDialog.java index a21b89b7..a60b4169 100644 --- a/src/main/java/com/sparrowwallet/sparrow/terminal/wallet/NewWalletDialog.java +++ b/src/main/java/com/sparrowwallet/sparrow/terminal/wallet/NewWalletDialog.java @@ -47,8 +47,9 @@ public abstract class NewWalletDialog extends DialogWindow { try { discoverAndSaveWallet(getWallets()); - } catch(ImportException e) { + } catch(Exception e) { log.error("Cannot import wallet", e); + showErrorDialog("Error Creating Wallet", e.getMessage()); } } diff --git a/src/main/java/com/sparrowwallet/sparrow/terminal/wallet/WatchOnlyDialog.java b/src/main/java/com/sparrowwallet/sparrow/terminal/wallet/WatchOnlyDialog.java index bd974d47..5be2c303 100644 --- a/src/main/java/com/sparrowwallet/sparrow/terminal/wallet/WatchOnlyDialog.java +++ b/src/main/java/com/sparrowwallet/sparrow/terminal/wallet/WatchOnlyDialog.java @@ -93,23 +93,26 @@ public class WatchOnlyDialog extends NewWalletDialog { @Override protected List getWallets() throws ImportException { - try { - return getWalletFromXpub(); - } catch(Exception e1) { - try { - return getWalletFromOutputDescriptor(); - } catch(Exception e2) { - log.error("Could not determine wallet from descriptor: " + descriptor.getText(), e2); + String text = descriptor.getText().replaceAll("\\s+", ""); + + if(ExtendedKey.isValid(text)) { + ExtendedKey extendedKey = ExtendedKey.fromDescriptor(text); + if(!extendedKey.getKey().isPubKeyOnly()) { + throw new ImportException("An extended private key cannot be used to create a watch only wallet. Enter an extended public key, or an output descriptor if the private key is intended to be imported."); } + + return getWalletFromXpub(extendedKey, ExtendedKey.Header.fromExtendedKey(text)); } - return Collections.emptyList(); + try { + return getWalletFromOutputDescriptor(text); + } catch(Exception e) { + log.error("Could not determine wallet from descriptor: " + text, e); + throw new ImportException("Could not determine wallet from descriptor: " + e.getMessage(), e); + } } - private List getWalletFromXpub() { - ExtendedKey xpub = ExtendedKey.fromDescriptor(descriptor.getText().replaceAll("\\s+", "")); - ExtendedKey.Header header = ExtendedKey.Header.fromExtendedKey(descriptor.getText()); - + private List getWalletFromXpub(ExtendedKey xpub, ExtendedKey.Header header) { Set scriptTypes = new LinkedHashSet<>(); scriptTypes.add(ScriptType.P2WPKH); scriptTypes.add(header.getDefaultScriptType()); @@ -136,8 +139,8 @@ public class WatchOnlyDialog extends NewWalletDialog { return wallets; } - private List getWalletFromOutputDescriptor() { - OutputDescriptor outputDescriptor = OutputDescriptor.getOutputDescriptor(descriptor.getText().replaceAll("\\s+", "")); + private List getWalletFromOutputDescriptor(String text) { + OutputDescriptor outputDescriptor = OutputDescriptor.getOutputDescriptor(text); Wallet wallet = outputDescriptor.toWallet(); wallet.setName(walletName); return List.of(wallet);