From 604cdcec8abf8a8c564111d6f55feaf94486ba6c Mon Sep 17 00:00:00 2001
From: Konstantinos Sideris <sideris.konstantin@gmail.com>
Date: Mon, 18 Jun 2018 12:56:47 +0300
Subject: [PATCH] Save the olm account after we create new one-time keys

Otherwise after a restart the old account will be loaded and we
won't be able to decrypt messages from devices using the new one-time keys.

Also new one-time key upload requests will fail due to conflicts with
the existing keys with the same keyid.
---
 include/Olm.hpp | 3 +++
 src/ChatPage.cc | 5 +++--
 src/Olm.cpp     | 9 +++++++++
 3 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/include/Olm.hpp b/include/Olm.hpp
index 6f871628d..eb7f9061a 100644
--- a/include/Olm.hpp
+++ b/include/Olm.hpp
@@ -75,4 +75,7 @@ encrypt_group_message(const std::string &room_id,
                       const std::string &device_id,
                       const std::string &body);
 
+void
+mark_keys_as_published();
+
 } // namespace olm
diff --git a/src/ChatPage.cc b/src/ChatPage.cc
index e543cdf98..cc9473e62 100644
--- a/src/ChatPage.cc
+++ b/src/ChatPage.cc
@@ -1038,7 +1038,8 @@ ChatPage::tryInitialSync()
                           return;
                   }
 
-                  olm::client()->mark_keys_as_published();
+                  olm::mark_keys_as_published();
+
                   for (const auto &entry : res.one_time_key_counts)
                           nhlog::net()->info(
                             "uploaded {} {} one-time keys", entry.second, entry.first);
@@ -1273,7 +1274,7 @@ ChatPage::ensureOneTimeKeyCount(const std::map<std::string, uint16_t> &counts)
                                           return;
                                   }
 
-                                  olm::client()->mark_keys_as_published();
+                                  olm::mark_keys_as_published();
                           });
                 }
         }
diff --git a/src/Olm.cpp b/src/Olm.cpp
index 5976c1c02..c426968f4 100644
--- a/src/Olm.cpp
+++ b/src/Olm.cpp
@@ -5,6 +5,8 @@
 
 using namespace mtx::crypto;
 
+static const std::string STORAGE_SECRET_KEY("secret");
+
 namespace {
 auto client_ = std::make_unique<mtx::crypto::OlmClient>();
 }
@@ -229,4 +231,11 @@ create_inbound_megolm_session(const std::string &sender,
         nhlog::crypto()->info("established inbound megolm session ({}, {})", room_id, sender);
 }
 
+void
+mark_keys_as_published()
+{
+        olm::client()->mark_keys_as_published();
+        cache::client()->saveOlmAccount(olm::client()->save(STORAGE_SECRET_KEY));
+}
+
 } // namespace olm
-- 
GitLab