]> nmode's Git Repositories - signal-cli/commitdiff
Use exit 4 when sending a single recipient message fails due to untrusted identity key
authorAsamK <asamk@gmx.de>
Sat, 16 Jan 2021 14:38:38 +0000 (15:38 +0100)
committerAsamK <asamk@gmx.de>
Sat, 16 Jan 2021 14:38:38 +0000 (15:38 +0100)
Fixes #88

man/signal-cli.1.adoc
src/main/java/org/asamk/Signal.java
src/main/java/org/asamk/signal/commands/SendCommand.java
src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java
src/main/java/org/asamk/signal/manager/Manager.java
src/main/java/org/asamk/signal/util/ErrorUtils.java

index 3ae54ff00133c1dcc98e46ccd2c7ea75c8049c09..16b684eaabb50ca2252a9f42862732d624bf14d9 100644 (file)
@@ -404,6 +404,7 @@ signal-cli -u USERNAME trust -a NUMBER
 * *1*: Error is probably caused and fixable by the user
 * *2*: Some unexpected error
 * *3*: Server or IO error
 * *1*: Error is probably caused and fixable by the user
 * *2*: Some unexpected error
 * *3*: Server or IO error
+* *4*: Sending failed due to untrusted key
 
 == Files
 
 
 == Files
 
index 16aec7c90b6b23d92e7d7418782c5b923245bec9..7f5d54d67df80d974a38b636639facd58b4621de 100644 (file)
@@ -15,21 +15,21 @@ public interface Signal extends DBusInterface {
 
     long sendMessage(
             String message, List<String> attachments, String recipient
 
     long sendMessage(
             String message, List<String> attachments, String recipient
-    ) throws Error.AttachmentInvalid, Error.Failure, Error.InvalidNumber;
+    ) throws Error.AttachmentInvalid, Error.Failure, Error.InvalidNumber, Error.UntrustedIdentity;
 
     long sendMessage(
             String message, List<String> attachments, List<String> recipients
 
     long sendMessage(
             String message, List<String> attachments, List<String> recipients
-    ) throws Error.AttachmentInvalid, Error.Failure, Error.InvalidNumber, Error.UnregisteredUser, Error.UntrustedIdentity;
+    ) throws Error.AttachmentInvalid, Error.Failure, Error.InvalidNumber, Error.UntrustedIdentity;
 
     long sendNoteToSelfMessage(
             String message, List<String> attachments
 
     long sendNoteToSelfMessage(
             String message, List<String> attachments
-    ) throws Error.AttachmentInvalid, Error.Failure, Error.UnregisteredUser, Error.UntrustedIdentity;
+    ) throws Error.AttachmentInvalid, Error.Failure;
 
 
-    void sendEndSessionMessage(List<String> recipients) throws Error.Failure, Error.InvalidNumber, Error.UnregisteredUser, Error.UntrustedIdentity;
+    void sendEndSessionMessage(List<String> recipients) throws Error.Failure, Error.InvalidNumber, Error.UntrustedIdentity;
 
     long sendGroupMessage(
             String message, List<String> attachments, byte[] groupId
 
     long sendGroupMessage(
             String message, List<String> attachments, byte[] groupId
-    ) throws Error.GroupNotFound, Error.Failure, Error.AttachmentInvalid, Error.UnregisteredUser, Error.UntrustedIdentity;
+    ) throws Error.GroupNotFound, Error.Failure, Error.AttachmentInvalid;
 
     String getContactName(String number) throws Error.InvalidNumber;
 
 
     String getContactName(String number) throws Error.InvalidNumber;
 
@@ -47,7 +47,7 @@ public interface Signal extends DBusInterface {
 
     byte[] updateGroup(
             byte[] groupId, String name, List<String> members, String avatar
 
     byte[] updateGroup(
             byte[] groupId, String name, List<String> members, String avatar
-    ) throws Error.AttachmentInvalid, Error.Failure, Error.InvalidNumber, Error.GroupNotFound, Error.UnregisteredUser, Error.UntrustedIdentity;
+    ) throws Error.AttachmentInvalid, Error.Failure, Error.InvalidNumber, Error.GroupNotFound;
 
     boolean isRegistered();
 
 
     boolean isRegistered();
 
@@ -198,13 +198,6 @@ public interface Signal extends DBusInterface {
             }
         }
 
             }
         }
 
-        class UnregisteredUser extends DBusExecutionException {
-
-            public UnregisteredUser(final String message) {
-                super(message);
-            }
-        }
-
         class UntrustedIdentity extends DBusExecutionException {
 
             public UntrustedIdentity(final String message) {
         class UntrustedIdentity extends DBusExecutionException {
 
             public UntrustedIdentity(final String message) {
index 6d806abccd041cc8e11475e466fd43b3c86bdbc3..73d8f2ed35b8346575a419765a4e718e7de86482 100644 (file)
@@ -66,6 +66,9 @@ public class SendCommand implements DbusCommand {
             } catch (AssertionError e) {
                 handleAssertionError(e);
                 return 1;
             } catch (AssertionError e) {
                 handleAssertionError(e);
                 return 1;
+            } catch (Signal.Error.UntrustedIdentity e) {
+                System.err.println("Failed to send message: " + e.getMessage());
+                return 4;
             } catch (DBusExecutionException e) {
                 System.err.println("Failed to send message: " + e.getMessage());
                 return 2;
             } catch (DBusExecutionException e) {
                 System.err.println("Failed to send message: " + e.getMessage());
                 return 2;
@@ -118,6 +121,9 @@ public class SendCommand implements DbusCommand {
             } catch (AssertionError e) {
                 handleAssertionError(e);
                 return 1;
             } catch (AssertionError e) {
                 handleAssertionError(e);
                 return 1;
+            } catch (Signal.Error.UntrustedIdentity e) {
+                System.err.println("Failed to send message: " + e.getMessage());
+                return 4;
             } catch (DBusExecutionException e) {
                 System.err.println("Failed to send note to self message: " + e.getMessage());
                 return 2;
             } catch (DBusExecutionException e) {
                 System.err.println("Failed to send note to self message: " + e.getMessage());
                 return 2;
@@ -134,6 +140,9 @@ public class SendCommand implements DbusCommand {
         } catch (UnknownObject e) {
             System.err.println("Failed to find dbus object, maybe missing the -u flag: " + e.getMessage());
             return 1;
         } catch (UnknownObject e) {
             System.err.println("Failed to find dbus object, maybe missing the -u flag: " + e.getMessage());
             return 1;
+        } catch (Signal.Error.UntrustedIdentity e) {
+            System.err.println("Failed to send message: " + e.getMessage());
+            return 4;
         } catch (DBusExecutionException e) {
             System.err.println("Failed to send message: " + e.getMessage());
             return 2;
         } catch (DBusExecutionException e) {
             System.err.println("Failed to send message: " + e.getMessage());
             return 2;
index 773414919b150fc1a649218455f3cefd45432e13..a2f6cace9933b95685dc0bf6de5c9296798a695d 100644 (file)
@@ -45,9 +45,30 @@ public class DbusSignalImpl implements Signal {
         return sendMessage(message, attachments, recipients);
     }
 
         return sendMessage(message, attachments, recipients);
     }
 
+    private static void checkSendMessageResult(long timestamp, SendMessageResult result) throws DBusExecutionException {
+        String error = ErrorUtils.getErrorMessageFromSendMessageResult(result);
+
+        if (error == null) {
+            return;
+        }
+
+        final String message = timestamp + "\nFailed to send message:\n" + error + '\n';
+
+        if (result.getIdentityFailure() != null) {
+            throw new Error.UntrustedIdentity(message);
+        } else {
+            throw new Error.Failure(message);
+        }
+    }
+
     private static void checkSendMessageResults(
             long timestamp, List<SendMessageResult> results
     ) throws DBusExecutionException {
     private static void checkSendMessageResults(
             long timestamp, List<SendMessageResult> results
     ) throws DBusExecutionException {
+        if (results.size() == 1) {
+            checkSendMessageResult(timestamp, results.get(0));
+            return;
+        }
+
         List<String> errors = ErrorUtils.getErrorMessagesFromSendMessageResults(results);
         if (errors.size() == 0) {
             return;
         List<String> errors = ErrorUtils.getErrorMessagesFromSendMessageResults(results);
         if (errors.size() == 0) {
             return;
@@ -81,10 +102,10 @@ public class DbusSignalImpl implements Signal {
     @Override
     public long sendNoteToSelfMessage(
             final String message, final List<String> attachments
     @Override
     public long sendNoteToSelfMessage(
             final String message, final List<String> attachments
-    ) throws Error.AttachmentInvalid, Error.Failure, Error.UnregisteredUser, Error.UntrustedIdentity {
+    ) throws Error.AttachmentInvalid, Error.Failure, Error.UntrustedIdentity {
         try {
         try {
-            final Pair<Long, List<SendMessageResult>> results = m.sendSelfMessage(message, attachments);
-            checkSendMessageResults(results.first(), results.second());
+            final Pair<Long, SendMessageResult> results = m.sendSelfMessage(message, attachments);
+            checkSendMessageResult(results.first(), results.second());
             return results.first();
         } catch (AttachmentInvalidException e) {
             throw new Error.AttachmentInvalid(e.getMessage());
             return results.first();
         } catch (AttachmentInvalidException e) {
             throw new Error.AttachmentInvalid(e.getMessage());
index 38c4375313da3536b59bfc8bb2af005faf91966e..3c352cd475d46f5ec730c7576a530dff6c51759e 100644 (file)
@@ -953,7 +953,7 @@ public class Manager implements Closeable {
         return sendMessage(messageBuilder, getSignalServiceAddresses(recipients));
     }
 
         return sendMessage(messageBuilder, getSignalServiceAddresses(recipients));
     }
 
-    public Pair<Long, List<SendMessageResult>> sendSelfMessage(
+    public Pair<Long, SendMessageResult> sendSelfMessage(
             String messageText, List<String> attachments
     ) throws IOException, AttachmentInvalidException {
         final SignalServiceDataMessage.Builder messageBuilder = SignalServiceDataMessage.newBuilder()
             String messageText, List<String> attachments
     ) throws IOException, AttachmentInvalidException {
         final SignalServiceDataMessage.Builder messageBuilder = SignalServiceDataMessage.newBuilder()
@@ -1278,7 +1278,7 @@ public class Manager implements Closeable {
         }
     }
 
         }
     }
 
-    private Pair<Long, List<SendMessageResult>> sendSelfMessage(
+    private Pair<Long, SendMessageResult> sendSelfMessage(
             SignalServiceDataMessage.Builder messageBuilder
     ) throws IOException {
         final long timestamp = System.currentTimeMillis();
             SignalServiceDataMessage.Builder messageBuilder
     ) throws IOException {
         final long timestamp = System.currentTimeMillis();
@@ -1294,7 +1294,7 @@ public class Manager implements Closeable {
 
             SignalServiceDataMessage message = messageBuilder.build();
             final SendMessageResult result = sendSelfMessage(message);
 
             SignalServiceDataMessage message = messageBuilder.build();
             final SendMessageResult result = sendSelfMessage(message);
-            return new Pair<>(timestamp, List.of(result));
+            return new Pair<>(timestamp, result);
         } finally {
             account.save();
         }
         } finally {
             account.save();
         }
index e9553f98e8f5760cba9cf9470dcb5adbaf31e29e..f7115ea97aa1d787a9257e9d428b6455bfcb8a79 100644 (file)
@@ -33,18 +33,26 @@ public class ErrorUtils {
     public static List<String> getErrorMessagesFromSendMessageResults(List<SendMessageResult> results) {
         List<String> errors = new ArrayList<>();
         for (SendMessageResult result : results) {
     public static List<String> getErrorMessagesFromSendMessageResults(List<SendMessageResult> results) {
         List<String> errors = new ArrayList<>();
         for (SendMessageResult result : results) {
-            if (result.isNetworkFailure()) {
-                errors.add(String.format("Network failure for \"%s\"", result.getAddress().getLegacyIdentifier()));
-            } else if (result.isUnregisteredFailure()) {
-                errors.add(String.format("Unregistered user \"%s\"", result.getAddress().getLegacyIdentifier()));
-            } else if (result.getIdentityFailure() != null) {
-                errors.add(String.format("Untrusted Identity for \"%s\"", result.getAddress().getLegacyIdentifier()));
+            String error = getErrorMessageFromSendMessageResult(result);
+            if (error != null) {
+                errors.add(error);
             }
         }
 
         return errors;
     }
 
             }
         }
 
         return errors;
     }
 
+    public static String getErrorMessageFromSendMessageResult(SendMessageResult result) {
+        if (result.isNetworkFailure()) {
+            return String.format("Network failure for \"%s\"", result.getAddress().getLegacyIdentifier());
+        } else if (result.isUnregisteredFailure()) {
+            return String.format("Unregistered user \"%s\"", result.getAddress().getLegacyIdentifier());
+        } else if (result.getIdentityFailure() != null) {
+            return String.format("Untrusted Identity for \"%s\"", result.getAddress().getLegacyIdentifier());
+        }
+        return null;
+    }
+
     private static int handleSendMessageResultErrors(List<String> errors) {
         if (errors.size() == 0) {
             return 0;
     private static int handleSendMessageResultErrors(List<String> errors) {
         if (errors.size() == 0) {
             return 0;