X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/ae41d0c5026fe868c6198e1005344fc78b6e0a2c..cd29144e81701698092f3334bee0c99c0f77f202:/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java diff --git a/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java b/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java index 3279d941..f5d70d28 100644 --- a/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java +++ b/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java @@ -1,66 +1,146 @@ package org.asamk.signal.json; +import com.fasterxml.jackson.annotation.JsonInclude; + import org.asamk.Signal; +import org.asamk.signal.manager.Manager; +import org.asamk.signal.manager.UntrustedIdentityException; +import org.asamk.signal.manager.api.RecipientIdentifier; import org.whispersystems.signalservice.api.messages.SignalServiceContent; import org.whispersystems.signalservice.api.messages.SignalServiceEnvelope; -import org.whispersystems.signalservice.api.push.SignalServiceAddress; +import org.whispersystems.signalservice.api.util.InvalidNumberException; + +import java.util.List; -public class JsonMessageEnvelope { +import static org.asamk.signal.util.Util.getLegacyIdentifier; - String source; - int sourceDevice; - String relay; - long timestamp; - boolean isReceipt; - JsonDataMessage dataMessage; - JsonSyncMessage syncMessage; - JsonCallMessage callMessage; - JsonReceiptMessage receiptMessage; +public record JsonMessageEnvelope( + @Deprecated String source, + String sourceNumber, + String sourceUuid, + String sourceName, + Integer sourceDevice, + long timestamp, + @JsonInclude(JsonInclude.Include.NON_NULL) JsonDataMessage dataMessage, + @JsonInclude(JsonInclude.Include.NON_NULL) JsonSyncMessage syncMessage, + @JsonInclude(JsonInclude.Include.NON_NULL) JsonCallMessage callMessage, + @JsonInclude(JsonInclude.Include.NON_NULL) JsonReceiptMessage receiptMessage, + @JsonInclude(JsonInclude.Include.NON_NULL) JsonTypingMessage typingMessage +) { - public JsonMessageEnvelope(SignalServiceEnvelope envelope, SignalServiceContent content) { - if (!envelope.isUnidentifiedSender() && envelope.hasSource()) { - SignalServiceAddress source = envelope.getSourceAddress(); - this.source = source.getNumber().get(); - this.relay = source.getRelay().isPresent() ? source.getRelay().get() : null; + public static JsonMessageEnvelope from( + SignalServiceEnvelope envelope, SignalServiceContent content, Throwable exception, Manager m + ) { + final String source; + final String sourceNumber; + final String sourceUuid; + final Integer sourceDevice; + if (!envelope.isUnidentifiedSender() && envelope.hasSourceUuid()) { + final var sourceAddress = m.resolveSignalServiceAddress(envelope.getSourceAddress()); + source = getLegacyIdentifier(sourceAddress); + sourceNumber = sourceAddress.getNumber().orNull(); + sourceUuid = sourceAddress.getUuid().toString(); + sourceDevice = envelope.getSourceDevice(); + } else if (envelope.isUnidentifiedSender() && content != null) { + final var sender = m.resolveSignalServiceAddress(content.getSender()); + source = getLegacyIdentifier(sender); + sourceNumber = sender.getNumber().orNull(); + sourceUuid = sender.getUuid().toString(); + sourceDevice = content.getSenderDevice(); + } else if (exception instanceof UntrustedIdentityException e) { + final var sender = m.resolveSignalServiceAddress(e.getSender()); + source = getLegacyIdentifier(sender); + sourceNumber = sender.getNumber().orNull(); + sourceUuid = sender.getUuid().toString(); + sourceDevice = e.getSenderDevice(); + } else { + source = null; + sourceNumber = null; + sourceUuid = null; + sourceDevice = null; + } + String name; + try { + name = m.getContactOrProfileName(RecipientIdentifier.Single.fromString(source, m.getSelfNumber())); + } catch (InvalidNumberException | NullPointerException e) { + name = null; } - this.sourceDevice = envelope.getSourceDevice(); - this.timestamp = envelope.getTimestamp(); - this.isReceipt = envelope.isReceipt(); - if (content != null) { - if (envelope.isUnidentifiedSender()) { - this.source = content.getSender().getNumber().get(); - this.sourceDevice = content.getSenderDevice(); - } - if (content.getDataMessage().isPresent()) { - this.dataMessage = new JsonDataMessage(content.getDataMessage().get()); - } - if (content.getSyncMessage().isPresent()) { - this.syncMessage = new JsonSyncMessage(content.getSyncMessage().get()); - } - if (content.getCallMessage().isPresent()) { - this.callMessage = new JsonCallMessage(content.getCallMessage().get()); - } - if (content.getReceiptMessage().isPresent()) { - this.receiptMessage = new JsonReceiptMessage(content.getReceiptMessage().get()); - } + final var sourceName = name; + final var timestamp = envelope.getTimestamp(); + final JsonReceiptMessage receiptMessage; + if (envelope.isReceipt()) { + receiptMessage = JsonReceiptMessage.deliveryReceipt(timestamp, List.of(timestamp)); + } else if (content != null && content.getReceiptMessage().isPresent()) { + receiptMessage = JsonReceiptMessage.from(content.getReceiptMessage().get()); + } else { + receiptMessage = null; } + final var typingMessage = content != null && content.getTypingMessage().isPresent() ? JsonTypingMessage.from( + content.getTypingMessage().get()) : null; + + final var dataMessage = content != null && content.getDataMessage().isPresent() + ? JsonDataMessage.from(content.getDataMessage().get(), m) + : null; + final var syncMessage = content != null && content.getSyncMessage().isPresent() + ? JsonSyncMessage.from(content.getSyncMessage().get(), m) + : null; + final var callMessage = content != null && content.getCallMessage().isPresent() + ? JsonCallMessage.from(content.getCallMessage().get()) + : null; + + return new JsonMessageEnvelope(source, + sourceNumber, + sourceUuid, + sourceName, + sourceDevice, + timestamp, + dataMessage, + syncMessage, + callMessage, + receiptMessage, + typingMessage); } - public JsonMessageEnvelope(Signal.MessageReceived messageReceived) { - source = messageReceived.getSender(); - timestamp = messageReceived.getTimestamp(); - dataMessage = new JsonDataMessage(messageReceived); + public static JsonMessageEnvelope from(Signal.MessageReceived messageReceived) { + return new JsonMessageEnvelope(messageReceived.getSource(), + null, + null, + null, + null, + messageReceived.getTimestamp(), + JsonDataMessage.from(messageReceived), + null, + null, + null, + null); } - public JsonMessageEnvelope(Signal.ReceiptReceived receiptReceived) { - source = receiptReceived.getSender(); - timestamp = receiptReceived.getTimestamp(); - isReceipt = true; + public static JsonMessageEnvelope from(Signal.ReceiptReceived receiptReceived) { + return new JsonMessageEnvelope(receiptReceived.getSender(), + null, + null, + null, + null, + receiptReceived.getTimestamp(), + null, + null, + null, + JsonReceiptMessage.deliveryReceipt(receiptReceived.getTimestamp(), + List.of(receiptReceived.getTimestamp())), + null); } - public JsonMessageEnvelope(Signal.SyncMessageReceived messageReceived) { - source = messageReceived.getSource(); - timestamp = messageReceived.getTimestamp(); - syncMessage = new JsonSyncMessage(messageReceived); + public static JsonMessageEnvelope from(Signal.SyncMessageReceived messageReceived) { + return new JsonMessageEnvelope(messageReceived.getSource(), + null, + null, + null, + null, + messageReceived.getTimestamp(), + null, + JsonSyncMessage.from(messageReceived), + null, + null, + null); } }