diff options
| author | Linus Jahn <lnj@kaidan.im> | 2022-05-31 12:22:48 +0200 |
|---|---|---|
| committer | Linus Jahn <lnj@kaidan.im> | 2022-08-13 15:55:03 +0200 |
| commit | f0e0e1cd227c08ffd97aa42813a479b8c3ca6d23 (patch) | |
| tree | 12ca6aefdef9195ee8937406db86e73cf1a5f820 /src | |
| parent | 87df8a8dda385558d39639ce09e2717974264ab6 (diff) | |
| download | qxmpp-f0e0e1cd227c08ffd97aa42813a479b8c3ca6d23.tar.gz | |
Split up OMEMO into extra module
Diffstat (limited to 'src')
| -rw-r--r-- | src/CMakeLists.txt | 36 | ||||
| -rw-r--r-- | src/base/QXmppOmemoDataBase.cpp | 290 | ||||
| -rw-r--r-- | src/base/QXmppOmemoElement_p.h | 2 | ||||
| -rw-r--r-- | src/base/QXmppOmemoEnvelope_p.h | 2 | ||||
| -rw-r--r-- | src/omemo/CMakeLists.txt | 91 | ||||
| -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.in | 12 | ||||
| -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: /// |
