summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorKonstantinos Sideris <sideris.konstantin@gmail.com>2018-07-22 16:36:25 +0300
committerKonstantinos Sideris <sideris.konstantin@gmail.com>2018-07-22 16:36:25 +0300
commit24bad93f6b7c3e03143541d3503fc5e59798357a (patch)
treeedf957e015e09f05fda60330502e4eabdc068769 /src
parentRefactor the room settings menu to look like the user profile (diff)
downloadnheko-24bad93f6b7c3e03143541d3503fc5e59798357a.tar.xz
Add option to ignore key requests altogether
Diffstat (limited to 'src')
-rw-r--r--src/MainWindow.cpp1
-rw-r--r--src/Olm.cpp6
-rw-r--r--src/Utils.cpp26
-rw-r--r--src/Utils.h9
-rw-r--r--src/dialogs/RoomSettings.cpp29
-rw-r--r--src/dialogs/RoomSettings.h1
6 files changed, 70 insertions, 2 deletions
diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp
index 43de4fe8..7cb12caa 100644
--- a/src/MainWindow.cpp
+++ b/src/MainWindow.cpp
@@ -341,6 +341,7 @@ MainWindow::openRoomSettings(const QString &room_id)
         roomSettingsModal_ =
           QSharedPointer<OverlayModal>(new OverlayModal(this, roomSettingsDialog_.data()));
 
+        roomSettingsModal_->setContentAlignment(Qt::AlignTop | Qt::AlignHCenter);
         roomSettingsModal_->show();
 }
 
diff --git a/src/Olm.cpp b/src/Olm.cpp
index 963bea41..f65430f1 100644
--- a/src/Olm.cpp
+++ b/src/Olm.cpp
@@ -3,6 +3,7 @@
 #include "Cache.h"
 #include "Logging.h"
 #include "MatrixClient.h"
+#include "Utils.h"
 
 using namespace mtx::crypto;
 
@@ -377,6 +378,11 @@ handle_key_request_message(const mtx::events::msg::KeyRequest &req)
                 return;
         }
 
+        if (!utils::respondsToKeyRequests(req.room_id)) {
+                nhlog::crypto()->info("ignoring all key requests for room {}", req.room_id);
+                return;
+        }
+
         //
         // Prepare the m.room_key event.
         //
diff --git a/src/Utils.cpp b/src/Utils.cpp
index 97e13c9b..e6b0bcce 100644
--- a/src/Utils.cpp
+++ b/src/Utils.cpp
@@ -15,6 +15,32 @@ utils::localUser()
         return settings.value("auth/user_id").toString();
 }
 
