From 2ccc8d2d7033bb7180638ec8f980b904cfe3d686 Mon Sep 17 00:00:00 2001 From: Melvin Keskin Date: Thu, 2 Sep 2021 23:27:45 +0200 Subject: Add QXmppOmemoDeviceList MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Germán Márquez Mejía --- src/CMakeLists.txt | 1 + src/base/QXmppOmemoData.cpp | 71 +++++++++++++++++++++++++++++ src/base/QXmppOmemoDeviceList.h | 55 ++++++++++++++++++++++ tests/qxmppomemodata/tst_qxmppomemodata.cpp | 62 +++++++++++++++++++++++++ 4 files changed, 189 insertions(+) create mode 100644 src/base/QXmppOmemoDeviceList.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6173b871..bba6b704 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -46,6 +46,7 @@ set(INSTALL_HEADER_FILES base/QXmppMucIq.h base/QXmppNonza.h base/QXmppNonSASLAuth.h + base/QXmppOmemoDeviceList.h base/QXmppOmemoDeviceElement.h base/QXmppPingIq.h base/QXmppPresence.h diff --git a/src/base/QXmppOmemoData.cpp b/src/base/QXmppOmemoData.cpp index c714e8f0..b095ac24 100644 --- a/src/base/QXmppOmemoData.cpp +++ b/src/base/QXmppOmemoData.cpp @@ -24,6 +24,7 @@ #include "QXmppConstants_p.h" #include "QXmppOmemoDeviceElement.h" +#include "QXmppOmemoDeviceList.h" #include "QXmppUtils.h" #include @@ -160,3 +161,73 @@ bool QXmppOmemoDeviceElement::isOmemoDeviceElement(const QDomElement &element) return element.tagName() == QStringLiteral("device") && element.namespaceURI() == ns_omemo_1; } + +/// +/// \class QXmppOmemoDeviceList +/// +/// \brief The QXmppOmemoDeviceList class represents an OMEMO device list +/// as defined by \xep{0384, OMEMO Encryption}. +/// +/// \since QXmpp 1.5 +/// + +/// +/// Constructs an OMEMO device list. +/// +QXmppOmemoDeviceList::QXmppOmemoDeviceList() +{ +} + +/// +/// Constructs a copy of \a other. +/// +/// \param other +/// +QXmppOmemoDeviceList::QXmppOmemoDeviceList(const QXmppOmemoDeviceList &other) = default; + +QXmppOmemoDeviceList::~QXmppOmemoDeviceList() = default; + +/// +/// Assigns \a other to this OMEMO device list. +/// +/// \param other +/// +QXmppOmemoDeviceList &QXmppOmemoDeviceList::operator=(const QXmppOmemoDeviceList &other) = default; + +/// \cond +void QXmppOmemoDeviceList::parse(const QDomElement &element) +{ + for (auto device = element.firstChildElement("device"); + !device.isNull(); + device = device.nextSiblingElement("device")) { + QXmppOmemoDeviceElement deviceElement; + deviceElement.parse(device); + append(deviceElement); + } +} + +void QXmppOmemoDeviceList::toXml(QXmlStreamWriter *writer) const +{ + writer->writeStartElement("devices"); + writer->writeDefaultNamespace(ns_omemo_1); + + for (const auto &device : *this) { + device.toXml(writer); + } + + writer->writeEndElement(); +} +/// \endcond + +/// +/// Determines whether the given DOM element is an OMEMO device list. +/// +/// \param element DOM element being checked +/// +/// \return true if element is an OMEMO device list, otherwise false +/// +bool QXmppOmemoDeviceList::isOmemoDeviceList(const QDomElement &element) +{ + return element.tagName() == QStringLiteral("devices") && + element.namespaceURI() == ns_omemo_1; +} diff --git a/src/base/QXmppOmemoDeviceList.h b/src/base/QXmppOmemoDeviceList.h new file mode 100644 index 00000000..36895486 --- /dev/null +++ b/src/base/QXmppOmemoDeviceList.h @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2008-2021 The QXmpp developers + * + * Author: + * Germán Márquez Mejía + * Melvin Keskin + * + * Source: + * https://github.com/qxmpp-project/qxmpp + * + * This file is a part of QXmpp library. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + */ + +#ifndef QXMPPOMEMODEVICELIST_H +#define QXMPPOMEMODEVICELIST_H + +#include "QXmppGlobal.h" + +#include "QList" + +class QDomElement; +class QXmlStreamWriter; +class QXmppOmemoDeviceElement; + +class QXMPP_EXPORT QXmppOmemoDeviceList : public QList +{ +public: + QXmppOmemoDeviceList(); + QXmppOmemoDeviceList(const QXmppOmemoDeviceList &other); + ~QXmppOmemoDeviceList(); + + QXmppOmemoDeviceList &operator=(const QXmppOmemoDeviceList &other); + + /// \cond + void parse(const QDomElement &element); + void toXml(QXmlStreamWriter *writer) const; + /// \endcond + + static bool isOmemoDeviceList(const QDomElement &element); +}; + +Q_DECLARE_TYPEINFO(QXmppOmemoDeviceList, Q_MOVABLE_TYPE); + +#endif // QXMPPOMEMODEVICELIST_H diff --git a/tests/qxmppomemodata/tst_qxmppomemodata.cpp b/tests/qxmppomemodata/tst_qxmppomemodata.cpp index 4084a8c7..23f65023 100644 --- a/tests/qxmppomemodata/tst_qxmppomemodata.cpp +++ b/tests/qxmppomemodata/tst_qxmppomemodata.cpp @@ -23,6 +23,7 @@ */ #include "QXmppOmemoDeviceElement.h" +#include "QXmppOmemoDeviceList.h" #include "util.h" #include @@ -36,6 +37,9 @@ private slots: void testIsOmemoDeviceElement(); void testOmemoDeviceElement_data(); void testOmemoDeviceElement(); + void testIsOmemoDeviceList_data(); + void testIsOmemoDeviceList(); + void testOmemoDeviceList(); }; void tst_QXmppOmemoData::testIsOmemoDeviceElement_data() @@ -101,5 +105,63 @@ void tst_QXmppOmemoData::testOmemoDeviceElement() serializePacket(deviceElement2, xml); } +void tst_QXmppOmemoData::testIsOmemoDeviceList_data() +{ + QTest::addColumn("xml"); + QTest::addColumn("isValid"); + + QTest::newRow("valid") + << QByteArrayLiteral("") + << true; + QTest::newRow("invalidTag") + << QByteArrayLiteral("") + << false; + QTest::newRow("invalidNamespace") + << QByteArrayLiteral("") + << false; +} + +void tst_QXmppOmemoData::testIsOmemoDeviceList() +{ + QFETCH(QByteArray, xml); + QFETCH(bool, isValid); + + QDomDocument doc; + QCOMPARE(doc.setContent(xml, true), true); + const QDomElement element = doc.documentElement(); + QCOMPARE(QXmppOmemoDeviceList::isOmemoDeviceList(element), isValid); +} + +void tst_QXmppOmemoData::testOmemoDeviceList() +{ + const QByteArray xml(QByteArrayLiteral( + "" + "" + "" + "")); + + QXmppOmemoDeviceElement deviceElement1; + deviceElement1.setId(12345); + + QXmppOmemoDeviceElement deviceElement2; + deviceElement2.setId(4223); + deviceElement2.setLabel(QStringLiteral("Gajim on Ubuntu Linux")); + + QXmppOmemoDeviceList deviceList1; + parsePacket(deviceList1, xml); + QCOMPARE(deviceList1.size(), 2); + QVERIFY(deviceList1.contains(deviceElement1)); + QVERIFY(deviceList1.contains(deviceElement2)); + serializePacket(deviceList1, xml); + + QXmppOmemoDeviceList deviceList2; + deviceList2.append(deviceElement1); + deviceList2.append(deviceElement2); + QCOMPARE(deviceList2.size(), 2); + QVERIFY(deviceList2.contains(deviceElement1)); + QVERIFY(deviceList2.contains(deviceElement2)); + serializePacket(deviceList2, xml); +} + QTEST_MAIN(tst_QXmppOmemoData) #include "tst_qxmppomemodata.moc" -- cgit v1.2.3