fix: also delete db on logout
we already cleared it out, but to change the db enc pw on the app we need to delete it completely first
This commit is contained in:
parent
87ce08d394
commit
22694a81d8
|
|
@ -1799,6 +1799,7 @@ class Client extends MatrixApi {
|
||||||
} catch (e, s) {
|
} catch (e, s) {
|
||||||
Logs().e('Unable to clear database', e, s);
|
Logs().e('Unable to clear database', e, s);
|
||||||
} finally {
|
} finally {
|
||||||
|
await database?.delete();
|
||||||
_database = null;
|
_database = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -335,6 +335,6 @@ abstract class DatabaseApi {
|
||||||
Future<CachedPresence?> getPresence(String userId);
|
Future<CachedPresence?> getPresence(String userId);
|
||||||
|
|
||||||
/// Deletes the whole database. The database needs to be created again after
|
/// Deletes the whole database. The database needs to be created again after
|
||||||
/// this. Used for migration only.
|
/// this.
|
||||||
Future<void> delete();
|
Future<void> delete();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -83,8 +83,14 @@ class BoxCollection with ZoneTransactionMixin {
|
||||||
return _db.close();
|
return _db.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
static Future<void> delete(String path, [dynamic factory]) =>
|
@Deprecated('use collection.deleteDatabase now')
|
||||||
(factory ?? window.indexedDB!).deleteDatabase(path);
|
static Future<void> delete(String name, [dynamic factory]) =>
|
||||||
|
(factory ?? window.indexedDB!).deleteDatabase(name);
|
||||||
|
|
||||||
|
Future<void> deleteDatabase(String name, [dynamic factory]) async {
|
||||||
|
await close();
|
||||||
|
await (factory ?? window.indexedDB).deleteDatabase(name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class Box<V> {
|
class Box<V> {
|
||||||
|
|
|
||||||
|
|
@ -54,6 +54,7 @@ import 'package:matrix/src/database/database_file_storage_stub.dart'
|
||||||
class MatrixSdkDatabase extends DatabaseApi with DatabaseFileStorage {
|
class MatrixSdkDatabase extends DatabaseApi with DatabaseFileStorage {
|
||||||
static const int version = 9;
|
static const int version = 9;
|
||||||
final String name;
|
final String name;
|
||||||
|
|
||||||
late BoxCollection _collection;
|
late BoxCollection _collection;
|
||||||
late Box<String> _clientBox;
|
late Box<String> _clientBox;
|
||||||
late Box<Map> _accountDataBox;
|
late Box<Map> _accountDataBox;
|
||||||
|
|
@ -1623,10 +1624,13 @@ class MatrixSdkDatabase extends DatabaseApi with DatabaseFileStorage {
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<void> delete() => BoxCollection.delete(
|
Future<void> delete() async {
|
||||||
name,
|
// database?.path is null on web
|
||||||
sqfliteFactory ?? idbFactory,
|
await _collection.deleteDatabase(
|
||||||
);
|
database?.path ?? name,
|
||||||
|
sqfliteFactory ?? idbFactory,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<void> markUserProfileAsOutdated(userId) async {
|
Future<void> markUserProfileAsOutdated(userId) async {
|
||||||
|
|
|
||||||
|
|
@ -68,8 +68,14 @@ class BoxCollection with ZoneTransactionMixin {
|
||||||
|
|
||||||
Future<void> close() => _db.close();
|
Future<void> close() => _db.close();
|
||||||
|
|
||||||
|
@Deprecated('use collection.deleteDatabase now')
|
||||||
static Future<void> delete(String path, [dynamic factory]) =>
|
static Future<void> delete(String path, [dynamic factory]) =>
|
||||||
(factory ?? databaseFactory).deleteDatabase(path);
|
(factory ?? databaseFactory).deleteDatabase(path);
|
||||||
|
|
||||||
|
Future<void> deleteDatabase(String path, [dynamic factory]) async {
|
||||||
|
await close();
|
||||||
|
await (factory ?? databaseFactory).deleteDatabase(path);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class Box<V> {
|
class Box<V> {
|
||||||
|
|
|
||||||
|
|
@ -41,5 +41,6 @@ dev_dependencies:
|
||||||
file: ">=6.1.1 <8.0.0"
|
file: ">=6.1.1 <8.0.0"
|
||||||
import_sorter: ^4.6.0
|
import_sorter: ^4.6.0
|
||||||
lints: ^4.0.0
|
lints: ^4.0.0
|
||||||
|
path: ^1.9.0
|
||||||
sqflite_common_ffi: 2.3.2+1 # v2.3.3 doesn't support dart v3.2.x
|
sqflite_common_ffi: 2.3.2+1 # v2.3.3 doesn't support dart v3.2.x
|
||||||
test: ^1.15.7
|
test: ^1.15.7
|
||||||
|
|
|
||||||
|
|
@ -100,9 +100,9 @@ void main() {
|
||||||
});
|
});
|
||||||
|
|
||||||
test(
|
test(
|
||||||
'Box.delete',
|
'Collection.deleteDatabase',
|
||||||
() async {
|
() async {
|
||||||
await BoxCollection.delete(
|
await collection.deleteDatabase(
|
||||||
db?.path ?? '',
|
db?.path ?? '',
|
||||||
isWeb ? null : databaseFactoryFfi,
|
isWeb ? null : databaseFactoryFfi,
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -18,11 +18,13 @@
|
||||||
|
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
import 'dart:io';
|
||||||
import 'dart:typed_data';
|
import 'dart:typed_data';
|
||||||
|
|
||||||
import 'package:canonical_json/canonical_json.dart';
|
import 'package:canonical_json/canonical_json.dart';
|
||||||
import 'package:collection/collection.dart';
|
import 'package:collection/collection.dart';
|
||||||
import 'package:olm/olm.dart' as olm;
|
import 'package:olm/olm.dart' as olm;
|
||||||
|
import 'package:path/path.dart' show join;
|
||||||
import 'package:test/test.dart';
|
import 'package:test/test.dart';
|
||||||
|
|
||||||
import 'package:matrix/matrix.dart';
|
import 'package:matrix/matrix.dart';
|
||||||
|
|
@ -31,16 +33,35 @@ import 'fake_client.dart';
|
||||||
import 'fake_database.dart';
|
import 'fake_database.dart';
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
late Client matrix;
|
|
||||||
|
|
||||||
// key @test:fakeServer.notExisting
|
// key @test:fakeServer.notExisting
|
||||||
const pickledOlmAccount =
|
const pickledOlmAccount =
|
||||||
'N2v1MkIFGcl0mQpo2OCwSopxPQJ0wnl7oe7PKiT4141AijfdTIhRu+ceXzXKy3Kr00nLqXtRv7kid6hU4a+V0rfJWLL0Y51+3Rp/ORDVnQy+SSeo6Fn4FHcXrxifJEJ0djla5u98fBcJ8BSkhIDmtXRPi5/oJAvpiYn+8zMjFHobOeZUAxYR0VfQ9JzSYBsSovoQ7uFkNks1M4EDUvHtuyg3RxViwdNxs3718fyAqQ/VSwbXsY0Nl+qQbF+nlVGHenGqk5SuNl1P6e1PzZxcR0IfXA94Xij1Ob5gDv5YH4UCn9wRMG0abZsQP0YzpDM0FLaHSCyo9i5JD/vMlhH+nZWrgAzPPCTNGYewNV8/h3c+VyJh8ZTx/fVi6Yq46Fv+27Ga2ETRZ3Qn+Oyx6dLBjnBZ9iUvIhqpe2XqaGA1PopOz8iDnaZitw';
|
'N2v1MkIFGcl0mQpo2OCwSopxPQJ0wnl7oe7PKiT4141AijfdTIhRu+ceXzXKy3Kr00nLqXtRv7kid6hU4a+V0rfJWLL0Y51+3Rp/ORDVnQy+SSeo6Fn4FHcXrxifJEJ0djla5u98fBcJ8BSkhIDmtXRPi5/oJAvpiYn+8zMjFHobOeZUAxYR0VfQ9JzSYBsSovoQ7uFkNks1M4EDUvHtuyg3RxViwdNxs3718fyAqQ/VSwbXsY0Nl+qQbF+nlVGHenGqk5SuNl1P6e1PzZxcR0IfXA94Xij1Ob5gDv5YH4UCn9wRMG0abZsQP0YzpDM0FLaHSCyo9i5JD/vMlhH+nZWrgAzPPCTNGYewNV8/h3c+VyJh8ZTx/fVi6Yq46Fv+27Ga2ETRZ3Qn+Oyx6dLBjnBZ9iUvIhqpe2XqaGA1PopOz8iDnaZitw';
|
||||||
const identityKey = '7rvl3jORJkBiK4XX1e5TnGnqz068XfYJ0W++Ml63rgk';
|
const identityKey = '7rvl3jORJkBiK4XX1e5TnGnqz068XfYJ0W++Ml63rgk';
|
||||||
const fingerprintKey = 'gjL//fyaFHADt9KBADGag8g7F8Up78B/K1zXeiEPLJo';
|
const fingerprintKey = 'gjL//fyaFHADt9KBADGag8g7F8Up78B/K1zXeiEPLJo';
|
||||||
|
|
||||||
|
group('client path', () {
|
||||||
|
late Client clientOnPath;
|
||||||
|
|
||||||
|
final dbPath = join(Directory.current.path, 'test.sqlite');
|
||||||
|
|
||||||
|
setUp(() async {
|
||||||
|
expect(await File(dbPath).exists(), false);
|
||||||
|
clientOnPath = await getClient(
|
||||||
|
databasePath: dbPath,
|
||||||
|
);
|
||||||
|
expect(await File(dbPath).exists(), true);
|
||||||
|
});
|
||||||
|
test('logout', () async {
|
||||||
|
expect(await File(dbPath).exists(), true);
|
||||||
|
await clientOnPath.logout();
|
||||||
|
expect(await File(dbPath).exists(), false);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
/// All Tests related to the Login
|
/// All Tests related to the Login
|
||||||
group('Client', tags: 'olm', () {
|
group('client mem', tags: 'olm', () {
|
||||||
|
late Client matrix;
|
||||||
|
|
||||||
Logs().level = Level.error;
|
Logs().level = Level.error;
|
||||||
|
|
||||||
/// Check if all Elements get created
|
/// Check if all Elements get created
|
||||||
|
|
|
||||||
|
|
@ -26,12 +26,16 @@ const ssssKey = 'EsT9 RzbW VhPW yqNp cC7j ViiW 5TZB LuY4 ryyv 9guN Ysmr WDPH';
|
||||||
const pickledOlmAccount =
|
const pickledOlmAccount =
|
||||||
'N2v1MkIFGcl0mQpo2OCwSopxPQJ0wnl7oe7PKiT4141AijfdTIhRu+ceXzXKy3Kr00nLqXtRv7kid6hU4a+V0rfJWLL0Y51+3Rp/ORDVnQy+SSeo6Fn4FHcXrxifJEJ0djla5u98fBcJ8BSkhIDmtXRPi5/oJAvpiYn+8zMjFHobOeZUAxYR0VfQ9JzSYBsSovoQ7uFkNks1M4EDUvHtuyg3RxViwdNxs3718fyAqQ/VSwbXsY0Nl+qQbF+nlVGHenGqk5SuNl1P6e1PzZxcR0IfXA94Xij1Ob5gDv5YH4UCn9wRMG0abZsQP0YzpDM0FLaHSCyo9i5JD/vMlhH+nZWrgAzPPCTNGYewNV8/h3c+VyJh8ZTx/fVi6Yq46Fv+27Ga2ETRZ3Qn+Oyx6dLBjnBZ9iUvIhqpe2XqaGA1PopOz8iDnaZitw';
|
'N2v1MkIFGcl0mQpo2OCwSopxPQJ0wnl7oe7PKiT4141AijfdTIhRu+ceXzXKy3Kr00nLqXtRv7kid6hU4a+V0rfJWLL0Y51+3Rp/ORDVnQy+SSeo6Fn4FHcXrxifJEJ0djla5u98fBcJ8BSkhIDmtXRPi5/oJAvpiYn+8zMjFHobOeZUAxYR0VfQ9JzSYBsSovoQ7uFkNks1M4EDUvHtuyg3RxViwdNxs3718fyAqQ/VSwbXsY0Nl+qQbF+nlVGHenGqk5SuNl1P6e1PzZxcR0IfXA94Xij1Ob5gDv5YH4UCn9wRMG0abZsQP0YzpDM0FLaHSCyo9i5JD/vMlhH+nZWrgAzPPCTNGYewNV8/h3c+VyJh8ZTx/fVi6Yq46Fv+27Ga2ETRZ3Qn+Oyx6dLBjnBZ9iUvIhqpe2XqaGA1PopOz8iDnaZitw';
|
||||||
|
|
||||||
Future<Client> getClient(
|
/// only use `path` if you explicitly if you need a db on path instead of in mem
|
||||||
{Duration sendTimelineEventTimeout = const Duration(minutes: 1)}) async {
|
Future<Client> getClient({
|
||||||
|
Duration sendTimelineEventTimeout = const Duration(minutes: 1),
|
||||||
|
String? databasePath,
|
||||||
|
}) async {
|
||||||
final client = Client(
|
final client = Client(
|
||||||
'testclient',
|
'testclient',
|
||||||
httpClient: FakeMatrixApi(),
|
httpClient: FakeMatrixApi(),
|
||||||
databaseBuilder: getDatabase,
|
databaseBuilder: (client) =>
|
||||||
|
getDatabase(client, databasePath: databasePath),
|
||||||
onSoftLogout: (client) => client.refreshAccessToken(),
|
onSoftLogout: (client) => client.refreshAccessToken(),
|
||||||
sendTimelineEventTimeout: sendTimelineEventTimeout,
|
sendTimelineEventTimeout: sendTimelineEventTimeout,
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,8 @@ import 'package:sqflite_common_ffi/sqflite_ffi.dart';
|
||||||
|
|
||||||
import 'package:matrix/matrix.dart';
|
import 'package:matrix/matrix.dart';
|
||||||
|
|
||||||
Future<DatabaseApi> getDatabase(Client? c) => getMatrixSdkDatabase(c);
|
Future<DatabaseApi> getDatabase(Client? c, {String? databasePath}) =>
|
||||||
|
getMatrixSdkDatabase(c, path: databasePath);
|
||||||
|
|
||||||
bool hiveInitialized = false;
|
bool hiveInitialized = false;
|
||||||
|
|
||||||
|
|
@ -44,9 +45,10 @@ Future<HiveCollectionsDatabase> getHiveCollectionsDatabase(Client? c) async {
|
||||||
}
|
}
|
||||||
|
|
||||||
// ignore: deprecated_member_use_from_same_package
|
// ignore: deprecated_member_use_from_same_package
|
||||||
Future<MatrixSdkDatabase> getMatrixSdkDatabase(Client? c) async {
|
Future<MatrixSdkDatabase> getMatrixSdkDatabase(Client? c,
|
||||||
|
{String? path}) async {
|
||||||
final database = await databaseFactoryFfi.openDatabase(
|
final database = await databaseFactoryFfi.openDatabase(
|
||||||
':memory:',
|
path ?? ':memory:',
|
||||||
options: OpenDatabaseOptions(singleInstance: false),
|
options: OpenDatabaseOptions(singleInstance: false),
|
||||||
);
|
);
|
||||||
final db = MatrixSdkDatabase(
|
final db = MatrixSdkDatabase(
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue