summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorNicolas Werner <nicolas.werner@hotmail.de>2020-10-18 00:52:35 +0200
committerNicolas Werner <nicolas.werner@hotmail.de>2020-10-18 00:52:35 +0200
commitc25fd947a8412c19ec5a491c25cdc555cdcab756 (patch)
treea2b0fc899008411170b7daa3e95cdda6de3fa906 /src
parentFix crash on exit (diff)
downloadnheko-c25fd947a8412c19ec5a491c25cdc555cdcab756.tar.xz
Automatic key sharing with trusted users
Diffstat (limited to 'src')
-rw-r--r--src/Olm.cpp16
-rw-r--r--src/UserSettingsPage.cpp62
-rw-r--r--src/UserSettingsPage.h7
3 files changed, 62 insertions, 23 deletions
diff --git a/src/Olm.cpp b/src/Olm.cpp
index 1d86b4d7..059733c6 100644
--- a/src/Olm.cpp
+++ b/src/Olm.cpp
@@ -9,6 +9,7 @@
 #include "DeviceVerificationFlow.h"
 #include "Logging.h"
 #include "MatrixClient.h"
+#include "UserSettingsPage.h"
 #include "Utils.h"
 
 static const std::string STORAGE_SECRET_KEY("secret");
@@ -519,7 +520,20 @@ handle_key_request_message(const mtx::events::DeviceEvent<mtx::events::msg::KeyR
                 return;
         }
 
-        if (!utils::respondsToKeyRequests(req.content.room_id)) {
+        // check if device is verified
+        auto verificationStatus = cache::verificationStatus(req.sender);
+        bool verifiedDevice     = false;
+        if (verificationStatus &&
+            ChatPage::instance()->userSettings()->shareKeysWithTrustedUsers()) {
+                for (const auto &dev : verificationStatus->verified_devices) {
+                        if (dev == req.content.requesting_device_id) {
+                                verifiedDevice = true;
+                                break;
+                        }
+                }
+        }
+
+        if (!utils::respondsToKeyRequests(req.content.room_id) && !verifiedDevice) {
                 nhlog::crypto()->debug("ignoring all key requests for room {}",
                                        req.content.room_id);
                 return;
diff --git a/src/UserSettingsPage.cpp b/src/UserSettingsPage.cpp
index 7d81e663..8f049a29 100644
--- a/src/UserSettingsPage.cpp
+++ b/src/UserSettingsPage.cpp
@@ -72,8 +72,10 @@ UserSettings::load()
         font_                = settings.value("user/font_family", "default").toString();
         avatarCircles_       = settings.value("user/avatar_circles", true).toBool();
         decryptSidebar_      = settings.value("user/decrypt_sidebar", true).toBool();
-        emojiFont_           = settings.value("user/emoji_font_family", "default").toString();
-        baseFontSize_        = settings.value("user/font_size", QFont().pointSizeF()).toDouble();
+        shareKeysWithTrustedUsers_ =
+          settings.value("user/share_keys_with_trusted_users", true).toBool();
+        emojiFont_    = settings.value("user/emoji_font_family", "default").toString();
+        baseFontSize_ = settings.value("user/font_size", QFont().pointSizeF()).toDouble();
         presence_ =
           settings.value("user/presence", QVariant::fromValue(Presence::AutomaticPresence))
             .value<Presence>();
@@ -292,6 +294,16 @@ UserSettings::setUseStunServer(bool useStunServer)
 }
 
 void
+UserSettings::setShareKeysWithTrustedUsers(bool shareKeys)
+{
+        if (shareKeys == shareKeysWithTrustedUsers_)
+                return;
+        shareKeysWithTrustedUsers_ = shareKeys;
+        emit shareKeysWithTrustedUsersChanged(shareKeys);
+        save();
+}
+
+void
 UserSettings::setDefaultAudioSource(const QString &defaultAudioSource)
 {
         if (defaultAudioSource == defaultAudioSource_)
@@ -374,6 +386,7 @@ UserSettings::save()
 
         settings.setValue("avatar_circles", avatarCircles_);
         settings.setValue("decrypt_sidebar", decryptSidebar_);
+        settings.setValue("share_keys_with_trusted_users", shareKeysWithTrustedUsers_);
         settings.setValue("font_size", baseFontSize_);
         settings.setValue("typing_notifications", typingNotifications_);
         settings.setValue("minor_events", sortByImportance_);
@@ -439,26 +452,27 @@ UserSettingsPage::UserSettingsPage(QSharedPointer<UserSettings> settings, QWidge
         general_->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed);
         general_->setFont(font);
 
-        trayToggle_               = new Toggle{this};
-        startInTrayToggle_        = new Toggle{this};
-        avatarCircles_            = new Toggle{this};
-        decryptSidebar_           = new Toggle(this);
-        groupViewToggle_          = new Toggle{this};
-        timelineButtonsToggle_    = new Toggle{this};
-        typingNotifications_      = new Toggle{this};
-        messageHoverHighlight_    = new Toggle{this};
-        enlargeEmojiOnlyMessages_ = new Toggle{this};
-        sortByImportance_         = new Toggle{this};
-        readReceipts_             = new Toggle{this};
-        markdown_                 = new Toggle{this};
-        desktopNotifications_     = new Toggle{this};
-        alertOnNotification_      = new Toggle{this};
-        useStunServer_            = new Toggle{this};
-        scaleFactorCombo_         = new QComboBox{this};
-        fontSizeCombo_            = new QComboBox{this};
-        fontSelectionCombo_       = new QComboBox{this};
-        emojiFontSelectionCombo_  = new QComboBox{this};
-        timelineMaxWidthSpin_     = new QSpinBox{this};
+        trayToggle_                = new Toggle{this};
+        startInTrayToggle_         = new Toggle{this};
+        avatarCircles_             = new Toggle{this};
+        decryptSidebar_            = new Toggle(this);
+        shareKeysWithTrustedUsers_ = new Toggle(this);
+        groupViewToggle_           = new Toggle{this};
+        timelineButtonsToggle_     = new Toggle{this};
+        typingNotifications_       = new Toggle{this};
+        messageHoverHighlight_     = new Toggle{this};
+        enlargeEmojiOnlyMessages_  = new Toggle{this};
+        sortByImportance_          = new Toggle{this};
+        readReceipts_              = new Toggle{this};
+        markdown_                  = new Toggle{this};
+        desktopNotifications_      = new Toggle{this};
+        alertOnNotification_       = new Toggle{this};
+        useStunServer_             = new Toggle{this};
+        scaleFactorCombo_          = new QComboBox{this};
+        fontSizeCombo_             = new QComboBox{this};
+        fontSelectionCombo_        = new QComboBox{this};
+        emojiFontSelectionCombo_   = new QComboBox{this};
+        timelineMaxWidthSpin_      = new QSpinBox{this};
 
         if (!settings_->tray())
                 startInTrayToggle_->setDisabled(true);
@@ -653,6 +667,10 @@ UserSettingsPage::UserSettingsPage(QSharedPointer<UserSettings> settings, QWidge
         formLayout_->addRow(new HorizontalLine{this});
         boxWrap(tr("Device ID"), deviceIdValue_);
         boxWrap(tr("Device Fingerprint"), deviceFingerprintValue_);
+        boxWrap(
+          tr("Share keys with trusted users"),
+          shareKeysWithTrustedUsers_,
+          tr("Automatically replies to key requests from other users, if they are verified."));
         formLayout_->addRow(new HorizontalLine{this});
         formLayout_->addRow(sessionKeysLabel, sessionKeysLayout);
 
diff --git a/src/UserSettingsPage.h b/src/UserSettingsPage.h
index e947bfae..e4a34893 100644
--- a/src/UserSettingsPage.h
+++ b/src/UserSettingsPage.h
@@ -75,6 +75,8 @@ class UserSettings : public QObject
           bool useStunServer READ useStunServer WRITE setUseStunServer NOTIFY useStunServerChanged)
         Q_PROPERTY(QString defaultAudioSource READ defaultAudioSource WRITE setDefaultAudioSource
                      NOTIFY defaultAudioSourceChanged)
+        Q_PROPERTY(bool shareKeysWithTrustedUsers READ shareKeysWithTrustedUsers WRITE
+                     setShareKeysWithTrustedUsers NOTIFY shareKeysWithTrustedUsersChanged)
 
 public:
         UserSettings();
@@ -113,6 +115,7 @@ public:
         void setPresence(Presence state);
         void setUseStunServer(bool state);
         void setDefaultAudioSource(const QString &deviceName);
+        void setShareKeysWithTrustedUsers(bool state);
 
         QString theme() const { return !theme_.isEmpty() ? theme_ : defaultTheme_; }
         bool messageHoverHighlight() const { return messageHoverHighlight_; }
@@ -140,6 +143,7 @@ public:
         Presence presence() const { return presence_; }
         bool useStunServer() const { return useStunServer_; }
         QString defaultAudioSource() const { return defaultAudioSource_; }
+        bool shareKeysWithTrustedUsers() const { return shareKeysWithTrustedUsers_; }
 
 signals:
         void groupViewStateChanged(bool state);
@@ -164,6 +168,7 @@ signals:
         void presenceChanged(Presence state);
         void useStunServerChanged(bool state);
         void defaultAudioSourceChanged(const QString &deviceName);
+        void shareKeysWithTrustedUsersChanged(bool state);
 
 private:
         // Default to system theme if QT_QPA_PLATFORMTHEME var is set.
@@ -186,6 +191,7 @@ private:
         bool hasAlertOnNotification_;
         bool avatarCircles_;
         bool decryptSidebar_;
+        bool shareKeysWithTrustedUsers_;
         int timelineMaxWidth_;
         double baseFontSize_;
         QString font_;
@@ -248,6 +254,7 @@ private:
         Toggle *avatarCircles_;
         Toggle *useStunServer_;
         Toggle *decryptSidebar_;
+        Toggle *shareKeysWithTrustedUsers_;
         QLabel *deviceFingerprintValue_;
         QLabel *deviceIdValue_;