1 package org
.asamk
.signal
.json
;
3 import com
.fasterxml
.jackson
.annotation
.JsonInclude
;
4 import com
.fasterxml
.jackson
.annotation
.JsonProperty
;
6 import org
.asamk
.Signal
;
7 import org
.asamk
.signal
.manager
.Manager
;
8 import org
.signal
.libsignal
.metadata
.ProtocolUntrustedIdentityException
;
9 import org
.whispersystems
.signalservice
.api
.messages
.SignalServiceContent
;
10 import org
.whispersystems
.signalservice
.api
.messages
.SignalServiceEnvelope
;
11 import org
.whispersystems
.signalservice
.api
.util
.InvalidNumberException
;
13 import java
.util
.List
;
14 import java
.util
.UUID
;
16 import static org
.asamk
.signal
.util
.Util
.getLegacyIdentifier
;
18 public class JsonMessageEnvelope
{
25 final String sourceNumber
;
28 final String sourceUuid
;
31 final String sourceName
;
34 final Integer sourceDevice
;
37 @JsonInclude(JsonInclude
.Include
.NON_NULL
)
44 @JsonInclude(JsonInclude
.Include
.NON_NULL
)
45 final JsonDataMessage dataMessage
;
48 @JsonInclude(JsonInclude
.Include
.NON_NULL
)
49 final JsonSyncMessage syncMessage
;
52 @JsonInclude(JsonInclude
.Include
.NON_NULL
)
53 final JsonCallMessage callMessage
;
56 @JsonInclude(JsonInclude
.Include
.NON_NULL
)
57 final JsonReceiptMessage receiptMessage
;
60 @JsonInclude(JsonInclude
.Include
.NON_NULL
)
61 final JsonTypingMessage typingMessage
;
63 public JsonMessageEnvelope(
64 SignalServiceEnvelope envelope
, SignalServiceContent content
, Throwable exception
, Manager m
66 if (!envelope
.isUnidentifiedSender() && envelope
.hasSource()) {
67 var source
= envelope
.getSourceAddress();
68 this.source
= getLegacyIdentifier(source
);
69 this.sourceNumber
= source
.getNumber().orNull();
70 this.sourceUuid
= source
.getUuid().transform(UUID
::toString
).orNull();
71 this.sourceDevice
= envelope
.getSourceDevice();
72 this.relay
= source
.getRelay().orNull();
73 } else if (envelope
.isUnidentifiedSender() && content
!= null) {
74 final var source
= content
.getSender();
75 this.source
= getLegacyIdentifier(source
);
76 this.sourceNumber
= source
.getNumber().orNull();
77 this.sourceUuid
= source
.getUuid().transform(UUID
::toString
).orNull();
78 this.sourceDevice
= content
.getSenderDevice();
80 } else if (exception
instanceof ProtocolUntrustedIdentityException
) {
81 var e
= (ProtocolUntrustedIdentityException
) exception
;
82 final var source
= m
.resolveSignalServiceAddress(e
.getSender());
83 this.source
= getLegacyIdentifier(source
);
84 this.sourceNumber
= source
.getNumber().orNull();
85 this.sourceUuid
= source
.getUuid().transform(UUID
::toString
).orNull();
86 this.sourceDevice
= e
.getSenderDevice();
90 this.sourceNumber
= null;
91 this.sourceUuid
= null;
92 this.sourceDevice
= null;
97 name
= m
.getContactOrProfileName(this.source
);
98 } catch (InvalidNumberException
| NullPointerException e
) {
101 this.sourceName
= name
;
102 this.timestamp
= envelope
.getTimestamp();
103 if (envelope
.isReceipt()) {
104 this.receiptMessage
= JsonReceiptMessage
.deliveryReceipt(timestamp
, List
.of(timestamp
));
105 } else if (content
!= null && content
.getReceiptMessage().isPresent()) {
106 this.receiptMessage
= new JsonReceiptMessage(content
.getReceiptMessage().get());
108 this.receiptMessage
= null;
110 this.typingMessage
= content
!= null && content
.getTypingMessage().isPresent()
111 ?
new JsonTypingMessage(content
.getTypingMessage().get())
114 this.dataMessage
= content
!= null && content
.getDataMessage().isPresent()
115 ?
new JsonDataMessage(content
.getDataMessage().get(), m
)
117 this.syncMessage
= content
!= null && content
.getSyncMessage().isPresent()
118 ?
new JsonSyncMessage(content
.getSyncMessage().get(), m
)
120 this.callMessage
= content
!= null && content
.getCallMessage().isPresent()
121 ?
new JsonCallMessage(content
.getCallMessage().get())
125 public JsonMessageEnvelope(Signal
.MessageReceived messageReceived
) {
126 source
= messageReceived
.getSender();
132 timestamp
= messageReceived
.getTimestamp();
133 receiptMessage
= null;
134 dataMessage
= new JsonDataMessage(messageReceived
);
137 typingMessage
= null;
140 public JsonMessageEnvelope(Signal
.ReceiptReceived receiptReceived
) {
141 source
= receiptReceived
.getSender();
147 timestamp
= receiptReceived
.getTimestamp();
148 receiptMessage
= JsonReceiptMessage
.deliveryReceipt(timestamp
, List
.of(timestamp
));
152 typingMessage
= null;
155 public JsonMessageEnvelope(Signal
.SyncMessageReceived messageReceived
) {
156 source
= messageReceived
.getSource();
162 timestamp
= messageReceived
.getTimestamp();
163 receiptMessage
= null;
165 syncMessage
= new JsonSyncMessage(messageReceived
);
167 typingMessage
= null;