summary refs log tree commit diff
path: root/src/dialogs
diff options
context:
space:
mode:
authorKonstantinos Sideris <sideris.konstantin@gmail.com>2018-06-12 09:45:26 +0300
committerKonstantinos Sideris <sideris.konstantin@gmail.com>2018-06-12 09:45:26 +0300
commit36cb62748b1a1c98d64ea3e8cfce0ef1cb5ba0c4 (patch)
tree9e0af2509e7202f0473f8da347183b6681a3512d /src/dialogs
parentAdd support for displaying decrypted messages (diff)
downloadnheko-36cb62748b1a1c98d64ea3e8cfce0ef1cb5ba0c4.tar.xz
Add menu option to enable encryption in a private room
Diffstat (limited to 'src/dialogs')
-rw-r--r--src/dialogs/RoomSettings.cpp100
1 files changed, 95 insertions, 5 deletions
diff --git a/src/dialogs/RoomSettings.cpp b/src/dialogs/RoomSettings.cpp

index 2396fc19..a091c8bc 100644 --- a/src/dialogs/RoomSettings.cpp +++ b/src/dialogs/RoomSettings.cpp
@@ -1,16 +1,20 @@ #include "Avatar.h" +#include "ChatPage.h" #include "Config.h" #include "FlatButton.h" +#include "Logging.hpp" #include "MatrixClient.h" #include "Painter.h" #include "TextField.h" #include "Theme.h" #include "Utils.h" #include "dialogs/RoomSettings.hpp" +#include "ui/ToggleButton.h" #include <QApplication> #include <QComboBox> #include <QLabel> +#include <QMessageBox> #include <QPainter> #include <QPixmap> #include <QSettings> @@ -188,8 +192,8 @@ RoomSettings::RoomSettings(const QString &room_id, QWidget *parent) layout->setSpacing(15); layout->setMargin(20); - saveBtn_ = new FlatButton("SAVE", this); - saveBtn_->setFontSize(conf::btn::fontSize); + okBtn_ = new FlatButton(tr("OK"), this); + okBtn_->setFontSize(conf::btn::fontSize); cancelBtn_ = new FlatButton(tr("CANCEL"), this); cancelBtn_->setFontSize(conf::btn::fontSize); @@ -197,7 +201,7 @@ RoomSettings::RoomSettings(const QString &room_id, QWidget *parent) btnLayout->setSpacing(0); btnLayout->setMargin(0); btnLayout->addStretch(1); - btnLayout->addWidget(saveBtn_); + btnLayout->addWidget(okBtn_); btnLayout->addWidget(cancelBtn_); auto notifOptionLayout_ = new QHBoxLayout; @@ -236,6 +240,61 @@ RoomSettings::RoomSettings(const QString &room_id, QWidget *parent) accessOptionLayout->addWidget(accessLabel); accessOptionLayout->addWidget(accessCombo); + auto encryptionOptionLayout = new QHBoxLayout; + encryptionOptionLayout->setMargin(SettingsMargin); + auto encryptionLabel = new QLabel(tr("Encryption"), this); + encryptionLabel->setStyleSheet("font-size: 15px;"); + encryptionToggle_ = new Toggle(this); + connect(encryptionToggle_, &Toggle::toggled, this, [this](bool isOn) { + if (isOn) + return; + + QFont font; + font.setPixelSize(conf::fontSize); + + QMessageBox msgBox; + msgBox.setIcon(QMessageBox::Question); + msgBox.setFont(font); + msgBox.setWindowTitle(tr("End-to-End Encryption")); + msgBox.setText(tr( + "Encryption is currently experimental and things might break unexpectedly. <br>" + "Please take note that it can't be disabled afterwards.")); + msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); + msgBox.setDefaultButton(QMessageBox::Save); + int ret = msgBox.exec(); + + switch (ret) { + case QMessageBox::Ok: { + encryptionToggle_->setState(false); + encryptionToggle_->setEnabled(false); + enableEncryption(); + break; + } + default: { + encryptionToggle_->setState(true); + encryptionToggle_->setEnabled(true); + break; + } + } + }); + + encryptionOptionLayout->addWidget(encryptionLabel); + encryptionOptionLayout->addWidget(encryptionToggle_, 0, Qt::AlignBottom | Qt::AlignRight); + + // Disable encryption button. + if (usesEncryption_) { + encryptionToggle_->setState(false); + encryptionToggle_->setEnabled(false); + } else { + encryptionToggle_->setState(true); + } + + // Hide encryption option for public rooms. + if (!usesEncryption_ && (info_.join_rule == JoinRule::Public)) { + encryptionToggle_->hide(); + encryptionLabel->hide(); + } + QFont font; font.setPixelSize(18); font.setWeight(70); @@ -255,10 +314,18 @@ RoomSettings::RoomSettings(const QString &room_id, QWidget *parent) layout->addLayout(editLayout_); layout->addLayout(notifOptionLayout_); layout->addLayout(accessOptionLayout); + layout->addLayout(encryptionOptionLayout); layout->addLayout(btnLayout); connect(cancelBtn_, &QPushButton::clicked, this, &RoomSettings::closing); - connect(saveBtn_, &QPushButton::clicked, this, &RoomSettings::saveSettings); + connect(okBtn_, &QPushButton::clicked, this, &RoomSettings::saveSettings); + + connect(this, &RoomSettings::enableEncryptionError, this, [this](const QString &msg) { + encryptionToggle_->setState(true); + encryptionToggle_->setEnabled(true); + + emit ChatPage::instance()->showNotification(msg); + }); } void @@ -308,7 +375,8 @@ void RoomSettings::retrieveRoomInfo() { try { - info_ = cache::client()->singleRoomInfo(room_id_.toStdString()); + usesEncryption_ = cache::client()->isRoomEncrypted(room_id_.toStdString()); + info_ = cache::client()->singleRoomInfo(room_id_.toStdString()); setAvatar(QImage::fromData(cache::client()->image(info_.avatar_url))); } catch (const lmdb::error &e) { qWarning() << "failed to retrieve room info from cache" << room_id_; @@ -340,6 +408,28 @@ RoomSettings::saveSettings() } void +RoomSettings::enableEncryption() +{ + const auto room_id = room_id_.toStdString(); + http::v2::client()->enable_encryption( + room_id, [room_id, this](const mtx::responses::EventId &, mtx::http::RequestErr err) { + if (err) { + int status_code = static_cast<int>(err->status_code); + log::net()->warn("failed to enable encryption in room ({}): {} {}", + room_id, + err->matrix_error.error, + status_code); + emit enableEncryptionError( + tr("Failed to enable encryption: %1") + .arg(QString::fromStdString(err->matrix_error.error))); + return; + } + + log::net()->info("enabled encryption on room ({})", room_id); + }); +} + +void RoomSettings::paintEvent(QPaintEvent *) { QStyleOption opt;