fix various minor issues around multisig keystore labelling and export button visibility

This commit is contained in:
Craig Raw 2025-02-13 08:43:55 +02:00
parent 5c29bf51b7
commit d0c827c2c7
4 changed files with 46 additions and 23 deletions

2
drongo

@ -1 +1 @@
Subproject commit f7d5b4fb8fb0cbc2192a0f76fb4a1ef79a35d811 Subproject commit 419ed1a6993de6e400de9ddc6e942f8d97b1522b

2
lark

@ -1 +1 @@
Subproject commit c4c7ca8da3a26e97c181a456eff5401b1bb7c1cc Subproject commit fd7d0b7fa58c0667e2eab2f7833591dadb19c684

View file

@ -3,6 +3,7 @@ package com.sparrowwallet.sparrow.keystoreimport;
import com.google.common.eventbus.Subscribe; import com.google.common.eventbus.Subscribe;
import com.sparrowwallet.drongo.KeyDerivation; import com.sparrowwallet.drongo.KeyDerivation;
import com.sparrowwallet.drongo.Network; import com.sparrowwallet.drongo.Network;
import com.sparrowwallet.drongo.protocol.ScriptType;
import com.sparrowwallet.drongo.wallet.Keystore; import com.sparrowwallet.drongo.wallet.Keystore;
import com.sparrowwallet.drongo.wallet.KeystoreSource; import com.sparrowwallet.drongo.wallet.KeystoreSource;
import com.sparrowwallet.drongo.wallet.Wallet; import com.sparrowwallet.drongo.wallet.Wallet;
@ -10,6 +11,7 @@ import com.sparrowwallet.drongo.wallet.WalletModel;
import com.sparrowwallet.sparrow.AppServices; import com.sparrowwallet.sparrow.AppServices;
import com.sparrowwallet.sparrow.EventManager; import com.sparrowwallet.sparrow.EventManager;
import com.sparrowwallet.sparrow.event.KeystoreImportEvent; import com.sparrowwallet.sparrow.event.KeystoreImportEvent;
import com.sparrowwallet.sparrow.wallet.KeystoreController;
import javafx.fxml.FXMLLoader; import javafx.fxml.FXMLLoader;
import javafx.scene.control.*; import javafx.scene.control.*;
import org.controlsfx.tools.Borders; import org.controlsfx.tools.Borders;
@ -20,16 +22,18 @@ import java.util.List;
public class KeystoreImportDialog extends Dialog<Keystore> { public class KeystoreImportDialog extends Dialog<Keystore> {
private final KeystoreImportController keystoreImportController; private final KeystoreImportController keystoreImportController;
private Keystore keystore; private Keystore keystore;
private final ScriptType scriptType;
private final String existingLabel;
public KeystoreImportDialog(Wallet wallet) { public KeystoreImportDialog(Wallet wallet) {
this(wallet, KeystoreSource.HW_USB); this(wallet, KeystoreSource.HW_USB);
} }
public KeystoreImportDialog(Wallet wallet, KeystoreSource initialSource) { public KeystoreImportDialog(Wallet wallet, KeystoreSource initialSource) {
this(wallet, initialSource, null, null, false); this(wallet, initialSource, null, null, Keystore.DEFAULT_LABEL, false);
} }
public KeystoreImportDialog(Wallet wallet, KeystoreSource initialSource, KeyDerivation currentDerivation, WalletModel currentModel, boolean restrictImport) { public KeystoreImportDialog(Wallet wallet, KeystoreSource initialSource, KeyDerivation currentDerivation, WalletModel currentModel, String currentLabel, boolean restrictImport) {
EventManager.get().register(this); EventManager.get().register(this);
setOnCloseRequest(event -> { setOnCloseRequest(event -> {
EventManager.get().unregister(this); EventManager.get().unregister(this);
@ -37,6 +41,8 @@ public class KeystoreImportDialog extends Dialog<Keystore> {
final DialogPane dialogPane = getDialogPane(); final DialogPane dialogPane = getDialogPane();
AppServices.setStageIcon(dialogPane.getScene().getWindow()); AppServices.setStageIcon(dialogPane.getScene().getWindow());
scriptType = wallet.getScriptType();
existingLabel = currentLabel;
try { try {
FXMLLoader ksiLoader = new FXMLLoader(AppServices.class.getResource("keystoreimport/keystoreimport.fxml")); FXMLLoader ksiLoader = new FXMLLoader(AppServices.class.getResource("keystoreimport/keystoreimport.fxml"));
@ -73,9 +79,10 @@ public class KeystoreImportDialog extends Dialog<Keystore> {
private Keystore getWatchOnlyKeystore() { private Keystore getWatchOnlyKeystore() {
this.keystore = new Keystore(); this.keystore = new Keystore();
keystore.setLabel(existingLabel);
keystore.setSource(KeystoreSource.SW_WATCH); keystore.setSource(KeystoreSource.SW_WATCH);
keystore.setWalletModel(WalletModel.SPARROW); keystore.setWalletModel(WalletModel.SPARROW);
keystore.setKeyDerivation(new KeyDerivation("","")); keystore.setKeyDerivation(new KeyDerivation(KeystoreController.DEFAULT_WATCH_ONLY_FINGERPRINT, scriptType.getDefaultDerivationPath()));
return keystore; return keystore;
} }

View file

@ -36,10 +36,7 @@ import tornadofx.control.Field;
import javax.smartcardio.CardException; import javax.smartcardio.CardException;
import java.net.URL; import java.net.URL;
import java.util.Base64; import java.util.*;
import java.util.Locale;
import java.util.Optional;
import java.util.ResourceBundle;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static com.sparrowwallet.sparrow.io.CardApi.isReaderAvailable; import static com.sparrowwallet.sparrow.io.CardApi.isReaderAvailable;
@ -371,7 +368,8 @@ public class KeystoreController extends WalletFormController implements Initiali
boolean restrictImport = keystore.getSource() != KeystoreSource.SW_WATCH && keystoreSourceToggleGroup.getToggles().stream().anyMatch(toggle -> ((ToggleButton)toggle).isDisabled()); boolean restrictImport = keystore.getSource() != KeystoreSource.SW_WATCH && keystoreSourceToggleGroup.getToggles().stream().anyMatch(toggle -> ((ToggleButton)toggle).isDisabled());
KeyDerivation currentDerivation = keystore.getKeyDerivation(); KeyDerivation currentDerivation = keystore.getKeyDerivation();
WalletModel currentModel = keystore.getWalletModel(); WalletModel currentModel = keystore.getWalletModel();
KeystoreImportDialog dlg = new KeystoreImportDialog(getWalletForm().getWallet(), initialSource, currentDerivation, currentModel, restrictImport); String currentLabel = keystore.getLabel();
KeystoreImportDialog dlg = new KeystoreImportDialog(getWalletForm().getWallet(), initialSource, currentDerivation, currentModel, currentLabel, restrictImport);
dlg.initOwner(selectSourcePane.getScene().getWindow()); dlg.initOwner(selectSourcePane.getScene().getWindow());
Optional<Keystore> result = dlg.showAndWait(); Optional<Keystore> result = dlg.showAndWait();
if(result.isPresent()) { if(result.isPresent()) {
@ -386,7 +384,12 @@ public class KeystoreController extends WalletFormController implements Initiali
return; return;
} }
} }
walletForm.getWallet().makeLabelsUnique(importedKeystore); if(!keystore.getLabel().equals(importedKeystore.getLabel())) {
List<Keystore> changedKeystores = walletForm.getWallet().makeLabelsUnique(importedKeystore);
if(!changedKeystores.isEmpty()) {
EventManager.get().post(new SettingsChangedEvent(walletForm.getWallet(), SettingsChangedEvent.Type.KEYSTORE_LABEL));
}
}
keystore.setSource(importedKeystore.getSource()); keystore.setSource(importedKeystore.getSource());
keystore.setWalletModel(importedKeystore.getWalletModel()); keystore.setWalletModel(importedKeystore.getWalletModel());
keystore.setLabel(importedKeystore.getLabel()); keystore.setLabel(importedKeystore.getLabel());
@ -396,7 +399,7 @@ public class KeystoreController extends WalletFormController implements Initiali
keystore.setSeed(importedKeystore.getSeed()); keystore.setSeed(importedKeystore.getSeed());
keystore.setBip47ExtendedPrivateKey(importedKeystore.getBip47ExtendedPrivateKey()); keystore.setBip47ExtendedPrivateKey(importedKeystore.getBip47ExtendedPrivateKey());
updateType(true); updateType(keystore.isValid());
label.setText(keystore.getLabel()); label.setText(keystore.getLabel());
fingerprint.setText(keystore.getKeyDerivation().getMasterFingerprint()); fingerprint.setText(keystore.getKeyDerivation().getMasterFingerprint());
derivation.setText(keystore.getKeyDerivation().getDerivationPath()); derivation.setText(keystore.getKeyDerivation().getDerivationPath());
@ -653,18 +656,31 @@ public class KeystoreController extends WalletFormController implements Initiali
@Subscribe @Subscribe
public void update(SettingsChangedEvent event) { public void update(SettingsChangedEvent event) {
if(walletForm.getWallet().equals(event.getWallet()) && event.getType().equals(SettingsChangedEvent.Type.SCRIPT_TYPE)) { if(walletForm.getWallet().equals(event.getWallet())) {
if(keystore.getSource() == KeystoreSource.SW_WATCH && derivation.getPromptText().equals(derivation.getText())) { if(event.getType().equals(SettingsChangedEvent.Type.SCRIPT_TYPE)) {
derivation.setText(event.getWallet().getScriptType().getDefaultDerivationPath()); if(keystore.getSource() == KeystoreSource.SW_WATCH && derivation.getPromptText().equals(derivation.getText())) {
derivation.setText(event.getWallet().getScriptType().getDefaultDerivationPath());
}
derivation.setPromptText(event.getWallet().getScriptType().getDefaultDerivationPath());
if(derivation.getText() != null && !derivation.getText().isEmpty()) {
String derivationPath = derivation.getText();
derivation.setText(derivationPath + " ");
derivation.setText(derivationPath);
}
if(keystore.getExtendedPublicKey() != null) {
setXpubContext(keystore.getExtendedPublicKey());
}
} else if(event.getType().equals(SettingsChangedEvent.Type.KEYSTORE_LABEL)) {
if(!keystore.getLabel().equals(label.getText())) {
label.setText(keystore.getLabel());
}
} }
derivation.setPromptText(event.getWallet().getScriptType().getDefaultDerivationPath());
if(derivation.getText() != null && !derivation.getText().isEmpty()) { if(event.getType().equals(SettingsChangedEvent.Type.KEYSTORE_LABEL) || event.getType().equals(SettingsChangedEvent.Type.KEYSTORE_FINGERPRINT) ||
String derivationPath = derivation.getText(); event.getType().equals(SettingsChangedEvent.Type.KEYSTORE_DERIVATION) || event.getType().equals(SettingsChangedEvent.Type.KEYSTORE_XPUB)) {
derivation.setText(derivationPath + " "); if(keystore.getSource() == KeystoreSource.SW_WATCH) {
derivation.setText(derivationPath); exportButton.setVisible(keystore.isValid() && getWalletForm().getWallet().getPolicyType() == PolicyType.MULTI);
} }
if(keystore.getExtendedPublicKey() != null) {
setXpubContext(keystore.getExtendedPublicKey());
} }
} }
} }