mirror of
https://github.com/sparrowwallet/sparrow.git
synced 2024-12-24 12:46:45 +00:00
terminal - show seed
This commit is contained in:
parent
273f3043fb
commit
e8fb676a24
1 changed files with 64 additions and 7 deletions
|
@ -10,6 +10,7 @@ import com.sparrowwallet.drongo.crypto.ECKey;
|
||||||
import com.sparrowwallet.drongo.crypto.EncryptionType;
|
import com.sparrowwallet.drongo.crypto.EncryptionType;
|
||||||
import com.sparrowwallet.drongo.crypto.InvalidPasswordException;
|
import com.sparrowwallet.drongo.crypto.InvalidPasswordException;
|
||||||
import com.sparrowwallet.drongo.crypto.Key;
|
import com.sparrowwallet.drongo.crypto.Key;
|
||||||
|
import com.sparrowwallet.drongo.policy.PolicyType;
|
||||||
import com.sparrowwallet.drongo.wallet.KeystoreSource;
|
import com.sparrowwallet.drongo.wallet.KeystoreSource;
|
||||||
import com.sparrowwallet.drongo.wallet.StandardAccount;
|
import com.sparrowwallet.drongo.wallet.StandardAccount;
|
||||||
import com.sparrowwallet.drongo.wallet.Wallet;
|
import com.sparrowwallet.drongo.wallet.Wallet;
|
||||||
|
@ -69,18 +70,27 @@ public class SettingsDialog extends WalletDialog {
|
||||||
mainPanel.addComponent(new EmptySpace(TerminalSize.ONE));
|
mainPanel.addComponent(new EmptySpace(TerminalSize.ONE));
|
||||||
mainPanel.addComponent(new EmptySpace(TerminalSize.ONE));
|
mainPanel.addComponent(new EmptySpace(TerminalSize.ONE));
|
||||||
|
|
||||||
Panel buttonPanel = new Panel();
|
|
||||||
buttonPanel.setLayoutManager(new GridLayout(2).setHorizontalSpacing(1));
|
|
||||||
buttonPanel.addComponent(new Button("Back", () -> onBack(Function.SETTINGS)));
|
|
||||||
buttonPanel.addComponent(new Button("Advanced", this::showAdvanced).setLayoutData(GridLayout.createLayoutData(GridLayout.Alignment.CENTER, GridLayout.Alignment.CENTER, true, false)));
|
|
||||||
|
|
||||||
if(getWalletForm().getMasterWallet().getKeystores().stream().allMatch(ks -> ks.getSource() == KeystoreSource.SW_SEED)) {
|
if(getWalletForm().getMasterWallet().getKeystores().stream().allMatch(ks -> ks.getSource() == KeystoreSource.SW_SEED)) {
|
||||||
mainPanel.addComponent(new Button("Add Account", this::showAddAccount));
|
Panel leftButtonPanel = new Panel();
|
||||||
|
leftButtonPanel.setLayoutManager(new GridLayout(2).setHorizontalSpacing(1));
|
||||||
|
leftButtonPanel.addComponent(new Button("Add Account", this::showAddAccount));
|
||||||
|
if(getWalletForm().getWallet().getPolicyType() == PolicyType.SINGLE) {
|
||||||
|
leftButtonPanel.addComponent(new Button("Show Seed", this::showSeed));
|
||||||
|
} else {
|
||||||
|
leftButtonPanel.addComponent(new EmptySpace(TerminalSize.ZERO));
|
||||||
|
}
|
||||||
|
|
||||||
|
leftButtonPanel.setLayoutData(GridLayout.createLayoutData(GridLayout.Alignment.BEGINNING, GridLayout.Alignment.CENTER,false,false)).addTo(mainPanel);
|
||||||
} else {
|
} else {
|
||||||
mainPanel.addComponent(new EmptySpace(TerminalSize.ONE));
|
mainPanel.addComponent(new EmptySpace(TerminalSize.ONE));
|
||||||
}
|
}
|
||||||
|
|
||||||
buttonPanel.setLayoutData(GridLayout.createLayoutData(GridLayout.Alignment.END, GridLayout.Alignment.CENTER,false,false)).addTo(mainPanel);
|
Panel rightButtonPanel = new Panel();
|
||||||
|
rightButtonPanel.setLayoutManager(new GridLayout(2).setHorizontalSpacing(1));
|
||||||
|
rightButtonPanel.addComponent(new Button("Back", () -> onBack(Function.SETTINGS)));
|
||||||
|
rightButtonPanel.addComponent(new Button("Advanced", this::showAdvanced).setLayoutData(GridLayout.createLayoutData(GridLayout.Alignment.CENTER, GridLayout.Alignment.CENTER, true, false)));
|
||||||
|
|
||||||
|
rightButtonPanel.setLayoutData(GridLayout.createLayoutData(GridLayout.Alignment.END, GridLayout.Alignment.CENTER,false,false)).addTo(mainPanel);
|
||||||
setComponent(mainPanel);
|
setComponent(mainPanel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -105,6 +115,53 @@ public class SettingsDialog extends WalletDialog {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void showSeed() {
|
||||||
|
Wallet wallet = getWalletForm().getWallet().copy();
|
||||||
|
if(wallet.isEncrypted()) {
|
||||||
|
Wallet copy = wallet.copy();
|
||||||
|
String walletId = getWalletForm().getWalletId();
|
||||||
|
|
||||||
|
TextInputDialogBuilder builder = new TextInputDialogBuilder().setTitle("Wallet Password");
|
||||||
|
builder.setDescription("Enter the wallet password:");
|
||||||
|
builder.setPasswordInput(true);
|
||||||
|
|
||||||
|
String password = builder.build().showDialog(SparrowTerminal.get().getGui());
|
||||||
|
if(password != null) {
|
||||||
|
Platform.runLater(() -> {
|
||||||
|
Storage.KeyDerivationService keyDerivationService = new Storage.KeyDerivationService(getWalletForm().getStorage(), new SecureString(password), true);
|
||||||
|
keyDerivationService.setOnSucceeded(workerStateEvent -> {
|
||||||
|
EventManager.get().post(new StorageEvent(walletId, TimedEvent.Action.END, "Done"));
|
||||||
|
ECKey encryptionFullKey = keyDerivationService.getValue();
|
||||||
|
Key key = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
key = new Key(encryptionFullKey.getPrivKeyBytes(), getWalletForm().getStorage().getKeyDeriver().getSalt(), EncryptionType.Deriver.ARGON2);
|
||||||
|
copy.decrypt(key);
|
||||||
|
showSuccessDialog("Wallet Seed", copy.getKeystores().get(0).getSeed().getMnemonicString().asString());
|
||||||
|
} finally {
|
||||||
|
encryptionFullKey.clear();
|
||||||
|
if(key != null) {
|
||||||
|
key.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
keyDerivationService.setOnFailed(workerStateEvent -> {
|
||||||
|
EventManager.get().post(new StorageEvent(walletId, TimedEvent.Action.END, "Failed"));
|
||||||
|
if(keyDerivationService.getException() instanceof InvalidPasswordException) {
|
||||||
|
showErrorDialog("Invalid Password", "The wallet password was invalid.");
|
||||||
|
} else {
|
||||||
|
log.error("Error deriving wallet key", keyDerivationService.getException());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
EventManager.get().post(new StorageEvent(walletId, TimedEvent.Action.START, "Decrypting wallet..."));
|
||||||
|
keyDerivationService.start();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
showSuccessDialog("Wallet Seed", wallet.getKeystores().get(0).getSeed().getMnemonicString().asString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void saveWallet(boolean changePassword, boolean suggestChangePassword) {
|
private void saveWallet(boolean changePassword, boolean suggestChangePassword) {
|
||||||
WalletForm walletForm = getWalletForm();
|
WalletForm walletForm = getWalletForm();
|
||||||
ECKey existingPubKey = walletForm.getStorage().getEncryptionPubKey();
|
ECKey existingPubKey = walletForm.getStorage().getEncryptionPubKey();
|
||||||
|
|
Loading…
Reference in a new issue