Add option to only send encrypted messages to verified devices

fixes #636
This commit is contained in:
Nicolas Werner 2021-08-01 00:59:46 +02:00
parent 760f675792
commit 25e7a985b8
No known key found for this signature in database
GPG key ID: C8D75E610773F2D9
5 changed files with 127 additions and 48 deletions

View file

@ -3542,7 +3542,7 @@ Cache::roomMembers(const std::string &room_id)
}
std::map<std::string, std::optional<UserKeyCache>>
Cache::getMembersWithKeys(const std::string &room_id)
Cache::getMembersWithKeys(const std::string &room_id, bool verified_only)
{
std::string_view keys;
@ -3559,10 +3559,51 @@ Cache::getMembersWithKeys(const std::string &room_id)
auto res = keysDb.get(txn, user_id, keys);
if (res) {
members[std::string(user_id)] =
json::parse(keys).get<UserKeyCache>();
auto k = json::parse(keys).get<UserKeyCache>();
if (verified_only) {
auto verif = verificationStatus(std::string(user_id));
if (verif.user_verified == crypto::Trust::Verified ||
!verif.verified_devices.empty()) {
auto keyCopy = k;
keyCopy.device_keys.clear();
std::copy_if(
k.device_keys.begin(),
k.device_keys.end(),
std::inserter(keyCopy.device_keys,
keyCopy.device_keys.end()),
[&verif](const auto &key) {
auto curve25519 = key.second.keys.find(
"curve25519:" + key.first);
if (curve25519 == key.second.keys.end())
return false;
if (auto t =
verif.verified_device_keys.find(
curve25519->second);
t ==
verif.verified_device_keys.end() ||
t->second != crypto::Trust::Verified)
return false;
return key.first ==
key.second.device_id &&
std::find(
verif.verified_devices.begin(),
verif.verified_devices.end(),
key.first) !=
verif.verified_devices.end();
});
if (!keyCopy.device_keys.empty())
members[std::string(user_id)] =
std::move(keyCopy);
}
} else {
members[std::string(user_id)] = std::move(k);
}
} else {
members[std::string(user_id)] = {};
if (!verified_only)
members[std::string(user_id)] = {};
}
}
cursor.close();