]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java
Extend error information in json output for received messages from untrusted identity
[signal-cli] / src / main / java / org / asamk / signal / json / JsonMessageEnvelope.java
1 package org.asamk.signal.json;
2
3 import com.fasterxml.jackson.annotation.JsonInclude;
4 import com.fasterxml.jackson.annotation.JsonProperty;
5
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;
12
13 import java.util.List;
14 import java.util.UUID;
15
16 import static org.asamk.signal.util.Util.getLegacyIdentifier;
17
18 public class JsonMessageEnvelope {
19
20 @JsonProperty
21 @Deprecated
22 final String source;
23
24 @JsonProperty
25 final String sourceNumber;
26
27 @JsonProperty
28 final String sourceUuid;
29
30 @JsonProperty
31 final String sourceName;
32
33 @JsonProperty
34 final Integer sourceDevice;
35
36 @JsonProperty
37 @JsonInclude(JsonInclude.Include.NON_NULL)
38 final String relay;
39
40 @JsonProperty
41 final long timestamp;
42
43 @JsonProperty
44 @JsonInclude(JsonInclude.Include.NON_NULL)
45 final JsonDataMessage dataMessage;
46
47 @JsonProperty
48 @JsonInclude(JsonInclude.Include.NON_NULL)
49 final JsonSyncMessage syncMessage;
50
51 @JsonProperty
52 @JsonInclude(JsonInclude.Include.NON_NULL)
53 final JsonCallMessage callMessage;
54
55 @JsonProperty
56 @JsonInclude(JsonInclude.Include.NON_NULL)
57 final JsonReceiptMessage receiptMessage;
58
59 @JsonProperty
60 @JsonInclude(JsonInclude.Include.NON_NULL)
61 final JsonTypingMessage typingMessage;
62
63 public JsonMessageEnvelope(
64 SignalServiceEnvelope envelope, SignalServiceContent content, Throwable exception, Manager m
65 ) {
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();
79 this.relay = null;
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();
87 this.relay = null;
88 } else {
89 this.source = null;
90 this.sourceNumber = null;
91 this.sourceUuid = null;
92 this.sourceDevice = null;
93 this.relay = null;
94 }
95 String name;
96 try {
97 name = m.getContactOrProfileName(this.source);
98 } catch (InvalidNumberException | NullPointerException e) {
99 name = null;
100 }
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());
107 } else {
108 this.receiptMessage = null;
109 }
110 this.typingMessage = content != null && content.getTypingMessage().isPresent()
111 ? new JsonTypingMessage(content.getTypingMessage().get())
112 : null;
113
114 this.dataMessage = content != null && content.getDataMessage().isPresent()
115 ? new JsonDataMessage(content.getDataMessage().get(), m)
116 : null;
117 this.syncMessage = content != null && content.getSyncMessage().isPresent()
118 ? new JsonSyncMessage(content.getSyncMessage().get(), m)
119 : null;
120 this.callMessage = content != null && content.getCallMessage().isPresent()
121 ? new JsonCallMessage(content.getCallMessage().get())
122 : null;
123 }
124
125 public JsonMessageEnvelope(Signal.MessageReceived messageReceived) {
126 source = messageReceived.getSender();
127 sourceNumber = null;
128 sourceUuid = null;
129 sourceName = null;
130 sourceDevice = null;
131 relay = null;
132 timestamp = messageReceived.getTimestamp();
133 receiptMessage = null;
134 dataMessage = new JsonDataMessage(messageReceived);
135 syncMessage = null;
136 callMessage = null;
137 typingMessage = null;
138 }
139
140 public JsonMessageEnvelope(Signal.ReceiptReceived receiptReceived) {
141 source = receiptReceived.getSender();
142 sourceNumber = null;
143 sourceUuid = null;
144 sourceName = null;
145 sourceDevice = null;
146 relay = null;
147 timestamp = receiptReceived.getTimestamp();
148 receiptMessage = JsonReceiptMessage.deliveryReceipt(timestamp, List.of(timestamp));
149 dataMessage = null;
150 syncMessage = null;
151 callMessage = null;
152 typingMessage = null;
153 }
154
155 public JsonMessageEnvelope(Signal.SyncMessageReceived messageReceived) {
156 source = messageReceived.getSource();
157 sourceNumber = null;
158 sourceUuid = null;
159 sourceName = null;
160 sourceDevice = null;
161 relay = null;
162 timestamp = messageReceived.getTimestamp();
163 receiptMessage = null;
164 dataMessage = null;
165 syncMessage = new JsonSyncMessage(messageReceived);
166 callMessage = null;
167 typingMessage = null;
168 }
169 }