diff --git a/generic/omemoplugin/changelog.txt b/generic/omemoplugin/changelog.txt index a20922f7..93e40c24 100644 --- a/generic/omemoplugin/changelog.txt +++ b/generic/omemoplugin/changelog.txt @@ -1,3 +1,13 @@ +2020-05-25 +v2.3 tehnick + * Improve plugin options dialog: + - add "Device ID" column to Known Keys tab + - add ability to copy fingerprints from all tables + - add support of selecting of multiple rows in all tables + * Do not show trust confirmation dialog for devices with unknown keys + * Update list of interlocutor's devices after receiving of encrypted message + from unknown device. [Thanks to taurus] + 2020-05-21 v2.2 tehnick * Improve plugin description in "About plugin" dialog diff --git a/generic/omemoplugin/src/configwidget.cpp b/generic/omemoplugin/src/configwidget.cpp index f003723b..f2169b73 100644 --- a/generic/omemoplugin/src/configwidget.cpp +++ b/generic/omemoplugin/src/configwidget.cpp @@ -1,4 +1,4 @@ -/* +/* * OMEMO Plugin for Psi * Copyright (C) 2018 Vyacheslav Karpukhin * Copyright (C) 2020 Boris Pek @@ -19,10 +19,13 @@ */ #include "configwidget.h" +#include +#include #include #include #include #include +#include #include #include @@ -65,9 +68,9 @@ ConfigWidgetTabWithTable::ConfigWidgetTabWithTable(int account, OMEMO *omemo, QW { m_table = new QTableView(this); m_table->setShowGrid(true); - m_table->setEditTriggers(QAbstractItemView::NoEditTriggers); + m_table->setEditTriggers(nullptr); m_table->setSelectionBehavior(QAbstractItemView::SelectRows); - m_table->setSelectionMode(QAbstractItemView::SingleSelection); + m_table->setContextMenuPolicy(Qt::CustomContextMenu); m_table->setSortingEnabled(true); m_table->horizontalHeader()->setSortIndicator(0, Qt::AscendingOrder); @@ -93,6 +96,21 @@ void ConfigWidgetTabWithTable::updateData() m_table->resizeColumnsToContents(); } +void ConfigWidgetTabWithTable::copyFingerprintFromTable(QStandardItemModel *tableModel, + const QModelIndexList &indexesList, + const int column) +{ + QString text; + for (auto selectIndex : indexesList) { + if (!text.isEmpty()) { + text += "\n"; + } + text += tableModel->item(selectIndex.row(), column)->text(); + } + QClipboard *clipboard = QApplication::clipboard(); + clipboard->setText(text); +} + void ConfigWidget::currentAccountChanged(int index) { int account = dynamic_cast(sender())->itemData(index).toInt(); @@ -112,9 +130,9 @@ KnownFingerprints::KnownFingerprints(int account, OMEMO *omemo, QWidget *parent) auto revokeButton = new QPushButton(tr("Do not trust"), this); auto removeButton = new QPushButton(tr("Delete"), this); - connect(trustButton, &QPushButton::clicked, this, &KnownFingerprints::trustFingerprint); - connect(revokeButton, &QPushButton::clicked, this, &KnownFingerprints::revokeFingerprint); - connect(removeButton, &QPushButton::clicked, this, &KnownFingerprints::removeFingerprint); + connect(trustButton, &QPushButton::clicked, this, &KnownFingerprints::trustKnownKey); + connect(revokeButton, &QPushButton::clicked, this, &KnownFingerprints::revokeKnownKey); + connect(removeButton, &QPushButton::clicked, this, &KnownFingerprints::removeKnownKey); buttonsLayout->addWidget(trustButton); buttonsLayout->addWidget(revokeButton); @@ -124,12 +142,15 @@ KnownFingerprints::KnownFingerprints(int account, OMEMO *omemo, QWidget *parent) setLayout(mainLayout); updateData(); + + connect(m_table, &QTableView::customContextMenuRequested, + this, &KnownFingerprints::contextMenuKnownKeys); } void KnownFingerprints::doUpdateData() { - m_tableModel->setColumnCount(3); - m_tableModel->setHorizontalHeaderLabels({ tr("User"), tr("Trust"), tr("Fingerprint") }); + m_tableModel->setColumnCount(4); + m_tableModel->setHorizontalHeaderLabels({ tr("User"), tr("Device ID"), tr("Trust"), tr("Fingerprint") }); for (auto fingerprint : m_omemo->getKnownFingerprints(m_account)) { if (!m_jid.isEmpty()) { if (fingerprint.contact != m_jid) { @@ -141,6 +162,7 @@ void KnownFingerprints::doUpdateData() auto contact = new QStandardItem(fingerprint.contact); contact->setData(QVariant(fingerprint.deviceId)); row.append(contact); + row.append(new QStandardItem(QString::number(fingerprint.deviceId))); TRUST_STATE state = fingerprint.trust; row.append(new QStandardItem(state == TRUSTED ? tr("trusted") : state == UNTRUSTED ? tr("untrusted") : tr("not decided"))); @@ -153,47 +175,82 @@ void KnownFingerprints::doUpdateData() } } -void KnownFingerprints::removeFingerprint() +void KnownFingerprints::removeKnownKey() { if (!m_table->selectionModel()->hasSelection()) return; - QStandardItem *item = m_tableModel->item(m_table->selectionModel()->selectedRows(0).at(0).row(), 0); - m_omemo->removeDevice(m_account, item->text(), item->data().toUInt()); + bool keyRemoved = false; + for (auto selectIndex : m_table->selectionModel()->selectedRows(0)) { + QStandardItem *item = m_tableModel->item(selectIndex.row(), 0); + if (m_omemo->removeDevice(m_account, item->text(), item->data().toUInt())) { + keyRemoved = true; + } + } - updateData(); + if (keyRemoved) + updateData(); } -void KnownFingerprints::trustFingerprint() +void KnownFingerprints::trustKnownKey() { if (!m_table->selectionModel()->hasSelection()) return; - QStandardItem *item = m_tableModel->item(m_table->selectionModel()->selectedRows(0).at(0).row(), 0); - m_omemo->confirmDeviceTrust(m_account, item->text(), item->data().toUInt()); + const auto &&selection = m_table->selectionModel()->selectedRows(0); + for (auto selectIndex : selection) { + QStandardItem *item = m_tableModel->item(selectIndex.row(), 0); + m_omemo->confirmDeviceTrust(m_account, item->text(), item->data().toUInt()); + } - const int index = item->row(); const int rowCount = m_tableModel->rowCount(); updateData(); - if (rowCount == m_tableModel->rowCount()) - m_table->selectRow(index); + if (rowCount == m_tableModel->rowCount() && selection.size() == 1) { + m_table->selectRow(selection.first().row()); + } } -void KnownFingerprints::revokeFingerprint() +void KnownFingerprints::revokeKnownKey() { if (!m_table->selectionModel()->hasSelection()) return; - QStandardItem *item = m_tableModel->item(m_table->selectionModel()->selectedRows(0).at(0).row(), 0); - m_omemo->revokeDeviceTrust(m_account, item->text(), item->data().toUInt()); + const auto &&selection = m_table->selectionModel()->selectedRows(0); + for (auto selectIndex : selection) { + QStandardItem *item = m_tableModel->item(selectIndex.row(), 0); + m_omemo->revokeDeviceTrust(m_account, item->text(), item->data().toUInt()); + } - const int index = item->row(); const int rowCount = m_tableModel->rowCount(); updateData(); - if (rowCount == m_tableModel->rowCount()) - m_table->selectRow(index); + if (rowCount == m_tableModel->rowCount() && selection.size() == 1) { + m_table->selectRow(selection.first().row()); + } +} + +void KnownFingerprints::contextMenuKnownKeys(const QPoint &pos) +{ + QModelIndex index = m_table->indexAt(pos); + if (!index.isValid()) + return; + + QMenu *menu = new QMenu(this); + + // TODO: update after stopping support of Ubuntu Xenial: + menu->addAction(QIcon::fromTheme("edit-copy"), tr("Copy fingerprint"), + this, SLOT(copyKnownFingerprint())); + + menu->exec(QCursor::pos()); +} + +void KnownFingerprints::copyKnownFingerprint() +{ + if (!m_table->selectionModel()->hasSelection()) + return; + + copyFingerprintFromTable(m_tableModel, m_table->selectionModel()->selectedRows(0), 3); } ManageDevices::ManageDevices(int account, OMEMO *omemo, QWidget *parent) : @@ -213,13 +270,14 @@ ManageDevices::ManageDevices(int account, OMEMO *omemo, QWidget *parent) : deviceInfoLayout->addWidget(infoLabel); deviceInfoLayout->addWidget(m_fingerprintLabel); + m_deviceIdLabel = new QLabel(currentDevice); auto deleteCurrentDeviceButton = new QPushButton(tr("Delete all OMEMO data for current device"), currentDevice); connect(deleteCurrentDeviceButton, &QPushButton::clicked, this, &ManageDevices::deleteCurrentDevice); auto deleteCurrentDeviceLayout = new QHBoxLayout(); - deleteCurrentDeviceLayout->addWidget(deleteCurrentDeviceButton); - deleteCurrentDeviceLayout->addWidget(new QLabel(currentDevice)); + deleteCurrentDeviceLayout->addWidget(m_deviceIdLabel); deleteCurrentDeviceLayout->addWidget(new QLabel(currentDevice)); + deleteCurrentDeviceLayout->addWidget(deleteCurrentDeviceButton); auto currentDeviceLayout = new QVBoxLayout(currentDevice); currentDeviceLayout->addLayout(deviceInfoLayout); @@ -230,7 +288,6 @@ ManageDevices::ManageDevices(int account, OMEMO *omemo, QWidget *parent) : auto otherDevices = new QGroupBox(tr("Other devices"), this); auto buttonsLayout = new QHBoxLayout(); m_deleteButton = new QPushButton(tr("Delete"), this); - m_deleteButton->setEnabled(false); connect(m_deleteButton, &QPushButton::clicked, this, &ManageDevices::deleteDevice); buttonsLayout->addWidget(m_deleteButton); buttonsLayout->addWidget(new QLabel(this)); @@ -246,8 +303,9 @@ ManageDevices::ManageDevices(int account, OMEMO *omemo, QWidget *parent) : mainLayout->addWidget(otherDevices); setLayout(mainLayout); - connect(m_table->selectionModel(), &QItemSelectionModel::selectionChanged, this, &ManageDevices::selectionChanged); connect(m_omemo, &OMEMO::deviceListUpdated, this, &ManageDevices::deviceListUpdated); + connect(m_table, &QTableView::customContextMenuRequested, + this, &ManageDevices::contextMenuOwnDevices); ManageDevices::updateData(); } @@ -255,24 +313,12 @@ ManageDevices::ManageDevices(int account, OMEMO *omemo, QWidget *parent) : void ManageDevices::updateData() { m_currentDeviceId = m_omemo->getDeviceId(m_account); + m_deviceIdLabel->setText(tr("Device ID") + QString(": %1").arg(QString::number(m_currentDeviceId))); m_fingerprintLabel->setText(QString("%1").arg(m_omemo->getOwnFingerprint(m_account))); ConfigWidgetTabWithTable::updateData(); } -void ManageDevices::selectionChanged(const QItemSelection &selected, const QItemSelection &) -{ - QModelIndexList selection = selected.indexes(); - if (!selection.isEmpty()) { - m_deleteButton->setEnabled(selectedDeviceId(selection) != m_currentDeviceId); - } -} - -uint32_t ManageDevices::selectedDeviceId(const QModelIndexList &selection) const -{ - return m_tableModel->itemFromIndex(selection.first())->data().toUInt(); -} - void ManageDevices::doUpdateData() { m_tableModel->setColumnCount(1); @@ -324,22 +370,32 @@ void ManageDevices::deleteCurrentDevice() void ManageDevices::deleteDevice() { - QModelIndexList selection = m_table->selectionModel()->selectedIndexes(); - if (!selection.isEmpty()) { - const QString &message = tr("After deleting of device from list of available devices " + const QModelIndexList &&selection = m_table->selectionModel()->selectedRows(0); + if (selection.isEmpty()) + return; + + for (auto selectIndex : selection) { + const QString &&deviceId = m_tableModel->item(selectIndex.row(), 0)->data().toString(); + const QString &&fingerprint = m_tableModel->item(selectIndex.row(), 1)->text(); + const QString &&message = tr("After deleting of device from list of available devices " "it stops receiving offline messages from your contacts " "until it will become online and your contacts mark it " "as trusted.") - + "\n\n" + tr("Delete selected device?"); + + "\n\n" + + tr("Device ID") + QString(": %1").arg(deviceId) + + "\n" + + tr("Fingerprint") + QString(": %1").arg(fingerprint) + + "\n\n" + + tr("Delete selected device?"); QMessageBox messageBox(QMessageBox::Question, QObject::tr("Confirm action"), message); messageBox.addButton(QObject::tr("Delete"), QMessageBox::AcceptRole); messageBox.addButton(QObject::tr("Cancel"), QMessageBox::RejectRole); if (messageBox.exec() != 0) - return; + continue; - m_omemo->unpublishDevice(m_account, selectedDeviceId(selection)); + m_omemo->unpublishDevice(m_account, deviceId.toUInt()); } } @@ -350,6 +406,29 @@ void ManageDevices::deviceListUpdated(int account) } } +void ManageDevices::contextMenuOwnDevices(const QPoint &pos) +{ + QModelIndex index = m_table->indexAt(pos); + if (!index.isValid()) + return; + + QMenu *menu = new QMenu(this); + + // TODO: update after stopping support of Ubuntu Xenial: + menu->addAction(QIcon::fromTheme("edit-copy"), tr("Copy fingerprint"), + this, SLOT(copyOwnFingerprint())); + + menu->exec(QCursor::pos()); +} + +void ManageDevices::copyOwnFingerprint() +{ + if (!m_table->selectionModel()->hasSelection()) + return; + + copyFingerprintFromTable(m_tableModel, m_table->selectionModel()->selectedRows(0), 1); +} + OmemoConfiguration::OmemoConfiguration(int account, OMEMO *omemo, QWidget *parent) : ConfigWidgetTab(account, omemo, parent) { diff --git a/generic/omemoplugin/src/configwidget.h b/generic/omemoplugin/src/configwidget.h index 3a17f2b1..011d6689 100644 --- a/generic/omemoplugin/src/configwidget.h +++ b/generic/omemoplugin/src/configwidget.h @@ -59,6 +59,9 @@ class ConfigWidgetTabWithTable : public ConfigWidgetTab { ConfigWidgetTabWithTable(int account, OMEMO *omemo, QWidget *parent); void filterContacts(const QString &jid); void updateData() override; + void copyFingerprintFromTable(QStandardItemModel *tableModel, + const QModelIndexList &indexesList, + const int column); protected: virtual void doUpdateData() = 0; @@ -76,9 +79,11 @@ class KnownFingerprints : public ConfigWidgetTabWithTable { void doUpdateData() override; private slots: - void removeFingerprint(); - void trustFingerprint(); - void revokeFingerprint(); + void removeKnownKey(); + void trustKnownKey(); + void revokeKnownKey(); + void contextMenuKnownKeys(const QPoint &pos); + void copyKnownFingerprint(); }; class ManageDevices : public ConfigWidgetTabWithTable { @@ -95,18 +100,19 @@ class ManageDevices : public ConfigWidgetTabWithTable { private: QLabel * m_fingerprintLabel; + QLabel * m_deviceIdLabel; uint32_t m_currentDeviceId; QPushButton *m_deleteButton; - uint32_t selectedDeviceId(const QModelIndexList &selection) const; protected: void doUpdateData() override; private slots: - void selectionChanged(const QItemSelection &, const QItemSelection &); void deleteCurrentDevice(); void deleteDevice(); void deviceListUpdated(int account); + void contextMenuOwnDevices(const QPoint &pos); + void copyOwnFingerprint(); }; class OmemoConfiguration : public ConfigWidgetTab { diff --git a/generic/omemoplugin/src/omemo.cpp b/generic/omemoplugin/src/omemo.cpp index e7a3f374..c175ce38 100644 --- a/generic/omemoplugin/src/omemo.cpp +++ b/generic/omemoplugin/src/omemo.cpp @@ -128,17 +128,21 @@ bool OMEMO::decryptMessage(int account, QDomElement &xml) QByteArray encryptedKey = QByteArray::fromBase64(keyElement.firstChild().nodeValue().toUtf8()); - uint deviceId = header.attribute("sid").toUInt(); QString from = message.attribute("from"); + QString to = message.attribute("to"); + uint deviceId = header.attribute("sid").toUInt(); + if (!signal->getDeviceList(from).contains(deviceId)) { + pepRequest(account, to.split("/").first(), from.split("/").first(), deviceListNodeName()); + } + QString sender = m_contactInfoAccessor->realJid(account, from).split("/").first(); QPair decryptionResult - = signal->decryptKey(sender, EncryptedKey(deviceId, isPreKey, encryptedKey)); + = signal->decryptKey(sender, EncryptedKey(deviceId, isPreKey, encryptedKey)); QByteArray decryptedKey = decryptionResult.first; bool buildSessionWithPreKey = decryptionResult.second; if (buildSessionWithPreKey) { // remote has an invalid session, let's recover by overwriting it with a fresh one QDomElement emptyMessage = message.cloneNode(false).toElement(); - QString to = message.attribute("to"); emptyMessage.setAttribute("from", to); emptyMessage.setAttribute("to", from); @@ -306,6 +310,13 @@ bool OMEMO::encryptMessage(const QString &ownJid, int account, QDomElement &xml, xml.appendChild(encryption); } + + qDebug() << "????????????????????????????????????????" + << __PRETTY_FUNCTION__; + QTextStream lTS(stderr); + lTS << xml; + + return true; } @@ -620,14 +631,9 @@ QSet OMEMO::getOwnDevicesList(int account) QList OMEMO::getKnownFingerprints(int account) { return getSignal(account)->getKnownFingerprints(); } -void OMEMO::askDeviceTrust(int account, const QString &user, uint32_t deviceId) -{ - getSignal(account)->askDeviceTrust(user, deviceId, true); -} - -void OMEMO::removeDevice(int account, const QString &user, uint32_t deviceId) +bool OMEMO::removeDevice(int account, const QString &user, uint32_t deviceId) { - getSignal(account)->removeDevice(user, deviceId); + return getSignal(account)->removeDevice(user, deviceId); } void OMEMO::confirmDeviceTrust(int account, const QString &user, uint32_t deviceId) diff --git a/generic/omemoplugin/src/omemo.h b/generic/omemoplugin/src/omemo.h index d3cbe488..1fddfe04 100644 --- a/generic/omemoplugin/src/omemo.h +++ b/generic/omemoplugin/src/omemo.h @@ -63,8 +63,7 @@ class OMEMO : public QObject { QList getKnownFingerprints(int account); QMap getOwnFingerprintsMap(int account); QSet getOwnDevicesList(int account); - void askDeviceTrust(int account, const QString &user, uint32_t deviceId); - void removeDevice(int account, const QString &user, uint32_t deviceId); + bool removeDevice(int account, const QString &user, uint32_t deviceId); void confirmDeviceTrust(int account, const QString &user, uint32_t deviceId); void revokeDeviceTrust(int account, const QString &user, uint32_t deviceId); void unpublishDevice(int account, uint32_t deviceId); diff --git a/generic/omemoplugin/src/omemoplugin.cpp b/generic/omemoplugin/src/omemoplugin.cpp index 96855159..836de39e 100644 --- a/generic/omemoplugin/src/omemoplugin.cpp +++ b/generic/omemoplugin/src/omemoplugin.cpp @@ -35,7 +35,7 @@ #include "omemoplugin.h" namespace psiomemo { -QString OMEMOPlugin::version() const { return "2.2"; } +QString OMEMOPlugin::version() const { return "2.3"; } QString OMEMOPlugin::shortName() const { return "omemo"; } diff --git a/generic/omemoplugin/src/psiplugin.json b/generic/omemoplugin/src/psiplugin.json index f769b2e0..6c43ae91 100644 --- a/generic/omemoplugin/src/psiplugin.json +++ b/generic/omemoplugin/src/psiplugin.json @@ -1,7 +1,7 @@ { "name": "OMEMO", "shortname": "omemo", - "version": "2.2", + "version": "2.3", "priority": 2, "icon": "base64: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", "description": "OMEMO is an end-to-end encryption protocol that leverages the Double Ratchet encryption scheme to provide multi-end to multi-end encryption, allowing messages to be synchronized securely across multiple clients, even if some of them are offline.", diff --git a/generic/omemoplugin/src/signal.cpp b/generic/omemoplugin/src/signal.cpp index 37b3bfb5..ffa1f184 100644 --- a/generic/omemoplugin/src/signal.cpp +++ b/generic/omemoplugin/src/signal.cpp @@ -334,7 +334,10 @@ void Signal::processUndecidedDevices(const QString &user, const bool ownJid, con void Signal::askDeviceTrust(const QString &user, uint32_t deviceId, bool skipNewDevicePart, bool ownJid) { - QString publicKey = getFingerprint(m_storage.loadDeviceIdentity(user, deviceId)); + const QString &&fingerprint = getFingerprint(m_storage.loadDeviceIdentity(user, deviceId)); + if (fingerprint.isEmpty()) + return; + QString message; if (!skipNewDevicePart) { message += QObject::tr("New OMEMO device has been discovered for \"%1\".").arg(user) + "

"; @@ -347,7 +350,7 @@ void Signal::askDeviceTrust(const QString &user, uint32_t deviceId, bool skipNew += QObject::tr("Do you want to trust this device and allow it to receive the encrypted messages from you?") + "

"; } - message += QObject::tr("Device public key:") + QString("
%1").arg(publicKey); + message += QObject::tr("Device public key:") + QString("
%1").arg(fingerprint); QMessageBox messageBox(QMessageBox::Question, QObject::tr("Managing of OMEMO keys"), message); messageBox.addButton(QObject::tr("Trust"), QMessageBox::AcceptRole); @@ -360,11 +363,11 @@ void Signal::askDeviceTrust(const QString &user, uint32_t deviceId, bool skipNew } } -void Signal::removeDevice(const QString &user, uint32_t deviceId) +bool Signal::removeDevice(const QString &user, uint32_t deviceId) { - const QString publicKey = getFingerprint(m_storage.loadDeviceIdentity(user, deviceId)); - const QString message = QObject::tr("Delete selected device from list of known devices of user \"%1\"?").arg(user) - + "

