feat: incorporate hashes from library, more wrapper for user groups and serialization from c++

This commit is contained in:
0x330a
2023-02-28 17:47:25 +11:00
parent c351cd6038
commit 858893a0e9
12 changed files with 62 additions and 61 deletions

View File

@@ -3,7 +3,6 @@ package org.thoughtcrime.securesms.database
import android.content.Context
import androidx.core.content.contentValuesOf
import androidx.core.database.getBlobOrNull
import androidx.core.database.getStringOrNull
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper
class ConfigDatabase(context: Context, helper: SQLCipherOpenHelper): Database(context, helper) {
@@ -12,35 +11,32 @@ class ConfigDatabase(context: Context, helper: SQLCipherOpenHelper): Database(co
private const val VARIANT = "variant"
private const val PUBKEY = "publicKey"
private const val DATA = "data"
private const val COMBINED_MESSAGE_HASHES = "combined_message_hashes"
private const val TABLE_NAME = "configs_table"
const val CREATE_CONFIG_TABLE_COMMAND =
"CREATE TABLE $TABLE_NAME ($VARIANT TEXT NOT NULL, $PUBKEY TEXT NOT NULL, $DATA BLOB, $COMBINED_MESSAGE_HASHES TEXT, PRIMARY KEY($VARIANT, $PUBKEY));"
"CREATE TABLE $TABLE_NAME ($VARIANT TEXT NOT NULL, $PUBKEY TEXT NOT NULL, $DATA BLOB, PRIMARY KEY($VARIANT, $PUBKEY));"
private const val VARIANT_AND_PUBKEY_WHERE = "$VARIANT = ? AND $PUBKEY = ?"
}
fun storeConfig(variant: String, publicKey: String, data: ByteArray, hashes: List<String>) {
fun storeConfig(variant: String, publicKey: String, data: ByteArray) {
val db = writableDatabase
val contentValues = contentValuesOf(
VARIANT to variant,
PUBKEY to publicKey,
DATA to data,
COMBINED_MESSAGE_HASHES to hashes.joinToString(",")
)
db.insertOrUpdate(TABLE_NAME, contentValues, VARIANT_AND_PUBKEY_WHERE, arrayOf(variant, publicKey))
}
fun retrieveConfigAndHashes(variant: String, publicKey: String): Pair<ByteArray,List<String>>? {
fun retrieveConfigAndHashes(variant: String, publicKey: String): ByteArray? {
val db = readableDatabase
val query = db.query(TABLE_NAME, arrayOf(DATA, COMBINED_MESSAGE_HASHES), VARIANT_AND_PUBKEY_WHERE, arrayOf(variant, publicKey),null, null, null)
val query = db.query(TABLE_NAME, arrayOf(DATA), VARIANT_AND_PUBKEY_WHERE, arrayOf(variant, publicKey),null, null, null)
return query?.use { cursor ->
if (!cursor.moveToFirst()) return@use null
val bytes = cursor.getBlobOrNull(cursor.getColumnIndex(DATA)) ?: return@use null
val hashes = cursor.getStringOrNull(cursor.getColumnIndex(COMBINED_MESSAGE_HASHES))?.split(",") ?: emptyList()
bytes to hashes
bytes
}
}

View File

@@ -47,10 +47,7 @@ class ConfigFactory(private val context: Context,
Log.d("Loki-DBG", "Getting user configs and hashes")
val userDump = configDatabase.retrieveConfigAndHashes(SharedConfigMessage.Kind.USER_PROFILE.name, publicKey)
_userConfig = if (userDump != null) {
val (bytes, hashes) = userDump
userHashes.clear()
userHashes.addAll(hashes)
UserProfile.newInstance(secretKey, bytes)
UserProfile.newInstance(secretKey, userDump)
} else {
UserProfile.newInstance(secretKey)
}
@@ -63,10 +60,7 @@ class ConfigFactory(private val context: Context,
val (secretKey, publicKey) = maybeGetUserInfo() ?: return@synchronized null
val contactsDump = configDatabase.retrieveConfigAndHashes(SharedConfigMessage.Kind.CONTACTS.name, publicKey)
_contacts = if (contactsDump != null) {
val (bytes, hashes) = contactsDump
contactsHashes.clear()
contactsHashes.addAll(hashes)
Contacts.newInstance(secretKey, bytes)
Contacts.newInstance(secretKey, contactsDump)
} else {
Contacts.newInstance(secretKey)
}
@@ -79,10 +73,7 @@ class ConfigFactory(private val context: Context,
val (secretKey, publicKey) = maybeGetUserInfo() ?: return@synchronized null
val convoDump = configDatabase.retrieveConfigAndHashes(SharedConfigMessage.Kind.CONVO_INFO_VOLATILE.name, publicKey)
_convoVolatileConfig = if (convoDump != null) {
val (bytes, hashes) = convoDump
convoHashes.clear()
convoHashes.addAll(hashes)
ConversationVolatileConfig.newInstance(secretKey, bytes)
ConversationVolatileConfig.newInstance(secretKey, convoDump)
} else {
ConversationVolatileConfig.newInstance(secretKey)
}
@@ -94,19 +85,19 @@ class ConfigFactory(private val context: Context,
private fun persistUserConfigDump() = synchronized(userLock) {
val dumped = user?.dump() ?: return
val (_, publicKey) = maybeGetUserInfo() ?: return
configDatabase.storeConfig(SharedConfigMessage.Kind.USER_PROFILE.name, publicKey, dumped, userHashes.toList())
configDatabase.storeConfig(SharedConfigMessage.Kind.USER_PROFILE.name, publicKey, dumped)
}
private fun persistContactsConfigDump() = synchronized(contactsLock) {
val dumped = contacts?.dump() ?: return
val (_, publicKey) = maybeGetUserInfo() ?: return
configDatabase.storeConfig(SharedConfigMessage.Kind.CONTACTS.name, publicKey, dumped, contactsHashes.toList())
configDatabase.storeConfig(SharedConfigMessage.Kind.CONTACTS.name, publicKey, dumped)
}
private fun persistConvoVolatileConfigDump() = synchronized (convoVolatileLock) {
val dumped = convoVolatile?.dump() ?: return
val (_, publicKey) = maybeGetUserInfo() ?: return
configDatabase.storeConfig(SharedConfigMessage.Kind.CONVO_INFO_VOLATILE.name, publicKey, dumped, convoHashes.toList())
configDatabase.storeConfig(SharedConfigMessage.Kind.CONVO_INFO_VOLATILE.name, publicKey, dumped)
}
override fun persist(forConfigObject: ConfigBase) {

View File

@@ -4,6 +4,7 @@ import android.content.Context
import network.loki.messenger.libsession_util.util.UserPic
import org.session.libsession.messaging.contacts.Contact
import org.session.libsession.utilities.SSKEnvironment
import org.session.libsession.utilities.TextSecurePreferences
import org.session.libsession.utilities.recipients.Recipient
import org.thoughtcrime.securesms.ApplicationContext
import org.thoughtcrime.securesms.dependencies.ConfigFactory
@@ -84,6 +85,7 @@ class ProfileManager(private val context: Context, private val configFactory: Co
override fun contactUpdatedInternal(contact: Contact) {
val contactConfig = configFactory.contacts ?: return
if (contact.sessionID == TextSecurePreferences.getLocalNumber(context)) return
contactConfig.upsertContact(contact.sessionID) {
this.name = contact.name.orEmpty()
this.nickname = contact.nickname.orEmpty()