Add menu option to enable encryption in a private room
This commit is contained in:
parent
626c680911
commit
36cb62748b
6 changed files with 142 additions and 15 deletions
|
|
@ -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_;
|
||||
|
|
@ -339,6 +407,28 @@ RoomSettings::saveSettings()
|
|||
closing();
|
||||
}
|
||||
|
||||
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 *)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue