1 package org
.asamk
.signal
;
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
;
17 import java
.util
.ArrayList
;
18 import java
.util
.List
;
20 public class JsonDbusReceiveMessageHandler
extends JsonReceiveMessageHandler
{
22 private final DBusConnection conn
;
24 private final String objectPath
;
26 public JsonDbusReceiveMessageHandler(Manager m
, DBusConnection conn
, final String objectPath
) {
29 this.objectPath
= objectPath
;
32 static void sendReceivedMessageToDbus(SignalServiceEnvelope envelope
, SignalServiceContent content
, DBusConnection conn
, final String objectPath
, Manager m
) {
33 if (envelope
.isReceipt()) {
35 conn
.sendMessage(new Signal
.ReceiptReceived(
37 envelope
.getTimestamp(),
38 // A receipt envelope always has a source address
39 envelope
.getSourceAddress().getLegacyIdentifier()
41 } catch (DBusException e
) {
44 } else if (content
!= null) {
45 final SignalServiceAddress sender
= !envelope
.isUnidentifiedSender() && envelope
.hasSource() ? envelope
.getSourceAddress() : content
.getSender();
46 if (content
.getReceiptMessage().isPresent()) {
47 final SignalServiceReceiptMessage receiptMessage
= content
.getReceiptMessage().get();
48 if (receiptMessage
.isDeliveryReceipt()) {
49 for (long timestamp
: receiptMessage
.getTimestamps()) {
51 conn
.sendMessage(new Signal
.ReceiptReceived(
54 sender
.getLegacyIdentifier()
56 } catch (DBusException e
) {
61 } else if (content
.getDataMessage().isPresent()) {
62 SignalServiceDataMessage message
= content
.getDataMessage().get();
64 byte[] groupId
= getGroupId(m
, message
);
65 if (!message
.isEndSession() &&
67 || message
.getGroupContext().get().getGroupV1Type() == null
68 || message
.getGroupContext().get().getGroupV1Type() == SignalServiceGroup
.Type
.DELIVER
)) {
70 conn
.sendMessage(new Signal
.MessageReceived(
72 message
.getTimestamp(),
73 sender
.getLegacyIdentifier(),
74 groupId
!= null ? groupId
: new byte[0],
75 message
.getBody().isPresent() ? message
.getBody().get() : "",
76 JsonDbusReceiveMessageHandler
.getAttachments(message
, m
)));
77 } catch (DBusException e
) {
81 } else if (content
.getSyncMessage().isPresent()) {
82 SignalServiceSyncMessage sync_message
= content
.getSyncMessage().get();
83 if (sync_message
.getSent().isPresent()) {
84 SentTranscriptMessage transcript
= sync_message
.getSent().get();
86 if (transcript
.getDestination().isPresent() || transcript
.getMessage().getGroupContext().isPresent()) {
87 SignalServiceDataMessage message
= transcript
.getMessage();
88 byte[] groupId
= getGroupId(m
, message
);
91 conn
.sendMessage(new Signal
.SyncMessageReceived(
93 transcript
.getTimestamp(),
94 sender
.getLegacyIdentifier(),
95 transcript
.getDestination().isPresent() ? transcript
.getDestination().get().getLegacyIdentifier() : "",
96 groupId
!= null ? groupId
: new byte[0],
97 message
.getBody().isPresent() ? message
.getBody().get() : "",
98 JsonDbusReceiveMessageHandler
.getAttachments(message
, m
)));
99 } catch (DBusException e
) {
108 private static byte[] getGroupId(final Manager m
, final SignalServiceDataMessage message
) {
110 if (message
.getGroupContext().isPresent()) {
111 if (message
.getGroupContext().get().getGroupV1().isPresent()) {
112 groupId
= message
.getGroupContext().get().getGroupV1().get().getGroupId();
113 } else if (message
.getGroupContext().get().getGroupV2().isPresent()) {
114 groupId
= m
.getGroupId(message
.getGroupContext().get().getGroupV2().get().getMasterKey());
124 static private List
<String
> getAttachments(SignalServiceDataMessage message
, Manager m
) {
125 List
<String
> attachments
= new ArrayList
<>();
126 if (message
.getAttachments().isPresent()) {
127 for (SignalServiceAttachment attachment
: message
.getAttachments().get()) {
128 if (attachment
.isPointer()) {
129 attachments
.add(m
.getAttachmentFile(attachment
.asPointer().getRemoteId()).getAbsolutePath());
137 public void handleMessage(SignalServiceEnvelope envelope
, SignalServiceContent content
, Throwable exception
) {
138 super.handleMessage(envelope
, content
, exception
);
140 sendReceivedMessageToDbus(envelope
, content
, conn
, objectPath
, m
);