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