crypto: Back up room keys when we create or receive new ones
This commit is contained in:
parent
f9476f12af
commit
5c7b248ed2
|
@ -379,7 +379,6 @@ internal class DefaultCryptoService @Inject constructor(
|
||||||
private val setDeviceNameTask: SetDeviceNameTask,
|
private val setDeviceNameTask: SetDeviceNameTask,
|
||||||
private val loadRoomMembersTask: LoadRoomMembersTask,
|
private val loadRoomMembersTask: LoadRoomMembersTask,
|
||||||
private val cryptoSessionInfoProvider: CryptoSessionInfoProvider,
|
private val cryptoSessionInfoProvider: CryptoSessionInfoProvider,
|
||||||
private val createKeysBackupVersionTask: CreateKeysBackupVersionTask,
|
|
||||||
private val coroutineDispatchers: MatrixCoroutineDispatchers,
|
private val coroutineDispatchers: MatrixCoroutineDispatchers,
|
||||||
private val taskExecutor: TaskExecutor,
|
private val taskExecutor: TaskExecutor,
|
||||||
private val cryptoCoroutineScope: CoroutineScope,
|
private val cryptoCoroutineScope: CoroutineScope,
|
||||||
|
@ -662,6 +661,8 @@ internal class DefaultCryptoService @Inject constructor(
|
||||||
// keys claim request to be sent out.
|
// keys claim request to be sent out.
|
||||||
// This could be omitted but then devices might be waiting for the next
|
// This could be omitted but then devices might be waiting for the next
|
||||||
sendOutgoingRequests()
|
sendOutgoingRequests()
|
||||||
|
|
||||||
|
keysBackupService?.maybeBackupKeys()
|
||||||
}
|
}
|
||||||
|
|
||||||
cryptoCoroutineScope.launch(coroutineDispatchers.crypto) {
|
cryptoCoroutineScope.launch(coroutineDispatchers.crypto) {
|
||||||
|
@ -996,12 +997,14 @@ internal class DefaultCryptoService @Inject constructor(
|
||||||
}
|
}
|
||||||
|
|
||||||
val keyShareLock = roomKeyShareLocks.getOrPut(roomId, { Mutex() })
|
val keyShareLock = roomKeyShareLocks.getOrPut(roomId, { Mutex() })
|
||||||
|
var sharedKey = false
|
||||||
|
|
||||||
keyShareLock.withLock {
|
keyShareLock.withLock {
|
||||||
coroutineScope {
|
coroutineScope {
|
||||||
this@DefaultCryptoService.olmMachine!!.shareRoomKey(roomId, roomMembers).map {
|
this@DefaultCryptoService.olmMachine!!.shareRoomKey(roomId, roomMembers).map {
|
||||||
when (it) {
|
when (it) {
|
||||||
is Request.ToDevice -> {
|
is Request.ToDevice -> {
|
||||||
|
sharedKey = true
|
||||||
async {
|
async {
|
||||||
sendToDevice(it)
|
sendToDevice(it)
|
||||||
}
|
}
|
||||||
|
@ -1016,6 +1019,12 @@ internal class DefaultCryptoService @Inject constructor(
|
||||||
}.joinAll()
|
}.joinAll()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If we sent out a room key over to-device messages it's likely that we created a new one
|
||||||
|
// Try to back the key up
|
||||||
|
if (sharedKey) {
|
||||||
|
keysBackupService?.maybeBackupKeys()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun encrypt(roomId: String, eventType: String, content: Content): Content {
|
private suspend fun encrypt(roomId: String, eventType: String, content: Content): Content {
|
||||||
|
@ -1120,7 +1129,10 @@ internal class DefaultCryptoService @Inject constructor(
|
||||||
override suspend fun importRoomKeys(roomKeysAsArray: ByteArray,
|
override suspend fun importRoomKeys(roomKeysAsArray: ByteArray,
|
||||||
password: String,
|
password: String,
|
||||||
progressListener: ProgressListener?): ImportRoomKeysResult {
|
progressListener: ProgressListener?): ImportRoomKeysResult {
|
||||||
return olmMachine!!.importKeys(roomKeysAsArray, password, progressListener)
|
val result = olmMachine!!.importKeys(roomKeysAsArray, password, progressListener)
|
||||||
|
keysBackupService?.maybeBackupKeys()
|
||||||
|
|
||||||
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -779,7 +779,7 @@ internal class RustKeyBackupService @Inject constructor(
|
||||||
/**
|
/**
|
||||||
* Do a backup if there are new keys, with a delay
|
* Do a backup if there are new keys, with a delay
|
||||||
*/
|
*/
|
||||||
private fun maybeBackupKeys() {
|
fun maybeBackupKeys() {
|
||||||
when {
|
when {
|
||||||
isStucked -> {
|
isStucked -> {
|
||||||
// If not already done, or in error case, check for a valid backup version on the homeserver.
|
// If not already done, or in error case, check for a valid backup version on the homeserver.
|
||||||
|
|
Loading…
Reference in New Issue