diff options
| author | Linus Jahn <lnj@kaidan.im> | 2022-10-17 17:47:32 +0200 |
|---|---|---|
| committer | Linus Jahn <lnj@kaidan.im> | 2022-10-18 21:12:51 +0200 |
| commit | ca56014bfc1293b31a934c080ba1ffc059d2faf1 (patch) | |
| tree | 9fbe215134b7e498003f48121c7ef9ccae3648e2 /src | |
| parent | bdc2b00a1d89c20f6fe87bdb6f9eb792afeea2bb (diff) | |
| download | qxmpp-ca56014bfc1293b31a934c080ba1ffc059d2faf1.tar.gz | |
OmemoManager: Implement isEncrypted() and decryptMessage()
Diffstat (limited to 'src')
| -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; |
