don't cache via db and properly handle invalid signatures

This commit is contained in:
Sorunome 2020-05-22 11:04:27 +02:00
parent 788353120b
commit 74361fff0e
No known key found for this signature in database
GPG key ID: B19471D07FC9BE9C
5 changed files with 37 additions and 174 deletions

View file

@ -1684,7 +1684,6 @@ class Client {
userId, userId,
deviceId, deviceId,
json.encode(entry.toJson()), json.encode(entry.toJson()),
json.encode(entry.validSignatures),
entry.verified, entry.verified,
entry.blocked, entry.blocked,
)); ));
@ -1746,7 +1745,6 @@ class Client {
userId, userId,
publicKey, publicKey,
json.encode(entry.toJson()), json.encode(entry.toJson()),
json.encode(entry.validSignatures),
entry.verified, entry.verified,
entry.blocked, entry.blocked,
)); ));

View file

@ -46,7 +46,6 @@ class Database extends _$Database {
if (from == 3) { if (from == 3) {
await m.createTable(userCrossSigningKeys); await m.createTable(userCrossSigningKeys);
await m.createIndex(userCrossSigningKeysIndex); await m.createIndex(userCrossSigningKeysIndex);
await m.addColumn(userDeviceKeysKey, userDeviceKeysKey.validSignatures);
// mark all keys as outdated so that the cross signing keys will be fetched // mark all keys as outdated so that the cross signing keys will be fetched
await m.issueCustomQuery('UPDATE user_device_keys SET outdated = true'); await m.issueCustomQuery('UPDATE user_device_keys SET outdated = true');
from++; from++;

View file

@ -699,7 +699,6 @@ class DbUserDeviceKeysKey extends DataClass
final String userId; final String userId;
final String deviceId; final String deviceId;
final String content; final String content;
final String validSignatures;
final bool verified; final bool verified;
final bool blocked; final bool blocked;
DbUserDeviceKeysKey( DbUserDeviceKeysKey(
@ -707,7 +706,6 @@ class DbUserDeviceKeysKey extends DataClass
@required this.userId, @required this.userId,
@required this.deviceId, @required this.deviceId,
@required this.content, @required this.content,
this.validSignatures,
this.verified, this.verified,
this.blocked}); this.blocked});
factory DbUserDeviceKeysKey.fromData( factory DbUserDeviceKeysKey.fromData(
@ -726,8 +724,6 @@ class DbUserDeviceKeysKey extends DataClass
.mapFromDatabaseResponse(data['${effectivePrefix}device_id']), .mapFromDatabaseResponse(data['${effectivePrefix}device_id']),
content: content:
stringType.mapFromDatabaseResponse(data['${effectivePrefix}content']), stringType.mapFromDatabaseResponse(data['${effectivePrefix}content']),
validSignatures: stringType
.mapFromDatabaseResponse(data['${effectivePrefix}valid_signatures']),
verified: verified:
boolType.mapFromDatabaseResponse(data['${effectivePrefix}verified']), boolType.mapFromDatabaseResponse(data['${effectivePrefix}verified']),
blocked: blocked:
@ -749,9 +745,6 @@ class DbUserDeviceKeysKey extends DataClass
if (!nullToAbsent || content != null) { if (!nullToAbsent || content != null) {
map['content'] = Variable<String>(content); map['content'] = Variable<String>(content);
} }
if (!nullToAbsent || validSignatures != null) {
map['valid_signatures'] = Variable<String>(validSignatures);
}
if (!nullToAbsent || verified != null) { if (!nullToAbsent || verified != null) {
map['verified'] = Variable<bool>(verified); map['verified'] = Variable<bool>(verified);
} }
@ -769,7 +762,6 @@ class DbUserDeviceKeysKey extends DataClass
userId: serializer.fromJson<String>(json['user_id']), userId: serializer.fromJson<String>(json['user_id']),
deviceId: serializer.fromJson<String>(json['device_id']), deviceId: serializer.fromJson<String>(json['device_id']),
content: serializer.fromJson<String>(json['content']), content: serializer.fromJson<String>(json['content']),
validSignatures: serializer.fromJson<String>(json['valid_signatures']),
verified: serializer.fromJson<bool>(json['verified']), verified: serializer.fromJson<bool>(json['verified']),
blocked: serializer.fromJson<bool>(json['blocked']), blocked: serializer.fromJson<bool>(json['blocked']),
); );
@ -782,7 +774,6 @@ class DbUserDeviceKeysKey extends DataClass
'user_id': serializer.toJson<String>(userId), 'user_id': serializer.toJson<String>(userId),
'device_id': serializer.toJson<String>(deviceId), 'device_id': serializer.toJson<String>(deviceId),
'content': serializer.toJson<String>(content), 'content': serializer.toJson<String>(content),
'valid_signatures': serializer.toJson<String>(validSignatures),
'verified': serializer.toJson<bool>(verified), 'verified': serializer.toJson<bool>(verified),
'blocked': serializer.toJson<bool>(blocked), 'blocked': serializer.toJson<bool>(blocked),
}; };
@ -793,7 +784,6 @@ class DbUserDeviceKeysKey extends DataClass
String userId, String userId,
String deviceId, String deviceId,
String content, String content,
String validSignatures,
bool verified, bool verified,
bool blocked}) => bool blocked}) =>
DbUserDeviceKeysKey( DbUserDeviceKeysKey(
@ -801,7 +791,6 @@ class DbUserDeviceKeysKey extends DataClass
userId: userId ?? this.userId, userId: userId ?? this.userId,
deviceId: deviceId ?? this.deviceId, deviceId: deviceId ?? this.deviceId,
content: content ?? this.content, content: content ?? this.content,
validSignatures: validSignatures ?? this.validSignatures,
verified: verified ?? this.verified, verified: verified ?? this.verified,
blocked: blocked ?? this.blocked, blocked: blocked ?? this.blocked,
); );
@ -812,7 +801,6 @@ class DbUserDeviceKeysKey extends DataClass
..write('userId: $userId, ') ..write('userId: $userId, ')
..write('deviceId: $deviceId, ') ..write('deviceId: $deviceId, ')
..write('content: $content, ') ..write('content: $content, ')
..write('validSignatures: $validSignatures, ')
..write('verified: $verified, ') ..write('verified: $verified, ')
..write('blocked: $blocked') ..write('blocked: $blocked')
..write(')')) ..write(')'))
@ -826,10 +814,8 @@ class DbUserDeviceKeysKey extends DataClass
userId.hashCode, userId.hashCode,
$mrjc( $mrjc(
deviceId.hashCode, deviceId.hashCode,
$mrjc( $mrjc(content.hashCode,
content.hashCode, $mrjc(verified.hashCode, blocked.hashCode))))));
$mrjc(validSignatures.hashCode,
$mrjc(verified.hashCode, blocked.hashCode)))))));
@override @override
bool operator ==(dynamic other) => bool operator ==(dynamic other) =>
identical(this, other) || identical(this, other) ||
@ -838,7 +824,6 @@ class DbUserDeviceKeysKey extends DataClass
other.userId == this.userId && other.userId == this.userId &&
other.deviceId == this.deviceId && other.deviceId == this.deviceId &&
other.content == this.content && other.content == this.content &&
other.validSignatures == this.validSignatures &&
other.verified == this.verified && other.verified == this.verified &&
other.blocked == this.blocked); other.blocked == this.blocked);
} }
@ -848,7 +833,6 @@ class UserDeviceKeysKeyCompanion extends UpdateCompanion<DbUserDeviceKeysKey> {
final Value<String> userId; final Value<String> userId;
final Value<String> deviceId; final Value<String> deviceId;
final Value<String> content; final Value<String> content;
final Value<String> validSignatures;
final Value<bool> verified; final Value<bool> verified;
final Value<bool> blocked; final Value<bool> blocked;
const UserDeviceKeysKeyCompanion({ const UserDeviceKeysKeyCompanion({
@ -856,7 +840,6 @@ class UserDeviceKeysKeyCompanion extends UpdateCompanion<DbUserDeviceKeysKey> {
this.userId = const Value.absent(), this.userId = const Value.absent(),
this.deviceId = const Value.absent(), this.deviceId = const Value.absent(),
this.content = const Value.absent(), this.content = const Value.absent(),
this.validSignatures = const Value.absent(),
this.verified = const Value.absent(), this.verified = const Value.absent(),
this.blocked = const Value.absent(), this.blocked = const Value.absent(),
}); });
@ -865,7 +848,6 @@ class UserDeviceKeysKeyCompanion extends UpdateCompanion<DbUserDeviceKeysKey> {
@required String userId, @required String userId,
@required String deviceId, @required String deviceId,
@required String content, @required String content,
this.validSignatures = const Value.absent(),
this.verified = const Value.absent(), this.verified = const Value.absent(),
this.blocked = const Value.absent(), this.blocked = const Value.absent(),
}) : clientId = Value(clientId), }) : clientId = Value(clientId),
@ -877,7 +859,6 @@ class UserDeviceKeysKeyCompanion extends UpdateCompanion<DbUserDeviceKeysKey> {
Expression<String> userId, Expression<String> userId,
Expression<String> deviceId, Expression<String> deviceId,
Expression<String> content, Expression<String> content,
Expression<String> validSignatures,
Expression<bool> verified, Expression<bool> verified,
Expression<bool> blocked, Expression<bool> blocked,
}) { }) {
@ -886,7 +867,6 @@ class UserDeviceKeysKeyCompanion extends UpdateCompanion<DbUserDeviceKeysKey> {
if (userId != null) 'user_id': userId, if (userId != null) 'user_id': userId,
if (deviceId != null) 'device_id': deviceId, if (deviceId != null) 'device_id': deviceId,
if (content != null) 'content': content, if (content != null) 'content': content,
if (validSignatures != null) 'valid_signatures': validSignatures,
if (verified != null) 'verified': verified, if (verified != null) 'verified': verified,
if (blocked != null) 'blocked': blocked, if (blocked != null) 'blocked': blocked,
}); });
@ -897,7 +877,6 @@ class UserDeviceKeysKeyCompanion extends UpdateCompanion<DbUserDeviceKeysKey> {
Value<String> userId, Value<String> userId,
Value<String> deviceId, Value<String> deviceId,
Value<String> content, Value<String> content,
Value<String> validSignatures,
Value<bool> verified, Value<bool> verified,
Value<bool> blocked}) { Value<bool> blocked}) {
return UserDeviceKeysKeyCompanion( return UserDeviceKeysKeyCompanion(
@ -905,7 +884,6 @@ class UserDeviceKeysKeyCompanion extends UpdateCompanion<DbUserDeviceKeysKey> {
userId: userId ?? this.userId, userId: userId ?? this.userId,
deviceId: deviceId ?? this.deviceId, deviceId: deviceId ?? this.deviceId,
content: content ?? this.content, content: content ?? this.content,
validSignatures: validSignatures ?? this.validSignatures,
verified: verified ?? this.verified, verified: verified ?? this.verified,
blocked: blocked ?? this.blocked, blocked: blocked ?? this.blocked,
); );
@ -926,9 +904,6 @@ class UserDeviceKeysKeyCompanion extends UpdateCompanion<DbUserDeviceKeysKey> {
if (content.present) { if (content.present) {
map['content'] = Variable<String>(content.value); map['content'] = Variable<String>(content.value);
} }
if (validSignatures.present) {
map['valid_signatures'] = Variable<String>(validSignatures.value);
}
if (verified.present) { if (verified.present) {
map['verified'] = Variable<bool>(verified.value); map['verified'] = Variable<bool>(verified.value);
} }
@ -976,16 +951,6 @@ class UserDeviceKeysKey extends Table
$customConstraints: 'NOT NULL'); $customConstraints: 'NOT NULL');
} }
final VerificationMeta _validSignaturesMeta =
const VerificationMeta('validSignatures');
GeneratedTextColumn _validSignatures;
GeneratedTextColumn get validSignatures =>
_validSignatures ??= _constructValidSignatures();
GeneratedTextColumn _constructValidSignatures() {
return GeneratedTextColumn('valid_signatures', $tableName, true,
$customConstraints: '');
}
final VerificationMeta _verifiedMeta = const VerificationMeta('verified'); final VerificationMeta _verifiedMeta = const VerificationMeta('verified');
GeneratedBoolColumn _verified; GeneratedBoolColumn _verified;
GeneratedBoolColumn get verified => _verified ??= _constructVerified(); GeneratedBoolColumn get verified => _verified ??= _constructVerified();
@ -1006,7 +971,7 @@ class UserDeviceKeysKey extends Table
@override @override
List<GeneratedColumn> get $columns => List<GeneratedColumn> get $columns =>
[clientId, userId, deviceId, content, validSignatures, verified, blocked]; [clientId, userId, deviceId, content, verified, blocked];
@override @override
UserDeviceKeysKey get asDslTable => this; UserDeviceKeysKey get asDslTable => this;
@override @override
@ -1043,12 +1008,6 @@ class UserDeviceKeysKey extends Table
} else if (isInserting) { } else if (isInserting) {
context.missing(_contentMeta); context.missing(_contentMeta);
} }
if (data.containsKey('valid_signatures')) {
context.handle(
_validSignaturesMeta,
validSignatures.isAcceptableOrUnknown(
data['valid_signatures'], _validSignaturesMeta));
}
if (data.containsKey('verified')) { if (data.containsKey('verified')) {
context.handle(_verifiedMeta, context.handle(_verifiedMeta,
verified.isAcceptableOrUnknown(data['verified'], _verifiedMeta)); verified.isAcceptableOrUnknown(data['verified'], _verifiedMeta));
@ -1086,7 +1045,6 @@ class DbUserCrossSigningKey extends DataClass
final String userId; final String userId;
final String publicKey; final String publicKey;
final String content; final String content;
final String validSignatures;
final bool verified; final bool verified;
final bool blocked; final bool blocked;
DbUserCrossSigningKey( DbUserCrossSigningKey(
@ -1094,7 +1052,6 @@ class DbUserCrossSigningKey extends DataClass
@required this.userId, @required this.userId,
@required this.publicKey, @required this.publicKey,
@required this.content, @required this.content,
this.validSignatures,
this.verified, this.verified,
this.blocked}); this.blocked});
factory DbUserCrossSigningKey.fromData( factory DbUserCrossSigningKey.fromData(
@ -1113,8 +1070,6 @@ class DbUserCrossSigningKey extends DataClass
.mapFromDatabaseResponse(data['${effectivePrefix}public_key']), .mapFromDatabaseResponse(data['${effectivePrefix}public_key']),
content: content:
stringType.mapFromDatabaseResponse(data['${effectivePrefix}content']), stringType.mapFromDatabaseResponse(data['${effectivePrefix}content']),
validSignatures: stringType
.mapFromDatabaseResponse(data['${effectivePrefix}valid_signatures']),
verified: verified:
boolType.mapFromDatabaseResponse(data['${effectivePrefix}verified']), boolType.mapFromDatabaseResponse(data['${effectivePrefix}verified']),
blocked: blocked:
@ -1136,9 +1091,6 @@ class DbUserCrossSigningKey extends DataClass
if (!nullToAbsent || content != null) { if (!nullToAbsent || content != null) {
map['content'] = Variable<String>(content); map['content'] = Variable<String>(content);
} }
if (!nullToAbsent || validSignatures != null) {
map['valid_signatures'] = Variable<String>(validSignatures);
}
if (!nullToAbsent || verified != null) { if (!nullToAbsent || verified != null) {
map['verified'] = Variable<bool>(verified); map['verified'] = Variable<bool>(verified);
} }
@ -1156,7 +1108,6 @@ class DbUserCrossSigningKey extends DataClass
userId: serializer.fromJson<String>(json['user_id']), userId: serializer.fromJson<String>(json['user_id']),
publicKey: serializer.fromJson<String>(json['public_key']), publicKey: serializer.fromJson<String>(json['public_key']),
content: serializer.fromJson<String>(json['content']), content: serializer.fromJson<String>(json['content']),
validSignatures: serializer.fromJson<String>(json['valid_signatures']),
verified: serializer.fromJson<bool>(json['verified']), verified: serializer.fromJson<bool>(json['verified']),
blocked: serializer.fromJson<bool>(json['blocked']), blocked: serializer.fromJson<bool>(json['blocked']),
); );
@ -1169,7 +1120,6 @@ class DbUserCrossSigningKey extends DataClass
'user_id': serializer.toJson<String>(userId), 'user_id': serializer.toJson<String>(userId),
'public_key': serializer.toJson<String>(publicKey), 'public_key': serializer.toJson<String>(publicKey),
'content': serializer.toJson<String>(content), 'content': serializer.toJson<String>(content),
'valid_signatures': serializer.toJson<String>(validSignatures),
'verified': serializer.toJson<bool>(verified), 'verified': serializer.toJson<bool>(verified),
'blocked': serializer.toJson<bool>(blocked), 'blocked': serializer.toJson<bool>(blocked),
}; };
@ -1180,7 +1130,6 @@ class DbUserCrossSigningKey extends DataClass
String userId, String userId,
String publicKey, String publicKey,
String content, String content,
String validSignatures,
bool verified, bool verified,
bool blocked}) => bool blocked}) =>
DbUserCrossSigningKey( DbUserCrossSigningKey(
@ -1188,7 +1137,6 @@ class DbUserCrossSigningKey extends DataClass
userId: userId ?? this.userId, userId: userId ?? this.userId,
publicKey: publicKey ?? this.publicKey, publicKey: publicKey ?? this.publicKey,
content: content ?? this.content, content: content ?? this.content,
validSignatures: validSignatures ?? this.validSignatures,
verified: verified ?? this.verified, verified: verified ?? this.verified,
blocked: blocked ?? this.blocked, blocked: blocked ?? this.blocked,
); );
@ -1199,7 +1147,6 @@ class DbUserCrossSigningKey extends DataClass
..write('userId: $userId, ') ..write('userId: $userId, ')
..write('publicKey: $publicKey, ') ..write('publicKey: $publicKey, ')
..write('content: $content, ') ..write('content: $content, ')
..write('validSignatures: $validSignatures, ')
..write('verified: $verified, ') ..write('verified: $verified, ')
..write('blocked: $blocked') ..write('blocked: $blocked')
..write(')')) ..write(')'))
@ -1213,10 +1160,8 @@ class DbUserCrossSigningKey extends DataClass
userId.hashCode, userId.hashCode,
$mrjc( $mrjc(
publicKey.hashCode, publicKey.hashCode,
$mrjc( $mrjc(content.hashCode,
content.hashCode, $mrjc(verified.hashCode, blocked.hashCode))))));
$mrjc(validSignatures.hashCode,
$mrjc(verified.hashCode, blocked.hashCode)))))));
@override @override
bool operator ==(dynamic other) => bool operator ==(dynamic other) =>
identical(this, other) || identical(this, other) ||
@ -1225,7 +1170,6 @@ class DbUserCrossSigningKey extends DataClass
other.userId == this.userId && other.userId == this.userId &&
other.publicKey == this.publicKey && other.publicKey == this.publicKey &&
other.content == this.content && other.content == this.content &&
other.validSignatures == this.validSignatures &&
other.verified == this.verified && other.verified == this.verified &&
other.blocked == this.blocked); other.blocked == this.blocked);
} }
@ -1236,7 +1180,6 @@ class UserCrossSigningKeysCompanion
final Value<String> userId; final Value<String> userId;
final Value<String> publicKey; final Value<String> publicKey;
final Value<String> content; final Value<String> content;
final Value<String> validSignatures;
final Value<bool> verified; final Value<bool> verified;
final Value<bool> blocked; final Value<bool> blocked;
const UserCrossSigningKeysCompanion({ const UserCrossSigningKeysCompanion({
@ -1244,7 +1187,6 @@ class UserCrossSigningKeysCompanion
this.userId = const Value.absent(), this.userId = const Value.absent(),
this.publicKey = const Value.absent(), this.publicKey = const Value.absent(),
this.content = const Value.absent(), this.content = const Value.absent(),
this.validSignatures = const Value.absent(),
this.verified = const Value.absent(), this.verified = const Value.absent(),
this.blocked = const Value.absent(), this.blocked = const Value.absent(),
}); });
@ -1253,7 +1195,6 @@ class UserCrossSigningKeysCompanion
@required String userId, @required String userId,
@required String publicKey, @required String publicKey,
@required String content, @required String content,
this.validSignatures = const Value.absent(),
this.verified = const Value.absent(), this.verified = const Value.absent(),
this.blocked = const Value.absent(), this.blocked = const Value.absent(),
}) : clientId = Value(clientId), }) : clientId = Value(clientId),
@ -1265,7 +1206,6 @@ class UserCrossSigningKeysCompanion
Expression<String> userId, Expression<String> userId,
Expression<String> publicKey, Expression<String> publicKey,
Expression<String> content, Expression<String> content,
Expression<String> validSignatures,
Expression<bool> verified, Expression<bool> verified,
Expression<bool> blocked, Expression<bool> blocked,
}) { }) {
@ -1274,7 +1214,6 @@ class UserCrossSigningKeysCompanion
if (userId != null) 'user_id': userId, if (userId != null) 'user_id': userId,
if (publicKey != null) 'public_key': publicKey, if (publicKey != null) 'public_key': publicKey,
if (content != null) 'content': content, if (content != null) 'content': content,
if (validSignatures != null) 'valid_signatures': validSignatures,
if (verified != null) 'verified': verified, if (verified != null) 'verified': verified,
if (blocked != null) 'blocked': blocked, if (blocked != null) 'blocked': blocked,
}); });
@ -1285,7 +1224,6 @@ class UserCrossSigningKeysCompanion
Value<String> userId, Value<String> userId,
Value<String> publicKey, Value<String> publicKey,
Value<String> content, Value<String> content,
Value<String> validSignatures,
Value<bool> verified, Value<bool> verified,
Value<bool> blocked}) { Value<bool> blocked}) {
return UserCrossSigningKeysCompanion( return UserCrossSigningKeysCompanion(
@ -1293,7 +1231,6 @@ class UserCrossSigningKeysCompanion
userId: userId ?? this.userId, userId: userId ?? this.userId,
publicKey: publicKey ?? this.publicKey, publicKey: publicKey ?? this.publicKey,
content: content ?? this.content, content: content ?? this.content,
validSignatures: validSignatures ?? this.validSignatures,
verified: verified ?? this.verified, verified: verified ?? this.verified,
blocked: blocked ?? this.blocked, blocked: blocked ?? this.blocked,
); );
@ -1314,9 +1251,6 @@ class UserCrossSigningKeysCompanion
if (content.present) { if (content.present) {
map['content'] = Variable<String>(content.value); map['content'] = Variable<String>(content.value);
} }
if (validSignatures.present) {
map['valid_signatures'] = Variable<String>(validSignatures.value);
}
if (verified.present) { if (verified.present) {
map['verified'] = Variable<bool>(verified.value); map['verified'] = Variable<bool>(verified.value);
} }
@ -1364,16 +1298,6 @@ class UserCrossSigningKeys extends Table
$customConstraints: 'NOT NULL'); $customConstraints: 'NOT NULL');
} }
final VerificationMeta _validSignaturesMeta =
const VerificationMeta('validSignatures');
GeneratedTextColumn _validSignatures;
GeneratedTextColumn get validSignatures =>
_validSignatures ??= _constructValidSignatures();
GeneratedTextColumn _constructValidSignatures() {
return GeneratedTextColumn('valid_signatures', $tableName, true,
$customConstraints: '');
}
final VerificationMeta _verifiedMeta = const VerificationMeta('verified'); final VerificationMeta _verifiedMeta = const VerificationMeta('verified');
GeneratedBoolColumn _verified; GeneratedBoolColumn _verified;
GeneratedBoolColumn get verified => _verified ??= _constructVerified(); GeneratedBoolColumn get verified => _verified ??= _constructVerified();
@ -1393,15 +1317,8 @@ class UserCrossSigningKeys extends Table
} }
@override @override
List<GeneratedColumn> get $columns => [ List<GeneratedColumn> get $columns =>
clientId, [clientId, userId, publicKey, content, verified, blocked];
userId,
publicKey,
content,
validSignatures,
verified,
blocked
];
@override @override
UserCrossSigningKeys get asDslTable => this; UserCrossSigningKeys get asDslTable => this;
@override @override
@ -1438,12 +1355,6 @@ class UserCrossSigningKeys extends Table
} else if (isInserting) { } else if (isInserting) {
context.missing(_contentMeta); context.missing(_contentMeta);
} }
if (data.containsKey('valid_signatures')) {
context.handle(
_validSignaturesMeta,
validSignatures.isAcceptableOrUnknown(
data['valid_signatures'], _validSignaturesMeta));
}
if (data.containsKey('verified')) { if (data.containsKey('verified')) {
context.handle(_verifiedMeta, context.handle(_verifiedMeta,
verified.isAcceptableOrUnknown(data['verified'], _verifiedMeta)); verified.isAcceptableOrUnknown(data['verified'], _verifiedMeta));
@ -5266,7 +5177,6 @@ abstract class _$Database extends GeneratedDatabase {
userId: row.readString('user_id'), userId: row.readString('user_id'),
deviceId: row.readString('device_id'), deviceId: row.readString('device_id'),
content: row.readString('content'), content: row.readString('content'),
validSignatures: row.readString('valid_signatures'),
verified: row.readBool('verified'), verified: row.readBool('verified'),
blocked: row.readBool('blocked'), blocked: row.readBool('blocked'),
); );
@ -5285,7 +5195,6 @@ abstract class _$Database extends GeneratedDatabase {
userId: row.readString('user_id'), userId: row.readString('user_id'),
publicKey: row.readString('public_key'), publicKey: row.readString('public_key'),
content: row.readString('content'), content: row.readString('content'),
validSignatures: row.readString('valid_signatures'),
verified: row.readBool('verified'), verified: row.readBool('verified'),
blocked: row.readBool('blocked'), blocked: row.readBool('blocked'),
); );
@ -5499,22 +5408,15 @@ abstract class _$Database extends GeneratedDatabase {
); );
} }
Future<int> storeUserDeviceKey( Future<int> storeUserDeviceKey(int client_id, String user_id,
int client_id, String device_id, String content, bool verified, bool blocked) {
String user_id,
String device_id,
String content,
String valid_signatures,
bool verified,
bool blocked) {
return customInsert( return customInsert(
'INSERT OR REPLACE INTO user_device_keys_key (client_id, user_id, device_id, content, valid_signatures, verified, blocked) VALUES (:client_id, :user_id, :device_id, :content, :valid_signatures, :verified, :blocked)', 'INSERT OR REPLACE INTO user_device_keys_key (client_id, user_id, device_id, content, verified, blocked) VALUES (:client_id, :user_id, :device_id, :content, :verified, :blocked)',
variables: [ variables: [
Variable.withInt(client_id), Variable.withInt(client_id),
Variable.withString(user_id), Variable.withString(user_id),
Variable.withString(device_id), Variable.withString(device_id),
Variable.withString(content), Variable.withString(content),
Variable.withString(valid_signatures),
Variable.withBool(verified), Variable.withBool(verified),
Variable.withBool(blocked) Variable.withBool(blocked)
], ],
@ -5566,22 +5468,15 @@ abstract class _$Database extends GeneratedDatabase {
); );
} }
Future<int> storeUserCrossSigningKey( Future<int> storeUserCrossSigningKey(int client_id, String user_id,
int client_id, String public_key, String content, bool verified, bool blocked) {
String user_id,
String public_key,
String content,
String valid_signatures,
bool verified,
bool blocked) {
return customInsert( return customInsert(
'INSERT OR REPLACE INTO user_cross_signing_keys (client_id, user_id, public_key, content, valid_signatures, verified, blocked) VALUES (:client_id, :user_id, :public_key, :content, :valid_signatures, :verified, :blocked)', 'INSERT OR REPLACE INTO user_cross_signing_keys (client_id, user_id, public_key, content, verified, blocked) VALUES (:client_id, :user_id, :public_key, :content, :verified, :blocked)',
variables: [ variables: [
Variable.withInt(client_id), Variable.withInt(client_id),
Variable.withString(user_id), Variable.withString(user_id),
Variable.withString(public_key), Variable.withString(public_key),
Variable.withString(content), Variable.withString(content),
Variable.withString(valid_signatures),
Variable.withBool(verified), Variable.withBool(verified),
Variable.withBool(blocked) Variable.withBool(blocked)
], ],

View file

@ -26,7 +26,6 @@ CREATE TABLE user_device_keys_key (
user_id TEXT NOT NULL, user_id TEXT NOT NULL,
device_id TEXT NOT NULL, device_id TEXT NOT NULL,
content TEXT NOT NULL, content TEXT NOT NULL,
valid_signatures TEXT,
verified BOOLEAN DEFAULT false, verified BOOLEAN DEFAULT false,
blocked BOOLEAN DEFAULT false, blocked BOOLEAN DEFAULT false,
UNIQUE(client_id, user_id, device_id) UNIQUE(client_id, user_id, device_id)
@ -38,7 +37,6 @@ CREATE TABLE user_cross_signing_keys (
user_id TEXT NOT NULL, user_id TEXT NOT NULL,
public_key TEXT NOT NULL, public_key TEXT NOT NULL,
content TEXT NOT NULL, content TEXT NOT NULL,
valid_signatures TEXT,
verified BOOLEAN DEFAULT false, verified BOOLEAN DEFAULT false,
blocked BOOLEAN DEFAULT false, blocked BOOLEAN DEFAULT false,
UNIQUE(client_id, user_id, public_key) UNIQUE(client_id, user_id, public_key)
@ -182,11 +180,11 @@ updateInboundGroupSessionIndexes: UPDATE inbound_group_sessions SET indexes = :i
storeUserDeviceKeysInfo: INSERT OR REPLACE INTO user_device_keys (client_id, user_id, outdated) VALUES (:client_id, :user_id, :outdated); storeUserDeviceKeysInfo: INSERT OR REPLACE INTO user_device_keys (client_id, user_id, outdated) VALUES (:client_id, :user_id, :outdated);
setVerifiedUserDeviceKey: UPDATE user_device_keys_key SET verified = :verified WHERE client_id = :client_id AND user_id = :user_id AND device_id = :device_id; setVerifiedUserDeviceKey: UPDATE user_device_keys_key SET verified = :verified WHERE client_id = :client_id AND user_id = :user_id AND device_id = :device_id;
setBlockedUserDeviceKey: UPDATE user_device_keys_key SET blocked = :blocked WHERE client_id = :client_id AND user_id = :user_id AND device_id = :device_id; setBlockedUserDeviceKey: UPDATE user_device_keys_key SET blocked = :blocked WHERE client_id = :client_id AND user_id = :user_id AND device_id = :device_id;
storeUserDeviceKey: INSERT OR REPLACE INTO user_device_keys_key (client_id, user_id, device_id, content, valid_signatures, verified, blocked) VALUES (:client_id, :user_id, :device_id, :content, :valid_signatures, :verified, :blocked); storeUserDeviceKey: INSERT OR REPLACE INTO user_device_keys_key (client_id, user_id, device_id, content, verified, blocked) VALUES (:client_id, :user_id, :device_id, :content, :verified, :blocked);
removeUserDeviceKey: DELETE FROM user_device_keys_key WHERE client_id = :client_id AND user_id = :user_id AND device_id = :device_id; removeUserDeviceKey: DELETE FROM user_device_keys_key WHERE client_id = :client_id AND user_id = :user_id AND device_id = :device_id;
setVerifiedUserCrossSigningKey: UPDATE user_cross_signing_keys SET verified = :verified WHERE client_id = :client_id AND user_id = :user_id AND public_key = :public_key; setVerifiedUserCrossSigningKey: UPDATE user_cross_signing_keys SET verified = :verified WHERE client_id = :client_id AND user_id = :user_id AND public_key = :public_key;
setBlockedUserCrossSigningKey: UPDATE user_cross_signing_keys SET blocked = :blocked WHERE client_id = :client_id AND user_id = :user_id AND public_key = :public_key; setBlockedUserCrossSigningKey: UPDATE user_cross_signing_keys SET blocked = :blocked WHERE client_id = :client_id AND user_id = :user_id AND public_key = :public_key;
storeUserCrossSigningKey: INSERT OR REPLACE INTO user_cross_signing_keys (client_id, user_id, public_key, content, valid_signatures, verified, blocked) VALUES (:client_id, :user_id, :public_key, :content, :valid_signatures, :verified, :blocked); storeUserCrossSigningKey: INSERT OR REPLACE INTO user_cross_signing_keys (client_id, user_id, public_key, content, verified, blocked) VALUES (:client_id, :user_id, :public_key, :content, :verified, :blocked);
removeUserCrossSigningKey: DELETE FROM user_cross_signing_keys WHERE client_id = :client_id AND user_id = :user_id AND public_key = :public_key; removeUserCrossSigningKey: DELETE FROM user_cross_signing_keys WHERE client_id = :client_id AND user_id = :user_id AND public_key = :public_key;
insertClient: INSERT INTO clients (name, homeserver_url, token, user_id, device_id, device_name, prev_batch, olm_account) VALUES (:name, :homeserver_url, :token, :user_id, :device_id, :device_name, :prev_batch, :olm_account); insertClient: INSERT INTO clients (name, homeserver_url, token, user_id, device_id, device_name, prev_batch, olm_account) VALUES (:name, :homeserver_url, :token, :user_id, :device_id, :device_name, :prev_batch, :olm_account);
ensureRoomExists: INSERT OR IGNORE INTO rooms (client_id, room_id, membership) VALUES (:client_id, :room_id, :membership); ensureRoomExists: INSERT OR IGNORE INTO rooms (client_id, room_id, membership) VALUES (:client_id, :room_id, :membership);

View file

@ -101,8 +101,10 @@ abstract class _SignedKey {
String _getSigningContent() { String _getSigningContent() {
final data = Map<String, dynamic>.from(content); final data = Map<String, dynamic>.from(content);
// some old data might have the custom verified and blocked keys
data.remove('verified'); data.remove('verified');
data.remove('blocked'); data.remove('blocked');
// remove the keys not needed for signing
data.remove('unsigned'); data.remove('unsigned');
data.remove('signatures'); data.remove('signatures');
return String.fromCharCodes(canonicalJson.encode(data)); return String.fromCharCodes(canonicalJson.encode(data));
@ -114,6 +116,9 @@ abstract class _SignedKey {
try { try {
olmutil.ed25519_verify(pubKey, _getSigningContent(), signature); olmutil.ed25519_verify(pubKey, _getSigningContent(), signature);
valid = true; valid = true;
} catch (_) {
// bad signature
valid = false;
} finally { } finally {
olmutil.free(); olmutil.free();
} }
@ -157,12 +162,18 @@ abstract class _SignedKey {
haveValidSignature = true; haveValidSignature = true;
gotSignatureFromCache = true; gotSignatureFromCache = true;
} else if (validSignatures[otherUserId][fullKeyId] == false) { } else if (validSignatures[otherUserId][fullKeyId] == false) {
haveValidSignature = false;
gotSignatureFromCache = true; gotSignatureFromCache = true;
} }
} }
if (!gotSignatureFromCache) { if (!gotSignatureFromCache) {
// validate the signature manually // validate the signature manually
haveValidSignature = _verifySignature(key.ed25519Key, signature); haveValidSignature = _verifySignature(key.ed25519Key, signature);
validSignatures ??= <String, dynamic>{};
if (!validSignatures.containsKey(otherUserId)) {
validSignatures[otherUserId] = <String, dynamic>{};
}
validSignatures[otherUserId][fullKeyId] = haveValidSignature;
} }
if (!haveValidSignature) { if (!haveValidSignature) {
// no valid signature, this key is useless // no valid signature, this key is useless
@ -181,6 +192,17 @@ abstract class _SignedKey {
} }
return false; return false;
} }
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>.from(content);
// some old data may have the verified and blocked keys which are unneeded now
data.remove('verified');
data.remove('blocked');
return data;
}
@override
String toString() => json.encode(toJson());
} }
class CrossSigningKey extends _SignedKey { class CrossSigningKey extends _SignedKey {
@ -208,13 +230,6 @@ class CrossSigningKey extends _SignedKey {
usage = json['usage'].cast<String>(); usage = json['usage'].cast<String>();
keys = json['keys'] != null ? Map<String, String>.from(json['keys']) : null; keys = json['keys'] != null ? Map<String, String>.from(json['keys']) : null;
signatures = json['signatures'] != null ? Map<String, dynamic>.from(json['signatures']) : null; signatures = json['signatures'] != null ? Map<String, dynamic>.from(json['signatures']) : null;
validSignatures = null;
if (dbEntry.validSignatures != null) {
final validSignaturesContent = Event.getMapFromPayload(dbEntry.validSignatures);
if (validSignaturesContent is Map) {
validSignatures = validSignaturesContent.cast<String, dynamic>();
}
}
_verified = dbEntry.verified; _verified = dbEntry.verified;
blocked = dbEntry.blocked; blocked = dbEntry.blocked;
} }
@ -228,28 +243,12 @@ class CrossSigningKey extends _SignedKey {
signatures = json['signatures'] != null signatures = json['signatures'] != null
? Map<String, dynamic>.from(json['signatures']) ? Map<String, dynamic>.from(json['signatures'])
: null; : null;
validSignatures = null;
_verified = json['verified'] ?? false; _verified = json['verified'] ?? false;
blocked = json['blocked'] ?? false; blocked = json['blocked'] ?? false;
if (keys != null) { if (keys != null) {
identifier = keys.values.first; identifier = keys.values.first;
} }
} }
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>.from(content);
data['user_id'] = userId;
data['usage'] = usage;
if (keys != null) {
data['keys'] = keys;
}
if (signatures != null) {
data['signatures'] = signatures;
}
data['verified'] = _verified;
data['blocked'] = blocked;
return data;
}
} }
class DeviceKeys extends _SignedKey { class DeviceKeys extends _SignedKey {
@ -291,13 +290,6 @@ class DeviceKeys extends _SignedKey {
unsigned = json['unsigned'] != null unsigned = json['unsigned'] != null
? Map<String, dynamic>.from(json['unsigned']) ? Map<String, dynamic>.from(json['unsigned'])
: null; : null;
validSignatures = null;
if (dbEntry.validSignatures != null) {
final validSignaturesContent = Event.getMapFromPayload(dbEntry.validSignatures);
if (validSignaturesContent is Map) {
validSignatures = validSignaturesContent.cast<String, dynamic>();
}
}
_verified = dbEntry.verified; _verified = dbEntry.verified;
blocked = dbEntry.blocked; blocked = dbEntry.blocked;
} }
@ -319,25 +311,6 @@ class DeviceKeys extends _SignedKey {
blocked = json['blocked'] ?? false; blocked = json['blocked'] ?? false;
} }
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>.from(content);
data['user_id'] = userId;
data['device_id'] = deviceId;
data['algorithms'] = algorithms;
if (keys != null) {
data['keys'] = keys;
}
if (signatures != null) {
data['signatures'] = signatures;
}
if (unsigned != null) {
data['unsigned'] = unsigned;
}
data['verified'] = _verified;
data['blocked'] = blocked;
return data;
}
KeyVerification startVerification() { KeyVerification startVerification() {
final request = KeyVerification(client: client, userId: userId, deviceId: deviceId); final request = KeyVerification(client: client, userId: userId, deviceId: deviceId);
request.start(); request.start();