aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMelvin Keskin <melvo@olomono.de>2021-09-02 23:24:07 +0200
committerLinus Jahn <lnj@kaidan.im>2021-09-03 16:16:06 +0200
commit7587dfafe8917fccf5917682a7e5e9657cfa6d08 (patch)
tree5340e7e8a9a1e4c8582eeb08a5bcd2b59dd6df9a
parentd422c44bb0e908a56058caf1cfdd605756ca6b64 (diff)
downloadqxmpp-7587dfafe8917fccf5917682a7e5e9657cfa6d08.tar.gz
Add QXmppOmemoDeviceElement
Co-authored-by: Germán Márquez Mejía <mancho@olomono.de>
-rw-r--r--src/CMakeLists.txt3
-rw-r--r--src/base/QXmppConstants.cpp1
-rw-r--r--src/base/QXmppConstants_p.h1
-rw-r--r--src/base/QXmppOmemoData.cpp162
-rw-r--r--src/base/QXmppOmemoDeviceElement.h65
-rw-r--r--tests/CMakeLists.txt1
-rw-r--r--tests/qxmppomemodata/tst_qxmppomemodata.cpp105
7 files changed, 337 insertions, 1 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 216126ca..6173b871 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/QXmppOmemoDeviceElement.h
base/QXmppPingIq.h
base/QXmppPresence.h
base/QXmppPubSubAffiliation.h
@@ -144,6 +145,7 @@ set(SOURCE_FILES
base/QXmppMucIq.cpp
base/QXmppNonza.cpp
base/QXmppNonSASLAuth.cpp
+ base/QXmppOmemoData.cpp
base/QXmppPacket.cpp
base/QXmppPingIq.cpp
base/QXmppPresence.cpp
@@ -301,4 +303,3 @@ install(
FILES ${INSTALL_HEADER_FILES}
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/qxmpp"
)
-
diff --git a/src/base/QXmppConstants.cpp b/src/base/QXmppConstants.cpp
index 00b7cabb..db896683 100644
--- a/src/base/QXmppConstants.cpp
+++ b/src/base/QXmppConstants.cpp
@@ -175,6 +175,7 @@ const char* ns_eme = "urn:xmpp:eme:0";
const char* ns_spoiler = "urn:xmpp:spoiler:0";
// XEP-0384: OMEMO Encryption
const char* ns_omemo = "eu.siacs.conversations.axolotl";
+const char* ns_omemo_1 = "urn:xmpp:omemo:1";
// XEP-0405: Mediated Information eXchange (MIX): Participant Server Requirements
const char* ns_mix_pam = "urn:xmpp:mix:pam:1";
const char* ns_mix_roster = "urn:xmpp:mix:roster:0";
diff --git a/src/base/QXmppConstants_p.h b/src/base/QXmppConstants_p.h
index 20f8c6ea..1d55ad03 100644
--- a/src/base/QXmppConstants_p.h
+++ b/src/base/QXmppConstants_p.h
@@ -187,6 +187,7 @@ extern const char* ns_eme;
extern const char* ns_spoiler;
// XEP-0384: OMEMO Encryption
extern const char* ns_omemo;
+extern const char* ns_omemo_1;
// XEP-0405: Mediated Information eXchange (MIX): Participant Server Requirements
extern const char* ns_mix_pam;
extern const char* ns_mix_roster;
diff --git a/src/base/QXmppOmemoData.cpp b/src/base/QXmppOmemoData.cpp
new file mode 100644
index 00000000..c714e8f0
--- /dev/null
+++ b/src/base/QXmppOmemoData.cpp
@@ -0,0 +1,162 @@
+/*
+ * 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.
+ *
+ */
+
+#include "QXmppConstants_p.h"
+#include "QXmppOmemoDeviceElement.h"
+#include "QXmppUtils.h"
+
+#include <QDomElement>
+
+///
+/// \class QXmppOmemoDeviceElement
+///
+/// \brief The QXmppOmemoDeviceElement class represents an element of the
+/// OMEMO device list as defined by \xep{0384, OMEMO Encryption}.
+///
+/// \since QXmpp 1.5
+///
+
+class QXmppOmemoDeviceElementPrivate : public QSharedData
+{
+public:
+ uint32_t id = 0;
+ QString label;
+};
+
+///
+/// Constructs an OMEMO device element.
+///
+QXmppOmemoDeviceElement::QXmppOmemoDeviceElement()
+ : d(new QXmppOmemoDeviceElementPrivate)
+{
+}
+
+///
+/// Constructs a copy of \a other.
+///
+/// \param other
+///
+QXmppOmemoDeviceElement::QXmppOmemoDeviceElement(const QXmppOmemoDeviceElement &other) = default;
+
+QXmppOmemoDeviceElement::~QXmppOmemoDeviceElement() = default;
+
+///
+/// Assigns \a other to this OMEMO device element.
+///
+/// \param other
+///
+QXmppOmemoDeviceElement &QXmppOmemoDeviceElement::operator=(const QXmppOmemoDeviceElement &other) = default;
+
+///
+/// Returns true if the IDs of both elements match.
+///
+bool QXmppOmemoDeviceElement::operator==(const QXmppOmemoDeviceElement &other) const
+{
+ return d->id == other.id();
+}
+
+///
+/// Returns the ID of this device element.
+///
+/// The ID is used to identify a device and fetch its bundle.
+/// The ID is 0 if it is unset.
+///
+/// \see QXmppOmemoDeviceBundle
+///
+/// \return this device element's ID
+///
+uint32_t QXmppOmemoDeviceElement::id() const
+{
+ return d->id;
+}
+
+///
+/// Sets the ID of this device element.
+///
+/// A valid ID must be at least 1 and at most 2^32-1.
+///
+/// \param id this device element's ID
+///
+void QXmppOmemoDeviceElement::setId(const uint32_t id)
+{
+ d->id = id;
+}
+
+///
+/// Returns the label of this device element.
+///
+/// The label is a human-readable string used to identify the device by users.
+/// If no label is set, a default-constructed QString is returned.
+///
+/// \return this device element's label
+///
+QString QXmppOmemoDeviceElement::label() const
+{
+ return d->label;
+}
+
+///
+/// Sets the optional label of this device element.
+///
+/// The label should not contain more than 53 characters.
+///
+/// \param label this device element's label
+///
+void QXmppOmemoDeviceElement::setLabel(const QString &label)
+{
+ d->label = label;
+}
+
+/// \cond
+void QXmppOmemoDeviceElement::parse(const QDomElement &element)
+{
+ d->id = element.attribute("id").toInt();
+ d->label = element.attribute("label");
+}
+
+void QXmppOmemoDeviceElement::toXml(QXmlStreamWriter *writer) const
+{
+ writer->writeStartElement("device");
+
+ writer->writeAttribute("id", QString::number(d->id));
+ if (!d->label.isEmpty()) {
+ writer->writeAttribute("label", d->label);
+ }
+
+ writer->writeEndElement(); // device
+}
+/// \endcond
+
+///
+/// Determines whether the given DOM element is an OMEMO device element.
+///
+/// \param element DOM element being checked
+///
+/// \return true if element is an OMEMO device element, otherwise false
+///
+bool QXmppOmemoDeviceElement::isOmemoDeviceElement(const QDomElement &element)
+{
+ return element.tagName() == QStringLiteral("device") &&
+ element.namespaceURI() == ns_omemo_1;
+}
diff --git a/src/base/QXmppOmemoDeviceElement.h b/src/base/QXmppOmemoDeviceElement.h
new file mode 100644
index 00000000..27ee908d
--- /dev/null
+++ b/src/base/QXmppOmemoDeviceElement.h
@@ -0,0 +1,65 @@
+/*
+ * 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 QXMPPOMEMODEVICEELEMENT_H
+#define QXMPPOMEMODEVICEELEMENT_H
+
+#include "QXmppGlobal.h"
+
+#include <QSharedDataPointer>
+
+class QDomElement;
+class QXmppOmemoDeviceElementPrivate;
+class QXmlStreamWriter;
+
+class QXMPP_EXPORT QXmppOmemoDeviceElement
+{
+public:
+ QXmppOmemoDeviceElement();
+ QXmppOmemoDeviceElement(const QXmppOmemoDeviceElement &other);
+ ~QXmppOmemoDeviceElement();
+
+ QXmppOmemoDeviceElement &operator=(const QXmppOmemoDeviceElement &other);
+ bool operator==(const QXmppOmemoDeviceElement &other) const;
+
+ uint32_t id() const;
+ void setId(uint32_t id);
+
+ QString label() const;
+ void setLabel(const QString &label);
+
+ /// \cond
+ void parse(const QDomElement &element);
+ void toXml(QXmlStreamWriter *writer) const;
+ /// \endcond
+
+ static bool isOmemoDeviceElement(const QDomElement &element);
+
+private:
+ QSharedDataPointer<QXmppOmemoDeviceElementPrivate> d;
+};
+
+Q_DECLARE_TYPEINFO(QXmppOmemoDeviceElement, Q_MOVABLE_TYPE);
+
+#endif // QXMPPOMEMODEVICEELEMENT_H
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 0b7efc43..8a4f278d 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -36,6 +36,7 @@ add_simple_test(qxmppmessage)
add_simple_test(qxmppmessagereceiptmanager)
add_simple_test(qxmppmixiq)
add_simple_test(qxmppnonsaslauthiq)
+add_simple_test(qxmppomemodata)
add_simple_test(qxmppoutgoingclient)
add_simple_test(qxmpppushenableiq)
add_simple_test(qxmpppresence)
diff --git a/tests/qxmppomemodata/tst_qxmppomemodata.cpp b/tests/qxmppomemodata/tst_qxmppomemodata.cpp
new file mode 100644
index 00000000..4084a8c7
--- /dev/null
+++ b/tests/qxmppomemodata/tst_qxmppomemodata.cpp
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2008-2021 The QXmpp developers
+ *
+ * Authors:
+ * 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.
+ *
+ */
+
+#include "QXmppOmemoDeviceElement.h"
+
+#include "util.h"
+#include <QObject>
+
+class tst_QXmppOmemoData : public QObject
+{
+ Q_OBJECT
+
+private slots:
+ void testIsOmemoDeviceElement_data();
+ void testIsOmemoDeviceElement();
+ void testOmemoDeviceElement_data();
+ void testOmemoDeviceElement();
+};
+
+void tst_QXmppOmemoData::testIsOmemoDeviceElement_data()
+{
+ QTest::addColumn<QByteArray>("xml");
+ QTest::addColumn<bool>("isValid");
+
+ QTest::newRow("valid")
+ << QByteArrayLiteral("<device xmlns=\"urn:xmpp:omemo:1\"/>")
+ << true;
+ QTest::newRow("invalidTag")
+ << QByteArrayLiteral("<invalid xmlns=\"urn:xmpp:omemo:1\"/>")
+ << false;
+ QTest::newRow("invalidNamespace")
+ << QByteArrayLiteral("<device xmlns=\"invalid\"/>")
+ << false;
+}
+
+void tst_QXmppOmemoData::testIsOmemoDeviceElement()
+{
+ QFETCH(QByteArray, xml);
+ QFETCH(bool, isValid);
+
+ QDomDocument doc;
+ QCOMPARE(doc.setContent(xml, true), true);
+ const QDomElement element = doc.documentElement();
+ QCOMPARE(QXmppOmemoDeviceElement::isOmemoDeviceElement(element), isValid);
+}
+
+void tst_QXmppOmemoData::testOmemoDeviceElement_data()
+{
+ QTest::addColumn<QByteArray>("xml");
+ QTest::addColumn<uint32_t>("id");
+ QTest::addColumn<QString>("label");
+
+ QTest::newRow("id")
+ << QByteArrayLiteral("<device id=\"12345\"/>")
+ << uint32_t(12345)
+ << QString();
+ QTest::newRow("idAndLabel")
+ << QByteArrayLiteral("<device id=\"4223\" label=\"Gajim on Ubuntu Linux\"/>")
+ << uint32_t(4223)
+ << QStringLiteral("Gajim on Ubuntu Linux");
+}
+
+void tst_QXmppOmemoData::testOmemoDeviceElement()
+{
+ QFETCH(QByteArray, xml);
+ QFETCH(uint32_t, id);
+ QFETCH(QString, label);
+
+ QXmppOmemoDeviceElement deviceElement1;
+ parsePacket(deviceElement1, xml);
+ QCOMPARE(deviceElement1.id(), id);
+ QCOMPARE(deviceElement1.label(), label);
+ serializePacket(deviceElement1, xml);
+
+ QXmppOmemoDeviceElement deviceElement2;
+ deviceElement2.setId(id);
+ deviceElement2.setLabel(label);
+ QCOMPARE(deviceElement2.id(), id);
+ QCOMPARE(deviceElement2.label(), label);
+ serializePacket(deviceElement2, xml);
+}
+
+QTEST_MAIN(tst_QXmppOmemoData)
+#include "tst_qxmppomemodata.moc"