]> nmode's Git Repositories - signal-cli/blobdiff - src/main/java/org/asamk/signal/jsonrpc/SignalJsonRpcCommandHandler.java
Show better error message when receiving an empty JSON RPC line
[signal-cli] / src / main / java / org / asamk / signal / jsonrpc / SignalJsonRpcCommandHandler.java
index 0f6a00bd6f323699ad0539c5838bad61e1186ae1..48eb4a450390e2baaf5cc48663d0847044f3be1c 100644 (file)
@@ -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.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;
 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 {
 
 
 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 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;
 
     private final Manager m;
     private final MultiAccountManager c;
@@ -52,8 +55,10 @@ public class SignalJsonRpcCommandHandler {
         this.commandProvider = commandProvider;
     }
 
         this.commandProvider = commandProvider;
     }
 
-    JsonNode handleRequest(
-            final ObjectMapper objectMapper, final String method, ContainerNode<?> params
+    public JsonNode handleRequest(
+            final ObjectMapper objectMapper,
+            final String method,
+            ContainerNode<?> params
     ) throws JsonRpcException {
         var command = getCommand(method);
         if (c != null) {
     ) throws JsonRpcException {
         var command = getCommand(method);
         if (c != null) {
@@ -87,7 +92,13 @@ public class SignalJsonRpcCommandHandler {
                 return runCommand(objectMapper, params, new CommandRunnerImpl<>(m, jsonRpcCommand));
             }
 
                 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 {
             if (manager != null) {
                 return runCommand(objectMapper, params, new CommandRunnerImpl<>(manager, jsonRpcCommand));
             } else {
@@ -188,7 +199,9 @@ public class SignalJsonRpcCommandHandler {
     }
 
     private JsonNode runCommand(
     }
 
     private JsonNode runCommand(
-            final ObjectMapper objectMapper, final ContainerNode<?> params, final CommandRunner<?> command
+            final ObjectMapper objectMapper,
+            final ContainerNode<?> params,
+            final CommandRunner<?> command
     ) throws JsonRpcException {
         final Object[] result = {null};
         final JsonWriter commandJsonWriter = s -> {
     ) throws JsonRpcException {
         final Object[] result = {null};
         final JsonWriter commandJsonWriter = s -> {
@@ -205,22 +218,32 @@ public class SignalJsonRpcCommandHandler {
             throw new JsonRpcException(new JsonRpcResponse.Error(JsonRpcResponse.Error.INVALID_REQUEST,
                     e.getMessage(),
                     null));
             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,
         } 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)));
         }
 
                     getErrorDataNode(objectMapper, result)));
         }