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;
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;
@Override
public void handleMessage(SignalServiceEnvelope envelope, SignalServiceContent content, Throwable exception) {
- 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");
}
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) {
+ 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()));
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);
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.");
}
}
+ 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
) {
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());
}
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());
}
}
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());
}
final PlainTextWriter writer, final SignalServiceDataMessage.Quote quote
) {
writer.println("Id: {}", quote.getId());
- writer.println("Author: {}", getLegacyIdentifier(m.resolveSignalServiceAddress(quote.getAuthor())));
+ writer.println("Author: {}", formatContact(quote.getAuthor()));
writer.println("Text: {}", quote.getText());
if (quote.getMentions() != null && quote.getMentions().size() > 0) {
writer.println("Mentions:");
private void printMention(
PlainTextWriter writer, SignalServiceDataMessage.Mention mention
) {
- 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());
}
}
private String formatContact(SignalServiceAddress address) {
+ address = m.resolveSignalServiceAddress(address);
final var number = getLegacyIdentifier(address);
- String name = null;
- try {
- name = m.getContactOrProfileName(number);
- } catch (InvalidNumberException ignored) {
- }
+ final var name = m.getContactOrProfileName(RecipientIdentifier.Single.fromAddress(address));
if (name == null || name.isEmpty()) {
return number;
} else {