]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/JsonDbusReceiveMessageHandler.java
Update libsignal-service-java
[signal-cli] / src / main / java / org / asamk / signal / JsonDbusReceiveMessageHandler.java
1 package org.asamk.signal;
2
3 import org.asamk.Signal;
4 import org.asamk.signal.manager.Manager;
5 import org.asamk.signal.manager.groups.GroupUtils;
6 import org.freedesktop.dbus.connections.impl.DBusConnection;
7 import org.freedesktop.dbus.exceptions.DBusException;
8 import org.whispersystems.signalservice.api.messages.SignalServiceContent;
9 import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage;
10 import org.whispersystems.signalservice.api.messages.SignalServiceEnvelope;
11 import org.whispersystems.signalservice.api.messages.SignalServiceGroup;
12
13 import java.util.ArrayList;
14 import java.util.List;
15
16 import static org.asamk.signal.util.Util.getLegacyIdentifier;
17
18 public class JsonDbusReceiveMessageHandler extends JsonReceiveMessageHandler {
19
20 private final DBusConnection conn;
21
22 private final String objectPath;
23
24 public JsonDbusReceiveMessageHandler(
25 Manager m, JsonWriter jsonWriter, DBusConnection conn, final String objectPath
26 ) {
27 super(m, jsonWriter);
28 this.conn = conn;
29 this.objectPath = objectPath;
30 }
31
32 static void sendReceivedMessageToDbus(
33 SignalServiceEnvelope envelope,
34 SignalServiceContent content,
35 DBusConnection conn,
36 final String objectPath,
37 Manager m
38 ) {
39 if (envelope.isReceipt()) {
40 try {
41 conn.sendMessage(new Signal.ReceiptReceived(objectPath, envelope.getTimestamp(),
42 // A receipt envelope always has a source address
43 getLegacyIdentifier(envelope.getSourceAddress())));
44 } catch (DBusException e) {
45 e.printStackTrace();
46 }
47 } else if (content != null) {
48 final var sender = !envelope.isUnidentifiedSender() && envelope.hasSourceUuid()
49 ? envelope.getSourceAddress()
50 : content.getSender();
51 if (content.getReceiptMessage().isPresent()) {
52 final var receiptMessage = content.getReceiptMessage().get();
53 if (receiptMessage.isDeliveryReceipt()) {
54 for (long timestamp : receiptMessage.getTimestamps()) {
55 try {
56 conn.sendMessage(new Signal.ReceiptReceived(objectPath,
57 timestamp,
58 getLegacyIdentifier(sender)));
59 } catch (DBusException e) {
60 e.printStackTrace();
61 }
62 }
63 }
64 } else if (content.getDataMessage().isPresent()) {
65 var message = content.getDataMessage().get();
66
67 var groupId = getGroupId(message);
68 if (!message.isEndSession() && (
69 groupId == null
70 || message.getGroupContext().get().getGroupV1Type() == null
71 || message.getGroupContext().get().getGroupV1Type() == SignalServiceGroup.Type.DELIVER
72 )) {
73 try {
74 conn.sendMessage(new Signal.MessageReceived(objectPath,
75 message.getTimestamp(),
76 getLegacyIdentifier(sender),
77 groupId != null ? groupId : new byte[0],
78 message.getBody().isPresent() ? message.getBody().get() : "",
79 JsonDbusReceiveMessageHandler.getAttachments(message, m)));
80 } catch (DBusException e) {
81 e.printStackTrace();
82 }
83 }
84 } else if (content.getSyncMessage().isPresent()) {
85 var sync_message = content.getSyncMessage().get();
86 if (sync_message.getSent().isPresent()) {
87 var transcript = sync_message.getSent().get();
88
89 if (transcript.getDestination().isPresent() || transcript.getMessage()
90 .getGroupContext()
91 .isPresent()) {
92 var message = transcript.getMessage();
93 var groupId = getGroupId(message);
94
95 try {
96 conn.sendMessage(new Signal.SyncMessageReceived(objectPath,
97 transcript.getTimestamp(),
98 getLegacyIdentifier(sender),
99 transcript.getDestination().isPresent()
100 ? getLegacyIdentifier(transcript.getDestination().get())
101 : "",
102 groupId != null ? groupId : new byte[0],
103 message.getBody().isPresent() ? message.getBody().get() : "",
104 JsonDbusReceiveMessageHandler.getAttachments(message, m)));
105 } catch (DBusException e) {
106 e.printStackTrace();
107 }
108 }
109 }
110 }
111 }
112 }
113
114 private static byte[] getGroupId(final SignalServiceDataMessage message) {
115 return message.getGroupContext().isPresent() ? GroupUtils.getGroupId(message.getGroupContext().get())
116 .serialize() : null;
117 }
118
119 static private List<String> getAttachments(SignalServiceDataMessage message, Manager m) {
120 var attachments = new ArrayList<String>();
121 if (message.getAttachments().isPresent()) {
122 for (var attachment : message.getAttachments().get()) {
123 if (attachment.isPointer()) {
124 attachments.add(m.getAttachmentFile(attachment.asPointer().getRemoteId()).getAbsolutePath());
125 }
126 }
127 }
128 return attachments;
129 }
130
131 @Override
132 public void handleMessage(SignalServiceEnvelope envelope, SignalServiceContent content, Throwable exception) {
133 super.handleMessage(envelope, content, exception);
134
135 sendReceivedMessageToDbus(envelope, content, conn, objectPath, m);
136 }
137 }