]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/JsonDbusReceiveMessageHandler.java
Reformat project
[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.freedesktop.dbus.connections.impl.DBusConnection;
6 import org.freedesktop.dbus.exceptions.DBusException;
7 import org.whispersystems.signalservice.api.messages.SignalServiceAttachment;
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 import org.whispersystems.signalservice.api.messages.SignalServiceReceiptMessage;
13 import org.whispersystems.signalservice.api.messages.multidevice.SentTranscriptMessage;
14 import org.whispersystems.signalservice.api.messages.multidevice.SignalServiceSyncMessage;
15 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
16
17 import java.util.ArrayList;
18 import java.util.List;
19
20 public class JsonDbusReceiveMessageHandler extends JsonReceiveMessageHandler {
21
22 private final DBusConnection conn;
23
24 private final String objectPath;
25
26 public JsonDbusReceiveMessageHandler(Manager m, DBusConnection conn, final String objectPath) {
27 super(m);
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 envelope.getSourceAddress().getLegacyIdentifier()));
44 } catch (DBusException e) {
45 e.printStackTrace();
46 }
47 } else if (content != null) {
48 final SignalServiceAddress sender = !envelope.isUnidentifiedSender() && envelope.hasSource()
49 ? envelope.getSourceAddress()
50 : content.getSender();
51 if (content.getReceiptMessage().isPresent()) {
52 final SignalServiceReceiptMessage 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 sender.getLegacyIdentifier()));
59 } catch (DBusException e) {
60 e.printStackTrace();
61 }
62 }
63 }
64 } else if (content.getDataMessage().isPresent()) {
65 SignalServiceDataMessage message = content.getDataMessage().get();
66
67 byte[] groupId = getGroupId(m, 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 sender.getLegacyIdentifier(),
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 SignalServiceSyncMessage sync_message = content.getSyncMessage().get();
86 if (sync_message.getSent().isPresent()) {
87 SentTranscriptMessage transcript = sync_message.getSent().get();
88
89 if (transcript.getDestination().isPresent() || transcript.getMessage()
90 .getGroupContext()
91 .isPresent()) {
92 SignalServiceDataMessage message = transcript.getMessage();
93 byte[] groupId = getGroupId(m, message);
94
95 try {
96 conn.sendMessage(new Signal.SyncMessageReceived(objectPath,
97 transcript.getTimestamp(),
98 sender.getLegacyIdentifier(),
99 transcript.getDestination().isPresent() ? transcript.getDestination()
100 .get()
101 .getLegacyIdentifier() : "",
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 Manager m, final SignalServiceDataMessage message) {
115 byte[] groupId;
116 if (message.getGroupContext().isPresent()) {
117 if (message.getGroupContext().get().getGroupV1().isPresent()) {
118 groupId = message.getGroupContext().get().getGroupV1().get().getGroupId();
119 } else if (message.getGroupContext().get().getGroupV2().isPresent()) {
120 groupId = m.getGroupId(message.getGroupContext().get().getGroupV2().get().getMasterKey());
121 } else {
122 groupId = null;
123 }
124 } else {
125 groupId = null;
126 }
127 return groupId;
128 }
129
130 static private List<String> getAttachments(SignalServiceDataMessage message, Manager m) {
131 List<String> attachments = new ArrayList<>();
132 if (message.getAttachments().isPresent()) {
133 for (SignalServiceAttachment attachment : message.getAttachments().get()) {
134 if (attachment.isPointer()) {
135 attachments.add(m.getAttachmentFile(attachment.asPointer().getRemoteId()).getAbsolutePath());
136 }
137 }
138 }
139 return attachments;
140 }
141
142 @Override
143 public void handleMessage(SignalServiceEnvelope envelope, SignalServiceContent content, Throwable exception) {
144 super.handleMessage(envelope, content, exception);
145
146 sendReceivedMessageToDbus(envelope, content, conn, objectPath, m);
147 }
148 }