fix: Migrate missing device keys

Currently we only migrate the client and SSSSCache but this leads to the
problem that we are no longer self signed after the migration.
We need to migrate all device keys too.
This also abstracts the migration code in a method. init() is too large already...
This commit is contained in:
Christian Pauly 2021-06-17 12:37:10 +02:00
parent 14ee16fe16
commit 38d81d6093
2 changed files with 82 additions and 42 deletions

View File

@ -877,44 +877,8 @@ class Client extends MatrixApi {
if (accessToken == null || homeserver == null || _userID == null) {
if (legacyDatabaseBuilder != null) {
Logs().i('Check legacy database for migration data...');
final legacyDatabase = await legacyDatabaseBuilder(this);
final migrateClient = await legacyDatabase.getClient(clientName);
if (migrateClient != null) {
Logs().i('Found data in the legacy database!');
_id = migrateClient['client_id'];
await database.insertClient(
clientName,
migrateClient['homeserver_url'],
migrateClient['token'],
migrateClient['user_id'],
migrateClient['device_id'],
migrateClient['device_name'],
null,
migrateClient['olm_account'],
);
for (final type in cacheTypes) {
final ssssCache = await legacyDatabase.getSSSSCache(_id, type);
if (ssssCache != null) {
Logs().d('Migrate $type');
await database.storeSSSSCache(
_id,
type,
ssssCache.keyId,
ssssCache.ciphertext,
ssssCache.content,
);
}
}
await legacyDatabase.clear(_id);
await legacyDatabaseDestroyer?.call(this);
}
await legacyDatabase.close();
if (migrateClient != null) {
_initLock = false;
return init();
}
await _migrateFromLegacyDatabase();
if (isLogged()) return;
}
// we aren't logged in
encryption?.dispose();
@ -2109,6 +2073,82 @@ sort order of ${prevState.sortOrder}. This should never happen...''');
}
return;
}
Future<void> _migrateFromLegacyDatabase() async {
Logs().i('Check legacy database for migration data...');
final legacyDatabase = await legacyDatabaseBuilder(this);
final migrateClient = await legacyDatabase.getClient(clientName);
if (migrateClient != null) {
Logs().i('Found data in the legacy database!');
_id = migrateClient['client_id'];
await database.insertClient(
clientName,
migrateClient['homeserver_url'],
migrateClient['token'],
migrateClient['user_id'],
migrateClient['device_id'],
migrateClient['device_name'],
null,
migrateClient['olm_account'],
);
Logs().d('Migrate SSSSCache...');
for (final type in cacheTypes) {
final ssssCache = await legacyDatabase.getSSSSCache(_id, type);
if (ssssCache != null) {
Logs().d('Migrate $type...');
await database.storeSSSSCache(
_id,
type,
ssssCache.keyId,
ssssCache.ciphertext,
ssssCache.content,
);
}
}
Logs().d('Migrate Device Keys...');
final userDeviceKeys = await legacyDatabase.getUserDeviceKeys(this);
for (final userId in userDeviceKeys.keys) {
Logs().d('Migrate Device Keys of user $userId...');
final deviceKeysList = userDeviceKeys[userId];
for (final crossSigningKey in deviceKeysList.crossSigningKeys.values) {
Logs().d(
'Migrate cross signing key with usage ${crossSigningKey.usage} and verified ${crossSigningKey.directVerified}...');
await database.storeUserCrossSigningKey(
_id,
userId,
crossSigningKey.publicKey,
jsonEncode(crossSigningKey.toJson()),
crossSigningKey.directVerified,
crossSigningKey.blocked,
);
}
for (final deviceKeys in deviceKeysList.deviceKeys.values) {
Logs().d('Migrate device keys for ${deviceKeys.deviceId}...');
await database.storeUserDeviceKey(
_id,
userId,
deviceKeys.deviceId,
jsonEncode(deviceKeys.toJson()),
deviceKeys.directVerified,
deviceKeys.blocked,
deviceKeys.lastActive.millisecondsSinceEpoch,
);
}
Logs().d('Migrate user device keys info...');
await database.storeUserDeviceKeysInfo(
_id, userId, deviceKeysList.outdated);
}
await legacyDatabase.clear(_id);
await legacyDatabaseDestroyer?.call(this);
}
await legacyDatabase.close();
_initLock = false;
if (migrateClient != null) {
return init();
}
}
}
class SdkError {

View File

@ -933,8 +933,8 @@ class FamedlySdkHiveDatabase extends DatabaseApi {
'user_id': userId,
'public_key': publicKey,
'content': content,
'verified': verified ?? false,
'blocked': blocked ?? false,
'verified': verified,
'blocked': blocked,
},
);
}
@ -946,8 +946,8 @@ class FamedlySdkHiveDatabase extends DatabaseApi {
'user_id': userId,
'device_id': deviceId,
'content': content,
'verified': verified ?? false,
'blocked': blocked ?? false,
'verified': verified,
'blocked': blocked,
'last_active': lastActive,
'last_sent_message': '',
});