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

View file

@ -36,10 +36,7 @@ import tornadofx.control.Field;
import javax.smartcardio.CardException;
import java.net.URL;
import java.util.Base64;
import java.util.Locale;
import java.util.Optional;
import java.util.ResourceBundle;
import java.util.*;
import java.util.stream.Collectors;
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());
KeyDerivation currentDerivation = keystore.getKeyDerivation();
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());
Optional<Keystore> result = dlg.showAndWait();
if(result.isPresent()) {
@ -386,7 +384,12 @@ public class KeystoreController extends WalletFormController implements Initiali
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.setWalletModel(importedKeystore.getWalletModel());
keystore.setLabel(importedKeystore.getLabel());
@ -396,7 +399,7 @@ public class KeystoreController extends WalletFormController implements Initiali
keystore.setSeed(importedKeystore.getSeed());
keystore.setBip47ExtendedPrivateKey(importedKeystore.getBip47ExtendedPrivateKey());
updateType(true);
updateType(keystore.isValid());
label.setText(keystore.getLabel());
fingerprint.setText(keystore.getKeyDerivation().getMasterFingerprint());
derivation.setText(keystore.getKeyDerivation().getDerivationPath());
@ -653,7 +656,8 @@ public class KeystoreController extends WalletFormController implements Initiali
@Subscribe
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(event.getType().equals(SettingsChangedEvent.Type.SCRIPT_TYPE)) {
if(keystore.getSource() == KeystoreSource.SW_WATCH && derivation.getPromptText().equals(derivation.getText())) {
derivation.setText(event.getWallet().getScriptType().getDefaultDerivationPath());
}
@ -666,6 +670,18 @@ public class KeystoreController extends WalletFormController implements Initiali
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());
}
}
if(event.getType().equals(SettingsChangedEvent.Type.KEYSTORE_LABEL) || event.getType().equals(SettingsChangedEvent.Type.KEYSTORE_FINGERPRINT) ||
event.getType().equals(SettingsChangedEvent.Type.KEYSTORE_DERIVATION) || event.getType().equals(SettingsChangedEvent.Type.KEYSTORE_XPUB)) {
if(keystore.getSource() == KeystoreSource.SW_WATCH) {
exportButton.setVisible(keystore.isValid() && getWalletForm().getWallet().getPolicyType() == PolicyType.MULTI);
}
}
}
}