]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/JsonDbusReceiveMessageHandler.java
Update dependencies
[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
16 import java.util.ArrayList;
17 import java.util.List;
18
19 public class JsonDbusReceiveMessageHandler extends JsonReceiveMessageHandler {
20
21 private final DBusConnection conn;
22
23 private final String objectPath;
24
25 public JsonDbusReceiveMessageHandler(Manager m, DBusConnection conn, final String objectPath) {
26 super(m);
27 this.conn = conn;
28 this.objectPath = objectPath;
29 }
30
31 static void sendReceivedMessageToDbus(SignalServiceEnvelope envelope, SignalServiceContent content, DBusConnection conn, final String objectPath, Manager m) {
32 if (envelope.isReceipt()) {
33 try {
34 conn.sendMessage(new Signal.ReceiptReceived(
35 objectPath,
36 envelope.getTimestamp(),
37 !envelope.isUnidentifiedSender() && envelope.hasSource() ? envelope.getSourceE164().get() : content.getSender().getNumber().get()
38 ));
39 } catch (DBusException e) {
40 e.printStackTrace();
41 }
42 } else if (content != null) {
43 if (content.getReceiptMessage().isPresent()) {
44 final SignalServiceReceiptMessage receiptMessage = content.getReceiptMessage().get();
45 if (receiptMessage.isDeliveryReceipt()) {
46 final String sender = !envelope.isUnidentifiedSender() && envelope.hasSource() ? envelope.getSourceE164().get() : content.getSender().getNumber().get();
47 for (long timestamp : receiptMessage.getTimestamps()) {
48 try {
49 conn.sendMessage(new Signal.ReceiptReceived(
50 objectPath,
51 timestamp,
52 sender
53 ));
54 } catch (DBusException e) {
55 e.printStackTrace();
56 }
57 }
58 }
59 } else if (content.getDataMessage().isPresent()) {
60 SignalServiceDataMessage message = content.getDataMessage().get();
61
62 if (!message.isEndSession() &&
63 !(message.getGroupContext().isPresent() &&
64 message.getGroupContext().get().getGroupV1Type() != SignalServiceGroup.Type.DELIVER)) {
65 try {
66 conn.sendMessage(new Signal.MessageReceived(
67 objectPath,
68 message.getTimestamp(),
69 envelope.isUnidentifiedSender() || !envelope.hasSource() ? content.getSender().getNumber().get() : envelope.getSourceE164().get(),
70 message.getGroupContext().isPresent() && message.getGroupContext().get().getGroupV1().isPresent()
71 ? message.getGroupContext().get().getGroupV1().get().getGroupId() : new byte[0],
72 message.getBody().isPresent() ? message.getBody().get() : "",
73 JsonDbusReceiveMessageHandler.getAttachments(message, m)));
74 } catch (DBusException e) {
75 e.printStackTrace();
76 }
77 }
78 } else if (content.getSyncMessage().isPresent()) {
79 SignalServiceSyncMessage sync_message = content.getSyncMessage().get();
80 if (sync_message.getSent().isPresent()) {
81 SentTranscriptMessage transcript = sync_message.getSent().get();
82
83 if (!envelope.isUnidentifiedSender() && envelope.hasSource() && (transcript.getDestination().isPresent() || transcript.getMessage().getGroupContext().isPresent())) {
84 SignalServiceDataMessage message = transcript.getMessage();
85
86 try {
87 conn.sendMessage(new Signal.SyncMessageReceived(
88 objectPath,
89 transcript.getTimestamp(),
90 envelope.getSourceAddress().getNumber().get(),
91 transcript.getDestination().isPresent() ? transcript.getDestination().get().getNumber().get() : "",
92 message.getGroupContext().isPresent() && message.getGroupContext().get().getGroupV1().isPresent()
93 ? message.getGroupContext().get().getGroupV1().get().getGroupId() : new byte[0],
94 message.getBody().isPresent() ? message.getBody().get() : "",
95 JsonDbusReceiveMessageHandler.getAttachments(message, m)));
96 } catch (DBusException e) {
97 e.printStackTrace();
98 }
99 }
100 }
101 }
102 }
103 }
104
105 static private List<String> getAttachments(SignalServiceDataMessage message, Manager m) {
106 List<String> attachments = new ArrayList<>();
107 if (message.getAttachments().isPresent()) {
108 for (SignalServiceAttachment attachment : message.getAttachments().get()) {
109 if (attachment.isPointer()) {
110 attachments.add(m.getAttachmentFile(attachment.asPointer().getRemoteId()).getAbsolutePath());
111 }
112 }
113 }
114 return attachments;
115 }
116
117 @Override
118 public void handleMessage(SignalServiceEnvelope envelope, SignalServiceContent content, Throwable exception) {
119 super.handleMessage(envelope, content, exception);
120
121 sendReceivedMessageToDbus(envelope, content, conn, objectPath, m);
122 }
123 }