diff options
Diffstat (limited to 'src/omemo')
| -rw-r--r-- | src/omemo/QXmppOmemoManager.cpp | 41 | ||||
| -rw-r--r-- | src/omemo/QXmppOmemoManager.h | 4 |
2 files changed, 45 insertions, 0 deletions
diff --git a/src/omemo/QXmppOmemoManager.cpp b/src/omemo/QXmppOmemoManager.cpp index cb66a515..8b1e532b 100644 --- a/src/omemo/QXmppOmemoManager.cpp +++ b/src/omemo/QXmppOmemoManager.cpp @@ -1017,6 +1017,30 @@ QFuture<QXmppE2eeExtension::MessageEncryptResult> Manager::encryptMessage(QXmppM return d->encryptMessageForRecipients(std::move(message), recipientJids, *acceptedTrustLevels); } +QFuture<QXmppE2eeExtension::MessageDecryptResult> QXmppOmemoManager::decryptMessage(QXmppMessage &&message) +{ + if (!d->isStarted) { + return makeReadyFuture<MessageDecryptResult>(QXmppError { + QStringLiteral("OMEMO manager must be started before decrypting"), + SendError::EncryptionError }); + } + + auto omemoElement = message.omemoElement(); + if (!omemoElement) { + return makeReadyFuture<MessageDecryptResult>(NotEncrypted()); + } + + return chain<MessageDecryptResult>(d->decryptMessage(message), this, [](std::optional<QXmppMessage> message) -> MessageDecryptResult { + if (message) { + return std::move(*message); + } + return QXmppError { + QStringLiteral("Couldn't decrypt message"), + {} + }; + }); +} + QFuture<QXmppE2eeExtension::IqEncryptResult> Manager::encryptIq(QXmppIq &&iq, const std::optional<QXmppSendStanzaParams> ¶ms) { QFutureInterface<QXmppE2eeExtension::IqEncryptResult> interface(QFutureInterfaceBase::Started); @@ -1090,6 +1114,23 @@ QFuture<QXmppE2eeExtension::IqDecryptResult> Manager::decryptIq(const QDomElemen return makeReadyFuture<IqDecryptResult>(NotEncrypted()); } +bool QXmppOmemoManager::isEncrypted(const QDomElement &el) +{ + for (auto subEl = el.firstChildElement(); + !subEl.isNull(); + subEl = subEl.nextSiblingElement()) { + if (subEl.tagName() == "encrypted" && subEl.namespaceURI() == ns_omemo_2) { + return true; + } + } + return false; +} + +bool QXmppOmemoManager::isEncrypted(const QXmppMessage &message) +{ + return message.omemoElement().has_value(); +} + QStringList Manager::discoveryFeatures() const { return { diff --git a/src/omemo/QXmppOmemoManager.h b/src/omemo/QXmppOmemoManager.h index cc957e73..2ba32671 100644 --- a/src/omemo/QXmppOmemoManager.h +++ b/src/omemo/QXmppOmemoManager.h @@ -125,10 +125,14 @@ public: /// \cond QFuture<MessageEncryptResult> encryptMessage(QXmppMessage &&message, const std::optional<QXmppSendStanzaParams> ¶ms) override; + QFuture<MessageDecryptResult> decryptMessage(QXmppMessage &&message) override; QFuture<IqEncryptResult> encryptIq(QXmppIq &&iq, const std::optional<QXmppSendStanzaParams> ¶ms) override; QFuture<IqDecryptResult> decryptIq(const QDomElement &element) override; + bool isEncrypted(const QDomElement &) override; + bool isEncrypted(const QXmppMessage &) override; + QStringList discoveryFeatures() const override; bool handleStanza(const QDomElement &stanza) override; bool handleMessage(const QXmppMessage &message) override; |
