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 {
@JsonProperty
+ @Deprecated
final String source;
@JsonProperty
- final Integer sourceDevice;
+ final String sourceNumber;
+
+ @JsonProperty
+ final String sourceUuid;
@JsonProperty
- final String relay;
+ final String sourceName;
+
+ @JsonProperty
+ final Integer sourceDevice;
@JsonProperty
final long timestamp;
@JsonInclude(JsonInclude.Include.NON_NULL)
final JsonTypingMessage typingMessage;
- public JsonMessageEnvelope(SignalServiceEnvelope envelope, SignalServiceContent content, Manager m) {
- if (!envelope.isUnidentifiedSender() && envelope.hasSource()) {
- SignalServiceAddress source = envelope.getSourceAddress();
- this.source = source.getLegacyIdentifier();
+ 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();
- this.relay = source.getRelay().orNull();
} else if (envelope.isUnidentifiedSender() && content != null) {
- this.source = content.getSender().getLegacyIdentifier();
+ 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();
- this.relay = null;
+ } 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.relay = null;
}
+ String name;
+ try {
+ name = m.getContactOrProfileName(RecipientIdentifier.Single.fromString(this.source, m.getSelfNumber()));
+ } catch (InvalidNumberException | NullPointerException e) {
+ name = null;
+ }
+ this.sourceName = name;
this.timestamp = envelope.getTimestamp();
if (envelope.isReceipt()) {
this.receiptMessage = JsonReceiptMessage.deliveryReceipt(timestamp, List.of(timestamp));
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);
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;
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;