diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 43de4fe..7cb12ca 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -341,6 +341,7 @@ MainWindow::openRoomSettings(const QString &room_id) roomSettingsModal_ = QSharedPointer(new OverlayModal(this, roomSettingsDialog_.data())); + roomSettingsModal_->setContentAlignment(Qt::AlignTop | Qt::AlignHCenter); roomSettingsModal_->show(); } diff --git a/src/Olm.cpp b/src/Olm.cpp index 963bea4..f65430f 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 97e13c9..e6b0bcc 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 10b5ee2..b8d675f 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 2109c86..8b450d7 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 93e99c0..321ea55 100644 --- a/src/dialogs/RoomSettings.h +++ b/src/dialogs/RoomSettings.h @@ -91,6 +91,7 @@ private: QComboBox *accessCombo; Toggle *encryptionToggle_; + Toggle *keyRequestsToggle_; }; } // dialogs