X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/467a48bac508b56f84dce7ee0b81a22fd0d32161..a593051512b716ed3cc42a1a7b69d49a459352ed:/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 814952aa..adc7a251 100644 --- a/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java +++ b/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java @@ -1,170 +1,81 @@ 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.api.MessageEnvelope; import org.asamk.signal.manager.api.RecipientIdentifier; -import org.signal.libsignal.metadata.ProtocolUntrustedIdentityException; -import org.whispersystems.signalservice.api.messages.SignalServiceContent; -import org.whispersystems.signalservice.api.messages.SignalServiceEnvelope; -import org.whispersystems.signalservice.api.util.InvalidNumberException; +import org.asamk.signal.manager.api.UntrustedIdentityException; +import org.asamk.signal.manager.storage.recipients.RecipientAddress; -import java.util.List; import java.util.UUID; -import static org.asamk.signal.util.Util.getLegacyIdentifier; - -public class JsonMessageEnvelope { - - @JsonProperty - @Deprecated - final String source; - - @JsonProperty - final String sourceNumber; - - @JsonProperty - final String sourceUuid; - - @JsonProperty - final String sourceName; - - @JsonProperty - final Integer sourceDevice; - - @JsonProperty - @JsonInclude(JsonInclude.Include.NON_NULL) - final String relay; - - @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 +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) JsonStoryMessage storyMessage, + @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 static JsonMessageEnvelope from( + MessageEnvelope envelope, Throwable exception, Manager m ) { - if (!envelope.isUnidentifiedSender() && envelope.hasSource()) { - var source = envelope.getSourceAddress(); - this.source = getLegacyIdentifier(source); - this.sourceNumber = source.getNumber().orNull(); - this.sourceUuid = source.getUuid().transform(UUID::toString).orNull(); - this.sourceDevice = envelope.getSourceDevice(); - this.relay = source.getRelay().orNull(); - } else if (envelope.isUnidentifiedSender() && content != null) { - final var source = content.getSender(); - this.source = getLegacyIdentifier(source); - this.sourceNumber = source.getNumber().orNull(); - this.sourceUuid = source.getUuid().transform(UUID::toString).orNull(); - this.sourceDevice = content.getSenderDevice(); - this.relay = null; - } else if (exception instanceof ProtocolUntrustedIdentityException) { - var e = (ProtocolUntrustedIdentityException) exception; - final var source = m.resolveSignalServiceAddress(e.getSender()); - this.source = getLegacyIdentifier(source); - this.sourceNumber = source.getNumber().orNull(); - this.sourceUuid = source.getUuid().transform(UUID::toString).orNull(); - this.sourceDevice = e.getSenderDevice(); - this.relay = null; + final RecipientAddress sourceAddress; + final Integer sourceDevice; + if (envelope.sourceAddress().isPresent()) { + sourceAddress = envelope.sourceAddress().get(); + sourceDevice = envelope.sourceDevice(); + } else if (exception instanceof UntrustedIdentityException e) { + sourceAddress = e.getSender(); + sourceDevice = e.getSenderDevice(); } else { - this.source = null; - this.sourceNumber = null; - this.sourceUuid = null; - this.sourceDevice = null; - this.relay = null; - } - String name; - try { - name = m.getContactOrProfileName(RecipientIdentifier.Single.fromString(this.source, m.getUsername())); - } catch (InvalidNumberException | NullPointerException e) { - name = null; + sourceAddress = null; + sourceDevice = null; } - 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()); + + final String source; + final String sourceNumber; + final String sourceUuid; + final String sourceName; + if (sourceAddress != null) { + source = sourceAddress.getLegacyIdentifier(); + sourceNumber = sourceAddress.number().orElse(null); + sourceUuid = sourceAddress.uuid().map(UUID::toString).orElse(null); + sourceName = m.getContactOrProfileName(RecipientIdentifier.Single.fromAddress(sourceAddress)); } else { - this.receiptMessage = null; + source = null; + sourceNumber = null; + sourceUuid = null; + sourceName = null; } - 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; - relay = 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; - relay = 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; - relay = null; - timestamp = messageReceived.getTimestamp(); - receiptMessage = null; - dataMessage = null; - syncMessage = new JsonSyncMessage(messageReceived); - callMessage = null; - typingMessage = null; + final var timestamp = envelope.timestamp(); + final var receiptMessage = envelope.receipt().map(JsonReceiptMessage::from).orElse(null); + final var typingMessage = envelope.typing().map(JsonTypingMessage::from).orElse(null); + + final var dataMessage = envelope.data().map(JsonDataMessage::from).orElse(null); + final var storyMessage = envelope.story().map(JsonStoryMessage::from).orElse(null); + final var syncMessage = envelope.sync().map(JsonSyncMessage::from).orElse(null); + final var callMessage = envelope.call().map(JsonCallMessage::from).orElse(null); + + return new JsonMessageEnvelope(source, + sourceNumber, + sourceUuid, + sourceName, + sourceDevice, + timestamp, + dataMessage, + storyMessage, + syncMessage, + callMessage, + receiptMessage, + typingMessage); } }