mirror of
https://github.com/sparrowwallet/sparrow.git
synced 2026-10-05 19:18:26 +00:00
gate the display address, sign message and keystore discovery panes on a fingerprint resolved after pin entry
This commit is contained in:
+1
-1
Submodule lark updated: 33fbba951e...13001e8acf
@@ -378,11 +378,6 @@ public class DevicePane extends TitledDescriptionPane {
|
|||||||
});
|
});
|
||||||
displayAddressButton.managedProperty().bind(displayAddressButton.visibleProperty());
|
displayAddressButton.managedProperty().bind(displayAddressButton.visibleProperty());
|
||||||
displayAddressButton.setVisible(false);
|
displayAddressButton.setVisible(false);
|
||||||
|
|
||||||
List<String> fingerprints = outputDescriptor.getExtendedPublicKeys().stream().map(extKey -> outputDescriptor.getKeyDerivation(extKey).getMasterFingerprint()).collect(Collectors.toList());
|
|
||||||
if(device.getFingerprint() != null && !fingerprints.contains(device.getFingerprint())) {
|
|
||||||
displayAddressButton.setDisable(true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createSignMessageButton() {
|
private void createSignMessageButton() {
|
||||||
@@ -394,10 +389,6 @@ public class DevicePane extends TitledDescriptionPane {
|
|||||||
});
|
});
|
||||||
signMessageButton.managedProperty().bind(signMessageButton.visibleProperty());
|
signMessageButton.managedProperty().bind(signMessageButton.visibleProperty());
|
||||||
signMessageButton.setVisible(false);
|
signMessageButton.setVisible(false);
|
||||||
|
|
||||||
if(device.getFingerprint() != null && !device.getFingerprint().equals(requiredDerivation.getMasterFingerprint())) {
|
|
||||||
signMessageButton.setDisable(true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createDiscoverKeystoresButton() {
|
private void createDiscoverKeystoresButton() {
|
||||||
@@ -629,11 +620,26 @@ public class DevicePane extends TitledDescriptionPane {
|
|||||||
setPassphraseButton.setDisable(true);
|
setPassphraseButton.setDisable(true);
|
||||||
setContent(getPassphraseEntry());
|
setContent(getPassphraseEntry());
|
||||||
setExpanded(true);
|
setExpanded(true);
|
||||||
|
} else if(device.getFingerprint() == null && (deviceOperation.equals(DeviceOperation.DISPLAY_ADDRESS) || deviceOperation.equals(DeviceOperation.SIGN_MESSAGE)
|
||||||
|
|| deviceOperation.equals(DeviceOperation.DISCOVER_KEYSTORES))) {
|
||||||
|
//A PIN protected device reports no fingerprint until it is unlocked, and these operations gate on it to avoid using the wrong device
|
||||||
|
Hwi.EnumerateService enumerateService = new Hwi.EnumerateService(passphrase.get());
|
||||||
|
enumerateService.setOnSucceeded(enumerateEvent -> {
|
||||||
|
for(Device freshDevice : enumerateService.getValue()) {
|
||||||
|
if(device.getPath().equals(freshDevice.getPath()) && device.getModel().equals(freshDevice.getModel())) {
|
||||||
|
device.setFingerprint(freshDevice.getFingerprint());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
showUnlockedOperation();
|
||||||
|
});
|
||||||
|
enumerateService.setOnFailed(enumerateEvent -> {
|
||||||
|
showUnlockedOperation();
|
||||||
|
setError("Error", enumerateService.getException().getMessage());
|
||||||
|
});
|
||||||
|
enumerateService.start();
|
||||||
} else {
|
} else {
|
||||||
showOperationButton();
|
showUnlockedOperation();
|
||||||
if(!deviceOperation.equals(DeviceOperation.IMPORT)) {
|
|
||||||
setContent(getTogglePassphraseOn());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
setError("Incorrect PIN", null);
|
setError("Incorrect PIN", null);
|
||||||
@@ -652,6 +658,13 @@ public class DevicePane extends TitledDescriptionPane {
|
|||||||
sendPinService.start();
|
sendPinService.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void showUnlockedOperation() {
|
||||||
|
showOperationButton();
|
||||||
|
if(!deviceOperation.equals(DeviceOperation.IMPORT)) {
|
||||||
|
setContent(getTogglePassphraseOn());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void sendPassphrase(String passphrase) {
|
private void sendPassphrase(String passphrase) {
|
||||||
Hwi.EnumerateService enumerateService = new Hwi.EnumerateService(passphrase);
|
Hwi.EnumerateService enumerateService = new Hwi.EnumerateService(passphrase);
|
||||||
enumerateService.setOnSucceeded(workerStateEvent -> {
|
enumerateService.setOnSucceeded(workerStateEvent -> {
|
||||||
@@ -1193,16 +1206,23 @@ public class DevicePane extends TitledDescriptionPane {
|
|||||||
signButton.setVisible(true);
|
signButton.setVisible(true);
|
||||||
showHideLink.setVisible(false);
|
showHideLink.setVisible(false);
|
||||||
} else if(deviceOperation.equals(DeviceOperation.DISPLAY_ADDRESS)) {
|
} else if(deviceOperation.equals(DeviceOperation.DISPLAY_ADDRESS)) {
|
||||||
|
//A device which has not yet been unlocked reports no fingerprint, so this check is only meaningful once the operation button is shown
|
||||||
|
List<String> fingerprints = outputDescriptor.getExtendedPublicKeys().stream().map(extKey -> outputDescriptor.getKeyDerivation(extKey).getMasterFingerprint()).collect(Collectors.toList());
|
||||||
displayAddressButton.setDefaultButton(defaultDevice);
|
displayAddressButton.setDefaultButton(defaultDevice);
|
||||||
displayAddressButton.setVisible(true);
|
displayAddressButton.setVisible(true);
|
||||||
|
displayAddressButton.setDisable(device.getFingerprint() != null && !fingerprints.contains(device.getFingerprint()));
|
||||||
showHideLink.setVisible(false);
|
showHideLink.setVisible(false);
|
||||||
} else if(deviceOperation.equals(DeviceOperation.SIGN_MESSAGE)) {
|
} else if(deviceOperation.equals(DeviceOperation.SIGN_MESSAGE)) {
|
||||||
signMessageButton.setDefaultButton(defaultDevice);
|
signMessageButton.setDefaultButton(defaultDevice);
|
||||||
signMessageButton.setVisible(true);
|
signMessageButton.setVisible(true);
|
||||||
|
signMessageButton.setDisable(device.getFingerprint() != null && !device.getFingerprint().equals(requiredDerivation.getMasterFingerprint()));
|
||||||
showHideLink.setVisible(false);
|
showHideLink.setVisible(false);
|
||||||
} else if(deviceOperation.equals(DeviceOperation.DISCOVER_KEYSTORES)) {
|
} else if(deviceOperation.equals(DeviceOperation.DISCOVER_KEYSTORES)) {
|
||||||
|
//Discovery stamps the wallet master fingerprint on keystores built from the device xpubs, so a mismatched device is silently persisted
|
||||||
discoverKeystoresButton.setDefaultButton(defaultDevice);
|
discoverKeystoresButton.setDefaultButton(defaultDevice);
|
||||||
discoverKeystoresButton.setVisible(true);
|
discoverKeystoresButton.setVisible(true);
|
||||||
|
discoverKeystoresButton.setDisable(device.getFingerprint() != null && wallet.getKeystores().size() == 1
|
||||||
|
&& !device.getFingerprint().equals(wallet.getKeystores().get(0).getKeyDerivation().getMasterFingerprint()));
|
||||||
showHideLink.setVisible(false);
|
showHideLink.setVisible(false);
|
||||||
} else if(deviceOperation.equals(DeviceOperation.GET_PRIVATE_KEY)) {
|
} else if(deviceOperation.equals(DeviceOperation.GET_PRIVATE_KEY)) {
|
||||||
if(defaultDevice) {
|
if(defaultDevice) {
|
||||||
|
|||||||
Reference in New Issue
Block a user