fix: compile errors and moving the references to sessionId and broken hex string function

This commit is contained in:
0x330a
2023-08-31 17:32:43 +10:00
parent 63e156cce5
commit d19d1231c9
16 changed files with 56 additions and 62 deletions

View File

@@ -8,6 +8,9 @@ import network.loki.messenger.libsession_util.ConfigBase.Companion.PRIORITY_PINN
import network.loki.messenger.libsession_util.ConfigBase.Companion.PRIORITY_VISIBLE
import network.loki.messenger.libsession_util.Contacts
import network.loki.messenger.libsession_util.ConversationVolatileConfig
import network.loki.messenger.libsession_util.GroupInfoConfig
import network.loki.messenger.libsession_util.GroupKeysConfig
import network.loki.messenger.libsession_util.GroupMemberConfig
import network.loki.messenger.libsession_util.UserGroupsConfig
import network.loki.messenger.libsession_util.UserProfile
import network.loki.messenger.libsession_util.util.BaseCommunityInfo
@@ -54,7 +57,6 @@ import org.session.libsession.messaging.sending_receiving.link_preview.LinkPrevi
import org.session.libsession.messaging.sending_receiving.notifications.PushRegistryV1
import org.session.libsession.messaging.sending_receiving.pollers.ClosedGroupPollerV2
import org.session.libsession.messaging.sending_receiving.quotes.QuoteModel
import org.session.libsession.messaging.utilities.SessionId
import org.session.libsession.messaging.utilities.SodiumUtilities
import org.session.libsession.messaging.utilities.UpdateMessageData
import org.session.libsession.snode.OnionRequestAPI
@@ -77,6 +79,7 @@ import org.session.libsignal.utilities.Hex
import org.session.libsignal.utilities.IdPrefix
import org.session.libsignal.utilities.KeyHelper
import org.session.libsignal.utilities.Log
import org.session.libsignal.utilities.SessionId
import org.session.libsignal.utilities.guava.Optional
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper
import org.thoughtcrime.securesms.database.model.MessageId
@@ -118,8 +121,7 @@ open class Storage(context: Context, helper: SQLCipherOpenHelper, private val co
address.isClosedGroup -> {
val sessionId = address.serialize()
val closedGroup = groups.getClosedGroup(sessionId)
Log.w("Loki", "Thread created called for new closed group address, not adding any extra information")
TODO("Set the closed group's convo volatile info")
}
address.isOpenGroup -> {
// these should be added on the group join / group info fetch
@@ -149,13 +151,15 @@ open class Storage(context: Context, helper: SQLCipherOpenHelper, private val co
val volatile = configFactory.convoVolatile ?: return
if (address.isGroup) {
val groups = configFactory.userGroups ?: return
if (address.isClosedGroup) {
if (address.isLegacyClosedGroup) {
val sessionId = GroupUtil.doubleDecodeGroupId(address.serialize())
volatile.eraseLegacyClosedGroup(sessionId)
groups.eraseLegacyGroup(sessionId)
} else if (address.isOpenGroup) {
// these should be removed in the group leave / handling new configs
Log.w("Loki", "Thread delete called for open group address, expecting to be handled elsewhere")
} else if (address.isClosedGroup) {
TODO("add the thread deleted checks for new closed groups")
}
} else {
// non-standard contact prefixes: 15, 00 etc shouldn't be stored in config
@@ -456,6 +460,9 @@ open class Storage(context: Context, helper: SQLCipherOpenHelper, private val co
is Contacts -> updateContacts(forConfigObject)
is ConversationVolatileConfig -> updateConvoVolatile(forConfigObject)
is UserGroupsConfig -> updateUserGroups(forConfigObject)
is GroupInfoConfig -> TODO()
is GroupKeysConfig -> TODO()
is GroupMemberConfig -> TODO()
}
}
@@ -548,8 +555,8 @@ open class Storage(context: Context, helper: SQLCipherOpenHelper, private val co
val toAddCommunities = communities.filter { it.community.fullUrl() !in existingCommunities.map { it.value.joinURL } }
val existingJoinUrls = existingCommunities.values.map { it.joinURL }
val existingClosedGroups = getAllGroups(includeInactive = true).filter { it.isClosedGroup }
val lgcIds = lgc.map { it.sessionId }
val existingClosedGroups = getAllGroups(includeInactive = true).filter { it.isLegacyClosedGroup }
val lgcIds = lgc.map { it.sessionId.hexString() }
val toDeleteClosedGroups = existingClosedGroups.filter { group ->
GroupUtil.doubleDecodeGroupId(group.encodedId) !in lgcIds
}
@@ -583,7 +590,7 @@ open class Storage(context: Context, helper: SQLCipherOpenHelper, private val co
}
for (group in lgc) {
val existingGroup = existingClosedGroups.firstOrNull { GroupUtil.doubleDecodeGroupId(it.encodedId) == group.sessionId }
val existingGroup = existingClosedGroups.firstOrNull { GroupUtil.doubleDecodeGroupId(it.encodedId) == group.sessionId.hexString() }
val existingThread = existingGroup?.let { getThreadId(existingGroup.encodedId) }
if (existingGroup != null) {
if (group.priority == PRIORITY_HIDDEN && existingThread != null) {
@@ -597,28 +604,28 @@ open class Storage(context: Context, helper: SQLCipherOpenHelper, private val co
} else {
val members = group.members.keys.map { Address.fromSerialized(it) }
val admins = group.members.filter { it.value /*admin = true*/ }.keys.map { Address.fromSerialized(it) }
val groupId = GroupUtil.doubleEncodeGroupID(group.sessionId)
val groupId = GroupUtil.doubleEncodeGroupID(group.sessionId.hexString())
val title = group.name
val formationTimestamp = (group.joinedAt * 1000L)
createGroup(groupId, title, admins + members, null, null, admins, formationTimestamp)
setProfileSharing(Address.fromSerialized(groupId), true)
// Add the group to the user's set of public keys to poll for
addClosedGroupPublicKey(group.sessionId)
addClosedGroupPublicKey(group.sessionId.hexString())
// Store the encryption key pair
val keyPair = ECKeyPair(DjbECPublicKey(group.encPubKey), DjbECPrivateKey(group.encSecKey))
addClosedGroupEncryptionKeyPair(keyPair, group.sessionId, SnodeAPI.nowWithOffset)
addClosedGroupEncryptionKeyPair(keyPair, group.sessionId.hexString(), SnodeAPI.nowWithOffset)
// Set expiration timer
val expireTimer = group.disappearingTimer
setExpirationTimer(groupId, expireTimer.toInt())
// Notify the PN server
PushRegistryV1.subscribeGroup(group.sessionId, publicKey = localUserPublicKey)
PushRegistryV1.subscribeGroup(group.sessionId.hexString(), publicKey = localUserPublicKey)
// Notify the user
val threadID = getOrCreateThreadIdFor(Address.fromSerialized(groupId))
threadDb.setDate(threadID, formationTimestamp)
insertOutgoingInfoMessage(context, groupId, SignalServiceGroup.Type.CREATION, title, members.map { it.serialize() }, admins.map { it.serialize() }, threadID, formationTimestamp)
// Don't create config group here, it's from a config update
// Start polling
ClosedGroupPollerV2.shared.startPolling(group.sessionId)
ClosedGroupPollerV2.shared.startPolling(group.sessionId.hexString())
}
}
}

View File

@@ -3,6 +3,7 @@ package network.loki.messenger.libsession_util
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
import network.loki.messenger.libsession_util.util.*
import org.hamcrest.CoreMatchers.equalTo
import org.hamcrest.CoreMatchers.not
import org.hamcrest.CoreMatchers.notNullValue
import org.hamcrest.MatcherAssert.assertThat
@@ -625,10 +626,13 @@ class InstrumentedTests {
val userCurve = Sodium.ed25519PkToCurve25519(userPublic)
val groupConfig = UserGroupsConfig.newInstance(userSecret)
val group = groupConfig.createGroup()
val groupSecret = group.adminKey!!
val groupSecret = group.adminKey
val groupPublic = Hex.fromStringCondensed(group.groupSessionId.publicKey)
groupConfig.set(group)
val infoConf = GroupInfoConfig.newInstance(groupPublic, group.adminKey!!)
val setGroup = groupConfig.getClosedGroup(group.groupSessionId.hexString())
assertThat(setGroup, notNullValue())
assertTrue(setGroup!!.adminKey.isNotEmpty())
val infoConf = GroupInfoConfig.newInstance(groupPublic, group.adminKey)
infoConf.setName("New Group")
assertEquals("New Group", infoConf.getName())
infoConf.setCreated(System.currentTimeMillis())

View File

@@ -1,6 +1,7 @@
#pragma clang diagnostic push
#pragma ide diagnostic ignored "bugprone-reserved-identifier"
#include "user_groups.h"
#include "oxenc/hex.h"
#pragma clang diagnostic push
#pragma ide diagnostic ignored "bugprone-reserved-identifier"
@@ -134,14 +135,8 @@ Java_network_loki_messenger_libsession_1util_UserGroupsConfig_set__Lnetwork_loki
auto deserialized = deserialize_legacy_group_info(env, group_info, conf);
conf->set(deserialized);
} else if (env->IsSameObject(closed_group_info, object_class)) {
LOGD("Closed group deserializing...")
auto deserialized = deserialize_closed_group_info(env, group_info);
LOGD("secret key deserialized: %d", deserialized.secretkey.size())
conf->set(deserialized);
auto check_group = conf->get_group(deserialized.id);
if (check_group) {
LOGD("after set: %d", check_group->secretkey.size());
}
}
}

View File

@@ -8,9 +8,6 @@
#include "session/config/user_groups.hpp"
#include <android/log.h>
#define APPNAME "libsession-jni"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, APPNAME, __VA_ARGS__);
inline session::config::UserGroups* ptrToUserGroups(JNIEnv *env, jobject obj) {
jclass configClass = env->FindClass("network/loki/messenger/libsession_util/UserGroupsConfig");
jfieldID pointerField = env->GetFieldID(configClass, "pointer", "J");
@@ -133,7 +130,6 @@ inline jobject serialize_legacy_group_info(JNIEnv *env, session::config::legacy_
inline jobject serialize_closed_group_info(JNIEnv* env, session::config::group_info info) {
auto session_id = util::serialize_session_id(env, info.id);
jbyteArray admin_bytes = util::bytes_from_ustring(env, info.secretkey);
LOGD("admin byte length: %d", info.secretkey.size());
jbyteArray auth_bytes = util::bytes_from_ustring(env, info.auth_data);
jclass group_info_class = env->FindClass("network/loki/messenger/libsession_util/util/GroupInfo$ClosedGroupInfo");

View File

@@ -84,13 +84,13 @@ Java_network_loki_messenger_libsession_1util_UserProfile_setPic(JNIEnv *env, job
extern "C"
JNIEXPORT void JNICALL
Java_network_loki_messenger_libsession_1util_UserProfile_setNtsPriority(JNIEnv *env, jobject thiz,
jint priority) {
jlong priority) {
std::lock_guard lock{util::util_mutex_};
auto profile = ptrToProfile(env, thiz);
profile->set_nts_priority(priority);
}
extern "C"
JNIEXPORT jint JNICALL
JNIEXPORT jlong JNICALL
Java_network_loki_messenger_libsession_1util_UserProfile_getNtsPriority(JNIEnv *env, jobject thiz) {
std::lock_guard lock{util::util_mutex_};
auto profile = ptrToProfile(env, thiz);

View File

@@ -36,9 +36,9 @@ sealed class ConfigBase(protected val /* yucky */ pointer: Long) {
fun isNewConfigEnabled(forced: Boolean, currentTime: Long) =
forced || currentTime >= ACTIVATE_TIME
const val PRIORITY_HIDDEN = -1
const val PRIORITY_VISIBLE = 0
const val PRIORITY_PINNED = 1
const val PRIORITY_HIDDEN = -1L
const val PRIORITY_VISIBLE = 0L
const val PRIORITY_PINNED = 1L
}
@@ -129,8 +129,8 @@ class UserProfile(pointer: Long) : ConfigBase(pointer) {
external fun getName(): String?
external fun getPic(): UserPic
external fun setPic(userPic: UserPic)
external fun setNtsPriority(priority: Int)
external fun getNtsPriority(): Int
external fun setNtsPriority(priority: Long)
external fun getNtsPriority(): Long
external fun getCommunityMessageRequests(): Boolean
external fun setCommunityMessageRequests(blocks: Boolean)
external fun isBlockCommunityMessageRequestsSet(): Boolean

View File

@@ -8,6 +8,6 @@ data class Contact(
var approvedMe: Boolean = false,
var blocked: Boolean = false,
var profilePicture: UserPic = UserPic.DEFAULT,
var priority: Int = 0,
var priority: Long = 0,
var expiryMode: ExpiryMode,
)

View File

@@ -8,8 +8,8 @@ sealed class GroupInfo {
data class ClosedGroupInfo(
val groupSessionId: SessionId,
val adminKey: ByteArray?,
val authData: ByteArray?
val adminKey: ByteArray,
val authData: ByteArray
): GroupInfo() {
override fun equals(other: Any?): Boolean {
if (this === other) return true
@@ -18,24 +18,19 @@ sealed class GroupInfo {
other as ClosedGroupInfo
if (groupSessionId != other.groupSessionId) return false
if (adminKey != null) {
if (other.adminKey == null) return false
if (!adminKey.contentEquals(other.adminKey)) return false
} else if (other.adminKey != null) return false
if (authData != null) {
if (other.authData == null) return false
if (!authData.contentEquals(other.authData)) return false
} else if (other.authData != null) return false
if (!adminKey.contentEquals(other.adminKey)) return false
if (!authData.contentEquals(other.authData)) return false
return true
}
override fun hashCode(): Int {
var result = groupSessionId.hashCode()
result = 31 * result + (adminKey?.contentHashCode() ?: 0)
result = 31 * result + (authData?.contentHashCode() ?: 0)
result = 31 * result + adminKey.contentHashCode()
result = 31 * result + authData.contentHashCode()
return result
}
}
data class LegacyGroupInfo(

View File

@@ -28,7 +28,7 @@ import org.session.libsession.messaging.sending_receiving.handleOpenGroupReactio
import org.session.libsession.messaging.sending_receiving.handleUnsendRequest
import org.session.libsession.messaging.sending_receiving.handleVisibleMessage
import org.session.libsession.messaging.utilities.Data
import org.session.libsession.messaging.utilities.SessionId
import org.session.libsignal.utilities.SessionId
import org.session.libsession.messaging.utilities.SodiumUtilities
import org.session.libsession.utilities.SSKEnvironment
import org.session.libsignal.protos.UtilProtos
@@ -160,7 +160,7 @@ class BatchMessageReceiveJob(
}?.let {
SessionId(
IdPrefix.BLINDED, it.publicKey.asBytes
).hexString
).hexString()
}
val sentTimestamp = message.sentTimestamp!!
if (message.sender == localUserPublicKey || isUserBlindedSender) {

View File

@@ -19,7 +19,6 @@ import okhttp3.MediaType
import okhttp3.RequestBody
import org.session.libsession.messaging.MessagingModuleConfiguration
import org.session.libsession.messaging.sending_receiving.pollers.OpenGroupPoller.Companion.maxInactivityPeriod
import org.session.libsession.messaging.utilities.SessionId
import org.session.libsession.messaging.utilities.SodiumUtilities
import org.session.libsession.snode.OnionRequestAPI
import org.session.libsession.snode.OnionResponse
@@ -36,6 +35,7 @@ import org.session.libsignal.utilities.Hex
import org.session.libsignal.utilities.IdPrefix
import org.session.libsignal.utilities.JsonUtil
import org.session.libsignal.utilities.Log
import org.session.libsignal.utilities.SessionId
import org.session.libsignal.utilities.removingIdPrefixIfNeeded
import org.whispersystems.curve25519.Curve25519
import java.util.concurrent.TimeUnit
@@ -360,7 +360,7 @@ object OpenGroupApi {
pubKey = SessionId(
IdPrefix.BLINDED,
keyPair.publicKey.asBytes
).hexString
).hexString()
signature = SodiumUtilities.sogsSignature(
messageBytes,
@@ -373,7 +373,7 @@ object OpenGroupApi {
pubKey = SessionId(
IdPrefix.UN_BLINDED,
ed25519KeyPair.publicKey.asBytes
).hexString
).hexString()
sodium.cryptoSignDetached(
signature,
messageBytes,

View File

@@ -6,12 +6,12 @@ import com.goterl.lazysodium.interfaces.Box
import com.goterl.lazysodium.interfaces.Sign
import org.session.libsession.messaging.MessagingModuleConfiguration
import org.session.libsession.messaging.sending_receiving.MessageReceiver.Error
import org.session.libsession.messaging.utilities.SessionId
import org.session.libsession.messaging.utilities.SodiumUtilities
import org.session.libsignal.crypto.ecc.ECKeyPair
import org.session.libsignal.utilities.Hex
import org.session.libsignal.utilities.IdPrefix
import org.session.libsignal.utilities.Log
import org.session.libsignal.utilities.SessionId
import org.session.libsignal.utilities.hexEncodedPublicKey
import org.session.libsignal.utilities.removingIdPrefixIfNeeded
@@ -60,7 +60,7 @@ object MessageDecrypter {
sodium.convertPublicKeyEd25519ToCurve25519(senderX25519PublicKey, senderED25519PublicKey)
val id = SessionId(IdPrefix.STANDARD, senderX25519PublicKey)
return Pair(plaintext, id.hexString)
return Pair(plaintext, id.hexString())
}
fun decryptBlinded(
@@ -106,6 +106,6 @@ object MessageDecrypter {
val senderX25519PublicKey = SodiumUtilities.toX25519(senderEdPublicKey) ?: throw Error.InvalidSignature
val id = SessionId(IdPrefix.STANDARD, senderX25519PublicKey)
return Pair(plaintext, id.hexString)
return Pair(plaintext, id.hexString())
}
}

View File

@@ -13,13 +13,13 @@ import org.session.libsession.messaging.messages.control.SharedConfigurationMess
import org.session.libsession.messaging.messages.control.TypingIndicator
import org.session.libsession.messaging.messages.control.UnsendRequest
import org.session.libsession.messaging.messages.visible.VisibleMessage
import org.session.libsession.messaging.utilities.SessionId
import org.session.libsession.messaging.utilities.SodiumUtilities
import org.session.libsession.snode.SnodeAPI
import org.session.libsignal.crypto.PushTransportDetails
import org.session.libsignal.protos.SignalServiceProtos
import org.session.libsignal.utilities.IdPrefix
import org.session.libsignal.utilities.Log
import org.session.libsignal.utilities.SessionId
object MessageReceiver {
@@ -146,7 +146,7 @@ object MessageReceiver {
VisibleMessage.fromProto(proto) ?: run {
throw Error.UnknownMessage
}
val isUserBlindedSender = sender == openGroupPublicKey?.let { SodiumUtilities.blindedKeyPair(it, MessagingModuleConfiguration.shared.getUserED25519KeyPair()!!) }?.let { SessionId(IdPrefix.BLINDED, it.publicKey.asBytes).hexString }
val isUserBlindedSender = sender == openGroupPublicKey?.let { SodiumUtilities.blindedKeyPair(it, MessagingModuleConfiguration.shared.getUserED25519KeyPair()!!) }?.let { SessionId(IdPrefix.BLINDED, it.publicKey.asBytes).hexString() }
// Ignore self send if needed
if (!message.isSelfSendValid && (sender == userPublicKey || isUserBlindedSender)) {
throw Error.SelfSend

View File

@@ -22,7 +22,6 @@ import org.session.libsession.messaging.open_groups.OpenGroupApi
import org.session.libsession.messaging.open_groups.OpenGroupApi.Capability
import org.session.libsession.messaging.open_groups.OpenGroupMessage
import org.session.libsession.messaging.utilities.MessageWrapper
import org.session.libsession.messaging.utilities.SessionId
import org.session.libsession.messaging.utilities.SodiumUtilities
import org.session.libsession.snode.RawResponsePromise
import org.session.libsession.snode.SnodeAPI

View File

@@ -27,7 +27,6 @@ import org.session.libsession.messaging.sending_receiving.link_preview.LinkPrevi
import org.session.libsession.messaging.sending_receiving.notifications.PushRegistryV1
import org.session.libsession.messaging.sending_receiving.pollers.ClosedGroupPollerV2
import org.session.libsession.messaging.sending_receiving.quotes.QuoteModel
import org.session.libsession.messaging.utilities.SessionId
import org.session.libsession.messaging.utilities.SodiumUtilities
import org.session.libsession.messaging.utilities.WebRtcUtils
import org.session.libsession.snode.SnodeAPI
@@ -47,6 +46,7 @@ import org.session.libsignal.protos.SignalServiceProtos.SharedConfigMessage
import org.session.libsignal.utilities.Base64
import org.session.libsignal.utilities.IdPrefix
import org.session.libsignal.utilities.Log
import org.session.libsignal.utilities.SessionId
import org.session.libsignal.utilities.guava.Optional
import org.session.libsignal.utilities.removingIdPrefixIfNeeded
import org.session.libsignal.utilities.toHexString
@@ -279,7 +279,7 @@ fun MessageReceiver.handleVisibleMessage(
val blindedKey = SodiumUtilities.blindedKeyPair(openGroup.publicKey, MessagingModuleConfiguration.shared.getUserED25519KeyPair()!!) ?: return@let null
SessionId(
IdPrefix.BLINDED, blindedKey.publicKey.asBytes
).hexString
).hexString()
}
// Update profile if needed
val recipient = Recipient.from(context, Address.fromSerialized(messageSender!!), false)
@@ -424,7 +424,7 @@ fun MessageReceiver.handleOpenGroupReactions(
val openGroup = storage.getOpenGroup(threadId)
val blindedPublicKey = openGroup?.publicKey?.let { serverPublicKey ->
SodiumUtilities.blindedKeyPair(serverPublicKey, MessagingModuleConfiguration.shared.getUserED25519KeyPair()!!)
?.let { SessionId(IdPrefix.BLINDED, it.publicKey.asBytes).hexString }
?.let { SessionId(IdPrefix.BLINDED, it.publicKey.asBytes).hexString() }
}
for ((emoji, reaction) in reactions) {
val pendingUserReaction = OpenGroupApi.pendingReactions

View File

@@ -1,9 +1,9 @@
package org.session.libsession.utilities
import org.session.libsession.messaging.open_groups.OpenGroup
import org.session.libsession.messaging.utilities.SessionId
import org.session.libsignal.messages.SignalServiceGroup
import org.session.libsignal.utilities.Hex
import org.session.libsignal.utilities.SessionId
import java.io.IOException
object GroupUtil {
@@ -19,7 +19,7 @@ object GroupUtil {
@JvmStatic
fun getEncodedOpenGroupInboxID(openGroup: OpenGroup, sessionId: SessionId): Address {
val openGroupInboxId =
"${openGroup.server}!${openGroup.publicKey}!${sessionId.hexString}".toByteArray()
"${openGroup.server}!${openGroup.publicKey}!${sessionId.hexString()}".toByteArray()
return getEncodedOpenGroupInboxID(openGroupInboxId)
}

View File

@@ -22,6 +22,4 @@ class SessionId {
}
fun hexString() = prefix?.value + publicKey
fun bytes(): ByteArray = Hex.fromStringCondensed(prefix?.value + publicKey)
}