X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/06e9f8ba6403ea83ab3535a3b1eb900f252d8b9d..cd29144e81701698092f3334bee0c99c0f77f202:/src/main/java/org/asamk/signal/ReceiveMessageHandler.java diff --git a/src/main/java/org/asamk/signal/ReceiveMessageHandler.java b/src/main/java/org/asamk/signal/ReceiveMessageHandler.java index e63ce548..200466ae 100644 --- a/src/main/java/org/asamk/signal/ReceiveMessageHandler.java +++ b/src/main/java/org/asamk/signal/ReceiveMessageHandler.java @@ -1,12 +1,13 @@ package org.asamk.signal; import org.asamk.signal.manager.Manager; +import org.asamk.signal.manager.UntrustedIdentityException; +import org.asamk.signal.manager.api.RecipientIdentifier; import org.asamk.signal.manager.groups.GroupId; import org.asamk.signal.manager.groups.GroupUtils; import org.asamk.signal.util.DateUtils; -import org.asamk.signal.util.Util; -import org.signal.libsignal.metadata.ProtocolUntrustedIdentityException; import org.slf4j.helpers.MessageFormatter; +import org.whispersystems.libsignal.protocol.DecryptionErrorMessage; import org.whispersystems.signalservice.api.messages.SignalServiceAttachment; import org.whispersystems.signalservice.api.messages.SignalServiceContent; import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage; @@ -18,29 +19,28 @@ import org.whispersystems.signalservice.api.messages.calls.SignalServiceCallMess import org.whispersystems.signalservice.api.messages.multidevice.SignalServiceSyncMessage; import org.whispersystems.signalservice.api.messages.shared.SharedContact; import org.whispersystems.signalservice.api.push.SignalServiceAddress; -import org.whispersystems.signalservice.api.util.InvalidNumberException; +import java.util.ArrayList; import java.util.Base64; import java.util.stream.Collectors; +import static org.asamk.signal.util.Util.getLegacyIdentifier; + public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler { final Manager m; + final PlainTextWriter writer; - public ReceiveMessageHandler(Manager m) { + public ReceiveMessageHandler(Manager m, final PlainTextWriter writer) { this.m = m; + this.writer = writer; } @Override public void handleMessage(SignalServiceEnvelope envelope, SignalServiceContent content, Throwable exception) { - PlainTextWriter writer = new PlainTextWriterImpl(System.out); - - if (envelope.hasSource()) { + if (envelope.hasSourceUuid()) { var source = envelope.getSourceAddress(); writer.println("Envelope from: {} (device: {})", formatContact(source), envelope.getSourceDevice()); - if (source.getRelay().isPresent()) { - writer.println("Relayed by: {}", source.getRelay().get()); - } } else { writer.println("Envelope from: unknown source"); } @@ -53,20 +53,19 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler { writer.println("Got receipt."); } else if (envelope.isSignalMessage() || envelope.isPreKeySignalMessage() || envelope.isUnidentifiedSender()) { if (exception != null) { - if (exception instanceof ProtocolUntrustedIdentityException) { - var e = (ProtocolUntrustedIdentityException) exception; + if (exception instanceof UntrustedIdentityException e) { writer.println( "The user’s key is untrusted, either the user has reinstalled Signal or a third party sent this message."); - final var recipientName = m.resolveSignalServiceAddress(e.getSender()).getLegacyIdentifier(); + final var recipientName = getLegacyIdentifier(m.resolveSignalServiceAddress(e.getSender())); writer.println( "Use 'signal-cli -u {} listIdentities -n {}', verify the key and run 'signal-cli -u {} trust -v \"FINGER_PRINT\" {}' to mark it as trusted", - m.getUsername(), + m.getSelfNumber(), recipientName, - m.getUsername(), + m.getSelfNumber(), recipientName); writer.println( "If you don't care about security, use 'signal-cli -u {} trust -a {}' to trust it without verification", - m.getUsername(), + m.getSelfNumber(), recipientName); } else { writer.println("Exception: {} ({})", exception.getMessage(), exception.getClass().getSimpleName()); @@ -82,6 +81,12 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler { DateUtils.formatTimestamp(content.getServerReceivedTimestamp()), DateUtils.formatTimestamp(content.getServerDeliveredTimestamp())); + if (content.getSenderKeyDistributionMessage().isPresent()) { + final var message = content.getSenderKeyDistributionMessage().get(); + writer.println("Received a sender key distribution message for distributionId {}", + message.getDistributionId()); + } + if (content.getDataMessage().isPresent()) { var message = content.getDataMessage().get(); printDataMessage(writer, message); @@ -107,6 +112,11 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler { var typingMessage = content.getTypingMessage().get(); printTypingMessage(writer.indentedWriter(), typingMessage); } + if (content.getDecryptionErrorMessage().isPresent()) { + writer.println("Received a decryption error message (resend request)"); + var decryptionErrorMessage = content.getDecryptionErrorMessage().get(); + printDecryptionErrorMessage(writer.indentedWriter(), decryptionErrorMessage); + } } } else { writer.println("Unknown message received."); @@ -209,6 +219,15 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler { } } + private void printDecryptionErrorMessage( + final PlainTextWriter writer, final DecryptionErrorMessage decryptionErrorMessage + ) { + writer.println("Device id: {}", decryptionErrorMessage.getDeviceId()); + writer.println("Timestamp: {}", DateUtils.formatTimestamp(decryptionErrorMessage.getTimestamp())); + writer.println("Ratchet key: {}", + decryptionErrorMessage.getRatchetKey().isPresent() ? "is present" : "not present"); + } + private void printReceiptMessage( final PlainTextWriter writer, final SignalServiceReceiptMessage receiptMessage ) { @@ -235,6 +254,13 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler { final var deviceId = callMessage.getDestinationDeviceId().get(); writer.println("Destination device id: {}", deviceId); } + if (callMessage.getGroupId().isPresent()) { + final var groupId = GroupId.unknownVersion(callMessage.getGroupId().get()); + writer.println("Destination group id: {}", groupId); + } + if (callMessage.getTimestamp().isPresent()) { + writer.println("Timestamp: {}", DateUtils.formatTimestamp(callMessage.getTimestamp().get())); + } if (callMessage.getAnswerMessage().isPresent()) { var answerMessage = callMessage.getAnswerMessage().get(); writer.println("Answer message: {}, sdp: {})", answerMessage.getId(), answerMessage.getSdp()); @@ -260,7 +286,9 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler { } if (callMessage.getOpaqueMessage().isPresent()) { final var opaqueMessage = callMessage.getOpaqueMessage().get(); - writer.println("Opaque message: size {}", opaqueMessage.getOpaque().length); + writer.println("Opaque message: size {}, urgency: {}", + opaqueMessage.getOpaque().length, + opaqueMessage.getUrgency().name()); } } @@ -285,6 +313,14 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler { DateUtils.formatTimestamp(rm.getTimestamp())); } } + if (syncMessage.getViewed().isPresent()) { + writer.println("Received sync viewed messages list"); + for (var vm : syncMessage.getViewed().get()) { + writer.println("- From: {} Message timestamp: {}", + formatContact(vm.getSender()), + DateUtils.formatTimestamp(vm.getTimestamp())); + } + } if (syncMessage.getRequest().isPresent()) { String type; if (syncMessage.getRequest().get().isContactsRequest()) { @@ -332,16 +368,13 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler { writer.println("Blocked numbers:"); final var blockedList = syncMessage.getBlockedList().get(); for (var address : blockedList.getAddresses()) { - writer.println("- {}", address.getLegacyIdentifier()); + writer.println("- {}", getLegacyIdentifier(address)); } } if (syncMessage.getVerified().isPresent()) { writer.println("Received sync message with verified identities:"); final var verifiedMessage = syncMessage.getVerified().get(); writer.println("- {}: {}", formatContact(verifiedMessage.getDestination()), verifiedMessage.getVerified()); - var safetyNumber = Util.formatSafetyNumber(m.computeSafetyNumber(verifiedMessage.getDestination(), - verifiedMessage.getIdentityKey())); - writer.indentedWriter().println(safetyNumber); } if (syncMessage.getConfiguration().isPresent()) { writer.println("Received sync message with configuration:"); @@ -439,7 +472,7 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler { final PlainTextWriter writer, final SignalServiceDataMessage.Reaction reaction ) { writer.println("Emoji: {}", reaction.getEmoji()); - writer.println("Target author: {}", formatContact(m.resolveSignalServiceAddress(reaction.getTargetAuthor()))); + writer.println("Target author: {}", formatContact(reaction.getTargetAuthor())); writer.println("Target timestamp: {}", DateUtils.formatTimestamp(reaction.getTargetSentTimestamp())); writer.println("Is remove: {}", reaction.isRemove()); } @@ -448,7 +481,7 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler { final PlainTextWriter writer, final SignalServiceDataMessage.Quote quote ) { writer.println("Id: {}", quote.getId()); - writer.println("Author: {}", m.resolveSignalServiceAddress(quote.getAuthor()).getLegacyIdentifier()); + writer.println("Author: {}", formatContact(quote.getAuthor())); writer.println("Text: {}", quote.getText()); if (quote.getMentions() != null && quote.getMentions().size() > 0) { writer.println("Mentions:"); @@ -610,7 +643,7 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler { var group = m.getGroup(groupId); if (group != null) { - writer.println("Name: {}", group.getTitle()); + writer.println("Name: {}", group.title()); } else { writer.println("Name: "); } @@ -619,7 +652,7 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler { private void printMention( PlainTextWriter writer, SignalServiceDataMessage.Mention mention ) { - final var address = m.resolveSignalServiceAddress(new SignalServiceAddress(mention.getUuid(), null)); + final var address = m.resolveSignalServiceAddress(new SignalServiceAddress(mention.getUuid())); writer.println("- {}: {} (length: {})", formatContact(address), mention.getStart(), mention.getLength()); } @@ -643,8 +676,19 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler { pointer.getPreview().isPresent() ? " (Preview is available: " + pointer.getPreview().get().length + " bytes)" : ""); - writer.println("Voice note: {}", pointer.getVoiceNote() ? "yes" : "no"); - writer.println("Borderless: {}", pointer.isBorderless() ? "yes" : "no"); + final var flags = new ArrayList(); + if (pointer.getVoiceNote()) { + flags.add("voice note"); + } + if (pointer.isBorderless()) { + flags.add("borderless"); + } + if (pointer.isGif()) { + flags.add("video gif"); + } + if (flags.size() > 0) { + writer.println("Flags: {}", String.join(", ", flags)); + } if (pointer.getWidth() > 0 || pointer.getHeight() > 0) { writer.println("Dimensions: {}x{}", pointer.getWidth(), pointer.getHeight()); } @@ -656,12 +700,9 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler { } private String formatContact(SignalServiceAddress address) { - final var number = address.getLegacyIdentifier(); - String name = null; - try { - name = m.getContactOrProfileName(number); - } catch (InvalidNumberException ignored) { - } + address = m.resolveSignalServiceAddress(address); + final var number = getLegacyIdentifier(address); + final var name = m.getContactOrProfileName(RecipientIdentifier.Single.fromAddress(address)); if (name == null || name.isEmpty()) { return number; } else {