1
1
package org.session.libsession.messaging.sending_receiving
2
2
3
+ import org.session.libsession.messaging.messages.Message
3
4
import org.session.libsession.messaging.messages.ProfileUpdateHandler
4
5
import org.session.libsession.messaging.messages.ProfileUpdateHandler.Updates.Companion.toUpdates
5
6
import org.session.libsession.messaging.messages.control.MessageRequestResponse
6
7
import org.session.libsession.messaging.messages.signal.IncomingMediaMessage
8
+ import org.session.libsession.messaging.messages.visible.VisibleMessage
7
9
import org.session.libsession.utilities.Address
8
10
import org.session.libsession.utilities.Address.Companion.toAddress
9
11
import org.session.libsession.utilities.ConfigFactoryProtocol
12
+ import org.session.libsession.utilities.recipients.Recipient
10
13
import org.session.libsession.utilities.updateContact
11
14
import org.session.libsession.utilities.upsertContact
12
15
import org.session.libsignal.utilities.Log
@@ -30,23 +33,81 @@ class MessageRequestResponseHandler @Inject constructor(
30
33
private val blindMappingRepository : BlindMappingRepository ,
31
34
) {
32
35
33
- suspend fun handle (message : MessageRequestResponse ) {
36
+ suspend fun handleVisibleMessage (message : VisibleMessage ) {
37
+ val (sender, receiver) = fetchSenderAndReceiver(message) ? : return
38
+
39
+ val allBlindedAddresses = blindMappingRepository.calculateReverseMappings(
40
+ contactAddress = sender.address as Address .Standard
41
+ )
42
+
43
+ // Do we have an existing message request (including blinded requests)?
44
+ val hasMessageRequest = configFactory.withUserConfigs { configs ->
45
+ val existingContact = configs.contacts.get(sender.address.accountId.hexString)
46
+ if (existingContact != null && existingContact.approved && ! existingContact.approvedMe) {
47
+ return @withUserConfigs true
48
+ }
49
+
50
+ allBlindedAddresses.any { (_, blindedId) ->
51
+ configs.contacts.getBlinded(blindedId.blindedId.hexString) != null
52
+ }
53
+ }
54
+
55
+ if (hasMessageRequest) {
56
+ handleRequestResponse(
57
+ messageSender = sender,
58
+ messageReceiver = receiver,
59
+ messageTimestampMs = message.sentTimestamp!! ,
60
+ )
61
+ }
62
+ }
63
+
64
+ suspend fun handleExplicitRequestResponseMessage (message : MessageRequestResponse ) {
65
+ val (sender, receiver) = fetchSenderAndReceiver(message) ? : return
66
+ // Always handle explicit request response
67
+ handleRequestResponse(
68
+ messageSender = sender,
69
+ messageReceiver = receiver,
70
+ messageTimestampMs = message.sentTimestamp!! ,
71
+ )
72
+
73
+ // Always process the profile update if any. We don't need
74
+ // to process profile for other kind of messages as they should be handled elsewhere
75
+ message.profile?.toUpdates()?.let { updates ->
76
+ profileUpdateHandler.get().handleProfileUpdate(
77
+ senderId = (sender.address as Address .Standard ).accountId,
78
+ updates = updates,
79
+ fromCommunity = null
80
+ )
81
+ }
82
+ }
83
+
84
+ private suspend fun fetchSenderAndReceiver (message : Message ): Pair <Recipient , Recipient >? {
34
85
val messageSender = recipientRepository.getRecipient(
35
86
requireNotNull(message.sender) {
36
87
" MessageRequestResponse must have a sender"
37
88
}.toAddress()
38
89
)
39
90
40
- if (messageSender.address !is Address .Standard ) {
91
+ return if (messageSender.address !is Address .Standard ) {
41
92
Log .e(TAG , " MessageRequestResponse sender must be a standard address, but got: ${messageSender.address.debugString} " )
42
- return
93
+ null
94
+ } else {
95
+ messageSender to recipientRepository.getRecipient(
96
+ requireNotNull(message.recipient) {
97
+ " MessageRequestResponse must have a receiver"
98
+ }.toAddress()
99
+ )
43
100
}
101
+ }
44
102
45
- val messageReceiver = recipientRepository.getRecipient(
46
- requireNotNull(message.recipient) {
47
- " MessageRequestResponse must have a receiver"
48
- }.toAddress()
49
- )
103
+ private fun handleRequestResponse (
104
+ messageSender : Recipient ,
105
+ messageReceiver : Recipient ,
106
+ messageTimestampMs : Long ,
107
+ ) {
108
+ check(messageSender.address is Address .Standard ) {
109
+ " The sender address must be a standard address"
110
+ }
50
111
51
112
Log .d(TAG , " Handling MessageRequestResponse from " +
52
113
" ${messageSender.address.debugString} to ${messageReceiver.address.debugString} " )
@@ -71,17 +132,6 @@ class MessageRequestResponseHandler @Inject constructor(
71
132
}
72
133
}
73
134
74
-
75
- // Process the profile update if any
76
- message.profile?.toUpdates()?.let { updates ->
77
- profileUpdateHandler.get().handleProfileUpdate(
78
- senderId = messageSender.address.accountId,
79
- updates = updates,
80
- fromCommunity = null
81
- )
82
- }
83
-
84
-
85
135
val threadId by lazy {
86
136
threadDatabase.getOrCreateThreadIdFor(messageSender.address)
87
137
}
@@ -92,7 +142,7 @@ class MessageRequestResponseHandler @Inject constructor(
92
142
mmsDatabase.insertSecureDecryptedMessageInbox(
93
143
retrieved = IncomingMediaMessage (
94
144
messageSender.address,
95
- message.sentTimestamp !! ,
145
+ messageTimestampMs ,
96
146
- 1 ,
97
147
0L ,
98
148
0L ,
@@ -153,7 +203,6 @@ class MessageRequestResponseHandler @Inject constructor(
153
203
154
204
}
155
205
}
156
-
157
206
}
158
207
159
208
private fun moveConversation (fromThreadId : Long , toThreadId : Long ) {
0 commit comments