X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/44851887894ed9162006ad9b12309e732aa3e876..8bcd8d87d219ae0496986cba4bd6b89f3b2ad6f6:/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 5e5e6a33..7b884b0e 100644 --- a/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java +++ b/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java @@ -1,69 +1,158 @@ package org.asamk.signal.json; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; + 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; +import static org.asamk.signal.util.Util.getLegacyIdentifier; + public class JsonMessageEnvelope { - String source; - int sourceDevice; - String relay; - long timestamp; - JsonDataMessage dataMessage; - JsonSyncMessage syncMessage; - JsonCallMessage callMessage; - JsonReceiptMessage receiptMessage; - - public JsonMessageEnvelope(SignalServiceEnvelope envelope, SignalServiceContent content) { - if (!envelope.isUnidentifiedSender() && envelope.hasSource()) { - SignalServiceAddress source = envelope.getSourceAddress(); - this.source = source.getLegacyIdentifier(); - this.relay = source.getRelay().isPresent() ? source.getRelay().get() : null; + @JsonProperty + @Deprecated + final String source; + + @JsonProperty + final String sourceNumber; + + @JsonProperty + final String sourceUuid; + + @JsonProperty + final String sourceName; + + @JsonProperty + final Integer sourceDevice; + + @JsonProperty + final long timestamp; + + @JsonProperty + @JsonInclude(JsonInclude.Include.NON_NULL) + final JsonDataMessage dataMessage; + + @JsonProperty + @JsonInclude(JsonInclude.Include.NON_NULL) + final JsonSyncMessage syncMessage; + + @JsonProperty + @JsonInclude(JsonInclude.Include.NON_NULL) + final JsonCallMessage callMessage; + + @JsonProperty + @JsonInclude(JsonInclude.Include.NON_NULL) + final JsonReceiptMessage receiptMessage; + + @JsonProperty + @JsonInclude(JsonInclude.Include.NON_NULL) + final JsonTypingMessage typingMessage; + + public JsonMessageEnvelope( + SignalServiceEnvelope envelope, SignalServiceContent content, Throwable exception, Manager m + ) { + if (!envelope.isUnidentifiedSender() && envelope.hasSourceUuid()) { + var source = m.resolveSignalServiceAddress(envelope.getSourceAddress()); + this.source = getLegacyIdentifier(source); + this.sourceNumber = source.getNumber().orNull(); + this.sourceUuid = source.getUuid().toString(); + this.sourceDevice = envelope.getSourceDevice(); + } else if (envelope.isUnidentifiedSender() && content != null) { + final var source = m.resolveSignalServiceAddress(content.getSender()); + this.source = getLegacyIdentifier(source); + this.sourceNumber = source.getNumber().orNull(); + this.sourceUuid = source.getUuid().toString(); + this.sourceDevice = content.getSenderDevice(); + } else if (exception instanceof UntrustedIdentityException) { + var e = (UntrustedIdentityException) exception; + final var source = m.resolveSignalServiceAddress(e.getSender()); + this.source = getLegacyIdentifier(source); + this.sourceNumber = source.getNumber().orNull(); + this.sourceUuid = source.getUuid().toString(); + this.sourceDevice = e.getSenderDevice(); + } else { + this.source = null; + this.sourceNumber = null; + this.sourceUuid = null; + this.sourceDevice = null; + } + String name; + try { + name = m.getContactOrProfileName(RecipientIdentifier.Single.fromString(this.source, m.getUsername())); + } catch (InvalidNumberException | NullPointerException e) { + name = null; } - this.sourceDevice = envelope.getSourceDevice(); + this.sourceName = name; this.timestamp = envelope.getTimestamp(); if (envelope.isReceipt()) { this.receiptMessage = JsonReceiptMessage.deliveryReceipt(timestamp, List.of(timestamp)); + } else if (content != null && content.getReceiptMessage().isPresent()) { + this.receiptMessage = new JsonReceiptMessage(content.getReceiptMessage().get()); + } else { + this.receiptMessage = null; } - if (content != null) { - if (envelope.isUnidentifiedSender()) { - this.source = content.getSender().getLegacyIdentifier(); - 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()); - } - } + this.typingMessage = content != null && content.getTypingMessage().isPresent() + ? new JsonTypingMessage(content.getTypingMessage().get()) + : null; + + this.dataMessage = content != null && content.getDataMessage().isPresent() + ? new JsonDataMessage(content.getDataMessage().get(), m) + : null; + this.syncMessage = content != null && content.getSyncMessage().isPresent() + ? new JsonSyncMessage(content.getSyncMessage().get(), m) + : null; + this.callMessage = content != null && content.getCallMessage().isPresent() + ? new JsonCallMessage(content.getCallMessage().get()) + : null; } public JsonMessageEnvelope(Signal.MessageReceived messageReceived) { source = messageReceived.getSender(); + sourceNumber = null; + sourceUuid = null; + sourceName = null; + sourceDevice = null; timestamp = messageReceived.getTimestamp(); + receiptMessage = null; dataMessage = new JsonDataMessage(messageReceived); + syncMessage = null; + callMessage = null; + typingMessage = null; } public JsonMessageEnvelope(Signal.ReceiptReceived receiptReceived) { source = receiptReceived.getSender(); + sourceNumber = null; + sourceUuid = null; + sourceName = null; + sourceDevice = null; timestamp = receiptReceived.getTimestamp(); receiptMessage = JsonReceiptMessage.deliveryReceipt(timestamp, List.of(timestamp)); + dataMessage = null; + syncMessage = null; + callMessage = null; + typingMessage = null; } public JsonMessageEnvelope(Signal.SyncMessageReceived messageReceived) { source = messageReceived.getSource(); + sourceNumber = null; + sourceUuid = null; + sourceName = null; + sourceDevice = null; timestamp = messageReceived.getTimestamp(); + receiptMessage = null; + dataMessage = null; syncMessage = new JsonSyncMessage(messageReceived); + callMessage = null; + typingMessage = null; } }