fix(security): treat a new identity key as a message request, never as a known contact
A stranger could pick the display name of an existing contact ("Mom")
and appear as that contact. Messages from a key that is not in the
contact list now open a message request labelled "(unknown)": no
replies, read receipts, typing indicators, calls or name in
notifications until the user accepts it and names the contact
themselves. Names that look like an existing contact (case, diacritics,
Cyrillic/Greek homoglyphs, invisible characters) also show a warning in
the real contact's chat.
When the relay account of a known contact shows up with a different
key, the chat shows "safety number changed", verification is cleared
and the session that now belongs to the other key is dropped before
sending, so a reply never goes to the new key.
This commit is contained in:
@@ -331,6 +331,18 @@ class SepotCrypto {
|
||||
Future<bool> hasSession(ProtocolAddress remote) =>
|
||||
_stores.session.containsSession(remote);
|
||||
|
||||
/// Identity klíč, pod kterým naposledy vznikla relace s [remote]
|
||||
/// (zapisuje ho libsignal při X3DH i při příjmu PreKey zprávy).
|
||||
/// Null = zatím žádný.
|
||||
Future<Uint8List?> sessionIdentity(ProtocolAddress remote) async {
|
||||
final key = await _stores.identity.getIdentity(remote);
|
||||
return key == null ? null : Uint8List.fromList(key.serialize().toList());
|
||||
}
|
||||
|
||||
/// Zahodí relaci s [remote]; další zpráva založí novou z bundle.
|
||||
Future<void> dropSession(ProtocolAddress remote) =>
|
||||
_stores.session.deleteSession(remote);
|
||||
|
||||
/// X3DH/PQXDH: zpracuje bundle protistrany a založí session.
|
||||
Future<void> processRemoteBundle(
|
||||
ProtocolAddress remote,
|
||||
|
||||
Reference in New Issue
Block a user