fix import of sparrow wallet with seed, alphabetically sort import and export choices

This commit is contained in:
Craig Raw 2021-06-21 11:25:47 +02:00
parent c68c713a4b
commit 9b8f97c041
7 changed files with 30 additions and 5 deletions

View file

@ -961,6 +961,10 @@ public class AppController implements Initializable {
walletFile.delete(); walletFile.delete();
} }
if(wallet.isEncrypted()) {
throw new IllegalArgumentException("Imported wallet must be unencrypted");
}
Storage storage = new Storage(Storage.getWalletFile(wallet.getName())); Storage storage = new Storage(Storage.getWalletFile(wallet.getName()));
WalletPasswordDialog dlg = new WalletPasswordDialog(wallet.getName(), WalletPasswordDialog.PasswordRequirement.UPDATE_NEW); WalletPasswordDialog dlg = new WalletPasswordDialog(wallet.getName(), WalletPasswordDialog.PasswordRequirement.UPDATE_NEW);
Optional<SecureString> password = dlg.showAndWait(); Optional<SecureString> password = dlg.showAndWait();
@ -969,8 +973,10 @@ public class AppController implements Initializable {
try { try {
storage.setEncryptionPubKey(Storage.NO_PASSWORD_KEY); storage.setEncryptionPubKey(Storage.NO_PASSWORD_KEY);
storage.saveWallet(wallet); storage.saveWallet(wallet);
checkWalletNetwork(wallet);
restorePublicKeysFromSeed(wallet, null);
addWalletTabOrWindow(storage, wallet, null, false); addWalletTabOrWindow(storage, wallet, null, false);
} catch(IOException | StorageException e) { } catch(IOException | StorageException | MnemonicException e) {
log.error("Error saving imported wallet", e); log.error("Error saving imported wallet", e);
} }
} else { } else {
@ -986,8 +992,10 @@ public class AppController implements Initializable {
wallet.encrypt(key); wallet.encrypt(key);
storage.setEncryptionPubKey(encryptionPubKey); storage.setEncryptionPubKey(encryptionPubKey);
storage.saveWallet(wallet); storage.saveWallet(wallet);
checkWalletNetwork(wallet);
restorePublicKeysFromSeed(wallet, key);
addWalletTabOrWindow(storage, wallet, null, false); addWalletTabOrWindow(storage, wallet, null, false);
} catch(IOException | StorageException e) { } catch(IOException | StorageException | MnemonicException e) {
log.error("Error saving imported wallet", e); log.error("Error saving imported wallet", e);
} finally { } finally {
encryptionFullKey.clear(); encryptionFullKey.clear();

View file

@ -16,6 +16,7 @@ import java.util.Arrays;
import java.util.OptionalDouble; import java.util.OptionalDouble;
public class TitledDescriptionPane extends TitledPane { public class TitledDescriptionPane extends TitledPane {
private Label mainLabel;
private Label descriptionLabel; private Label descriptionLabel;
protected Hyperlink showHideLink; protected Hyperlink showHideLink;
protected HBox buttonBox; protected HBox buttonBox;
@ -50,7 +51,7 @@ public class TitledDescriptionPane extends TitledPane {
VBox labelsBox = new VBox(); VBox labelsBox = new VBox();
labelsBox.setSpacing(5); labelsBox.setSpacing(5);
labelsBox.setAlignment(Pos.CENTER_LEFT); labelsBox.setAlignment(Pos.CENTER_LEFT);
Label mainLabel = new Label(); mainLabel = new Label();
mainLabel.setText(title); mainLabel.setText(title);
mainLabel.getStyleClass().add("main-label"); mainLabel.getStyleClass().add("main-label");
labelsBox.getChildren().add(mainLabel); labelsBox.getChildren().add(mainLabel);
@ -99,6 +100,10 @@ public class TitledDescriptionPane extends TitledPane {
return null; return null;
} }
public String getTitle() {
return mainLabel.getText();
}
protected void setDescription(String text) { protected void setDescription(String text) {
descriptionLabel.getStyleClass().remove("description-error"); descriptionLabel.getStyleClass().remove("description-error");
descriptionLabel.getStyleClass().add("description-label"); descriptionLabel.getStyleClass().add("description-label");

View file

@ -11,6 +11,7 @@ import javafx.scene.control.*;
import javafx.scene.layout.AnchorPane; import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.StackPane; import javafx.scene.layout.StackPane;
import java.util.Comparator;
import java.util.List; import java.util.List;
public class WalletExportDialog extends Dialog<Wallet> { public class WalletExportDialog extends Dialog<Wallet> {
@ -53,6 +54,8 @@ public class WalletExportDialog extends Dialog<Wallet> {
FileWalletExportPane exportPane = new FileWalletExportPane(wallet, exporter); FileWalletExportPane exportPane = new FileWalletExportPane(wallet, exporter);
exportAccordion.getPanes().add(exportPane); exportAccordion.getPanes().add(exportPane);
} }
exportAccordion.getPanes().sort(Comparator.comparing(o -> ((TitledDescriptionPane) o).getTitle()));
scrollPane.setContent(exportAccordion); scrollPane.setContent(exportAccordion);
final ButtonType cancelButtonType = new javafx.scene.control.ButtonType("Cancel", ButtonBar.ButtonData.CANCEL_CLOSE); final ButtonType cancelButtonType = new javafx.scene.control.ButtonType("Cancel", ButtonBar.ButtonData.CANCEL_CLOSE);

View file

@ -16,6 +16,7 @@ import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.StackPane; import javafx.scene.layout.StackPane;
import org.controlsfx.glyphfont.Glyph; import org.controlsfx.glyphfont.Glyph;
import java.util.Comparator;
import java.util.List; import java.util.List;
public class WalletImportDialog extends Dialog<Wallet> { public class WalletImportDialog extends Dialog<Wallet> {
@ -58,6 +59,8 @@ public class WalletImportDialog extends Dialog<Wallet> {
FileWalletImportPane importPane = new FileWalletImportPane(importer); FileWalletImportPane importPane = new FileWalletImportPane(importer);
importAccordion.getPanes().add(importPane); importAccordion.getPanes().add(importPane);
} }
importAccordion.getPanes().sort(Comparator.comparing(o -> ((TitledDescriptionPane) o).getTitle()));
scrollPane.setContent(importAccordion); scrollPane.setContent(importAccordion);
final ButtonType cancelButtonType = new javafx.scene.control.ButtonType("Cancel", ButtonBar.ButtonData.CANCEL_CLOSE); final ButtonType cancelButtonType = new javafx.scene.control.ButtonType("Cancel", ButtonBar.ButtonData.CANCEL_CLOSE);

View file

@ -91,7 +91,9 @@ public class Sparrow implements WalletImport, WalletExport {
if(!isEncrypted(tempFile)) { if(!isEncrypted(tempFile)) {
return storage.loadUnencryptedWallet().getWallet(); return storage.loadUnencryptedWallet().getWallet();
} else { } else {
return storage.loadEncryptedWallet(password).getWallet(); WalletBackupAndKey walletBackupAndKey = storage.loadEncryptedWallet(password);
walletBackupAndKey.getWallet().decrypt(walletBackupAndKey.getKey());
return walletBackupAndKey.getWallet();
} }
} catch(IOException | StorageException e) { } catch(IOException | StorageException e) {
log.error("Error importing Sparrow wallet", e); log.error("Error importing Sparrow wallet", e);

View file

@ -555,7 +555,7 @@ public class DbPersistence implements Persistence {
log.error("Wallet file may already be in use. Make sure the application is not running elsewhere.", e); log.error("Wallet file may already be in use. Make sure the application is not running elsewhere.", e);
throw new StorageException("Wallet file may already be in use. Make sure the application is not running elsewhere.", e); throw new StorageException("Wallet file may already be in use. Make sure the application is not running elsewhere.", e);
} else if(e.getMessage() != null && (e.getMessage().contains("Wrong user name or password") || e.getMessage().contains("Encryption error in file"))) { } else if(e.getMessage() != null && (e.getMessage().contains("Wrong user name or password") || e.getMessage().contains("Encryption error in file"))) {
throw new InvalidPasswordException("Incorrect password for wallet file.", e); throw new InvalidPasswordException("Incorrect password for wallet file " + walletFile.getAbsolutePath(), e);
} else { } else {
log.error("Failed to open database file", e); log.error("Failed to open database file", e);
throw new StorageException("Failed to open database file.\n" + e.getMessage(), e); throw new StorageException("Failed to open database file.\n" + e.getMessage(), e);

View file

@ -2,11 +2,13 @@ package com.sparrowwallet.sparrow.keystoreimport;
import com.sparrowwallet.drongo.policy.PolicyType; import com.sparrowwallet.drongo.policy.PolicyType;
import com.sparrowwallet.sparrow.control.FileKeystoreImportPane; import com.sparrowwallet.sparrow.control.FileKeystoreImportPane;
import com.sparrowwallet.sparrow.control.TitledDescriptionPane;
import com.sparrowwallet.sparrow.io.*; import com.sparrowwallet.sparrow.io.*;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.scene.control.Accordion; import javafx.scene.control.Accordion;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator;
import java.util.List; import java.util.List;
public class HwAirgappedController extends KeystoreImportDetailController { public class HwAirgappedController extends KeystoreImportDetailController {
@ -25,5 +27,7 @@ public class HwAirgappedController extends KeystoreImportDetailController {
FileKeystoreImportPane importPane = new FileKeystoreImportPane(getMasterController().getWallet(), (KeystoreFileImport)importer);; FileKeystoreImportPane importPane = new FileKeystoreImportPane(getMasterController().getWallet(), (KeystoreFileImport)importer);;
importAccordion.getPanes().add(importPane); importAccordion.getPanes().add(importPane);
} }
importAccordion.getPanes().sort(Comparator.comparing(o -> ((TitledDescriptionPane) o).getTitle()));
} }
} }