]> nmode's Git Repositories - signal-cli/blobdiff - src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java
Update libsignal-service-java
[signal-cli] / src / main / java / org / asamk / signal / json / JsonMessageEnvelope.java
index b42699495668899af4a2ad9837c917e6c54bef7b..7b884b0e3887588013854933ab7013c0356b35d8 100644 (file)
 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;
-    boolean isReceipt;
-    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;
         }
-        this.sourceDevice = envelope.getSourceDevice();
+        String name;
+        try {
+            name = m.getContactOrProfileName(RecipientIdentifier.Single.fromString(this.source, m.getUsername()));
+        } catch (InvalidNumberException | NullPointerException e) {
+            name = null;
+        }
+        this.sourceName = name;
         this.timestamp = envelope.getTimestamp();
-        this.isReceipt = envelope.isReceipt();
-        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());
-            }
+        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;
         }
+        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();
-        isReceipt = true;
+        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;
     }
 }