mirror of
https://github.com/sparrowwallet/sparrow.git
synced 2024-12-25 05:06:45 +00:00
upgrade to hwi 2.2.0, add support for entering empty passphrases to trezor one
This commit is contained in:
parent
5f96570c07
commit
68cd3673af
7 changed files with 32 additions and 9 deletions
|
@ -11,6 +11,7 @@ public class Device {
|
||||||
private Boolean needsPinSent;
|
private Boolean needsPinSent;
|
||||||
private Boolean needsPassphraseSent;
|
private Boolean needsPassphraseSent;
|
||||||
private String fingerprint;
|
private String fingerprint;
|
||||||
|
private String[][] warnings;
|
||||||
private String error;
|
private String error;
|
||||||
|
|
||||||
public String getType() {
|
public String getType() {
|
||||||
|
@ -69,6 +70,20 @@ public class Device {
|
||||||
this.fingerprint = fingerprint;
|
this.fingerprint = fingerprint;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean containsWarning(String warning) {
|
||||||
|
if(warnings != null) {
|
||||||
|
for(String[] warns : warnings) {
|
||||||
|
for(String warn : warns) {
|
||||||
|
if(warn.contains(warning)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public String getError() {
|
public String getError() {
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,7 +34,7 @@ public class Hwi {
|
||||||
private static final Logger log = LoggerFactory.getLogger(Hwi.class);
|
private static final Logger log = LoggerFactory.getLogger(Hwi.class);
|
||||||
private static final String HWI_HOME_DIR = "hwi";
|
private static final String HWI_HOME_DIR = "hwi";
|
||||||
private static final String HWI_VERSION_PREFIX = "hwi-";
|
private static final String HWI_VERSION_PREFIX = "hwi-";
|
||||||
private static final String HWI_VERSION = "2.1.1";
|
private static final String HWI_VERSION = "2.2.0";
|
||||||
private static final String HWI_VERSION_DIR = HWI_VERSION_PREFIX + HWI_VERSION;
|
private static final String HWI_VERSION_DIR = HWI_VERSION_PREFIX + HWI_VERSION;
|
||||||
|
|
||||||
private static boolean isPromptActive = false;
|
private static boolean isPromptActive = false;
|
||||||
|
@ -43,18 +43,26 @@ public class Hwi {
|
||||||
String output = null;
|
String output = null;
|
||||||
try {
|
try {
|
||||||
List<String> command;
|
List<String> command;
|
||||||
if(passphrase != null && !passphrase.isEmpty()) {
|
if(passphrase != null) {
|
||||||
command = List.of(getHwiExecutable(Command.ENUMERATE).getAbsolutePath(), "--password", escape(passphrase), Command.ENUMERATE.toString());
|
command = new ArrayList<>(List.of(getHwiExecutable(Command.ENUMERATE).getAbsolutePath(), "--password", escape(passphrase), Command.ENUMERATE.toString()));
|
||||||
} else {
|
} else {
|
||||||
command = List.of(getHwiExecutable(Command.ENUMERATE).getAbsolutePath(), Command.ENUMERATE.toString());
|
command = new ArrayList<>(List.of(getHwiExecutable(Command.ENUMERATE).getAbsolutePath(), Command.ENUMERATE.toString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
addChainType(command, true);
|
||||||
|
|
||||||
isPromptActive = true;
|
isPromptActive = true;
|
||||||
output = execute(command);
|
output = execute(command);
|
||||||
Device[] devices = getGson().fromJson(output, Device[].class);
|
Device[] devices = getGson().fromJson(output, Device[].class);
|
||||||
if(devices == null) {
|
if(devices == null) {
|
||||||
throw new ImportException("Error scanning, check devices are ready");
|
throw new ImportException("Error scanning, check devices are ready");
|
||||||
}
|
}
|
||||||
|
//Restore previous (pre v2.2.0) behaviour for Trezor One - don't default to an empty passphrase if one is not supplied
|
||||||
|
Arrays.stream(devices).filter(device -> device.containsWarning("Using default passphrase of the empty string")).forEach(device -> {
|
||||||
|
device.setFingerprint(null);
|
||||||
|
device.setNeedsPassphraseSent(true);
|
||||||
|
device.setError("Passphrase needs to be specified before the fingerprint information can be retrieved");
|
||||||
|
});
|
||||||
return Arrays.stream(devices).filter(device -> device != null && device.getModel() != null).collect(Collectors.toList());
|
return Arrays.stream(devices).filter(device -> device != null && device.getModel() != null).collect(Collectors.toList());
|
||||||
} catch(IOException e) {
|
} catch(IOException e) {
|
||||||
log.error("Error executing " + HWI_VERSION_DIR, e);
|
log.error("Error executing " + HWI_VERSION_DIR, e);
|
||||||
|
@ -67,7 +75,7 @@ public class Hwi {
|
||||||
throw new ImportException(error.getAsString());
|
throw new ImportException(error.getAsString());
|
||||||
} catch(Exception ex) {
|
} catch(Exception ex) {
|
||||||
log.error("Error parsing JSON: " + output, e);
|
log.error("Error parsing JSON: " + output, e);
|
||||||
throw new ImportException("Error parsing JSON: " + output, e);
|
throw new ImportException("Error scanning" + (output.isEmpty() ? ", check devices are ready" : ": " + output), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
throw e;
|
throw e;
|
||||||
|
@ -118,7 +126,7 @@ public class Hwi {
|
||||||
public String getXpub(Device device, String passphrase, String derivationPath) throws ImportException {
|
public String getXpub(Device device, String passphrase, String derivationPath) throws ImportException {
|
||||||
try {
|
try {
|
||||||
String output;
|
String output;
|
||||||
if(passphrase != null && !passphrase.isEmpty() && device.getModel().externalPassphraseEntry()) {
|
if(passphrase != null && device.getModel().externalPassphraseEntry()) {
|
||||||
output = execute(getDeviceCommand(device, passphrase, Command.GET_XPUB, derivationPath));
|
output = execute(getDeviceCommand(device, passphrase, Command.GET_XPUB, derivationPath));
|
||||||
} else {
|
} else {
|
||||||
output = execute(getDeviceCommand(device, Command.GET_XPUB, derivationPath));
|
output = execute(getDeviceCommand(device, Command.GET_XPUB, derivationPath));
|
||||||
|
@ -151,7 +159,7 @@ public class Hwi {
|
||||||
|
|
||||||
isPromptActive = true;
|
isPromptActive = true;
|
||||||
String output;
|
String output;
|
||||||
if(passphrase != null && !passphrase.isEmpty() && device.getModel().externalPassphraseEntry()) {
|
if(passphrase != null && device.getModel().externalPassphraseEntry()) {
|
||||||
output = execute(getDeviceCommand(device, passphrase, Command.DISPLAY_ADDRESS, "--desc", descriptor));
|
output = execute(getDeviceCommand(device, passphrase, Command.DISPLAY_ADDRESS, "--desc", descriptor));
|
||||||
} else {
|
} else {
|
||||||
output = execute(getDeviceCommand(device, Command.DISPLAY_ADDRESS, "--desc", descriptor));
|
output = execute(getDeviceCommand(device, Command.DISPLAY_ADDRESS, "--desc", descriptor));
|
||||||
|
@ -179,7 +187,7 @@ public class Hwi {
|
||||||
try {
|
try {
|
||||||
isPromptActive = true;
|
isPromptActive = true;
|
||||||
String output;
|
String output;
|
||||||
if(passphrase != null && !passphrase.isEmpty() && device.getModel().externalPassphraseEntry()) {
|
if(passphrase != null && device.getModel().externalPassphraseEntry()) {
|
||||||
output = execute(getDeviceArguments(device, passphrase, Command.SIGN_MESSAGE), Command.SIGN_MESSAGE, message, derivationPath);
|
output = execute(getDeviceArguments(device, passphrase, Command.SIGN_MESSAGE), Command.SIGN_MESSAGE, message, derivationPath);
|
||||||
} else {
|
} else {
|
||||||
output = execute(getDeviceArguments(device, Command.SIGN_MESSAGE), Command.SIGN_MESSAGE, message, derivationPath);
|
output = execute(getDeviceArguments(device, Command.SIGN_MESSAGE), Command.SIGN_MESSAGE, message, derivationPath);
|
||||||
|
@ -209,7 +217,7 @@ public class Hwi {
|
||||||
|
|
||||||
isPromptActive = true;
|
isPromptActive = true;
|
||||||
String output;
|
String output;
|
||||||
if(passphrase != null && !passphrase.isEmpty() && device.getModel().externalPassphraseEntry()) {
|
if(passphrase != null && device.getModel().externalPassphraseEntry()) {
|
||||||
output = execute(getDeviceArguments(device, passphrase, Command.SIGN_TX), Command.SIGN_TX, psbtBase64);
|
output = execute(getDeviceArguments(device, passphrase, Command.SIGN_TX), Command.SIGN_TX, psbtBase64);
|
||||||
} else {
|
} else {
|
||||||
output = execute(getDeviceArguments(device, Command.SIGN_TX), Command.SIGN_TX, psbtBase64);
|
output = execute(getDeviceArguments(device, Command.SIGN_TX), Command.SIGN_TX, psbtBase64);
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
src/main/resources/native/osx/x64/hwi-2.1.1-mac-amd64-signed.zip → src/main/resources/native/osx/x64/hwi-2.2.0-mac-amd64-signed.zip
Executable file → Normal file
BIN
src/main/resources/native/osx/x64/hwi-2.1.1-mac-amd64-signed.zip → src/main/resources/native/osx/x64/hwi-2.2.0-mac-amd64-signed.zip
Executable file → Normal file
Binary file not shown.
Binary file not shown.
Loading…
Reference in a new issue