X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/221d937eecca5c9b09a3bee7df812203b9927a56..e83bfb9e037d5a55d24b6f6f83efe27edb8dd27e:/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 6df283f3..4a516197 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.slf4j.helpers.MessageFormatter; -import org.whispersystems.libsignal.UntrustedIdentityException; import org.whispersystems.signalservice.api.messages.SignalServiceAttachment; import org.whispersystems.signalservice.api.messages.SignalServiceContent; import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage; @@ -19,38 +20,27 @@ import org.whispersystems.signalservice.api.messages.multidevice.SignalServiceSy import org.whispersystems.signalservice.api.messages.shared.SharedContact; import org.whispersystems.signalservice.api.push.SignalServiceAddress; -import java.io.IOException; +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) { - try { - printMessage(envelope, content, exception); - } catch (IOException e) { - e.printStackTrace(); - } - } - - private void printMessage( - SignalServiceEnvelope envelope, SignalServiceContent content, Throwable exception - ) throws IOException { - 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"); } @@ -67,20 +57,23 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler { var e = (UntrustedIdentityException) exception; writer.println( "The user’s key is untrusted, either the user has reinstalled Signal or a third party sent this message."); + final var recipientName = getLegacyIdentifier(m.resolveSignalServiceAddress(e.getSender())); writer.println( - "Use 'signal-cli -u {0} listIdentities -n {1}', verify the key and run 'signal-cli -u {0} trust -v \"FINGER_PRINT\" {1}' to mark it as trusted", + "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(), - e.getName()); + recipientName, + m.getUsername(), + recipientName); writer.println( "If you don't care about security, use 'signal-cli -u {} trust -a {}' to trust it without verification", m.getUsername(), - e.getName()); + recipientName); } else { writer.println("Exception: {} ({})", exception.getMessage(), exception.getClass().getSimpleName()); } } if (content == null) { - writer.println("Failed to decrypt message."); + writer.println("No message content"); } else { writer.println("Sender: {} (device: {})", formatContact(content.getSender()), @@ -123,7 +116,7 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler { private void printDataMessage( PlainTextWriter writer, SignalServiceDataMessage message - ) throws IOException { + ) { writer.println("Message timestamp: {}", DateUtils.formatTimestamp(message.getTimestamp())); if (message.isViewOnce()) { writer.println("=VIEW ONCE="); @@ -206,7 +199,7 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler { private void printTypingMessage( final PlainTextWriter writer, final SignalServiceTypingMessage typingMessage - ) throws IOException { + ) { writer.println("Action: {}", typingMessage.getAction()); writer.println("Timestamp: {}", DateUtils.formatTimestamp(typingMessage.getTimestamp())); if (typingMessage.getGroupId().isPresent()) { @@ -218,7 +211,7 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler { private void printReceiptMessage( final PlainTextWriter writer, final SignalServiceReceiptMessage receiptMessage - ) throws IOException { + ) { writer.println("When: {}", DateUtils.formatTimestamp(receiptMessage.getWhen())); if (receiptMessage.isDeliveryReceipt()) { writer.println("Is delivery receipt"); @@ -237,11 +230,18 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler { private void printCallMessage( final PlainTextWriter writer, final SignalServiceCallMessage callMessage - ) throws IOException { + ) { if (callMessage.getDestinationDeviceId().isPresent()) { 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()); @@ -267,13 +267,15 @@ 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()); } } private void printSyncMessage( final PlainTextWriter writer, final SignalServiceSyncMessage syncMessage - ) throws IOException { + ) { if (syncMessage.getContacts().isPresent()) { final var contactsMessage = syncMessage.getContacts().get(); var type = contactsMessage.isComplete() ? "complete" : "partial"; @@ -292,6 +294,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()) { @@ -339,7 +349,7 @@ 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()) { @@ -421,7 +431,7 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler { private void printPreview( final PlainTextWriter writer, final SignalServiceDataMessage.Preview preview - ) throws IOException { + ) { writer.println("Title: {}", preview.getTitle()); writer.println("Description: {}", preview.getDescription()); writer.println("Date: {}", DateUtils.formatTimestamp(preview.getDate())); @@ -434,7 +444,7 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler { private void printSticker( final PlainTextWriter writer, final SignalServiceDataMessage.Sticker sticker - ) throws IOException { + ) { writer.println("Pack id: {}", Base64.getEncoder().encodeToString(sticker.getPackId())); writer.println("Pack key: {}", Base64.getEncoder().encodeToString(sticker.getPackKey())); writer.println("Sticker id: {}", sticker.getStickerId()); @@ -444,18 +454,18 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler { private void printReaction( final PlainTextWriter writer, final SignalServiceDataMessage.Reaction reaction - ) throws IOException { + ) { 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()); } private void printQuote( final PlainTextWriter writer, final SignalServiceDataMessage.Quote quote - ) throws IOException { + ) { 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:"); @@ -478,7 +488,7 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler { } } - private void printSharedContact(final PlainTextWriter writer, final SharedContact contact) throws IOException { + private void printSharedContact(final PlainTextWriter writer, final SharedContact contact) { writer.println("Name:"); var name = contact.getName(); writer.indent(w -> { @@ -587,7 +597,7 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler { private void printGroupContext( final PlainTextWriter writer, final SignalServiceGroupContext groupContext - ) throws IOException { + ) { final var groupId = GroupUtils.getGroupId(groupContext); if (groupContext.getGroupV1().isPresent()) { var groupInfo = groupContext.getGroupV1().get(); @@ -612,7 +622,7 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler { } } - private void printGroupInfo(final PlainTextWriter writer, final GroupId groupId) throws IOException { + private void printGroupInfo(final PlainTextWriter writer, final GroupId groupId) { writer.println("Id: {}", groupId.toBase64()); var group = m.getGroup(groupId); @@ -625,8 +635,8 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler { private void printMention( PlainTextWriter writer, SignalServiceDataMessage.Mention mention - ) throws IOException { - final var address = m.resolveSignalServiceAddress(new SignalServiceAddress(mention.getUuid(), null)); + ) { + final var address = m.resolveSignalServiceAddress(mention.getUuid()); writer.println("- {}: {} (length: {})", formatContact(address), mention.getStart(), mention.getLength()); } @@ -650,8 +660,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()); } @@ -663,9 +684,10 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler { } private String formatContact(SignalServiceAddress address) { - final var number = address.getLegacyIdentifier(); - var name = m.getContactOrProfileName(number); - if (name == null) { + 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 { return MessageFormatter.arrayFormat("“{}” {}", new Object[]{name, number}).getMessage();