aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMelvin Keskin <melvo@olomono.de>2021-09-02 23:27:45 +0200
committerLinus Jahn <lnj@kaidan.im>2021-09-03 16:16:14 +0200
commit2ccc8d2d7033bb7180638ec8f980b904cfe3d686 (patch)
tree89b6bf5d82bb95e9070a04dd0dd45382f28e2544
parent7587dfafe8917fccf5917682a7e5e9657cfa6d08 (diff)
downloadqxmpp-2ccc8d2d7033bb7180638ec8f980b904cfe3d686.tar.gz
Add QXmppOmemoDeviceList
Co-authored-by: Germán Márquez Mejía <mancho@olomono.de>
-rw-r--r--src/CMakeLists.txt1
-rw-r--r--src/base/QXmppOmemoData.cpp71
-rw-r--r--src/base/QXmppOmemoDeviceList.h55
-rw-r--r--tests/qxmppomemodata/tst_qxmppomemodata.cpp62
4 files changed, 189 insertions, 0 deletions
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 <QDomElement>
@@ -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<QXmppOmemoDeviceElement>
+{
+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 <QObject>
@@ -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<QByteArray>("xml");
+ QTest::addColumn<bool>("isValid");
+
+ QTest::newRow("valid")
+ << QByteArrayLiteral("<devices xmlns=\"urn:xmpp:omemo:1\"/>")
+ << true;
+ QTest::newRow("invalidTag")
+ << QByteArrayLiteral("<invalid xmlns=\"urn:xmpp:omemo:1\"/>")
+ << false;
+ QTest::newRow("invalidNamespace")
+ << QByteArrayLiteral("<devices xmlns=\"invalid\"/>")
+ << 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(
+ "<devices xmlns=\"urn:xmpp:omemo:1\">"
+ "<device id=\"12345\"/>"
+ "<device id=\"4223\" label=\"Gajim on Ubuntu Linux\"/>"
+ "</devices>"));
+
+ 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"