+bool
+utils::respondsToKeyRequests(const std::string &roomId)
+{
+        return respondsToKeyRequests(QString::fromStdString(roomId));
+}
+
+bool
+utils::respondsToKeyRequests(const QString &roomId)
+{
+        if (roomId.isEmpty())
+                return false;
+
+        QSettings settings;
+        return settings.value("rooms/respond_to_key_requests/" + roomId, false).toBool();
+}
+
+void
+utils::setKeyRequestsPreference(QString roomId, bool value)
+{
+        if (roomId.isEmpty())
+                return;
+
+        QSettings settings;
+        settings.setValue("rooms/respond_to_key_requests/" + roomId, value);
+}
+
 QString
 utils::descriptiveTime(const QDateTime &then)
 {
diff --git a/src/Utils.h b/src/Utils.h
index 10b5ee2b..b8d675f3 100644
--- a/src/Utils.h
+++ b/src/Utils.h
@@ -18,6 +18,15 @@ using TimelineEvent = mtx::events::collections::TimelineEvents;
 QString
 localUser();
 
+//! Whether or not we should respond to key requests for the given room.
+bool
+respondsToKeyRequests(const QString &roomId);
+bool
+respondsToKeyRequests(const std::string &roomId);
+
+void
+setKeyRequestsPreference(QString roomId, bool value);
+
 //! Human friendly timestamp representation.
 QString
 descriptiveTime(const QDateTime &then);
diff --git a/src/dialogs/RoomSettings.cpp b/src/dialogs/RoomSettings.cpp
index 2109c86a..8b450d7e 100644
--- a/src/dialogs/RoomSettings.cpp
+++ b/src/dialogs/RoomSettings.cpp
@@ -260,18 +260,43 @@ RoomSettings::RoomSettings(const QString &room_id, QWidget *parent)
         encryptionOptionLayout->addWidget(encryptionLabel, Qt::AlignBottom | Qt::AlignLeft);
         encryptionOptionLayout->addWidget(encryptionToggle_, 0, Qt::AlignBottom | Qt::AlignRight);
 
+        auto keyRequestsLabel = new QLabel(tr("Respond to key requests"), this);
+        keyRequestsLabel->setToolTipDuration(6000);
+        keyRequestsLabel->setToolTip(
+          tr("Whether or not the client should respond automatically with the session keys\n"
+             " upon request. Use with caution, this is a temporary measure to test the\n"
+             " E2E implementation until device verification is completed."));
+        keyRequestsToggle_ = new Toggle(this);
+        connect(keyRequestsToggle_, &Toggle::toggled, this, [this](bool isOn) {
+                utils::setKeyRequestsPreference(room_id_, !isOn);
+        });
+
+        auto keyRequestsLayout = new QHBoxLayout;
+        keyRequestsLayout->setMargin(0);
+        keyRequestsLayout->setSpacing(0);
+        keyRequestsLayout->addWidget(keyRequestsLabel, Qt::AlignBottom | Qt::AlignLeft);
+        keyRequestsLayout->addWidget(keyRequestsToggle_, 0, Qt::AlignBottom | Qt::AlignRight);
+
         // Disable encryption button.
         if (usesEncryption_) {
                 encryptionToggle_->setState(false);
                 encryptionToggle_->setEnabled(false);
+
+                keyRequestsToggle_->setState(!utils::respondsToKeyRequests(room_id_));
         } else {
                 encryptionToggle_->setState(true);
+
+                keyRequestsLabel->hide();
+                keyRequestsToggle_->hide();
         }
 
         // Hide encryption option for public rooms.
         if (!usesEncryption_ && (info_.join_rule == JoinRule::Public)) {
                 encryptionToggle_->hide();
                 encryptionLabel->hide();
+
+                keyRequestsLabel->hide();
+                keyRequestsToggle_->hide();
         }
 
         avatar_ = new Avatar(this);
@@ -284,8 +309,7 @@ RoomSettings::RoomSettings(const QString &room_id, QWidget *parent)
         auto roomNameLabel = new QLabel(QString::fromStdString(info_.name), this);
         roomNameLabel->setFont(doubleFont);
 
-        auto membersLabel =
-          new QLabel(QString::fromStdString("%1 members").arg(info_.member_count), this);
+        auto membersLabel = new QLabel(tr("%n member(s)", "", info_.member_count), this);
 
         auto textLayout = new QVBoxLayout;
         textLayout->addWidget(roomNameLabel);
@@ -304,6 +328,7 @@ RoomSettings::RoomSettings(const QString &room_id, QWidget *parent)
         layout->addLayout(notifOptionLayout_);
         layout->addLayout(accessOptionLayout);
         layout->addLayout(encryptionOptionLayout);
+        layout->addLayout(keyRequestsLayout);
         layout->addStretch(1);
 
         connect(this, &RoomSettings::enableEncryptionError, this, [this](const QString &msg) {
diff --git a/src/dialogs/RoomSettings.h b/src/dialogs/RoomSettings.h
index 93e99c0a..321ea551 100644
--- a/src/dialogs/RoomSettings.h
+++ b/src/dialogs/RoomSettings.h
@@ -91,6 +91,7 @@ private:
 
         QComboBox *accessCombo;
         Toggle *encryptionToggle_;
+        Toggle *keyRequestsToggle_;
 };
 
 } // dialogs