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
|