aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLinus Jahn <lnj@kaidan.im>2022-05-31 12:22:48 +0200
committerLinus Jahn <lnj@kaidan.im>2022-08-13 15:55:03 +0200
commitf0e0e1cd227c08ffd97aa42813a479b8c3ca6d23 (patch)
tree12ca6aefdef9195ee8937406db86e73cf1a5f820 /src
parent87df8a8dda385558d39639ce09e2717974264ab6 (diff)
downloadqxmpp-f0e0e1cd227c08ffd97aa42813a479b8c3ca6d23.tar.gz
Split up OMEMO into extra module
Diffstat (limited to 'src')
-rw-r--r--src/CMakeLists.txt36
-rw-r--r--src/base/QXmppOmemoDataBase.cpp290
-rw-r--r--src/base/QXmppOmemoElement_p.h2
-rw-r--r--src/base/QXmppOmemoEnvelope_p.h2
-rw-r--r--src/omemo/CMakeLists.txt91
-rw-r--r--src/omemo/OmemoCryptoProvider.cpp (renamed from src/client/OmemoCryptoProvider.cpp)0
-rw-r--r--src/omemo/OmemoCryptoProvider.h (renamed from src/client/OmemoCryptoProvider.h)0
-rw-r--r--src/omemo/OmemoLibWrappers.h (renamed from src/client/OmemoLibWrappers.h)0
-rw-r--r--src/omemo/QXmppOmemoConfig.cmake.in12
-rw-r--r--src/omemo/QXmppOmemoData.cpp (renamed from src/base/QXmppOmemoData.cpp)272
-rw-r--r--src/omemo/QXmppOmemoDeviceBundle_p.h (renamed from src/base/QXmppOmemoDeviceBundle_p.h)0
-rw-r--r--src/omemo/QXmppOmemoDeviceElement_p.h (renamed from src/base/QXmppOmemoDeviceElement_p.h)0
-rw-r--r--src/omemo/QXmppOmemoDeviceList_p.h (renamed from src/base/QXmppOmemoDeviceList_p.h)0
-rw-r--r--src/omemo/QXmppOmemoIq_p.h (renamed from src/base/QXmppOmemoIq_p.h)0
-rw-r--r--src/omemo/QXmppOmemoItems_p.h (renamed from src/base/QXmppOmemoItems_p.h)0
-rw-r--r--src/omemo/QXmppOmemoManager.cpp (renamed from src/client/QXmppOmemoManager.cpp)0
-rw-r--r--src/omemo/QXmppOmemoManager.h (renamed from src/client/QXmppOmemoManager.h)7
-rw-r--r--src/omemo/QXmppOmemoManager_p.cpp (renamed from src/client/QXmppOmemoManager_p.cpp)0
-rw-r--r--src/omemo/QXmppOmemoManager_p.h (renamed from src/client/QXmppOmemoManager_p.h)0
-rw-r--r--src/omemo/QXmppOmemoMemoryStorage.cpp (renamed from src/client/QXmppOmemoMemoryStorage.cpp)0
-rw-r--r--src/omemo/QXmppOmemoMemoryStorage.h (renamed from src/client/QXmppOmemoMemoryStorage.h)4
-rw-r--r--src/omemo/QXmppOmemoStorage.cpp (renamed from src/client/QXmppOmemoStorage.cpp)0
-rw-r--r--src/omemo/QXmppOmemoStorage.h (renamed from src/client/QXmppOmemoStorage.h)4
23 files changed, 409 insertions, 311 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 4dfb2d16..c02c4015 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -251,28 +251,8 @@ set(SOURCE_FILES
)
if(BUILD_OMEMO)
- set(INSTALL_HEADER_FILES
- ${INSTALL_HEADER_FILES}
-
- # Client
- client/QXmppOmemoManager.h
- client/QXmppOmemoMemoryStorage.h
- client/QXmppOmemoStorage.h
- )
-
- set(SOURCE_FILES
- ${SOURCE_FILES}
-
- # Base
- base/QXmppOmemoData.cpp
-
- # Client
- client/QXmppOmemoManager.cpp
- client/QXmppOmemoManager_p.cpp
- client/QXmppOmemoMemoryStorage.cpp
- client/QXmppOmemoStorage.cpp
- client/OmemoCryptoProvider.cpp
- )
+ # required to be used in QXmppMessage
+ set(SOURCE_FILES ${SOURCE_FILES} base/QXmppOmemoDataBase.cpp)
endif()
if(WITH_GSTREAMER)
@@ -326,14 +306,6 @@ target_link_libraries(qxmpp
Qt${QT_VERSION_MAJOR}::Xml
)
-if(WITH_OMEMO)
- target_link_libraries(qxmpp
- PRIVATE
- PkgConfig::OmemoC
- qca-qt${QT_VERSION_MAJOR}
- )
-endif()
-
if(WITH_GSTREAMER)
target_link_libraries(qxmpp
PRIVATE
@@ -366,3 +338,7 @@ install(
FILES ${INSTALL_HEADER_FILES}
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/qxmpp"
)
+
+if(BUILD_OMEMO)
+ add_subdirectory(omemo)
+endif()
diff --git a/src/base/QXmppOmemoDataBase.cpp b/src/base/QXmppOmemoDataBase.cpp
new file mode 100644
index 00000000..a75d54ea
--- /dev/null
+++ b/src/base/QXmppOmemoDataBase.cpp
@@ -0,0 +1,290 @@
+// SPDX-FileCopyrightText: 2021 Germán Márquez Mejía <mancho@olomono.de>
+// SPDX-FileCopyrightText: 2021 Melvin Keskin <melvo@olomono.de>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
+#include "QXmppConstants_p.h"
+#include "QXmppOmemoElement_p.h"
+#include "QXmppOmemoEnvelope_p.h"
+#include "QXmppUtils.h"
+
+#include <QDomElement>
+#include <QXmlStreamWriter>
+
+/// \cond
+///
+/// \class QXmppOmemoEnvelope
+///
+/// \brief The QXmppOmemoEnvelope class represents an OMEMO envelope as
+/// defined by \xep{0384, OMEMO Encryption}.
+///
+
+///
+/// Returns the ID of the recipient's device.
+///
+/// The ID is 0 if it is unset.
+///
+/// \return the recipient's device ID
+///
+uint32_t QXmppOmemoEnvelope::recipientDeviceId() const
+{
+ return m_recipientDeviceId;
+}
+
+///
+/// Sets the ID of the recipient's device.
+///
+/// The ID must be at least 1 and at most \c std::numeric_limits<int32_t>::max().
+///
+/// \param id recipient's device ID
+///
+void QXmppOmemoEnvelope::setRecipientDeviceId(uint32_t id)
+{
+ m_recipientDeviceId = id;
+}
+
+///
+/// Returns true if a pre-key was used to prepare this envelope.
+///
+/// The default is false.
+///
+/// \return true if a pre-key was used to prepare this envelope, otherwise false
+///
+bool QXmppOmemoEnvelope::isUsedForKeyExchange() const
+{
+ return m_isUsedForKeyExchange;
+}
+
+///
+/// Sets whether a pre-key was used to prepare this envelope.
+///
+/// \param isUsed whether a pre-key was used to prepare this envelope
+///
+void QXmppOmemoEnvelope::setIsUsedForKeyExchange(bool isUsed)
+{
+ m_isUsedForKeyExchange = isUsed;
+}
+
+///
+/// Returns the BLOB containing the data for the underlying double ratchet library.
+///
+/// It should be treated like an obscure BLOB being passed as is to the ratchet
+/// library for further processing.
+///
+/// \return the binary data for the ratchet library
+///
+QByteArray QXmppOmemoEnvelope::data() const
+{
+ return m_data;
+}
+
+///
+/// Sets the BLOB containing the data from the underlying double ratchet library.
+///
+/// It should be treated like an obscure BLOB produced by the ratchet library.
+///
+/// \param data binary data from the ratchet library
+///
+void QXmppOmemoEnvelope::setData(const QByteArray &data)
+{
+ m_data = data;
+}
+
+void QXmppOmemoEnvelope::parse(const QDomElement &element)
+{
+ m_recipientDeviceId = element.attribute(QStringLiteral("rid")).toInt();
+
+ const auto isUsedForKeyExchange = element.attribute(QStringLiteral("kex"));
+ if (isUsedForKeyExchange == QStringLiteral("true") ||
+ isUsedForKeyExchange == QStringLiteral("1")) {
+ m_isUsedForKeyExchange = true;
+ }
+
+ m_data = QByteArray::fromBase64(element.text().toLatin1());
+}
+
+void QXmppOmemoEnvelope::toXml(QXmlStreamWriter *writer) const
+{
+ writer->writeStartElement(QStringLiteral("key"));
+ writer->writeAttribute(QStringLiteral("rid"), QString::number(m_recipientDeviceId));
+
+ if (m_isUsedForKeyExchange) {
+ helperToXmlAddAttribute(writer, QStringLiteral("kex"), QStringLiteral("true"));
+ }
+
+ writer->writeCharacters(m_data.toBase64());
+ writer->writeEndElement();
+}
+
+///
+/// Determines whether the given DOM element is an OMEMO envelope.
+///
+/// \param element DOM element being checked
+///
+/// \return true if element is an OMEMO envelope, otherwise false
+///
+bool QXmppOmemoEnvelope::isOmemoEnvelope(const QDomElement &element)
+{
+ return element.tagName() == QStringLiteral("key") &&
+ element.namespaceURI() == ns_omemo_2;
+}
+
+///
+/// \class QXmppOmemoElement
+///
+/// \brief The QXmppOmemoElement class represents an OMEMO element as
+/// defined by \xep{0384, OMEMO Encryption}.
+///
+
+///
+/// Returns the ID of the sender's device.
+///
+/// The ID is 0 if it is unset.
+///
+/// \return the sender's device ID
+///
+uint32_t QXmppOmemoElement::senderDeviceId() const
+{
+ return m_senderDeviceId;
+}
+
+///
+/// Sets the ID of the sender's device.
+///
+/// The ID must be at least 1 and at most
+/// \c std::numeric_limits<int32_t>::max().
+///
+/// \param id sender's device ID
+///
+void QXmppOmemoElement::setSenderDeviceId(uint32_t id)
+{
+ m_senderDeviceId = id;
+}
+
+///
+/// Returns the payload which consists of the encrypted SCE envelope.
+///
+/// \return the encrypted payload
+///
+QByteArray QXmppOmemoElement::payload() const
+{
+ return m_payload;
+}
+
+///
+/// Sets the payload which consists of the encrypted SCE envelope.
+///
+/// \param payload encrypted payload
+///
+void QXmppOmemoElement::setPayload(const QByteArray &payload)
+{
+ m_payload = payload;
+}
+
+///
+/// Searches for an OMEMO envelope by its recipient JID and device ID.
+///
+/// \param recipientJid bare JID of the recipient
+/// \param recipientDeviceId ID of the recipient's device
+///
+/// \return the found OMEMO envelope
+///
+std::optional<QXmppOmemoEnvelope> QXmppOmemoElement::searchEnvelope(const QString &recipientJid, uint32_t recipientDeviceId) const
+{
+ for (auto itr = m_envelopes.constFind(recipientJid);
+ itr != m_envelopes.constEnd() && itr.key() == recipientJid;
+ ++itr) {
+ const auto &envelope = itr.value();
+ if (envelope.recipientDeviceId() == recipientDeviceId) {
+ return envelope;
+ }
+ }
+
+ return std::nullopt;
+}
+
+///
+/// Adds an OMEMO envelope.
+///
+/// If a full JID is passed as recipientJid, it is converted into a bare JID.
+///
+/// \see QXmppOmemoEnvelope
+///
+/// \param recipientJid bare JID of the recipient
+/// \param envelope OMEMO envelope
+///
+void QXmppOmemoElement::addEnvelope(const QString &recipientJid, const QXmppOmemoEnvelope &envelope)
+{
+ m_envelopes.insert(QXmppUtils::jidToBareJid(recipientJid), envelope);
+}
+
+void QXmppOmemoElement::parse(const QDomElement &element)
+{
+ const auto header = element.firstChildElement(QStringLiteral("header"));
+
+ m_senderDeviceId = header.attribute(QStringLiteral("sid")).toInt();
+
+ for (auto recipient = header.firstChildElement(QStringLiteral("keys"));
+ !recipient.isNull();
+ recipient = recipient.nextSiblingElement(QStringLiteral("keys"))) {
+ const auto recipientJid = recipient.attribute(QStringLiteral("jid"));
+
+ for (auto envelope = recipient.firstChildElement(QStringLiteral("key"));
+ !envelope.isNull();
+ envelope = envelope.nextSiblingElement(QStringLiteral("key"))) {
+ QXmppOmemoEnvelope omemoEnvelope;
+ omemoEnvelope.parse(envelope);
+ addEnvelope(recipientJid, omemoEnvelope);
+ }
+ }
+
+ m_payload = QByteArray::fromBase64(element.firstChildElement(QStringLiteral("payload")).text().toLatin1());
+}
+
+void QXmppOmemoElement::toXml(QXmlStreamWriter *writer) const
+{
+ writer->writeStartElement(QStringLiteral("encrypted"));
+ writer->writeDefaultNamespace(ns_omemo_2);
+
+ writer->writeStartElement(QStringLiteral("header"));
+ writer->writeAttribute(QStringLiteral("sid"), QString::number(m_senderDeviceId));
+
+ const auto recipientJids = m_envelopes.uniqueKeys();
+ for (const auto &recipientJid : recipientJids) {
+ writer->writeStartElement(QStringLiteral("keys"));
+ writer->writeAttribute(QStringLiteral("jid"), recipientJid);
+
+ for (auto itr = m_envelopes.constFind(recipientJid);
+ itr != m_envelopes.constEnd() && itr.key() == recipientJid;
+ ++itr) {
+ const auto &envelope = itr.value();
+ envelope.toXml(writer);
+ }
+
+ writer->writeEndElement(); // keys
+ }
+
+ writer->writeEndElement(); // header
+
+ // The payload element is only included if there is a payload.
+ // An empty OMEMO message does not contain a payload.
+ if (!m_payload.isEmpty()) {
+ writer->writeTextElement(QStringLiteral("payload"), m_payload.toBase64());
+ }
+
+ writer->writeEndElement(); // encrypted
+}
+
+///
+/// Determines whether the given DOM element is an OMEMO element.
+///
+/// \param element DOM element being checked
+///
+/// \return true if element is an OMEMO element, otherwise false
+///
+bool QXmppOmemoElement::isOmemoElement(const QDomElement &element)
+{
+ return element.tagName() == QStringLiteral("encrypted") &&
+ element.namespaceURI() == ns_omemo_2;
+}
+/// \endcond
diff --git a/src/base/QXmppOmemoElement_p.h b/src/base/QXmppOmemoElement_p.h
index bd113d04..1e160479 100644
--- a/src/base/QXmppOmemoElement_p.h
+++ b/src/base/QXmppOmemoElement_p.h
@@ -16,7 +16,7 @@ class QDomElement;
class QXmppOmemoEnvelope;
class QXmlStreamWriter;
-class QXMPP_AUTOTEST_EXPORT QXmppOmemoElement
+class QXMPP_EXPORT QXmppOmemoElement
{
public:
uint32_t senderDeviceId() const;
diff --git a/src/base/QXmppOmemoEnvelope_p.h b/src/base/QXmppOmemoEnvelope_p.h
index 376a7ebf..d5eac395 100644
--- a/src/base/QXmppOmemoEnvelope_p.h
+++ b/src/base/QXmppOmemoEnvelope_p.h
@@ -11,7 +11,7 @@
class QDomElement;
class QXmlStreamWriter;
-class QXMPP_AUTOTEST_EXPORT QXmppOmemoEnvelope
+class QXMPP_EXPORT QXmppOmemoEnvelope
{
public:
uint32_t recipientDeviceId() const;
diff --git a/src/omemo/CMakeLists.txt b/src/omemo/CMakeLists.txt
new file mode 100644
index 00000000..3c6e403e
--- /dev/null
+++ b/src/omemo/CMakeLists.txt
@@ -0,0 +1,91 @@
+# SPDX-FileCopyrightText: 2022 Linus Jahn <lnj@kaidan.im>
+#
+# SPDX-License-Identifier: CC0-1.0
+
+include(CMakePackageConfigHelpers)
+include(GenerateExportHeader)
+
+set(OMEMO_CMAKE_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/QXmppOmemo")
+set(OMEMO_HEADER_DIR "${CMAKE_INSTALL_FULL_INCLUDEDIR}/qxmpp/omemo")
+set(OMEMO_INSTALL_HEADER_FILES
+ QXmppOmemoManager.h
+ QXmppOmemoMemoryStorage.h
+ QXmppOmemoStorage.h
+)
+set(OMEMO_SOURCE_FILES
+ OmemoCryptoProvider.cpp
+ QXmppOmemoData.cpp
+ QXmppOmemoManager.cpp
+ QXmppOmemoManager_p.cpp
+ QXmppOmemoMemoryStorage.cpp
+ QXmppOmemoStorage.cpp
+)
+
+add_library(QXmppOmemo SHARED ${OMEMO_SOURCE_FILES})
+
+target_link_libraries(QXmppOmemo
+ PUBLIC
+ qxmpp
+ Qt${QT_VERSION_MAJOR}::Core
+ PRIVATE
+ PkgConfig::OmemoC
+ qca-qt${QT_VERSION_MAJOR}
+)
+target_include_directories(QXmppOmemo
+ PUBLIC
+ ${OMEMO_HEADER_DIR}
+ PRIVATE
+ ${CMAKE_CURRENT_LIST_DIR}
+ ${CMAKE_CURRENT_BINARY_DIR}
+)
+
+generate_export_header(QXmppOmemo)
+
+install(
+ FILES ${OMEMO_INSTALL_HEADER_FILES} ${CMAKE_CURRENT_BINARY_DIR}/qxmppomemo_export.h
+ DESTINATION ${OMEMO_HEADER_DIR}
+)
+
+set_target_properties(QXmppOmemo PROPERTIES
+ VERSION ${PROJECT_VERSION}
+ SOVERSION ${SO_VERSION}
+ EXPORT_NAME Omemo
+)
+
+install(
+ TARGETS QXmppOmemo
+ DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ EXPORT QXmppOmemoTargets
+)
+
+install(
+ EXPORT QXmppOmemoTargets
+ DESTINATION ${OMEMO_CMAKE_DIR}
+ FILE QXmppOmemo.cmake
+ NAMESPACE QXmpp::
+ COMPONENT Devel
+)
+
+export(
+ TARGETS QXmppOmemo
+ FILE QXmppOmemo.cmake
+)
+
+configure_package_config_file(
+ QXmppOmemoConfig.cmake.in
+ ${CMAKE_CURRENT_BINARY_DIR}/QXmppOmemoConfig.cmake
+ INSTALL_DESTINATION ${OMEMO_CMAKE_DIR}
+)
+
+write_basic_package_version_file(
+ ${CMAKE_CURRENT_BINARY_DIR}/QXmppOmemoConfigVersion.cmake
+ VERSION ${PROJECT_VERSION}
+ COMPATIBILITY SameMajorVersion
+)
+
+install(
+ FILES ${CMAKE_CURRENT_BINARY_DIR}/QXmppOmemoConfig.cmake
+ ${CMAKE_CURRENT_BINARY_DIR}/QXmppOmemoConfigVersion.cmake
+ DESTINATION ${OMEMO_CMAKE_DIR}
+ COMPONENT Devel
+)
diff --git a/src/client/OmemoCryptoProvider.cpp b/src/omemo/OmemoCryptoProvider.cpp
index e39124d4..e39124d4 100644
--- a/src/client/OmemoCryptoProvider.cpp
+++ b/src/omemo/OmemoCryptoProvider.cpp
diff --git a/src/client/OmemoCryptoProvider.h b/src/omemo/OmemoCryptoProvider.h
index f4c63cd8..f4c63cd8 100644
--- a/src/client/OmemoCryptoProvider.h
+++ b/src/omemo/OmemoCryptoProvider.h
diff --git a/src/client/OmemoLibWrappers.h b/src/omemo/OmemoLibWrappers.h
index e157f12c..e157f12c 100644
--- a/src/client/OmemoLibWrappers.h
+++ b/src/omemo/OmemoLibWrappers.h
diff --git a/src/omemo/QXmppOmemoConfig.cmake.in b/src/omemo/QXmppOmemoConfig.cmake.in
new file mode 100644
index 00000000..5363c0f5
--- /dev/null
+++ b/src/omemo/QXmppOmemoConfig.cmake.in
@@ -0,0 +1,12 @@
+# SPDX-FileCopyrightText: 2017 Niels Ole Salscheider <niels_ole@salscheider-online.de>
+#
+# SPDX-License-Identifier: CC0-1.0
+
+@PACKAGE_INIT@
+
+include(CMakeFindDependencyMacro)
+find_dependency(QXmpp)
+
+include("${CMAKE_CURRENT_LIST_DIR}/QXmppOmemo.cmake")
+
+check_required_components(QXmppOmemo)
diff --git a/src/base/QXmppOmemoData.cpp b/src/omemo/QXmppOmemoData.cpp
index dd99eefd..d1dd2a88 100644
--- a/src/base/QXmppOmemoData.cpp
+++ b/src/omemo/QXmppOmemoData.cpp
@@ -360,278 +360,6 @@ bool QXmppOmemoDeviceBundle::isOmemoDeviceBundle(const QDomElement &element)
}
///
-/// \class QXmppOmemoEnvelope
-///
-/// \brief The QXmppOmemoEnvelope class represents an OMEMO envelope as
-/// defined by \xep{0384, OMEMO Encryption}.
-///
-
-///
-/// Returns the ID of the recipient's device.
-///
-/// The ID is 0 if it is unset.
-///
-/// \return the recipient's device ID
-///
-uint32_t QXmppOmemoEnvelope::recipientDeviceId() const
-{
- return m_recipientDeviceId;
-}
-
-///
-/// Sets the ID of the recipient's device.
-///
-/// The ID must be at least 1 and at most
-/// \c std::numeric_limits<int32_t>::max().
-///
-/// \param id recipient's device ID
-///
-void QXmppOmemoEnvelope::setRecipientDeviceId(uint32_t id)
-{
- m_recipientDeviceId = id;
-}
-
-///
-/// Returns true if a pre-key was used to prepare this envelope.
-///
-/// The default is false.
-///
-/// \return true if a pre-key was used to prepare this envelope, otherwise false
-///
-bool QXmppOmemoEnvelope::isUsedForKeyExchange() const
-{
- return m_isUsedForKeyExchange;
-}
-
-///
-/// Sets whether a pre-key was used to prepare this envelope.
-///
-/// \param isUsed whether a pre-key was used to prepare this envelope
-///
-void QXmppOmemoEnvelope::setIsUsedForKeyExchange(bool isUsed)
-{
- m_isUsedForKeyExchange = isUsed;
-}
-
-///
-/// Returns the BLOB containing the data for the underlying double ratchet library.
-///
-/// It should be treated like an obscure BLOB being passed as is to the ratchet
-/// library for further processing.
-///
-/// \return the binary data for the ratchet library
-///
-QByteArray QXmppOmemoEnvelope::data() const
-{
- return m_data;
-}
-
-///
-/// Sets the BLOB containing the data from the underlying double ratchet library.
-///
-/// It should be treated like an obscure BLOB produced by the ratchet library.
-///
-/// \param data binary data from the ratchet library
-///
-void QXmppOmemoEnvelope::setData(const QByteArray &data)
-{
- m_data = data;
-}
-
-void QXmppOmemoEnvelope::parse(const QDomElement &element)
-{
- m_recipientDeviceId = element.attribute(QStringLiteral("rid")).toInt();
-
- const auto isUsedForKeyExchange = element.attribute(QStringLiteral("kex"));
- if (isUsedForKeyExchange == QStringLiteral("true") || isUsedForKeyExchange == QStringLiteral("1")) {
- m_isUsedForKeyExchange = true;
- }
-
- m_data = QByteArray::fromBase64(element.text().toLatin1());
-}
-
-void QXmppOmemoEnvelope::toXml(QXmlStreamWriter *writer) const
-{
- writer->writeStartElement(QStringLiteral("key"));
- writer->writeAttribute(QStringLiteral("rid"), QString::number(m_recipientDeviceId));
-
- if (m_isUsedForKeyExchange) {
- helperToXmlAddAttribute(writer, QStringLiteral("kex"), QStringLiteral("true"));
- }
-
- writer->writeCharacters(m_data.toBase64());
- writer->writeEndElement();
-}
-
-///
-/// Determines whether the given DOM element is an OMEMO envelope.
-///
-/// \param element DOM element being checked
-///
-/// \return true if element is an OMEMO envelope, otherwise false
-///
-bool QXmppOmemoEnvelope::isOmemoEnvelope(const QDomElement &element)
-{
- return element.tagName() == QStringLiteral("key") &&
- element.namespaceURI() == ns_omemo_2;
-}
-
-///
-/// \class QXmppOmemoElement
-///
-/// \brief The QXmppOmemoElement class represents an OMEMO element as
-/// defined by \xep{0384, OMEMO Encryption}.
-///
-
-///
-/// Returns the ID of the sender's device.
-///
-/// The ID is 0 if it is unset.
-///
-/// \return the sender's device ID
-///
-uint32_t QXmppOmemoElement::senderDeviceId() const
-{
- return m_senderDeviceId;
-}
-
-///
-/// Sets the ID of the sender's device.
-///
-/// The ID must be at least 1 and at most
-/// \c std::numeric_limits<int32_t>::max().
-///
-/// \param id sender's device ID
-///
-void QXmppOmemoElement::setSenderDeviceId(uint32_t id)
-{
- m_senderDeviceId = id;
-}
-
-///
-/// Returns the payload which consists of the encrypted SCE envelope.
-///
-/// \return the encrypted payload
-///
-QByteArray QXmppOmemoElement::payload() const
-{
- return m_payload;
-}
-
-///
-/// Sets the payload which consists of the encrypted SCE envelope.
-///
-/// \param payload encrypted payload
-///
-void QXmppOmemoElement::setPayload(const QByteArray &payload)
-{
- m_payload = payload;
-}
-
-///
-/// Searches for an OMEMO envelope by its recipient JID and device ID.
-///
-/// \param recipientJid bare JID of the recipient
-/// \param recipientDeviceId ID of the recipient's device
-///
-/// \return the found OMEMO envelope
-///
-std::optional<QXmppOmemoEnvelope> QXmppOmemoElement::searchEnvelope(const QString &recipientJid, uint32_t recipientDeviceId) const
-{
- for (auto itr = m_envelopes.constFind(recipientJid); itr != m_envelopes.constEnd() && itr.key() == recipientJid; ++itr) {
- const auto &envelope = itr.value();
- if (envelope.recipientDeviceId() == recipientDeviceId) {
- return envelope;
- }
- }
-
- return std::nullopt;
-}
-
-///
-/// Adds an OMEMO envelope.
-///
-/// If a full JID is passed as recipientJid, it is converted into a bare JID.
-///
-/// \see QXmppOmemoEnvelope
-///
-/// \param recipientJid bare JID of the recipient
-/// \param envelope OMEMO envelope
-///
-void QXmppOmemoElement::addEnvelope(const QString &recipientJid, const QXmppOmemoEnvelope &envelope)
-{
- m_envelopes.insert(QXmppUtils::jidToBareJid(recipientJid), envelope);
-}
-
-void QXmppOmemoElement::parse(const QDomElement &element)
-{
- const auto header = element.firstChildElement(QStringLiteral("header"));
-
- m_senderDeviceId = header.attribute(QStringLiteral("sid")).toInt();
-
- for (auto recipient = header.firstChildElement(QStringLiteral("keys"));
- !recipient.isNull();
- recipient = recipient.nextSiblingElement(QStringLiteral("keys"))) {
- const auto recipientJid = recipient.attribute(QStringLiteral("jid"));
-
- for (auto envelope = recipient.firstChildElement(QStringLiteral("key"));
- !envelope.isNull();
- envelope = envelope.nextSiblingElement(QStringLiteral("key"))) {
- QXmppOmemoEnvelope omemoEnvelope;
- omemoEnvelope.parse(envelope);
- addEnvelope(recipientJid, omemoEnvelope);
- }
- }
-
- m_payload = QByteArray::fromBase64(element.firstChildElement(QStringLiteral("payload")).text().toLatin1());
-}
-
-void QXmppOmemoElement::toXml(QXmlStreamWriter *writer) const
-{
- writer->writeStartElement(QStringLiteral("encrypted"));
- writer->writeDefaultNamespace(ns_omemo_2);
-
- writer->writeStartElement(QStringLiteral("header"));
- writer->writeAttribute(QStringLiteral("sid"), QString::number(m_senderDeviceId));
-
- const auto recipientJids = m_envelopes.uniqueKeys();
- for (const auto &recipientJid : recipientJids) {
- writer->writeStartElement(QStringLiteral("keys"));
- writer->writeAttribute(QStringLiteral("jid"), recipientJid);
-
- for (auto itr = m_envelopes.constFind(recipientJid); itr != m_envelopes.constEnd() && itr.key() == recipientJid; ++itr) {
- const auto &envelope = itr.value();
- envelope.toXml(writer);
- }
-
- writer->writeEndElement(); // keys
- }
-
- writer->writeEndElement(); // header
-
- // The payload element is only included if there is a payload.
- // An empty OMEMO message does not contain a payload.
- if (!m_payload.isEmpty()) {
- writer->writeTextElement(QStringLiteral("payload"), m_payload.toBase64());
- }
-
- writer->writeEndElement(); // encrypted
-}
-
-///
-/// Determines whether the given DOM element is an OMEMO element.
-///
-/// \param element DOM element being checked
-///
-/// \return true if element is an OMEMO element, otherwise false
-///
-bool QXmppOmemoElement::isOmemoElement(const QDomElement &element)
-{
- return element.tagName() == QStringLiteral("encrypted") &&
- element.namespaceURI() == ns_omemo_2;
-}
-
-///
/// \class QXmppOmemoIq
///
/// \brief The QXmppOmemoIq class represents an encrypted IQ stanza as defined
diff --git a/src/base/QXmppOmemoDeviceBundle_p.h b/src/omemo/QXmppOmemoDeviceBundle_p.h
index 49506e86..49506e86 100644
--- a/src/base/QXmppOmemoDeviceBundle_p.h
+++ b/src/omemo/QXmppOmemoDeviceBundle_p.h
diff --git a/src/base/QXmppOmemoDeviceElement_p.h b/src/omemo/QXmppOmemoDeviceElement_p.h
index 1c391e30..1c391e30 100644
--- a/src/base/QXmppOmemoDeviceElement_p.h
+++ b/src/omemo/QXmppOmemoDeviceElement_p.h
diff --git a/src/base/QXmppOmemoDeviceList_p.h b/src/omemo/QXmppOmemoDeviceList_p.h
index 76bff435..76bff435 100644
--- a/src/base/QXmppOmemoDeviceList_p.h
+++ b/src/omemo/QXmppOmemoDeviceList_p.h
diff --git a/src/base/QXmppOmemoIq_p.h b/src/omemo/QXmppOmemoIq_p.h
index 15623884..15623884 100644
--- a/src/base/QXmppOmemoIq_p.h
+++ b/src/omemo/QXmppOmemoIq_p.h
diff --git a/src/base/QXmppOmemoItems_p.h b/src/omemo/QXmppOmemoItems_p.h
index 9b816ed8..9b816ed8 100644
--- a/src/base/QXmppOmemoItems_p.h
+++ b/src/omemo/QXmppOmemoItems_p.h
diff --git a/src/client/QXmppOmemoManager.cpp b/src/omemo/QXmppOmemoManager.cpp
index cb66a515..cb66a515 100644
--- a/src/client/QXmppOmemoManager.cpp
+++ b/src/omemo/QXmppOmemoManager.cpp
diff --git a/src/client/QXmppOmemoManager.h b/src/omemo/QXmppOmemoManager.h
index 91d57799..cc957e73 100644
--- a/src/client/QXmppOmemoManager.h
+++ b/src/omemo/QXmppOmemoManager.h
@@ -11,13 +11,14 @@
#include "QXmppPubSubEventHandler.h"
#include "QXmppPubSubManager.h"
#include "QXmppTrustSecurityPolicy.h"
+#include "qxmppomemo_export.h"
class QXmppOmemoDevicePrivate;
class QXmppOmemoManagerPrivate;
class QXmppOmemoOwnDevicePrivate;
class QXmppOmemoStorage;
-class QXMPP_EXPORT QXmppOmemoOwnDevice
+class QXMPPOMEMO_EXPORT QXmppOmemoOwnDevice
{
public:
QXmppOmemoOwnDevice();
@@ -38,7 +39,7 @@ private:
QSharedDataPointer<QXmppOmemoOwnDevicePrivate> d;
};
-class QXMPP_EXPORT QXmppOmemoDevice
+class QXMPPOMEMO_EXPORT QXmppOmemoDevice
{
public:
QXmppOmemoDevice();
@@ -65,7 +66,7 @@ private:
QSharedDataPointer<QXmppOmemoDevicePrivate> d;
};
-class QXMPP_EXPORT QXmppOmemoManager : public QXmppClientExtension, public QXmppE2eeExtension, public QXmppPubSubEventHandler, public QXmppMessageHandler
+class QXMPPOMEMO_EXPORT QXmppOmemoManager : public QXmppClientExtension, public QXmppE2eeExtension, public QXmppPubSubEventHandler, public QXmppMessageHandler
{
Q_OBJECT
diff --git a/src/client/QXmppOmemoManager_p.cpp b/src/omemo/QXmppOmemoManager_p.cpp
index 2f8ca00d..2f8ca00d 100644
--- a/src/client/QXmppOmemoManager_p.cpp
+++ b/src/omemo/QXmppOmemoManager_p.cpp
diff --git a/src/client/QXmppOmemoManager_p.h b/src/omemo/QXmppOmemoManager_p.h
index 7f697ed2..7f697ed2 100644
--- a/src/client/QXmppOmemoManager_p.h
+++ b/src/omemo/QXmppOmemoManager_p.h
diff --git a/src/client/QXmppOmemoMemoryStorage.cpp b/src/omemo/QXmppOmemoMemoryStorage.cpp
index 6ff81002..6ff81002 100644
--- a/src/client/QXmppOmemoMemoryStorage.cpp
+++ b/src/omemo/QXmppOmemoMemoryStorage.cpp
diff --git a/src/client/QXmppOmemoMemoryStorage.h b/src/omemo/QXmppOmemoMemoryStorage.h
index dc935de6..9e2c89c6 100644
--- a/src/client/QXmppOmemoMemoryStorage.h
+++ b/src/omemo/QXmppOmemoMemoryStorage.h
@@ -5,14 +5,14 @@
#ifndef QXMPPOMEMOMEMORYSTORAGE_H
#define QXMPPOMEMOMEMORYSTORAGE_H
-#include "QXmppGlobal.h"
#include "QXmppOmemoStorage.h"
+#include "qxmppomemo_export.h"
#include <memory>
class QXmppOmemoMemoryStoragePrivate;
-class QXMPP_EXPORT QXmppOmemoMemoryStorage : public QXmppOmemoStorage
+class QXMPPOMEMO_EXPORT QXmppOmemoMemoryStorage : public QXmppOmemoStorage
{
public:
QXmppOmemoMemoryStorage();
diff --git a/src/client/QXmppOmemoStorage.cpp b/src/omemo/QXmppOmemoStorage.cpp
index 97b66dbe..97b66dbe 100644
--- a/src/client/QXmppOmemoStorage.cpp
+++ b/src/omemo/QXmppOmemoStorage.cpp
diff --git a/src/client/QXmppOmemoStorage.h b/src/omemo/QXmppOmemoStorage.h
index 6c1388b4..e3139544 100644
--- a/src/client/QXmppOmemoStorage.h
+++ b/src/omemo/QXmppOmemoStorage.h
@@ -5,14 +5,14 @@
#ifndef QXMPPOMEMOSTORAGE_H
#define QXMPPOMEMOSTORAGE_H
-#include "QXmppGlobal.h"
+#include "qxmppomemo_export.h"
#include <optional>
#include <QDateTime>
#include <QFuture>
-class QXMPP_EXPORT QXmppOmemoStorage
+class QXMPPOMEMO_EXPORT QXmppOmemoStorage
{
public:
///