X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/81a11dc9776672e3468ee9a8eed556889fb2e070..4a1af0786c938f887a109a17dcc879da21704a8b:/src/main/java/org/asamk/signal/jsonrpc/SignalJsonRpcDispatcherHandler.java diff --git a/src/main/java/org/asamk/signal/jsonrpc/SignalJsonRpcDispatcherHandler.java b/src/main/java/org/asamk/signal/jsonrpc/SignalJsonRpcDispatcherHandler.java index c33cd9a5..112bc5a9 100644 --- a/src/main/java/org/asamk/signal/jsonrpc/SignalJsonRpcDispatcherHandler.java +++ b/src/main/java/org/asamk/signal/jsonrpc/SignalJsonRpcDispatcherHandler.java @@ -6,19 +6,20 @@ import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ContainerNode; +import com.fasterxml.jackson.databind.node.ObjectNode; import org.asamk.signal.JsonReceiveMessageHandler; import org.asamk.signal.JsonWriter; -import org.asamk.signal.OutputWriter; import org.asamk.signal.commands.Command; import org.asamk.signal.commands.Commands; -import org.asamk.signal.commands.JsonRpcCommand; -import org.asamk.signal.commands.SignalCreator; +import org.asamk.signal.commands.JsonRpcMultiCommand; +import org.asamk.signal.commands.JsonRpcSingleCommand; import org.asamk.signal.commands.exceptions.CommandException; import org.asamk.signal.commands.exceptions.IOErrorException; import org.asamk.signal.commands.exceptions.UntrustedKeyErrorException; import org.asamk.signal.commands.exceptions.UserErrorException; import org.asamk.signal.manager.Manager; +import org.asamk.signal.manager.MultiAccountManager; import org.asamk.signal.util.Util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -42,21 +43,21 @@ public class SignalJsonRpcDispatcherHandler { private final JsonRpcReader jsonRpcReader; private final boolean noReceiveOnStart; - private SignalCreator c; + private MultiAccountManager c; private final Map receiveHandlers = new HashMap<>(); private Manager m; public SignalJsonRpcDispatcherHandler( - final JsonWriter outputWriter, final Supplier lineSupplier, final boolean noReceiveOnStart + final JsonWriter jsonWriter, final Supplier lineSupplier, final boolean noReceiveOnStart ) { this.noReceiveOnStart = noReceiveOnStart; this.objectMapper = Util.createJsonObjectMapper(); - this.jsonRpcSender = new JsonRpcSender(outputWriter); + this.jsonRpcSender = new JsonRpcSender(jsonWriter); this.jsonRpcReader = new JsonRpcReader(jsonRpcSender, lineSupplier); } - public void handleConnection(final SignalCreator c) { + public void handleConnection(final MultiAccountManager c) { this.c = c; if (!noReceiveOnStart) { @@ -119,17 +120,20 @@ public class SignalJsonRpcDispatcherHandler { final ObjectMapper objectMapper, final String method, ContainerNode params ) throws JsonRpcException { var command = getCommand(method); - // TODO implement listAccounts, register, verify, link - if (command instanceof JsonRpcCommand jsonRpcCommand) { + // TODO implement register, verify, link + if (c != null) { + if (command instanceof JsonRpcMultiCommand jsonRpcCommand) { + return runCommand(objectMapper, params, new MultiCommandRunnerImpl<>(c, jsonRpcCommand)); + } + } + if (command instanceof JsonRpcSingleCommand jsonRpcCommand) { if (m != null) { return runCommand(objectMapper, params, new CommandRunnerImpl<>(m, jsonRpcCommand)); } - if (params.has("account")) { - Manager manager = c.getManager(params.get("account").asText()); - if (manager != null) { - return runCommand(objectMapper, params, new CommandRunnerImpl<>(manager, jsonRpcCommand)); - } + final var manager = getManagerFromParams(params); + if (manager != null) { + return runCommand(objectMapper, params, new CommandRunnerImpl<>(manager, jsonRpcCommand)); } else { throw new JsonRpcException(new JsonRpcResponse.Error(JsonRpcResponse.Error.INVALID_PARAMS, "Method requires valid account parameter", @@ -142,6 +146,15 @@ public class SignalJsonRpcDispatcherHandler { null)); } + private Manager getManagerFromParams(final ContainerNode params) { + if (params.has("account")) { + final var manager = c.getManager(params.get("account").asText()); + ((ObjectNode) params).remove("account"); + return manager; + } + return null; + } + private Command getCommand(final String method) { if ("subscribeReceive".equals(method)) { return new SubscribeReceiveCommand(); @@ -152,11 +165,26 @@ public class SignalJsonRpcDispatcherHandler { return Commands.getCommand(method); } - private record CommandRunnerImpl(Manager m, JsonRpcCommand command) implements CommandRunner { + private record CommandRunnerImpl(Manager m, JsonRpcSingleCommand command) implements CommandRunner { + + @Override + public void handleCommand(final T request, final JsonWriter jsonWriter) throws CommandException { + command.handleCommand(request, m, jsonWriter); + } + + @Override + public TypeReference getRequestType() { + return command.getRequestType(); + } + } + + private record MultiCommandRunnerImpl( + MultiAccountManager c, JsonRpcMultiCommand command + ) implements CommandRunner { @Override - public void handleCommand(final T request, final OutputWriter outputWriter) throws CommandException { - command.handleCommand(request, m, outputWriter); + public void handleCommand(final T request, final JsonWriter jsonWriter) throws CommandException { + command.handleCommand(request, c, jsonWriter); } @Override @@ -167,7 +195,7 @@ public class SignalJsonRpcDispatcherHandler { interface CommandRunner { - void handleCommand(T request, OutputWriter outputWriter) throws CommandException; + void handleCommand(T request, JsonWriter jsonWriter) throws CommandException; TypeReference getRequestType(); } @@ -176,7 +204,7 @@ public class SignalJsonRpcDispatcherHandler { final ObjectMapper objectMapper, final ContainerNode params, final CommandRunner command ) throws JsonRpcException { final Object[] result = {null}; - final JsonWriter commandOutputWriter = s -> { + final JsonWriter commandJsonWriter = s -> { if (result[0] != null) { throw new AssertionError("Command may only write one json result"); } @@ -185,7 +213,7 @@ public class SignalJsonRpcDispatcherHandler { }; try { - parseParamsAndRunCommand(objectMapper, params, commandOutputWriter, command); + parseParamsAndRunCommand(objectMapper, params, commandJsonWriter, command); } catch (JsonMappingException e) { throw new JsonRpcException(new JsonRpcResponse.Error(JsonRpcResponse.Error.INVALID_REQUEST, e.getMessage(), @@ -210,7 +238,7 @@ public class SignalJsonRpcDispatcherHandler { private void parseParamsAndRunCommand( final ObjectMapper objectMapper, final TreeNode params, - final OutputWriter outputWriter, + final JsonWriter jsonWriter, final CommandRunner command ) throws CommandException, JsonMappingException { T requestParams = null; @@ -224,10 +252,10 @@ public class SignalJsonRpcDispatcherHandler { throw new AssertionError(e); } } - command.handleCommand(requestParams, outputWriter); + command.handleCommand(requestParams, jsonWriter); } - private class SubscribeReceiveCommand implements JsonRpcCommand { + private class SubscribeReceiveCommand implements JsonRpcSingleCommand { @Override public String getName() { @@ -236,13 +264,13 @@ public class SignalJsonRpcDispatcherHandler { @Override public void handleCommand( - final Void request, final Manager m, final OutputWriter outputWriter + final Void request, final Manager m, final JsonWriter jsonWriter ) throws CommandException { subscribeReceive(m); } } - private class UnsubscribeReceiveCommand implements JsonRpcCommand { + private class UnsubscribeReceiveCommand implements JsonRpcSingleCommand { @Override public String getName() { @@ -251,7 +279,7 @@ public class SignalJsonRpcDispatcherHandler { @Override public void handleCommand( - final Void request, final Manager m, final OutputWriter outputWriter + final Void request, final Manager m, final JsonWriter jsonWriter ) throws CommandException { unsubscribeReceive(m); }