Add option to only send encrypted messages to verified devices
fixes #636
This commit is contained in:
parent
760f675792
commit
25e7a985b8
5 changed files with 127 additions and 48 deletions
|
|
@ -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();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue