mirror of
https://github.com/element-hq/element-android
synced 2024-11-28 13:38:49 +03:00
quick dispatch to correct thread (will need more work)
This commit is contained in:
parent
5c1fcc47a1
commit
a48bf61ad7
1 changed files with 49 additions and 35 deletions
|
@ -36,9 +36,13 @@ import im.vector.matrix.android.internal.crypto.tasks.UploadSigningKeysTask
|
||||||
import im.vector.matrix.android.internal.di.UserId
|
import im.vector.matrix.android.internal.di.UserId
|
||||||
import im.vector.matrix.android.internal.session.SessionScope
|
import im.vector.matrix.android.internal.session.SessionScope
|
||||||
import im.vector.matrix.android.internal.task.TaskExecutor
|
import im.vector.matrix.android.internal.task.TaskExecutor
|
||||||
|
import im.vector.matrix.android.internal.task.TaskThread
|
||||||
import im.vector.matrix.android.internal.task.configureWith
|
import im.vector.matrix.android.internal.task.configureWith
|
||||||
import im.vector.matrix.android.internal.util.JsonCanonicalizer
|
import im.vector.matrix.android.internal.util.JsonCanonicalizer
|
||||||
|
import im.vector.matrix.android.internal.util.MatrixCoroutineDispatchers
|
||||||
import im.vector.matrix.android.internal.util.withoutPrefix
|
import im.vector.matrix.android.internal.util.withoutPrefix
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
import org.greenrobot.eventbus.EventBus
|
import org.greenrobot.eventbus.EventBus
|
||||||
import org.matrix.olm.OlmPkSigning
|
import org.matrix.olm.OlmPkSigning
|
||||||
import org.matrix.olm.OlmUtility
|
import org.matrix.olm.OlmUtility
|
||||||
|
@ -56,6 +60,8 @@ internal class DefaultCrossSigningService @Inject constructor(
|
||||||
private val uploadSignaturesTask: UploadSignaturesTask,
|
private val uploadSignaturesTask: UploadSignaturesTask,
|
||||||
private val computeTrustTask: ComputeTrustTask,
|
private val computeTrustTask: ComputeTrustTask,
|
||||||
private val taskExecutor: TaskExecutor,
|
private val taskExecutor: TaskExecutor,
|
||||||
|
private val coroutineDispatchers: MatrixCoroutineDispatchers,
|
||||||
|
private val cryptoCoroutineScope: CoroutineScope,
|
||||||
val eventBus: EventBus) : CrossSigningService, DeviceListManager.UserDevicesUpdateListener {
|
val eventBus: EventBus) : CrossSigningService, DeviceListManager.UserDevicesUpdateListener {
|
||||||
|
|
||||||
private var olmUtility: OlmUtility? = null
|
private var olmUtility: OlmUtility? = null
|
||||||
|
@ -208,6 +214,7 @@ internal class DefaultCrossSigningService @Inject constructor(
|
||||||
cryptoStore.storePrivateKeysInfo(masterKeyPrivateKey?.toBase64NoPadding(), uskPrivateKey?.toBase64NoPadding(), sskPrivateKey?.toBase64NoPadding())
|
cryptoStore.storePrivateKeysInfo(masterKeyPrivateKey?.toBase64NoPadding(), uskPrivateKey?.toBase64NoPadding(), sskPrivateKey?.toBase64NoPadding())
|
||||||
|
|
||||||
uploadSigningKeysTask.configureWith(params) {
|
uploadSigningKeysTask.configureWith(params) {
|
||||||
|
this.executionThread = TaskThread.CRYPTO
|
||||||
this.callback = object : MatrixCallback<Unit> {
|
this.callback = object : MatrixCallback<Unit> {
|
||||||
override fun onSuccess(data: Unit) {
|
override fun onSuccess(data: Unit) {
|
||||||
Timber.i("## CrossSigning - Keys successfully uploaded")
|
Timber.i("## CrossSigning - Keys successfully uploaded")
|
||||||
|
@ -243,6 +250,7 @@ internal class DefaultCrossSigningService @Inject constructor(
|
||||||
resetTrustOnKeyChange()
|
resetTrustOnKeyChange()
|
||||||
uploadSignaturesTask.configureWith(UploadSignaturesTask.Params(uploadSignatureQueryBuilder.build())) {
|
uploadSignaturesTask.configureWith(UploadSignaturesTask.Params(uploadSignatureQueryBuilder.build())) {
|
||||||
// this.retryCount = 3
|
// this.retryCount = 3
|
||||||
|
this.executionThread = TaskThread.CRYPTO
|
||||||
this.callback = object : MatrixCallback<Unit> {
|
this.callback = object : MatrixCallback<Unit> {
|
||||||
override fun onSuccess(data: Unit) {
|
override fun onSuccess(data: Unit) {
|
||||||
Timber.i("## CrossSigning - signatures successfully uploaded")
|
Timber.i("## CrossSigning - signatures successfully uploaded")
|
||||||
|
@ -495,6 +503,7 @@ internal class DefaultCrossSigningService @Inject constructor(
|
||||||
.withSigningKeyInfo(otherMasterKeys.copyForSignature(userId, userPubKey, newSignature))
|
.withSigningKeyInfo(otherMasterKeys.copyForSignature(userId, userPubKey, newSignature))
|
||||||
.build()
|
.build()
|
||||||
uploadSignaturesTask.configureWith(UploadSignaturesTask.Params(uploadQuery)) {
|
uploadSignaturesTask.configureWith(UploadSignaturesTask.Params(uploadQuery)) {
|
||||||
|
this.executionThread = TaskThread.CRYPTO
|
||||||
this.callback = callback
|
this.callback = callback
|
||||||
}.executeBy(taskExecutor)
|
}.executeBy(taskExecutor)
|
||||||
}
|
}
|
||||||
|
@ -541,6 +550,7 @@ internal class DefaultCrossSigningService @Inject constructor(
|
||||||
.withDeviceInfo(toUpload)
|
.withDeviceInfo(toUpload)
|
||||||
.build()
|
.build()
|
||||||
uploadSignaturesTask.configureWith(UploadSignaturesTask.Params(uploadQuery)) {
|
uploadSignaturesTask.configureWith(UploadSignaturesTask.Params(uploadQuery)) {
|
||||||
|
this.executionThread = TaskThread.CRYPTO
|
||||||
this.callback = callback
|
this.callback = callback
|
||||||
}.executeBy(taskExecutor)
|
}.executeBy(taskExecutor)
|
||||||
}
|
}
|
||||||
|
@ -607,48 +617,52 @@ internal class DefaultCrossSigningService @Inject constructor(
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onUsersDeviceUpdate(users: List<String>) {
|
override fun onUsersDeviceUpdate(users: List<String>) {
|
||||||
Timber.d("## CrossSigning - onUsersDeviceUpdate for ${users.size} users")
|
cryptoCoroutineScope.launch(coroutineDispatchers.crypto) {
|
||||||
users.forEach { otherUserId ->
|
Timber.d("## CrossSigning - onUsersDeviceUpdate for ${users.size} users")
|
||||||
|
users.forEach { otherUserId ->
|
||||||
|
|
||||||
checkUserTrust(otherUserId).let {
|
checkUserTrust(otherUserId).let {
|
||||||
Timber.d("## CrossSigning - update trust for $otherUserId , verified=${it.isVerified()}")
|
Timber.d("## CrossSigning - update trust for $otherUserId , verified=${it.isVerified()}")
|
||||||
setUserKeysAsTrusted(otherUserId, it.isVerified())
|
setUserKeysAsTrusted(otherUserId, it.isVerified())
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO if my keys have changes, i should recheck all devices of all users?
|
||||||
|
val devices = cryptoStore.getUserDeviceList(otherUserId)
|
||||||
|
devices?.forEach { device ->
|
||||||
|
val updatedTrust = checkDeviceTrust(otherUserId, device.deviceId, device.trustLevel?.isLocallyVerified() ?: false)
|
||||||
|
Timber.d("## CrossSigning - update trust for device ${device.deviceId} of user $otherUserId , verified=$updatedTrust")
|
||||||
|
cryptoStore.setDeviceTrust(otherUserId, device.deviceId, updatedTrust.isCrossSignedVerified(), updatedTrust.isLocallyVerified())
|
||||||
|
}
|
||||||
|
|
||||||
|
if (otherUserId == userId) {
|
||||||
|
// It's me, i should check if a newly trusted device is signing my master key
|
||||||
|
// In this case it will change my MSK trust, and should then re-trigger a check of all other user trust
|
||||||
|
setUserKeysAsTrusted(otherUserId, checkSelfTrust().isVerified())
|
||||||
|
}
|
||||||
|
|
||||||
|
eventBus.post(CryptoToSessionUserTrustChange(users))
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO if my keys have changes, i should recheck all devices of all users?
|
|
||||||
val devices = cryptoStore.getUserDeviceList(otherUserId)
|
|
||||||
devices?.forEach { device ->
|
|
||||||
val updatedTrust = checkDeviceTrust(otherUserId, device.deviceId, device.trustLevel?.isLocallyVerified() ?: false)
|
|
||||||
Timber.d("## CrossSigning - update trust for device ${device.deviceId} of user $otherUserId , verified=$updatedTrust")
|
|
||||||
cryptoStore.setDeviceTrust(otherUserId, device.deviceId, updatedTrust.isCrossSignedVerified(), updatedTrust.isLocallyVerified())
|
|
||||||
}
|
|
||||||
|
|
||||||
if (otherUserId == userId) {
|
|
||||||
// It's me, i should check if a newly trusted device is signing my master key
|
|
||||||
// In this case it will change my MSK trust, and should then re-trigger a check of all other user trust
|
|
||||||
setUserKeysAsTrusted(otherUserId, checkSelfTrust().isVerified())
|
|
||||||
}
|
|
||||||
|
|
||||||
eventBus.post(CryptoToSessionUserTrustChange(users))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun setUserKeysAsTrusted(otherUserId: String, trusted: Boolean) {
|
private fun setUserKeysAsTrusted(otherUserId: String, trusted: Boolean) {
|
||||||
val currentTrust = cryptoStore.getCrossSigningInfo(otherUserId)?.isTrusted()
|
cryptoCoroutineScope.launch(coroutineDispatchers.crypto) {
|
||||||
cryptoStore.setUserKeysAsTrusted(otherUserId, trusted)
|
val currentTrust = cryptoStore.getCrossSigningInfo(otherUserId)?.isTrusted()
|
||||||
// If it's me, recheck trust of all users and devices?
|
cryptoStore.setUserKeysAsTrusted(otherUserId, trusted)
|
||||||
val users = ArrayList<String>()
|
// If it's me, recheck trust of all users and devices?
|
||||||
if (otherUserId == userId && currentTrust != trusted) {
|
val users = ArrayList<String>()
|
||||||
cryptoStore.updateUsersTrust {
|
if (otherUserId == userId && currentTrust != trusted) {
|
||||||
users.add(it)
|
cryptoStore.updateUsersTrust {
|
||||||
checkUserTrust(it).isVerified()
|
users.add(it)
|
||||||
}
|
checkUserTrust(it).isVerified()
|
||||||
|
}
|
||||||
|
|
||||||
users.forEach {
|
users.forEach {
|
||||||
cryptoStore.getUserDeviceList(it)?.forEach { device ->
|
cryptoStore.getUserDeviceList(it)?.forEach { device ->
|
||||||
val updatedTrust = checkDeviceTrust(it, device.deviceId, device.trustLevel?.isLocallyVerified() ?: false)
|
val updatedTrust = checkDeviceTrust(it, device.deviceId, device.trustLevel?.isLocallyVerified() ?: false)
|
||||||
Timber.d("## CrossSigning - update trust for device ${device.deviceId} of user $otherUserId , verified=$updatedTrust")
|
Timber.d("## CrossSigning - update trust for device ${device.deviceId} of user $otherUserId , verified=$updatedTrust")
|
||||||
cryptoStore.setDeviceTrust(it, device.deviceId, updatedTrust.isCrossSignedVerified(), updatedTrust.isLocallyVerified())
|
cryptoStore.setDeviceTrust(it, device.deviceId, updatedTrust.isCrossSignedVerified(), updatedTrust.isLocallyVerified())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue