crypto: Forward sync crypto chagnes to the rust side

This commit is contained in:
Damir Jelić 2021-02-17 15:50:49 +01:00
parent 01149c8d45
commit e2692ec604
6 changed files with 61 additions and 18 deletions

View File

@ -98,6 +98,9 @@ import org.matrix.android.sdk.internal.extensions.foldToCallback
import org.matrix.android.sdk.internal.session.SessionScope import org.matrix.android.sdk.internal.session.SessionScope
import org.matrix.android.sdk.internal.session.room.membership.LoadRoomMembersTask import org.matrix.android.sdk.internal.session.room.membership.LoadRoomMembersTask
import org.matrix.android.sdk.internal.session.sync.model.SyncResponse import org.matrix.android.sdk.internal.session.sync.model.SyncResponse
import org.matrix.android.sdk.internal.session.sync.model.DeviceListResponse
import org.matrix.android.sdk.internal.session.sync.model.DeviceOneTimeKeysCountSyncResponse
import org.matrix.android.sdk.internal.session.sync.model.ToDeviceSyncResponse
import org.matrix.android.sdk.internal.task.TaskExecutor import org.matrix.android.sdk.internal.task.TaskExecutor
import org.matrix.android.sdk.internal.task.TaskThread import org.matrix.android.sdk.internal.task.TaskThread
import org.matrix.android.sdk.internal.task.configureWith import org.matrix.android.sdk.internal.task.configureWith
@ -321,9 +324,7 @@ internal class DefaultCryptoService @Inject constructor(
* *
*/ */
suspend fun start() { suspend fun start() {
cryptoCoroutineScope.launch(coroutineDispatchers.crypto) { internalStart()
internalStart()
}
// Just update // Just update
fetchDevicesList(NoOpMatrixCallback()) fetchDevicesList(NoOpMatrixCallback())
@ -939,6 +940,13 @@ internal class DefaultCryptoService @Inject constructor(
} }
} }
suspend fun receiveSyncChanges(
toDevice: ToDeviceSyncResponse?,
deviceChanges: DeviceListResponse?,
keyCounts: DeviceOneTimeKeysCountSyncResponse?) {
olmMachine!!.receiveSyncChanges(toDevice, deviceChanges, keyCounts)
}
private suspend fun sendOutgoingRequests() { private suspend fun sendOutgoingRequests() {
// TODO these requests should be sent out in parallel // TODO these requests should be sent out in parallel
for (outgoingRequest in olmMachine!!.outgoingRequests()) { for (outgoingRequest in olmMachine!!.outgoingRequests()) {

View File

@ -19,17 +19,21 @@ package org.matrix.android.sdk.internal
import java.io.File import java.io.File
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.matrix.android.sdk.internal.di.MoshiProvider
import org.matrix.android.sdk.internal.session.sync.model.DeviceListResponse
import org.matrix.android.sdk.internal.session.sync.model.DeviceOneTimeKeysCountSyncResponse
import org.matrix.android.sdk.internal.session.sync.model.ToDeviceSyncResponse
import timber.log.Timber
import uniffi.olm.Device as InnerDevice import uniffi.olm.Device as InnerDevice
import uniffi.olm.DeviceLists
import uniffi.olm.Logger
import uniffi.olm.OlmMachine as InnerMachine import uniffi.olm.OlmMachine as InnerMachine
import uniffi.olm.Request import uniffi.olm.Request
import uniffi.olm.RequestType import uniffi.olm.RequestType
import uniffi.olm.Sas as InnerSas import uniffi.olm.Sas as InnerSas
import uniffi.olm.Logger
import uniffi.olm.setLogger import uniffi.olm.setLogger
import timber.log.Timber class CryptoLogger() : Logger {
class CryptoLogger(): Logger {
override fun log(logLine: String) { override fun log(logLine: String) {
Timber.d(logLine) Timber.d(logLine)
} }
@ -60,7 +64,7 @@ class Device(inner: InnerDevice, machine: InnerMachine) {
} }
} }
class OlmMachine(user_id: String, device_id: String, path: File) { internal class OlmMachine(user_id: String, device_id: String, path: File) {
private val inner: InnerMachine = InnerMachine(user_id, device_id, path.toString()) private val inner: InnerMachine = InnerMachine(user_id, device_id, path.toString())
fun userId(): String { fun userId(): String {
@ -79,6 +83,24 @@ class OlmMachine(user_id: String, device_id: String, path: File) {
inner.outgoingRequests() inner.outgoingRequests()
} }
suspend fun receiveSyncChanges(
toDevice: ToDeviceSyncResponse?,
deviceChanges: DeviceListResponse?,
keyCounts: DeviceOneTimeKeysCountSyncResponse?
) = withContext(Dispatchers.IO) {
var counts: MutableMap<String, Int> = mutableMapOf()
if (keyCounts?.signedCurve25519 != null) {
counts.put("signed_curve25519", keyCounts.signedCurve25519)
}
val devices = DeviceLists(deviceChanges?.changed ?: listOf(), deviceChanges?.left ?: listOf())
val adapter = MoshiProvider.providesMoshi().adapter<ToDeviceSyncResponse>(ToDeviceSyncResponse::class.java)
val events = adapter.toJson(toDevice ?: ToDeviceSyncResponse())!!
inner.receiveSyncChanges(events, devices, counts)
}
suspend fun markRequestAsSent( suspend fun markRequestAsSent(
request_id: String, request_id: String,
request_type: RequestType, request_type: RequestType,

View File

@ -62,9 +62,10 @@ internal class SyncResponseHandler @Inject constructor(@SessionDatabase private
measureTimeMillis { measureTimeMillis {
if (!cryptoService.isStarted()) { if (!cryptoService.isStarted()) {
Timber.v("Should start cryptoService") Timber.v("Should start cryptoService")
// TODO shirley there's a better place for this than the sync
// loop?
cryptoService.start() cryptoService.start()
} }
cryptoService.onSyncWillProcess(isInitialSync)
}.also { }.also {
Timber.v("Finish handling start cryptoService in $it ms") Timber.v("Finish handling start cryptoService in $it ms")
} }
@ -73,11 +74,12 @@ internal class SyncResponseHandler @Inject constructor(@SessionDatabase private
// to ensure to decrypt them properly // to ensure to decrypt them properly
measureTimeMillis { measureTimeMillis {
Timber.v("Handle toDevice") Timber.v("Handle toDevice")
reportSubtask(reporter, R.string.initial_sync_start_importing_account_crypto, 100, 0.1f) {
if (syncResponse.toDevice != null) { cryptoService.receiveSyncChanges(
cryptoSyncHandler.handleToDevice(syncResponse.toDevice, reporter) syncResponse.toDevice,
} syncResponse.deviceLists,
} syncResponse.deviceOneTimeKeysCount
)
}.also { }.also {
Timber.v("Finish handling toDevice in $it ms") Timber.v("Finish handling toDevice in $it ms")
} }

View File

@ -18,6 +18,10 @@ thiserror = "1.0.23"
tracing = "0.1.23" tracing = "0.1.23"
tracing-subscriber = "0.2.15" tracing-subscriber = "0.2.15"
[dependencies.js_int]
version = "0.2.0"
features = ["lax_deserialize"]
[dependencies.matrix-sdk-crypto] [dependencies.matrix-sdk-crypto]
git = "https://github.com/matrix-org/matrix-rust-sdk/" git = "https://github.com/matrix-org/matrix-rust-sdk/"
features = ["sled_cryptostore"] features = ["sled_cryptostore"]

View File

@ -1,6 +1,6 @@
use std::{ use std::{
collections::{BTreeMap, HashMap}, collections::{BTreeMap, HashMap},
convert::TryFrom, convert::{TryFrom, TryInto},
}; };
use http::Response; use http::Response;
@ -301,13 +301,20 @@ impl OlmMachine {
&self, &self,
events: &str, events: &str,
device_changes: DeviceLists, device_changes: DeviceLists,
key_counts: HashMap<String, u32>, key_counts: HashMap<String, i32>,
) { ) {
let events: ToDevice = serde_json::from_str(events).unwrap(); let events: ToDevice = serde_json::from_str(events).unwrap();
let device_changes: RumaDeviceLists = device_changes.into(); let device_changes: RumaDeviceLists = device_changes.into();
let key_counts: BTreeMap<DeviceKeyAlgorithm, UInt> = key_counts let key_counts: BTreeMap<DeviceKeyAlgorithm, UInt> = key_counts
.into_iter() .into_iter()
.map(|(k, v)| (DeviceKeyAlgorithm::from(k), v.into())) .map(|(k, v)| {
(
DeviceKeyAlgorithm::from(k),
v.clamp(0, i32::MAX)
.try_into()
.expect("Couldn't convert key counts into an UInt"),
)
})
.collect(); .collect();
self.runtime self.runtime

View File

@ -56,7 +56,7 @@ interface OlmMachine {
void receive_sync_changes([ByRef] string events, void receive_sync_changes([ByRef] string events,
DeviceLists device_changes, DeviceLists device_changes,
record<DOMString, u32> key_counts); record<DOMString, i32> key_counts);
record<DOMString, string> identity_keys(); record<DOMString, string> identity_keys();