Skip to content

Commit d250e3d

Browse files
Add sharing existing inbound sessions functionality on new room invites
1 parent 9b7e94e commit d250e3d

File tree

5 files changed

+67
-0
lines changed

5 files changed

+67
-0
lines changed

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/IMXDecrypting.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import org.matrix.android.sdk.api.session.crypto.model.IncomingRoomKeyRequest
2121
import org.matrix.android.sdk.api.session.crypto.model.IncomingSecretShareRequest
2222
import org.matrix.android.sdk.api.session.crypto.model.MXEventDecryptionResult
2323
import org.matrix.android.sdk.api.session.events.model.Event
24+
import org.matrix.android.sdk.internal.crypto.MegolmSessionData
2425
import org.matrix.android.sdk.internal.crypto.keysbackup.DefaultKeysBackupService
2526

2627
/**
@@ -60,6 +61,8 @@ internal interface IMXDecrypting {
6061
*/
6162
fun shareKeysWithDevice(request: IncomingRoomKeyRequest) {}
6263

64+
fun shareKeysWithDevice(exportedKeys: MegolmSessionData?, deviceId: String, userId: String) {}
65+
6366
fun shareSecretWithDevice(request: IncomingSecretShareRequest, secretValue: String) {}
6467

6568
fun requestKeysForEvent(event: Event, withHeld: Boolean)

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/megolm/MXMegolmDecryption.kt

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import org.matrix.android.sdk.api.session.events.model.content.RoomKeyWithHeldCo
3737
import org.matrix.android.sdk.api.session.events.model.toModel
3838
import org.matrix.android.sdk.internal.crypto.DeviceListManager
3939
import org.matrix.android.sdk.internal.crypto.MXOlmDevice
40+
import org.matrix.android.sdk.internal.crypto.MegolmSessionData
4041
import org.matrix.android.sdk.internal.crypto.OutgoingGossipingRequestManager
4142
import org.matrix.android.sdk.internal.crypto.actions.EnsureOlmSessionsForDevicesAction
4243
import org.matrix.android.sdk.internal.crypto.actions.MessageEncrypter
@@ -341,6 +342,46 @@ internal class MXMegolmDecryption(private val userId: String,
341342
return olmDevice.hasInboundSessionKeys(roomId, senderKey, sessionId)
342343
}
343344

345+
override fun shareKeysWithDevice(exportedKeys: MegolmSessionData?, deviceId: String, userId: String) {
346+
exportedKeys ?: return
347+
cryptoCoroutineScope.launch(coroutineDispatchers.crypto) {
348+
runCatching { deviceListManager.downloadKeys(listOf(userId), false) }
349+
.mapCatching {
350+
val deviceInfo = cryptoStore.getUserDevice(userId, deviceId)
351+
if (deviceInfo == null) {
352+
throw RuntimeException()
353+
} else {
354+
val devicesByUser = mapOf(userId to listOf(deviceInfo))
355+
val usersDeviceMap = ensureOlmSessionsForDevicesAction.handle(devicesByUser)
356+
val olmSessionResult = usersDeviceMap.getObject(userId, deviceId)
357+
if (olmSessionResult?.sessionId == null) {
358+
// no session with this device, probably because there
359+
// were no one-time keys.
360+
Timber.tag(loggerTag.value).e("no session with this device $deviceId, probably because there were no one-time keys.")
361+
return@mapCatching
362+
}
363+
Timber.tag(loggerTag.value).i("shareKeysWithDevice() : sharing session ${exportedKeys.sessionId} with device $userId:$deviceId")
364+
365+
val payloadJson = mapOf(
366+
"type" to EventType.FORWARDED_ROOM_KEY,
367+
"content" to exportedKeys
368+
)
369+
370+
val encodedPayload = messageEncrypter.encryptMessage(payloadJson, listOf(deviceInfo))
371+
val sendToDeviceMap = MXUsersDevicesMap<Any>()
372+
sendToDeviceMap.setObject(userId, deviceId, encodedPayload)
373+
Timber.tag(loggerTag.value).i("shareKeysWithDevice() : sending ${exportedKeys.sessionId} to $userId:$deviceId")
374+
val sendToDeviceParams = SendToDeviceTask.Params(EventType.ENCRYPTED, sendToDeviceMap)
375+
try {
376+
sendToDeviceTask.execute(sendToDeviceParams)
377+
} catch (failure: Throwable) {
378+
Timber.tag(loggerTag.value).e(failure, "shareKeysWithDevice() : Failed to send ${exportedKeys.sessionId} to $userId:$deviceId")
379+
}
380+
}
381+
}
382+
}
383+
}
384+
344385
override fun shareKeysWithDevice(request: IncomingRoomKeyRequest) {
345386
// sanity checks
346387
if (request.requestBody == null) {

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/IMXCryptoStore.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,14 @@ internal interface IMXCryptoStore {
6767
*/
6868
fun getInboundGroupSessions(): List<OlmInboundGroupSessionWrapper2>
6969

70+
/**
71+
* Retrieve the known inbound group sessions for the specified room
72+
*
73+
* @param roomId The roomId that the sessions will be returned
74+
* @return the list of all known group sessions, for the provided roomId
75+
*/
76+
fun getInboundGroupSessions(roomId: String): List<OlmInboundGroupSessionWrapper2>
77+
7078
/**
7179
* @return true to unilaterally blacklist all unverified devices.
7280
*/

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/RealmCryptoStore.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -814,6 +814,18 @@ internal class RealmCryptoStore @Inject constructor(
814814
}
815815
}
816816

817+
override fun getInboundGroupSessions(roomId: String): List<OlmInboundGroupSessionWrapper2> {
818+
return doWithRealm(realmConfiguration) {
819+
it.where<OlmInboundGroupSessionEntity>()
820+
.findAll()
821+
.mapNotNull { inboundGroupSessionEntity ->
822+
inboundGroupSessionEntity.getInboundGroupSession()
823+
}.filter { inboundSession ->
824+
inboundSession.roomId == roomId
825+
}
826+
}
827+
}
828+
817829
override fun removeInboundGroupSession(sessionId: String, senderKey: String) {
818830
val key = OlmInboundGroupSessionEntity.createPrimaryKey(sessionId, senderKey)
819831

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/membership/DefaultMembershipService.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import dagger.assisted.AssistedFactory
2323
import dagger.assisted.AssistedInject
2424
import io.realm.Realm
2525
import io.realm.RealmQuery
26+
import org.matrix.android.sdk.api.session.crypto.CryptoService
2627
import org.matrix.android.sdk.api.session.identity.ThreePid
2728
import org.matrix.android.sdk.api.session.room.members.MembershipService
2829
import org.matrix.android.sdk.api.session.room.members.RoomMemberQueryParams
@@ -47,6 +48,7 @@ internal class DefaultMembershipService @AssistedInject constructor(
4748
private val inviteTask: InviteTask,
4849
private val inviteThreePidTask: InviteThreePidTask,
4950
private val membershipAdminTask: MembershipAdminTask,
51+
private val cryptoService: CryptoService,
5052
@UserId
5153
private val userId: String,
5254
private val queryStringValueProcessor: QueryStringValueProcessor
@@ -127,6 +129,7 @@ internal class DefaultMembershipService @AssistedInject constructor(
127129
}
128130

129131
override suspend fun invite(userId: String, reason: String?) {
132+
cryptoService.sendSharedHistoryKeys(roomId, userId)
130133
val params = InviteTask.Params(roomId, userId, reason)
131134
inviteTask.execute(params)
132135
}

0 commit comments

Comments
 (0)