diff options
Diffstat (limited to 'src/Cache.cpp')
-rw-r--r-- | src/Cache.cpp | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/src/Cache.cpp b/src/Cache.cpp index 58dc689b..35bfe9dd 100644 --- a/src/Cache.cpp +++ b/src/Cache.cpp @@ -924,9 +924,29 @@ Cache::saveInboundMegolmSession(const MegolmSessionIndex &index, std::string_view value; if (inboundMegolmSessionDb_.get(txn, key, value)) { auto oldSession = unpickle<InboundSessionObject>(std::string(value), pickle_secret_); - if (olm_inbound_group_session_first_known_index(session.get()) > - olm_inbound_group_session_first_known_index(oldSession.get())) { - nhlog::crypto()->warn("Not storing inbound session with newer first known index"); + + auto newIndex = olm_inbound_group_session_first_known_index(session.get()); + auto oldIndex = olm_inbound_group_session_first_known_index(oldSession.get()); + + // merge trusted > untrusted + // first known index minimum + if (megolmSessionDataDb_.get(txn, key, value)) { + auto oldData = nlohmann::json::parse(value).get<GroupSessionData>(); + if (oldData.trusted && newIndex >= oldIndex) { + nhlog::crypto()->warn( + "Not storing inbound session of lesser trust or bigger index."); + return; + } + + oldData.trusted = data.trusted || oldData.trusted; + + if (newIndex < oldIndex) { + inboundMegolmSessionDb_.put(txn, key, pickled); + oldData.message_index = newIndex; + } + + megolmSessionDataDb_.put(txn, key, nlohmann::json(oldData).dump()); + txn.commit(); return; } } |