X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/4a1af0786c938f887a109a17dcc879da21704a8b..b7005884fdcfa8d95f54e557ddbf2fe4201962f8:/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 112bc5a9..c4e9775a 100644 --- a/src/main/java/org/asamk/signal/jsonrpc/SignalJsonRpcDispatcherHandler.java +++ b/src/main/java/org/asamk/signal/jsonrpc/SignalJsonRpcDispatcherHandler.java @@ -13,6 +13,7 @@ import org.asamk.signal.JsonWriter; import org.asamk.signal.commands.Command; import org.asamk.signal.commands.Commands; import org.asamk.signal.commands.JsonRpcMultiCommand; +import org.asamk.signal.commands.JsonRpcRegistrationCommand; import org.asamk.signal.commands.JsonRpcSingleCommand; import org.asamk.signal.commands.exceptions.CommandException; import org.asamk.signal.commands.exceptions.IOErrorException; @@ -20,6 +21,7 @@ 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.manager.RegistrationManager; import org.asamk.signal.util.Util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -120,11 +122,25 @@ public class SignalJsonRpcDispatcherHandler { final ObjectMapper objectMapper, final String method, ContainerNode params ) throws JsonRpcException { var command = getCommand(method); - // TODO implement register, verify, link if (c != null) { if (command instanceof JsonRpcMultiCommand jsonRpcCommand) { return runCommand(objectMapper, params, new MultiCommandRunnerImpl<>(c, jsonRpcCommand)); } + if (command instanceof JsonRpcRegistrationCommand jsonRpcCommand) { + try (var manager = getRegistrationManagerFromParams(params)) { + if (manager != null) { + return runCommand(objectMapper, + params, + new RegistrationCommandRunnerImpl<>(manager, c, jsonRpcCommand)); + } else { + throw new JsonRpcException(new JsonRpcResponse.Error(JsonRpcResponse.Error.INVALID_PARAMS, + "Method requires valid account parameter", + null)); + } + } catch (IOException e) { + logger.warn("Failed to close registration manager", e); + } + } } if (command instanceof JsonRpcSingleCommand jsonRpcCommand) { if (m != null) { @@ -147,7 +163,7 @@ public class SignalJsonRpcDispatcherHandler { } private Manager getManagerFromParams(final ContainerNode params) { - if (params.has("account")) { + if (params != null && params.has("account")) { final var manager = c.getManager(params.get("account").asText()); ((ObjectNode) params).remove("account"); return manager; @@ -155,6 +171,20 @@ public class SignalJsonRpcDispatcherHandler { return null; } + private RegistrationManager getRegistrationManagerFromParams(final ContainerNode params) { + if (params != null && params.has("account")) { + try { + final var registrationManager = c.getNewRegistrationManager(params.get("account").asText()); + ((ObjectNode) params).remove("account"); + return registrationManager; + } catch (IOException | IllegalStateException e) { + logger.warn("Failed to load registration manager", e); + return null; + } + } + return null; + } + private Command getCommand(final String method) { if ("subscribeReceive".equals(method)) { return new SubscribeReceiveCommand(); @@ -178,6 +208,21 @@ public class SignalJsonRpcDispatcherHandler { } } + private record RegistrationCommandRunnerImpl( + RegistrationManager m, MultiAccountManager c, JsonRpcRegistrationCommand 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 {