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
.asamk
.signal
.manager
.api
.RecipientIdentifier
;
9 import org
.signal
.libsignal
.metadata
.ProtocolUntrustedIdentityException
;
10 import org
.whispersystems
.signalservice
.api
.messages
.SignalServiceContent
;
11 import org
.whispersystems
.signalservice
.api
.messages
.SignalServiceEnvelope
;
12 import org
.whispersystems
.signalservice
.api
.util
.InvalidNumberException
;
14 import java
.util
.List
;
15 import java
.util
.UUID
;
17 import static org
.asamk
.signal
.util
.Util
.getLegacyIdentifier
;
19 public class JsonMessageEnvelope
{
26 final String sourceNumber
;
29 final String sourceUuid
;
32 final String sourceName
;
35 final Integer sourceDevice
;
38 @JsonInclude(JsonInclude
.Include
.NON_NULL
)
45 @JsonInclude(JsonInclude
.Include
.NON_NULL
)
46 final JsonDataMessage dataMessage
;
49 @JsonInclude(JsonInclude
.Include
.NON_NULL
)
50 final JsonSyncMessage syncMessage
;
53 @JsonInclude(JsonInclude
.Include
.NON_NULL
)
54 final JsonCallMessage callMessage
;
57 @JsonInclude(JsonInclude
.Include
.NON_NULL
)
58 final JsonReceiptMessage receiptMessage
;
61 @JsonInclude(JsonInclude
.Include
.NON_NULL
)
62 final JsonTypingMessage typingMessage
;
64 public JsonMessageEnvelope(
65 SignalServiceEnvelope envelope
, SignalServiceContent content
, Throwable exception
, Manager m
67 if (!envelope
.isUnidentifiedSender() && envelope
.hasSource()) {
68 var source
= envelope
.getSourceAddress();
69 this.source
= getLegacyIdentifier(source
);
70 this.sourceNumber
= source
.getNumber().orNull();
71 this.sourceUuid
= source
.getUuid().transform(UUID
::toString
).orNull();
72 this.sourceDevice
= envelope
.getSourceDevice();
73 this.relay
= source
.getRelay().orNull();
74 } else if (envelope
.isUnidentifiedSender() && content
!= null) {
75 final var source
= content
.getSender();
76 this.source
= getLegacyIdentifier(source
);
77 this.sourceNumber
= source
.getNumber().orNull();
78 this.sourceUuid
= source
.getUuid().transform(UUID
::toString
).orNull();
79 this.sourceDevice
= content
.getSenderDevice();
81 } else if (exception
instanceof ProtocolUntrustedIdentityException
) {
82 var e
= (ProtocolUntrustedIdentityException
) exception
;
83 final var source
= m
.resolveSignalServiceAddress(e
.getSender());
84 this.source
= getLegacyIdentifier(source
);
85 this.sourceNumber
= source
.getNumber().orNull();
86 this.sourceUuid
= source
.getUuid().transform(UUID
::toString
).orNull();
87 this.sourceDevice
= e
.getSenderDevice();
91 this.sourceNumber
= null;
92 this.sourceUuid
= null;
93 this.sourceDevice
= null;
98 name
= m
.getContactOrProfileName(RecipientIdentifier
.Single
.fromString(this.source
, m
.getUsername()));
99 } catch (InvalidNumberException
| NullPointerException e
) {
102 this.sourceName
= name
;
103 this.timestamp
= envelope
.getTimestamp();
104 if (envelope
.isReceipt()) {
105 this.receiptMessage
= JsonReceiptMessage
.deliveryReceipt(timestamp
, List
.of(timestamp
));
106 } else if (content
!= null && content
.getReceiptMessage().isPresent()) {
107 this.receiptMessage
= new JsonReceiptMessage(content
.getReceiptMessage().get());
109 this.receiptMessage
= null;
111 this.typingMessage
= content
!= null && content
.getTypingMessage().isPresent()
112 ?
new JsonTypingMessage(content
.getTypingMessage().get())
115 this.dataMessage
= content
!= null && content
.getDataMessage().isPresent()
116 ?
new JsonDataMessage(content
.getDataMessage().get(), m
)
118 this.syncMessage
= content
!= null && content
.getSyncMessage().isPresent()
119 ?
new JsonSyncMessage(content
.getSyncMessage().get(), m
)
121 this.callMessage
= content
!= null && content
.getCallMessage().isPresent()
122 ?
new JsonCallMessage(content
.getCallMessage().get())
126 public JsonMessageEnvelope(Signal
.MessageReceived messageReceived
) {
127 source
= messageReceived
.getSender();
133 timestamp
= messageReceived
.getTimestamp();
134 receiptMessage
= null;
135 dataMessage
= new JsonDataMessage(messageReceived
);
138 typingMessage
= null;
141 public JsonMessageEnvelope(Signal
.ReceiptReceived receiptReceived
) {
142 source
= receiptReceived
.getSender();
148 timestamp
= receiptReceived
.getTimestamp();
149 receiptMessage
= JsonReceiptMessage
.deliveryReceipt(timestamp
, List
.of(timestamp
));
153 typingMessage
= null;
156 public JsonMessageEnvelope(Signal
.SyncMessageReceived messageReceived
) {
157 source
= messageReceived
.getSource();
163 timestamp
= messageReceived
.getTimestamp();
164 receiptMessage
= null;
166 syncMessage
= new JsonSyncMessage(messageReceived
);
168 typingMessage
= null;