" + QObject::tr("Device public key:") + QString("
%1").arg(publicKey); + const QString &&fingerprint = getFingerprint(m_storage.loadDeviceIdentity(user, deviceId)); + const QString &&message = QObject::tr("Delete selected device from list of known devices of user \"%1\"?").arg(user) + + "

" + QObject::tr("Device public key:") + QString("
%1").arg(fingerprint); QMessageBox messageBox(QMessageBox::Question, QObject::tr("Confirm action"), message); messageBox.addButton(QObject::tr("Delete"), QMessageBox::AcceptRole); @@ -372,7 +375,10 @@ void Signal::removeDevice(const QString &user, uint32_t deviceId) if (messageBox.exec() == 0) { m_storage.removeDevice(user, deviceId); + return true; } + + return false; } void Signal::confirmDeviceTrust(const QString &user, uint32_t deviceId) diff --git a/generic/omemoplugin/src/signal.h b/generic/omemoplugin/src/signal.h index 29897e56..f18b8429 100644 --- a/generic/omemoplugin/src/signal.h +++ b/generic/omemoplugin/src/signal.h @@ -87,7 +87,7 @@ class Signal { QList getKnownFingerprints(); void askDeviceTrust(const QString &user, uint32_t deviceId, bool skipNewDevicePart, bool ownJid = false); - void removeDevice(const QString &user, uint32_t deviceId); + bool removeDevice(const QString &user, uint32_t deviceId); void confirmDeviceTrust(const QString &user, uint32_t deviceId); void revokeDeviceTrust(const QString &user, uint32_t deviceId); void removeCurrentDevice();