1 package org
.asamk
.signal
;
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
;
18 import java
.util
.ArrayList
;
19 import java
.util
.List
;
21 public class JsonDbusReceiveMessageHandler
extends JsonReceiveMessageHandler
{
23 private final DBusConnection conn
;
25 private final String objectPath
;
27 public JsonDbusReceiveMessageHandler(Manager m
, DBusConnection conn
, final String objectPath
) {
30 this.objectPath
= objectPath
;
33 static void sendReceivedMessageToDbus(
34 SignalServiceEnvelope envelope
,
35 SignalServiceContent content
,
37 final String objectPath
,
40 if (envelope
.isReceipt()) {
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
) {
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()) {
57 conn
.sendMessage(new Signal
.ReceiptReceived(objectPath
,
59 sender
.getLegacyIdentifier()));
60 } catch (DBusException e
) {
65 } else if (content
.getDataMessage().isPresent()) {
66 SignalServiceDataMessage message
= content
.getDataMessage().get();
68 byte[] groupId
= getGroupId(message
);
69 if (!message
.isEndSession() && (
71 || message
.getGroupContext().get().getGroupV1Type() == null
72 || message
.getGroupContext().get().getGroupV1Type() == SignalServiceGroup
.Type
.DELIVER
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
) {
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();
90 if (transcript
.getDestination().isPresent() || transcript
.getMessage()
93 SignalServiceDataMessage message
= transcript
.getMessage();
94 byte[] groupId
= getGroupId(message
);
97 conn
.sendMessage(new Signal
.SyncMessageReceived(objectPath
,
98 transcript
.getTimestamp(),
99 sender
.getLegacyIdentifier(),
100 transcript
.getDestination().isPresent() ? transcript
.getDestination()
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
) {
115 private static byte[] getGroupId(final SignalServiceDataMessage message
) {
116 return message
.getGroupContext().isPresent() ? GroupUtils
.getGroupId(message
.getGroupContext().get())
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());
133 public void handleMessage(SignalServiceEnvelope envelope
, SignalServiceContent content
, Throwable exception
) {
134 super.handleMessage(envelope
, content
, exception
);
136 sendReceivedMessageToDbus(envelope
, content
, conn
, objectPath
, m
);