diff --git a/src/main/java/com/sparrowwallet/sparrow/control/MnemonicWalletKeystoreImportPane.java b/src/main/java/com/sparrowwallet/sparrow/control/MnemonicWalletKeystoreImportPane.java index 8426d2b1..841dcf15 100644 --- a/src/main/java/com/sparrowwallet/sparrow/control/MnemonicWalletKeystoreImportPane.java +++ b/src/main/java/com/sparrowwallet/sparrow/control/MnemonicWalletKeystoreImportPane.java @@ -218,6 +218,15 @@ public class MnemonicWalletKeystoreImportPane extends MnemonicKeystorePane { try { PolicyAndScriptType type = comboBox.getValue(); Wallet wallet = getWallet(type.policyType(), type.scriptType(), type.scriptType().getDefaultDerivation()); + if(passphraseProperty.get() != null && !passphraseProperty.get().isEmpty()) { + KeystorePassphraseDialog keystorePassphraseDialog = new KeystorePassphraseDialog(null, wallet.getKeystores().getFirst(), true); + keystorePassphraseDialog.initOwner(this.getScene().getWindow()); + Optional optPassphrase = keystorePassphraseDialog.showAndWait(); + if(optPassphrase.isEmpty() || !optPassphrase.get().equals(passphraseProperty.get())) { + throw new ImportException("Re-entered passphrase did not match"); + } + } + EventManager.get().post(new WalletImportEvent(wallet)); } catch(ImportException e) { log.error("Error importing mnemonic", e); diff --git a/src/main/java/com/sparrowwallet/sparrow/terminal/PassphraseDialog.java b/src/main/java/com/sparrowwallet/sparrow/terminal/PassphraseDialog.java index 92329640..a7c39637 100644 --- a/src/main/java/com/sparrowwallet/sparrow/terminal/PassphraseDialog.java +++ b/src/main/java/com/sparrowwallet/sparrow/terminal/PassphraseDialog.java @@ -15,7 +15,11 @@ public class PassphraseDialog extends DialogWindow { private String result; public PassphraseDialog(String walletName, Keystore keystore) { - super("Passphrase for " + walletName); + this(walletName, keystore, false); + } + + public PassphraseDialog(String walletName, Keystore keystore, boolean confirm) { + super((confirm ? "Confirm Passphrase for " : "Passphrase for ") + walletName); setHints(Collections.singleton(Window.Hint.CENTERED)); @@ -30,7 +34,7 @@ public class PassphraseDialog extends DialogWindow { Panel mainPanel = new Panel(); mainPanel.setLayoutManager(new GridLayout(1).setLeftMarginSize(1).setRightMarginSize(1)); - mainPanel.addComponent(new Label("Enter the BIP39 passphrase for keystore:\n" + keystore.getLabel())); + mainPanel.addComponent(new Label(confirm ? "Re-enter the BIP39 passphrase\nto confirm:" : "Enter the BIP39 passphrase for keystore:\n" + keystore.getLabel())); mainPanel.addComponent(new EmptySpace(TerminalSize.ONE)); passphrase.setLayoutData(GridLayout.createLayoutData(GridLayout.Alignment.FILL, GridLayout.Alignment.CENTER, true, false)).addTo(mainPanel); mainPanel.addComponent(new EmptySpace(TerminalSize.ONE)); diff --git a/src/main/java/com/sparrowwallet/sparrow/terminal/wallet/Bip39Dialog.java b/src/main/java/com/sparrowwallet/sparrow/terminal/wallet/Bip39Dialog.java index c29ff51b..2231ad11 100644 --- a/src/main/java/com/sparrowwallet/sparrow/terminal/wallet/Bip39Dialog.java +++ b/src/main/java/com/sparrowwallet/sparrow/terminal/wallet/Bip39Dialog.java @@ -12,6 +12,7 @@ import com.sparrowwallet.drongo.wallet.Keystore; import com.sparrowwallet.drongo.wallet.Wallet; import com.sparrowwallet.sparrow.io.Bip39; import com.sparrowwallet.sparrow.io.ImportException; +import com.sparrowwallet.sparrow.terminal.PassphraseDialog; import com.sparrowwallet.sparrow.terminal.SparrowTerminal; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -23,6 +24,8 @@ import java.util.Arrays; import java.util.Date; import java.util.List; +import static com.sparrowwallet.sparrow.AppServices.showErrorDialog; + public class Bip39Dialog extends NewWalletDialog { private static final Logger log = LoggerFactory.getLogger(Bip39Dialog.class); public static final int MAX_COLUMNS = 40; @@ -100,6 +103,28 @@ public class Bip39Dialog extends NewWalletDialog { }); } + @Override + protected void createWallet() { + if(!passphrase.getText().isEmpty()) { + try { + PolicyAndScriptType type = scriptType.getSelectedItem(); + Keystore keystore = importer.getKeystore(type.policyType(), type.scriptType().getDefaultDerivation(), getWords(), passphrase.getText()); + PassphraseDialog passphraseDialog = new PassphraseDialog(walletName, keystore, true); + String confirmation = passphraseDialog.showDialog(SparrowTerminal.get().getGui()); + if(confirmation == null || !confirmation.equals(passphrase.getText())) { + showErrorDialog("Error Creating Wallet", "Re-entered passphrase did not match."); + return; + } + } catch(ImportException e) { + log.error("Cannot create keystore", e); + showErrorDialog("Error Creating Wallet", e.getMessage()); + return; + } + } + + super.createWallet(); + } + private void generateNew() { WordNumberDialog wordNumberDialog = new WordNumberDialog(); Integer numberOfWords = wordNumberDialog.showDialog(SparrowTerminal.get().getGui());