1 package org
.asamk
.signal
;
3 import org
.asamk
.Signal
;
4 import org
.asamk
.signal
.manager
.Manager
;
5 import org
.asamk
.signal
.manager
.groups
.GroupUtils
;
6 import org
.freedesktop
.dbus
.connections
.impl
.DBusConnection
;
7 import org
.freedesktop
.dbus
.exceptions
.DBusException
;
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
;
13 import java
.util
.ArrayList
;
14 import java
.util
.List
;
16 import static org
.asamk
.signal
.util
.Util
.getLegacyIdentifier
;
18 public class JsonDbusReceiveMessageHandler
extends JsonReceiveMessageHandler
{
20 private final DBusConnection conn
;
22 private final String objectPath
;
24 public JsonDbusReceiveMessageHandler(Manager m
, DBusConnection conn
, final String objectPath
) {
27 this.objectPath
= objectPath
;
30 static void sendReceivedMessageToDbus(
31 SignalServiceEnvelope envelope
,
32 SignalServiceContent content
,
34 final String objectPath
,
37 if (envelope
.isReceipt()) {
39 conn
.sendMessage(new Signal
.ReceiptReceived(objectPath
, envelope
.getTimestamp(),
40 // A receipt envelope always has a source address
41 getLegacyIdentifier(envelope
.getSourceAddress())));
42 } catch (DBusException e
) {
45 } else if (content
!= null) {
46 final var sender
= !envelope
.isUnidentifiedSender() && envelope
.hasSource()
47 ? envelope
.getSourceAddress()
48 : content
.getSender();
49 if (content
.getReceiptMessage().isPresent()) {
50 final var receiptMessage
= content
.getReceiptMessage().get();
51 if (receiptMessage
.isDeliveryReceipt()) {
52 for (long timestamp
: receiptMessage
.getTimestamps()) {
54 conn
.sendMessage(new Signal
.ReceiptReceived(objectPath
,
56 getLegacyIdentifier(sender
)));
57 } catch (DBusException e
) {
62 } else if (content
.getDataMessage().isPresent()) {
63 var message
= content
.getDataMessage().get();
65 var groupId
= getGroupId(message
);
66 if (!message
.isEndSession() && (
68 || message
.getGroupContext().get().getGroupV1Type() == null
69 || message
.getGroupContext().get().getGroupV1Type() == SignalServiceGroup
.Type
.DELIVER
72 conn
.sendMessage(new Signal
.MessageReceived(objectPath
,
73 message
.getTimestamp(),
74 getLegacyIdentifier(sender
),
75 groupId
!= null ? groupId
: new byte[0],
76 message
.getBody().isPresent() ? message
.getBody().get() : "",
77 JsonDbusReceiveMessageHandler
.getAttachments(message
, m
)));
78 } catch (DBusException e
) {
82 } else if (content
.getSyncMessage().isPresent()) {
83 var sync_message
= content
.getSyncMessage().get();
84 if (sync_message
.getSent().isPresent()) {
85 var transcript
= sync_message
.getSent().get();
87 if (transcript
.getDestination().isPresent() || transcript
.getMessage()
90 var message
= transcript
.getMessage();
91 var groupId
= getGroupId(message
);
94 conn
.sendMessage(new Signal
.SyncMessageReceived(objectPath
,
95 transcript
.getTimestamp(),
96 getLegacyIdentifier(sender
),
97 transcript
.getDestination().isPresent()
98 ?
getLegacyIdentifier(transcript
.getDestination().get())
100 groupId
!= null ? groupId
: new byte[0],
101 message
.getBody().isPresent() ? message
.getBody().get() : "",
102 JsonDbusReceiveMessageHandler
.getAttachments(message
, m
)));
103 } catch (DBusException e
) {
112 private static byte[] getGroupId(final SignalServiceDataMessage message
) {
113 return message
.getGroupContext().isPresent() ? GroupUtils
.getGroupId(message
.getGroupContext().get())
117 static private List
<String
> getAttachments(SignalServiceDataMessage message
, Manager m
) {
118 var attachments
= new ArrayList
<String
>();
119 if (message
.getAttachments().isPresent()) {
120 for (var attachment
: message
.getAttachments().get()) {
121 if (attachment
.isPointer()) {
122 attachments
.add(m
.getAttachmentFile(attachment
.asPointer().getRemoteId()).getAbsolutePath());
130 public void handleMessage(SignalServiceEnvelope envelope
, SignalServiceContent content
, Throwable exception
) {
131 super.handleMessage(envelope
, content
, exception
);
133 sendReceivedMessageToDbus(envelope
, content
, conn
, objectPath
, m
);