X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/ae678871ec976f2bcf1cee969e555ca00239f7d8..eac2a47163a07c2553fee8a0cfcdf3f1e6adafd2:/src/main/java/org/asamk/signal/jsonrpc/SignalJsonRpcCommandHandler.java diff --git a/src/main/java/org/asamk/signal/jsonrpc/SignalJsonRpcCommandHandler.java b/src/main/java/org/asamk/signal/jsonrpc/SignalJsonRpcCommandHandler.java index 0f6a00bd..96456a4e 100644 --- a/src/main/java/org/asamk/signal/jsonrpc/SignalJsonRpcCommandHandler.java +++ b/src/main/java/org/asamk/signal/jsonrpc/SignalJsonRpcCommandHandler.java @@ -14,6 +14,8 @@ 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; +import org.asamk.signal.commands.exceptions.RateLimitErrorException; +import org.asamk.signal.commands.exceptions.UnexpectedErrorException; import org.asamk.signal.commands.exceptions.UntrustedKeyErrorException; import org.asamk.signal.commands.exceptions.UserErrorException; import org.asamk.signal.manager.Manager; @@ -30,11 +32,12 @@ import java.util.function.Function; public class SignalJsonRpcCommandHandler { - private final static Logger logger = LoggerFactory.getLogger(SignalJsonRpcDispatcherHandler.class); + private static final Logger logger = LoggerFactory.getLogger(SignalJsonRpcDispatcherHandler.class); private static final int USER_ERROR = -1; private static final int IO_ERROR = -3; private static final int UNTRUSTED_KEY_ERROR = -4; + private static final int RATELIMIT_ERROR = -5; private final Manager m; private final MultiAccountManager c; @@ -52,7 +55,7 @@ public class SignalJsonRpcCommandHandler { this.commandProvider = commandProvider; } - JsonNode handleRequest( + public JsonNode handleRequest( final ObjectMapper objectMapper, final String method, ContainerNode params ) throws JsonRpcException { var command = getCommand(method); @@ -87,7 +90,13 @@ public class SignalJsonRpcCommandHandler { return runCommand(objectMapper, params, new CommandRunnerImpl<>(m, jsonRpcCommand)); } - final var manager = getManagerFromParams(params); + var manager = getManagerFromParams(params); + if (manager == null) { + final var managers = c.getManagers(); + if (managers.size() == 1) { + manager = managers.getFirst(); + } + } if (manager != null) { return runCommand(objectMapper, params, new CommandRunnerImpl<>(manager, jsonRpcCommand)); } else { @@ -205,22 +214,32 @@ public class SignalJsonRpcCommandHandler { throw new JsonRpcException(new JsonRpcResponse.Error(JsonRpcResponse.Error.INVALID_REQUEST, e.getMessage(), null)); - } catch (UserErrorException e) { - throw new JsonRpcException(new JsonRpcResponse.Error(USER_ERROR, - e.getMessage(), - getErrorDataNode(objectMapper, result))); - } catch (IOErrorException e) { - throw new JsonRpcException(new JsonRpcResponse.Error(IO_ERROR, - e.getMessage(), - getErrorDataNode(objectMapper, result))); - } catch (UntrustedKeyErrorException e) { - throw new JsonRpcException(new JsonRpcResponse.Error(UNTRUSTED_KEY_ERROR, - e.getMessage(), - getErrorDataNode(objectMapper, result))); + } catch (CommandException ce) { + switch (ce) { + case UserErrorException e -> throw new JsonRpcException(new JsonRpcResponse.Error(USER_ERROR, + e.getMessage(), + getErrorDataNode(objectMapper, result))); + case IOErrorException e -> throw new JsonRpcException(new JsonRpcResponse.Error(IO_ERROR, + e.getMessage(), + getErrorDataNode(objectMapper, result))); + case UntrustedKeyErrorException e -> throw new JsonRpcException(new JsonRpcResponse.Error( + UNTRUSTED_KEY_ERROR, + e.getMessage(), + getErrorDataNode(objectMapper, result))); + case RateLimitErrorException e -> throw new JsonRpcException(new JsonRpcResponse.Error(RATELIMIT_ERROR, + e.getMessage(), + getErrorDataNode(objectMapper, result))); + case UnexpectedErrorException e -> { + logger.error("Command execution failed with unexpected error", e); + throw new JsonRpcException(new JsonRpcResponse.Error(JsonRpcResponse.Error.INTERNAL_ERROR, + e.getMessage() + " (" + e.getClass().getSimpleName() + ")", + getErrorDataNode(objectMapper, result))); + } + } } catch (Throwable e) { logger.error("Command execution failed", e); throw new JsonRpcException(new JsonRpcResponse.Error(JsonRpcResponse.Error.INTERNAL_ERROR, - e.getMessage(), + e.getMessage() + " (" + e.getClass().getSimpleName() + ")", getErrorDataNode(objectMapper, result))); }