Skip to content

Commit 5035c80

Browse files
Update how pro feature flags are set (#1728)
1 parent 3f712ba commit 5035c80

22 files changed

+153
-110
lines changed

app/src/main/java/org/session/libsession/messaging/messages/ProfileUpdateHandler.kt

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package org.session.libsession.messaging.messages
22

33
import com.google.protobuf.ByteString
4+
import network.loki.messenger.libsession_util.protocol.ProProfileFeature
45
import network.loki.messenger.libsession_util.util.BaseCommunityInfo
6+
import network.loki.messenger.libsession_util.util.BitSet
7+
import network.loki.messenger.libsession_util.util.Conversation
58
import network.loki.messenger.libsession_util.util.UserPic
69
import org.session.libsession.utilities.Address
710
import org.session.libsession.utilities.Address.Companion.toAddress
@@ -13,6 +16,7 @@ import org.session.libsignal.utilities.Log
1316
import org.thoughtcrime.securesms.database.BlindMappingRepository
1417
import org.thoughtcrime.securesms.database.RecipientRepository
1518
import org.thoughtcrime.securesms.database.RecipientSettingsDatabase
19+
import org.thoughtcrime.securesms.database.model.RecipientSettings
1620
import org.thoughtcrime.securesms.util.DateUtils.Companion.secondsToInstant
1721
import org.thoughtcrime.securesms.util.DateUtils.Companion.toEpochSeconds
1822
import java.time.Instant
@@ -57,11 +61,14 @@ class ProfileUpdateHandler @Inject constructor(
5761
val standardSender = unblinded ?: (senderAddress as? Address.Standard)
5862
if (standardSender != null && (!updates.name.isNullOrBlank() || updates.pic != null)) {
5963
configFactory.withMutableUserConfigs { configs ->
64+
var shouldUpdate = false
6065
configs.contacts.updateContact(standardSender) {
61-
if (shouldUpdateProfile(
66+
shouldUpdate = shouldUpdateProfile(
6267
lastUpdated = profileUpdatedEpochSeconds.secondsToInstant(),
6368
newUpdateTime = updates.profileUpdateTime
64-
)) {
69+
)
70+
71+
if (shouldUpdate) {
6572
if (updates.name != null) {
6673
name = updates.name
6774
}
@@ -70,6 +77,10 @@ class ProfileUpdateHandler @Inject constructor(
7077
profilePicture = updates.pic
7178
}
7279

80+
if (updates.proFeatures != null) {
81+
proFeatures = updates.proFeatures
82+
}
83+
7384
if (updates.profileUpdateTime != null) {
7485
profileUpdatedEpochSeconds = updates.profileUpdateTime.toEpochSeconds()
7586
}
@@ -78,13 +89,20 @@ class ProfileUpdateHandler @Inject constructor(
7889
Log.d(TAG, "Ignoring contact profile update for ${standardSender.debugString}, no changes detected")
7990
}
8091
}
92+
93+
if (shouldUpdate) {
94+
configs.convoInfoVolatile.set(
95+
configs.convoInfoVolatile.getOrConstructOneToOne(standardSender.accountId.hexString)
96+
.copy(proProofInfo = updates.proProof)
97+
)
98+
}
8199
}
82100
}
83101

84102
// If we have a blinded address, we need to look at if we have a blinded contact to update
85103
if (senderAddress is Address.Blinded && (updates.pic != null || !updates.name.isNullOrBlank())) {
86104
configFactory.withMutableUserConfigs { configs ->
87-
configs.contacts.getBlinded(senderAddress.blindedId.hexString)?.let { c ->
105+
val shouldUpdate = configs.contacts.getBlinded(senderAddress.blindedId.hexString)?.let { c ->
88106
if (shouldUpdateProfile(
89107
lastUpdated = c.profileUpdatedEpochSeconds.secondsToInstant(),
90108
newUpdateTime = updates.profileUpdateTime
@@ -97,12 +115,26 @@ class ProfileUpdateHandler @Inject constructor(
97115
c.name = updates.name
98116
}
99117

118+
if (updates.proFeatures != null) {
119+
c.proFeatures = updates.proFeatures
120+
}
121+
100122
if (updates.profileUpdateTime != null) {
101123
c.profileUpdatedEpochSeconds = updates.profileUpdateTime.toEpochSeconds()
102124
}
103125

104126
configs.contacts.setBlinded(c)
127+
true
128+
} else {
129+
false
105130
}
131+
} == true
132+
133+
if (shouldUpdate) {
134+
configs.convoInfoVolatile.set(
135+
configs.convoInfoVolatile.getOrConstructedBlindedOneToOne(senderAddress.blindedId.hexString)
136+
.copy(proProofInfo = updates.proProof)
137+
)
106138
}
107139
}
108140
}
@@ -122,7 +154,13 @@ class ProfileUpdateHandler @Inject constructor(
122154
r.copy(
123155
name = updates.name ?: r.name,
124156
profilePic = updates.pic ?: r.profilePic,
125-
blocksCommunityMessagesRequests = updates.blocksCommunityMessageRequests ?: r.blocksCommunityMessagesRequests
157+
blocksCommunityMessagesRequests = updates.blocksCommunityMessageRequests ?: r.blocksCommunityMessagesRequests,
158+
proData = updates.proProof?.let {
159+
RecipientSettings.ProData(
160+
info = it,
161+
features = updates.proFeatures ?: BitSet()
162+
)
163+
},
126164
)
127165
} else if (updates.blocksCommunityMessageRequests != null &&
128166
r.blocksCommunityMessagesRequests != updates.blocksCommunityMessageRequests) {
@@ -155,6 +193,8 @@ class ProfileUpdateHandler @Inject constructor(
155193
// Name to update, must be non-blank if provided.
156194
val name: String? = null,
157195
val pic: UserPic? = null,
196+
val proProof: Conversation.ProProofInfo? = null,
197+
val proFeatures: BitSet<ProProfileFeature>? = null,
158198
val blocksCommunityMessageRequests: Boolean? = null,
159199
val profileUpdateTime: Instant?,
160200
) {

app/src/main/java/org/session/libsession/messaging/messages/signal/IncomingMediaMessage.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.session.libsession.messaging.messages.signal
22

3-
import network.loki.messenger.libsession_util.protocol.ProFeatures
3+
import network.loki.messenger.libsession_util.protocol.ProMessageFeature
4+
import network.loki.messenger.libsession_util.util.BitSet
45
import org.session.libsession.messaging.messages.visible.VisibleMessage
56
import org.session.libsession.messaging.sending_receiving.attachments.Attachment
67
import org.session.libsession.messaging.sending_receiving.data_extraction.DataExtractionNotificationInfoMessage
@@ -19,7 +20,7 @@ class IncomingMediaMessage(
1920
val body: String?,
2021
val group: Address.GroupLike?,
2122
val attachments: List<Attachment>,
22-
val proFeatures: ProFeatures,
23+
val proFeatures: BitSet<ProMessageFeature>,
2324
val messageContent: MessageContent?,
2425
val quote: QuoteModel?,
2526
val linkPreviews: List<LinkPreview>,

app/src/main/java/org/session/libsession/messaging/messages/signal/IncomingTextMessage.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.session.libsession.messaging.messages.signal
22

3-
import network.loki.messenger.libsession_util.protocol.ProFeatures
3+
import network.loki.messenger.libsession_util.protocol.ProMessageFeature
4+
import network.loki.messenger.libsession_util.util.BitSet
45
import org.session.libsession.messaging.calls.CallMessageType
56
import org.session.libsession.messaging.messages.visible.OpenGroupInvitation
67
import org.session.libsession.messaging.messages.visible.VisibleMessage
@@ -20,7 +21,7 @@ data class IncomingTextMessage(
2021
val hasMention: Boolean,
2122
val isOpenGroupInvitation: Boolean,
2223
val isSecureMessage: Boolean,
23-
val proFeatures: ProFeatures,
24+
val proFeatures: BitSet<ProMessageFeature>,
2425
val isGroupMessage: Boolean = false,
2526
val isGroupUpdateMessage: Boolean = false,
2627
) {
@@ -80,7 +81,7 @@ data class IncomingTextMessage(
8081
hasMention = false,
8182
isOpenGroupInvitation = false,
8283
isSecureMessage = false,
83-
proFeatures = ProFeatures.NONE,
84+
proFeatures = BitSet(),
8485
)
8586

8687
companion object {
@@ -108,7 +109,7 @@ data class IncomingTextMessage(
108109
hasMention = false,
109110
isOpenGroupInvitation = true,
110111
isSecureMessage = false,
111-
proFeatures = ProFeatures.NONE,
112+
proFeatures = BitSet(),
112113
)
113114
}
114115
}

app/src/main/java/org/session/libsession/messaging/messages/signal/OutgoingMediaMessage.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.session.libsession.messaging.messages.signal
22

3-
import network.loki.messenger.libsession_util.protocol.ProFeatures
3+
import network.loki.messenger.libsession_util.protocol.ProMessageFeature
4+
import network.loki.messenger.libsession_util.util.BitSet
45
import org.session.libsession.messaging.messages.visible.VisibleMessage
56
import org.session.libsession.messaging.sending_receiving.attachments.Attachment
67
import org.session.libsession.messaging.sending_receiving.link_preview.LinkPreview
@@ -20,7 +21,7 @@ class OutgoingMediaMessage(
2021
val linkPreviews: List<LinkPreview>,
2122
val group: Address.GroupLike?,
2223
val isGroupUpdateMessage: Boolean,
23-
val proFeatures: ProFeatures = ProFeatures.NONE,
24+
val proFeatures: BitSet<ProMessageFeature> = BitSet()
2425
) {
2526
init {
2627
check(!isGroupUpdateMessage || group != null) {

app/src/main/java/org/session/libsession/messaging/messages/signal/OutgoingTextMessage.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.session.libsession.messaging.messages.signal
22

3-
import network.loki.messenger.libsession_util.protocol.ProFeatures
3+
import network.loki.messenger.libsession_util.protocol.ProMessageFeature
4+
import network.loki.messenger.libsession_util.util.BitSet
45
import org.session.libsession.messaging.messages.visible.OpenGroupInvitation
56
import org.session.libsession.messaging.messages.visible.VisibleMessage
67
import org.session.libsession.messaging.utilities.UpdateMessageData
@@ -13,7 +14,7 @@ data class OutgoingTextMessage(
1314
val expireStartedAtMillis: Long,
1415
val sentTimestampMillis: Long,
1516
val isOpenGroupInvitation: Boolean,
16-
val proFeatures: ProFeatures = ProFeatures.NONE,
17+
val proFeatures: BitSet<ProMessageFeature> = BitSet()
1718
) {
1819
constructor(
1920
message: VisibleMessage,

app/src/main/java/org/session/libsession/messaging/messages/visible/VisibleMessage.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ package org.session.libsession.messaging.messages.visible
22

33
import androidx.annotation.Keep
44
import network.loki.messenger.BuildConfig
5-
import network.loki.messenger.libsession_util.protocol.ProFeatures
5+
import network.loki.messenger.libsession_util.protocol.ProMessageFeature
6+
import network.loki.messenger.libsession_util.util.BitSet
67
import org.session.libsession.database.MessageDataProvider
78
import org.session.libsession.messaging.messages.Message
89
import org.session.libsession.messaging.messages.copyExpiration
@@ -26,12 +27,12 @@ data class VisibleMessage(
2627
var reaction: Reaction? = null,
2728
var hasMention: Boolean = false,
2829
var blocksMessageRequests: Boolean = false,
29-
var proFeatures: ProFeatures = ProFeatures.NONE
30+
var proFeatures: BitSet<ProMessageFeature> = BitSet()
3031
) : Message() {
3132

3233
// This empty constructor is needed for kryo serialization
3334
@Keep
34-
constructor(): this(proFeatures = ProFeatures.NONE)
35+
constructor(): this(proFeatures = BitSet())
3536

3637
override val isSelfSendValid: Boolean = true
3738

@@ -113,7 +114,7 @@ data class VisibleMessage(
113114
}
114115

115116
// Pro features
116-
if (proFeatures != ProFeatures.NONE) {
117+
if (!proFeatures.isEmpty) {
117118
builder.proMessageBuilder.setFeatures(proFeatures.rawValue)
118119
}
119120
}

app/src/main/java/org/session/libsession/messaging/sending_receiving/MessageParser.kt

Lines changed: 15 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package org.session.libsession.messaging.sending_receiving
22

3-
import network.loki.messenger.libsession_util.ED25519
3+
import dagger.Lazy
44
import network.loki.messenger.libsession_util.SessionEncrypt
5-
import network.loki.messenger.libsession_util.pro.ProProof
65
import network.loki.messenger.libsession_util.protocol.DecodedEnvelope
7-
import network.loki.messenger.libsession_util.protocol.ProFeatures
6+
import network.loki.messenger.libsession_util.protocol.DecodedPro
87
import network.loki.messenger.libsession_util.protocol.SessionProtocol
8+
import network.loki.messenger.libsession_util.util.BitSet
99
import org.session.libsession.database.StorageProtocol
1010
import org.session.libsession.messaging.messages.Message
1111
import org.session.libsession.messaging.messages.control.CallMessage
@@ -21,13 +21,14 @@ import org.session.libsession.messaging.open_groups.OpenGroupApi
2121
import org.session.libsession.snode.SnodeClock
2222
import org.session.libsession.utilities.Address
2323
import org.session.libsession.utilities.ConfigFactoryProtocol
24+
import org.session.libsession.utilities.TextSecurePreferences
2425
import org.session.libsignal.exceptions.NonRetryableException
2526
import org.session.libsignal.protos.SignalServiceProtos
2627
import org.session.libsignal.utilities.AccountId
2728
import org.session.libsignal.utilities.Base64
2829
import org.session.libsignal.utilities.Hex
2930
import org.session.libsignal.utilities.IdPrefix
30-
import java.time.Instant
31+
import org.thoughtcrime.securesms.pro.ProStatusManager
3132
import java.util.concurrent.TimeUnit
3233
import javax.inject.Inject
3334
import javax.inject.Singleton
@@ -38,6 +39,7 @@ class MessageParser @Inject constructor(
3839
private val configFactory: ConfigFactoryProtocol,
3940
private val storage: StorageProtocol,
4041
private val snodeClock: SnodeClock,
42+
private val prefs: TextSecurePreferences,
4143
) {
4244

4345
//TODO: Obtain proBackendKey from somewhere
@@ -77,20 +79,10 @@ class MessageParser @Inject constructor(
7779
currentUserBlindedIDs: List<AccountId>,
7880
senderIdPrefix: IdPrefix
7981
): Pair<Message, SignalServiceProtos.Content> {
80-
val proFeatures = if (decodedEnvelope.proProof?.status(
81-
senderED25519PubKey = decodedEnvelope.senderEd25519PubKey.data,
82-
signedMessage = null,
83-
now = decodedEnvelope.timestamp) == ProProof.Status.Valid
84-
) {
85-
decodedEnvelope.proFeatures
86-
} else {
87-
ProFeatures.NONE
88-
}
89-
9082
return parseMessage(
9183
sender = AccountId(senderIdPrefix, decodedEnvelope.senderX25519PubKey.data),
9284
contentPlaintext = decodedEnvelope.contentPlainText.data,
93-
proFeatures = proFeatures,
85+
pro = decodedEnvelope.decodedPro,
9486
messageTimestampMs = decodedEnvelope.timestamp.toEpochMilli(),
9587
relaxSignatureCheck = relaxSignatureCheck,
9688
checkForBlockStatus = checkForBlockStatus,
@@ -103,7 +95,7 @@ class MessageParser @Inject constructor(
10395
private fun parseMessage(
10496
sender: AccountId,
10597
contentPlaintext: ByteArray,
106-
proFeatures: ProFeatures,
98+
pro: DecodedPro?,
10799
messageTimestampMs: Long,
108100
relaxSignatureCheck: Boolean,
109101
checkForBlockStatus: Boolean,
@@ -142,7 +134,11 @@ class MessageParser @Inject constructor(
142134
message.sentTimestamp = messageTimestampMs
143135
message.receivedTimestamp = snodeClock.currentTimeMills()
144136
message.isSenderSelf = isSenderSelf
145-
(message as? VisibleMessage)?.proFeatures = proFeatures
137+
138+
// Only process pro features post pro launch
139+
if (prefs.forcePostPro()) {
140+
(message as? VisibleMessage)?.proFeatures = pro?.proMessageFeatures ?: BitSet()
141+
}
146142

147143
// Validate
148144
var isValid = message.isValid()
@@ -244,19 +240,9 @@ class MessageParser @Inject constructor(
244240

245241
val sender = AccountId(msg.sessionId)
246242

247-
val proFeatures = if (decoded.proProof?.status(
248-
senderED25519PubKey = sender.pubKeyBytes,
249-
signedMessage = null,
250-
now = Instant.ofEpochMilli((msg.posted * 1000.0).toLong())) == ProProof.Status.Valid
251-
) {
252-
decoded.proFeatures
253-
} else {
254-
ProFeatures.NONE
255-
}
256-
257243
return parseMessage(
258244
contentPlaintext = decoded.contentPlainText.data,
259-
proFeatures = proFeatures,
245+
pro = decoded.decodedPro,
260246
relaxSignatureCheck = true,
261247
checkForBlockStatus = false,
262248
isForGroup = false,
@@ -291,27 +277,10 @@ class MessageParser @Inject constructor(
291277
)
292278

293279
val sender = Address.Standard(AccountId(senderId))
294-
val messageSent = Instant.ofEpochMilli((msg.postedAt * 1000.0).toLong())
295-
296-
val proProof = decoded.proProof
297-
val proFeatures = if (proProof != null) {
298-
val hasValidProof = ED25519.ed25519PubKeysFromCurve25519(sender.accountId.pubKeyBytes)
299-
.any { senderEd25519PubKey ->
300-
proProof.status(senderEd25519PubKey, now = messageSent) == ProProof.Status.Valid
301-
}
302-
303-
if (hasValidProof) {
304-
decoded.proFeatures
305-
} else {
306-
ProFeatures.NONE
307-
}
308-
} else {
309-
ProFeatures.NONE
310-
}
311280

312281
return parseMessage(
313282
contentPlaintext = decoded.contentPlainText.data,
314-
proFeatures = proFeatures,
283+
pro = decoded.decodedPro,
315284
relaxSignatureCheck = true,
316285
checkForBlockStatus = false,
317286
isForGroup = false,

app/src/main/java/org/session/libsession/messaging/sending_receiving/MessageRequestResponseHandler.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package org.session.libsession.messaging.sending_receiving
22

3-
import network.loki.messenger.libsession_util.protocol.ProFeatures
3+
import network.loki.messenger.libsession_util.util.BitSet
44
import org.session.libsession.messaging.messages.Message
55
import org.session.libsession.messaging.messages.ProfileUpdateHandler
66
import org.session.libsession.messaging.messages.control.MessageRequestResponse
@@ -161,7 +161,7 @@ class MessageRequestResponseHandler @Inject constructor(
161161
body = null,
162162
group = null,
163163
attachments = emptyList(),
164-
proFeatures = ProFeatures.NONE,
164+
proFeatures = BitSet(),
165165
messageContent = null,
166166
quote = null,
167167
linkPreviews = emptyList(),

0 commit comments

Comments
 (0)