aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLinus Jahn <lnj@kaidan.im>2022-10-17 17:47:32 +0200
committerLinus Jahn <lnj@kaidan.im>2022-10-18 21:12:51 +0200
commitca56014bfc1293b31a934c080ba1ffc059d2faf1 (patch)
tree9fbe215134b7e498003f48121c7ef9ccae3648e2 /src
parentbdc2b00a1d89c20f6fe87bdb6f9eb792afeea2bb (diff)
downloadqxmpp-ca56014bfc1293b31a934c080ba1ffc059d2faf1.tar.gz
OmemoManager: Implement isEncrypted() and decryptMessage()
Diffstat (limited to 'src')
-rw-r--r--src/omemo/QXmppOmemoManager.cpp41
-rw-r--r--src/omemo/QXmppOmemoManager.h4
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> &params)
{
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> &params) override;
+ QFuture<MessageDecryptResult> decryptMessage(QXmppMessage &&message) override;
QFuture<IqEncryptResult> encryptIq(QXmppIq &&iq, const std::optional<QXmppSendStanzaParams> &params) 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;