commit
1cafca6de6
@ -8,7 +8,7 @@ Improvements 🙌:
|
|||||||
-
|
-
|
||||||
|
|
||||||
Bugfix 🐛:
|
Bugfix 🐛:
|
||||||
-
|
- Sometimes the same device appears twice in the list of devices of a user (#1329)
|
||||||
|
|
||||||
Translations 🗣:
|
Translations 🗣:
|
||||||
-
|
-
|
||||||
|
@ -446,7 +446,7 @@ internal class DefaultCryptoService @Inject constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun getCryptoDeviceInfo(userId: String): List<CryptoDeviceInfo> {
|
override fun getCryptoDeviceInfo(userId: String): List<CryptoDeviceInfo> {
|
||||||
return cryptoStore.getUserDevices(userId)?.map { it.value }?.sortedBy { it.deviceId } ?: emptyList()
|
return cryptoStore.getUserDeviceList(userId) ?: emptyList()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getLiveCryptoDeviceInfo(): LiveData<List<CryptoDeviceInfo>> {
|
override fun getLiveCryptoDeviceInfo(): LiveData<List<CryptoDeviceInfo>> {
|
||||||
|
@ -48,7 +48,7 @@ internal class SetDeviceVerificationAction @Inject constructor(
|
|||||||
|
|
||||||
if (device.trustLevel != trustLevel) {
|
if (device.trustLevel != trustLevel) {
|
||||||
device.trustLevel = trustLevel
|
device.trustLevel = trustLevel
|
||||||
cryptoStore.storeUserDevice(userId, device)
|
cryptoStore.setDeviceTrust(userId, deviceId, trustLevel.crossSigningVerified, trustLevel.locallyVerified)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -164,14 +164,6 @@ internal interface IMXCryptoStore {
|
|||||||
*/
|
*/
|
||||||
fun saveOlmAccount()
|
fun saveOlmAccount()
|
||||||
|
|
||||||
/**
|
|
||||||
* Store a device for a user.
|
|
||||||
*
|
|
||||||
* @param userId the user's id.
|
|
||||||
* @param device the device to store.
|
|
||||||
*/
|
|
||||||
fun storeUserDevice(userId: String?, deviceInfo: CryptoDeviceInfo?)
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve a device for a user.
|
* Retrieve a device for a user.
|
||||||
*
|
*
|
||||||
@ -415,7 +407,7 @@ internal interface IMXCryptoStore {
|
|||||||
fun getKeyBackupRecoveryKeyInfo() : SavedKeyBackupKeyInfo?
|
fun getKeyBackupRecoveryKeyInfo() : SavedKeyBackupKeyInfo?
|
||||||
|
|
||||||
fun setUserKeysAsTrusted(userId: String, trusted: Boolean = true)
|
fun setUserKeysAsTrusted(userId: String, trusted: Boolean = true)
|
||||||
fun setDeviceTrust(userId: String, deviceId: String, crossSignedVerified: Boolean, locallyVerified: Boolean)
|
fun setDeviceTrust(userId: String, deviceId: String, crossSignedVerified: Boolean, locallyVerified: Boolean?)
|
||||||
|
|
||||||
fun clearOtherUserTrust()
|
fun clearOtherUserTrust()
|
||||||
|
|
||||||
|
@ -233,29 +233,6 @@ internal class RealmCryptoStore @Inject constructor(
|
|||||||
return olmAccount!!
|
return olmAccount!!
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun storeUserDevice(userId: String?, deviceInfo: CryptoDeviceInfo?) {
|
|
||||||
if (userId == null || deviceInfo == null) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
doRealmTransaction(realmConfiguration) { realm ->
|
|
||||||
val user = UserEntity.getOrCreate(realm, userId)
|
|
||||||
|
|
||||||
// Create device info
|
|
||||||
val deviceInfoEntity = CryptoMapper.mapToEntity(deviceInfo)
|
|
||||||
realm.insertOrUpdate(deviceInfoEntity)
|
|
||||||
// val deviceInfoEntity = DeviceInfoEntity.getOrCreate(it, userId, deviceInfo.deviceId).apply {
|
|
||||||
// deviceId = deviceInfo.deviceId
|
|
||||||
// identityKey = deviceInfo.identityKey()
|
|
||||||
// putDeviceInfo(deviceInfo)
|
|
||||||
// }
|
|
||||||
|
|
||||||
if (!user.devices.contains(deviceInfoEntity)) {
|
|
||||||
user.devices.add(deviceInfoEntity)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getUserDevice(userId: String, deviceId: String): CryptoDeviceInfo? {
|
override fun getUserDevice(userId: String, deviceId: String): CryptoDeviceInfo? {
|
||||||
return doWithRealm(realmConfiguration) {
|
return doWithRealm(realmConfiguration) {
|
||||||
it.where<DeviceInfoEntity>()
|
it.where<DeviceInfoEntity>()
|
||||||
@ -1276,7 +1253,7 @@ internal class RealmCryptoStore @Inject constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun setDeviceTrust(userId: String, deviceId: String, crossSignedVerified: Boolean, locallyVerified: Boolean) {
|
override fun setDeviceTrust(userId: String, deviceId: String, crossSignedVerified: Boolean, locallyVerified: Boolean?) {
|
||||||
doRealmTransaction(realmConfiguration) { realm ->
|
doRealmTransaction(realmConfiguration) { realm ->
|
||||||
realm.where(DeviceInfoEntity::class.java)
|
realm.where(DeviceInfoEntity::class.java)
|
||||||
.equalTo(DeviceInfoEntityFields.PRIMARY_KEY, DeviceInfoEntity.createPrimaryKey(userId, deviceId))
|
.equalTo(DeviceInfoEntityFields.PRIMARY_KEY, DeviceInfoEntity.createPrimaryKey(userId, deviceId))
|
||||||
@ -1289,7 +1266,7 @@ internal class RealmCryptoStore @Inject constructor(
|
|||||||
deviceInfoEntity.trustLevelEntity = it
|
deviceInfoEntity.trustLevelEntity = it
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
trustEntity.locallyVerified = locallyVerified
|
locallyVerified?.let { trustEntity.locallyVerified = it }
|
||||||
trustEntity.crossSignedVerified = crossSignedVerified
|
trustEntity.crossSignedVerified = crossSignedVerified
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -45,7 +45,7 @@ internal class RealmCryptoStoreMigration @Inject constructor(private val crossSi
|
|||||||
|
|
||||||
// Version 1L added Cross Signing info persistence
|
// Version 1L added Cross Signing info persistence
|
||||||
companion object {
|
companion object {
|
||||||
const val CRYPTO_STORE_SCHEMA_VERSION = 5L
|
const val CRYPTO_STORE_SCHEMA_VERSION = 6L
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun migrate(realm: DynamicRealm, oldVersion: Long, newVersion: Long) {
|
override fun migrate(realm: DynamicRealm, oldVersion: Long, newVersion: Long) {
|
||||||
@ -56,6 +56,7 @@ internal class RealmCryptoStoreMigration @Inject constructor(private val crossSi
|
|||||||
if (oldVersion <= 2) migrateTo3(realm)
|
if (oldVersion <= 2) migrateTo3(realm)
|
||||||
if (oldVersion <= 3) migrateTo4(realm)
|
if (oldVersion <= 3) migrateTo4(realm)
|
||||||
if (oldVersion <= 4) migrateTo5(realm)
|
if (oldVersion <= 4) migrateTo5(realm)
|
||||||
|
if (oldVersion <= 5) migrateTo6(realm)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun migrateTo1(realm: DynamicRealm) {
|
private fun migrateTo1(realm: DynamicRealm) {
|
||||||
@ -255,4 +256,22 @@ internal class RealmCryptoStoreMigration @Inject constructor(private val crossSi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Fixes duplicate devices in UserEntity#devices
|
||||||
|
private fun migrateTo6(realm: DynamicRealm) {
|
||||||
|
val userEntities = realm.where("UserEntity").findAll()
|
||||||
|
userEntities.forEach {
|
||||||
|
try {
|
||||||
|
val deviceList = it.getList(UserEntityFields.DEVICES.`$`)
|
||||||
|
?: return@forEach
|
||||||
|
val distinct = deviceList.distinctBy { it.getString(DeviceInfoEntityFields.DEVICE_ID) }
|
||||||
|
if (distinct.size != deviceList.size) {
|
||||||
|
deviceList.clear()
|
||||||
|
deviceList.addAll(distinct)
|
||||||
|
}
|
||||||
|
} catch (failure: Throwable) {
|
||||||
|
Timber.w(failure, "Crypto Data base migration error for migrateTo6")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user