mirror of
https://github.com/sparrowwallet/sparrow.git
synced 2024-12-24 20:56:45 +00:00
pass psbt and message to hwi on stdin to avoid too long process arguments
This commit is contained in:
parent
548b8d270b
commit
7f2d72ee59
1 changed files with 47 additions and 11 deletions
|
@ -179,9 +179,9 @@ public class Hwi {
|
||||||
isPromptActive = true;
|
isPromptActive = true;
|
||||||
String output;
|
String output;
|
||||||
if(passphrase != null && !passphrase.isEmpty() && device.getModel().externalPassphraseEntry()) {
|
if(passphrase != null && !passphrase.isEmpty() && device.getModel().externalPassphraseEntry()) {
|
||||||
output = execute(getDeviceCommand(device, passphrase, Command.SIGN_MESSAGE, message, derivationPath));
|
output = execute(getDeviceArguments(device, passphrase, Command.SIGN_MESSAGE), Command.SIGN_MESSAGE, message, derivationPath);
|
||||||
} else {
|
} else {
|
||||||
output = execute(getDeviceCommand(device, Command.SIGN_MESSAGE, message, derivationPath));
|
output = execute(getDeviceArguments(device, Command.SIGN_MESSAGE), Command.SIGN_MESSAGE, message, derivationPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
JsonObject result = JsonParser.parseString(output).getAsJsonObject();
|
JsonObject result = JsonParser.parseString(output).getAsJsonObject();
|
||||||
|
@ -209,9 +209,9 @@ public class Hwi {
|
||||||
isPromptActive = true;
|
isPromptActive = true;
|
||||||
String output;
|
String output;
|
||||||
if(passphrase != null && !passphrase.isEmpty() && device.getModel().externalPassphraseEntry()) {
|
if(passphrase != null && !passphrase.isEmpty() && device.getModel().externalPassphraseEntry()) {
|
||||||
output = execute(getDeviceCommand(device, passphrase, Command.SIGN_TX, psbtBase64));
|
output = execute(getDeviceArguments(device, passphrase, Command.SIGN_TX), Command.SIGN_TX, psbtBase64);
|
||||||
} else {
|
} else {
|
||||||
output = execute(getDeviceCommand(device, Command.SIGN_TX, psbtBase64));
|
output = execute(getDeviceArguments(device, Command.SIGN_TX), Command.SIGN_TX, psbtBase64);
|
||||||
}
|
}
|
||||||
|
|
||||||
JsonObject result = JsonParser.parseString(output).getAsJsonObject();
|
JsonObject result = JsonParser.parseString(output).getAsJsonObject();
|
||||||
|
@ -242,7 +242,31 @@ public class Hwi {
|
||||||
private String execute(List<String> command) throws IOException {
|
private String execute(List<String> command) throws IOException {
|
||||||
ProcessBuilder processBuilder = new ProcessBuilder(command);
|
ProcessBuilder processBuilder = new ProcessBuilder(command);
|
||||||
Process process = processBuilder.start();
|
Process process = processBuilder.start();
|
||||||
return CharStreams.toString(new InputStreamReader(process.getInputStream(), StandardCharsets.UTF_8));
|
try(InputStreamReader reader = new InputStreamReader(process.getInputStream(), StandardCharsets.UTF_8)) {
|
||||||
|
return CharStreams.toString(reader);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String execute(List<String> arguments, Command command, String... commandArguments) throws IOException {
|
||||||
|
List<String> processArguments = new ArrayList<>(arguments);
|
||||||
|
processArguments.add("--stdin");
|
||||||
|
|
||||||
|
ProcessBuilder processBuilder = new ProcessBuilder(processArguments);
|
||||||
|
Process process = processBuilder.start();
|
||||||
|
|
||||||
|
try(BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream(), StandardCharsets.UTF_8))) {
|
||||||
|
writer.write(command.toString());
|
||||||
|
for(String commandArgument : commandArguments) {
|
||||||
|
writer.write(" \"");
|
||||||
|
writer.write(commandArgument.replace("\\", "\\\\").replace("\"", "\\\""));
|
||||||
|
writer.write("\"");
|
||||||
|
}
|
||||||
|
writer.flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
try(InputStreamReader reader = new InputStreamReader(process.getInputStream(), StandardCharsets.UTF_8)) {
|
||||||
|
return CharStreams.toString(reader);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized File getHwiExecutable(Command command) {
|
private synchronized File getHwiExecutable(Command command) {
|
||||||
|
@ -400,30 +424,42 @@ public class Hwi {
|
||||||
return result.get("success").getAsBoolean();
|
return result.get("success").getAsBoolean();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private List<String> getDeviceArguments(Device device, Command command) throws IOException {
|
||||||
|
List<String> elements = new ArrayList<>(List.of(getHwiExecutable(command).getAbsolutePath(), "--device-path", device.getPath(), "--device-type", device.getType()));
|
||||||
|
addChainType(elements, false);
|
||||||
|
return elements;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<String> getDeviceArguments(Device device, String passphrase, Command command) throws IOException {
|
||||||
|
List<String> elements = new ArrayList<>(List.of(getHwiExecutable(command).getAbsolutePath(), "--device-path", device.getPath(), "--device-type", device.getType(), "--password", escape(passphrase)));
|
||||||
|
addChainType(elements, false);
|
||||||
|
return elements;
|
||||||
|
}
|
||||||
|
|
||||||
private List<String> getDeviceCommand(Device device, Command command) throws IOException {
|
private List<String> getDeviceCommand(Device device, Command command) throws IOException {
|
||||||
List<String> elements = new ArrayList<>(List.of(getHwiExecutable(command).getAbsolutePath(), "--device-path", device.getPath(), "--device-type", device.getType(), command.toString()));
|
List<String> elements = new ArrayList<>(List.of(getHwiExecutable(command).getAbsolutePath(), "--device-path", device.getPath(), "--device-type", device.getType(), command.toString()));
|
||||||
addChainType(elements);
|
addChainType(elements, true);
|
||||||
return elements;
|
return elements;
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<String> getDeviceCommand(Device device, Command command, String... commandData) throws IOException {
|
private List<String> getDeviceCommand(Device device, Command command, String... commandData) throws IOException {
|
||||||
List<String> elements = new ArrayList<>(List.of(getHwiExecutable(command).getAbsolutePath(), "--device-path", device.getPath(), "--device-type", device.getType(), command.toString()));
|
List<String> elements = new ArrayList<>(List.of(getHwiExecutable(command).getAbsolutePath(), "--device-path", device.getPath(), "--device-type", device.getType(), command.toString()));
|
||||||
addChainType(elements);
|
addChainType(elements, true);
|
||||||
elements.addAll(Arrays.stream(commandData).filter(Objects::nonNull).collect(Collectors.toList()));
|
elements.addAll(Arrays.stream(commandData).filter(Objects::nonNull).collect(Collectors.toList()));
|
||||||
return elements;
|
return elements;
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<String> getDeviceCommand(Device device, String passphrase, Command command, String... commandData) throws IOException {
|
private List<String> getDeviceCommand(Device device, String passphrase, Command command, String... commandData) throws IOException {
|
||||||
List<String> elements = new ArrayList<>(List.of(getHwiExecutable(command).getAbsolutePath(), "--device-path", device.getPath(), "--device-type", device.getType(), "--password", escape(passphrase), command.toString()));
|
List<String> elements = new ArrayList<>(List.of(getHwiExecutable(command).getAbsolutePath(), "--device-path", device.getPath(), "--device-type", device.getType(), "--password", escape(passphrase), command.toString()));
|
||||||
addChainType(elements);
|
addChainType(elements, true);
|
||||||
elements.addAll(Arrays.stream(commandData).filter(Objects::nonNull).collect(Collectors.toList()));
|
elements.addAll(Arrays.stream(commandData).filter(Objects::nonNull).collect(Collectors.toList()));
|
||||||
return elements;
|
return elements;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addChainType(List<String> elements) {
|
private void addChainType(List<String> elements, boolean commandPresent) {
|
||||||
if(Network.get() != Network.MAINNET) {
|
if(Network.get() != Network.MAINNET) {
|
||||||
elements.add(elements.size() - 1, "--chain");
|
elements.add(elements.size() - (commandPresent ? 1 : 0), "--chain");
|
||||||
elements.add(elements.size() - 1, getChainName(Network.get()));
|
elements.add(elements.size() - (commandPresent ? 1 : 0), getChainName(Network.get()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue