From ca56014bfc1293b31a934c080ba1ffc059d2faf1 Mon Sep 17 00:00:00 2001 From: Linus Jahn Date: Mon, 17 Oct 2022 17:47:32 +0200 Subject: OmemoManager: Implement isEncrypted() and decryptMessage() --- src/omemo/QXmppOmemoManager.cpp | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) (limited to 'src/omemo/QXmppOmemoManager.cpp') 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 Manager::encryptMessage(QXmppM return d->encryptMessageForRecipients(std::move(message), recipientJids, *acceptedTrustLevels); } +QFuture QXmppOmemoManager::decryptMessage(QXmppMessage &&message) +{ + if (!d->isStarted) { + return makeReadyFuture(QXmppError { + QStringLiteral("OMEMO manager must be started before decrypting"), + SendError::EncryptionError }); + } + + auto omemoElement = message.omemoElement(); + if (!omemoElement) { + return makeReadyFuture(NotEncrypted()); + } + + return chain(d->decryptMessage(message), this, [](std::optional message) -> MessageDecryptResult { + if (message) { + return std::move(*message); + } + return QXmppError { + QStringLiteral("Couldn't decrypt message"), + {} + }; + }); +} + QFuture Manager::encryptIq(QXmppIq &&iq, const std::optional ¶ms) { QFutureInterface interface(QFutureInterfaceBase::Started); @@ -1090,6 +1114,23 @@ QFuture Manager::decryptIq(const QDomElemen return makeReadyFuture(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 { -- cgit v1.2.3