diff options
| author | Linus Jahn <lnj@kaidan.im> | 2019-12-14 22:44:20 +0100 |
|---|---|---|
| committer | LNJ <lnj@kaidan.im> | 2020-01-20 17:14:49 +0100 |
| commit | 55966be2e3e80bd5ab2cc86da2492963dd8127ee (patch) | |
| tree | 899f31eda630825df1a00b331efe3c997c9f7808 /src | |
| parent | 8557bc3a605e5d2b1a7dae5999501b19c1c99b58 (diff) | |
| download | qxmpp-55966be2e3e80bd5ab2cc86da2492963dd8127ee.tar.gz | |
Add QXmppStartTlsPacket to replace hard-coded XML in TLS code
Diffstat (limited to 'src')
| -rw-r--r-- | src/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/base/QXmppStartTlsPacket.cpp | 103 | ||||
| -rw-r--r-- | src/base/QXmppStartTlsPacket.h | 62 |
3 files changed, 167 insertions, 0 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index db020e3b..c61d4d48 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -51,6 +51,7 @@ set(INSTALL_HEADER_FILES base/QXmppSessionIq.h base/QXmppSocks.h base/QXmppStanza.h + base/QXmppStartTlsPacket.h base/QXmppStream.h base/QXmppStreamFeatures.h base/QXmppStun.h @@ -135,6 +136,7 @@ set(SOURCE_FILES base/QXmppSessionIq.cpp base/QXmppSocks.cpp base/QXmppStanza.cpp + base/QXmppStartTlsPacket.cpp base/QXmppStream.cpp base/QXmppStreamFeatures.cpp base/QXmppStreamInitiationIq.cpp diff --git a/src/base/QXmppStartTlsPacket.cpp b/src/base/QXmppStartTlsPacket.cpp new file mode 100644 index 00000000..46aafc7d --- /dev/null +++ b/src/base/QXmppStartTlsPacket.cpp @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2008-2019 The QXmpp developers + * + * Authors: + * Linus Jahn + * + * 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 "QXmppStartTlsPacket.h" + +#include "QXmppConstants_p.h" + +#include <QDomElement> +#include <QXmlStreamWriter> + +const static QStringList STARTTLS_TYPES = { + QStringLiteral("starttls"), + QStringLiteral("proceed"), + QStringLiteral("failure") +}; + +/// Constructs a new QXmppStartTlsPacket +/// +/// \param type The type of the new QXmppStartTlsPacket. + +QXmppStartTlsPacket::QXmppStartTlsPacket(Type type) + : m_type(type) +{ +} + +QXmppStartTlsPacket::~QXmppStartTlsPacket() = default; + +/// Returns the type of the STARTTLS packet + +QXmppStartTlsPacket::Type QXmppStartTlsPacket::type() const +{ + return m_type; +} + +/// Sets the type of the STARTTLS packet + +void QXmppStartTlsPacket::setType(QXmppStartTlsPacket::Type type) +{ + m_type = type; +} + +/// \cond +void QXmppStartTlsPacket::parse(const QDomElement &element) +{ + if (!QXmppStartTlsPacket::isStartTlsPacket(element)) + return; + + m_type = Type(STARTTLS_TYPES.indexOf(element.tagName())); +} + +void QXmppStartTlsPacket::toXml(QXmlStreamWriter *writer) const +{ + writer->writeStartElement(STARTTLS_TYPES.at(int(m_type))); + writer->writeAttribute(QStringLiteral("xmlns"), ns_tls); + writer->writeEndElement(); +} +/// \endcond + +/// Checks whether the given \p element is a STARTTLS packet according to +/// <a href="https://xmpp.org/rfcs/rfc6120.html#tls-process-initiate">RFC6120</a>. +/// +/// \param element The element that should be checked for being a STARTTLS packet. +/// +/// \returns True, if the element is a STARTTLS packet. + +bool QXmppStartTlsPacket::isStartTlsPacket(const QDomElement &element) +{ + return element.namespaceURI() == ns_tls && STARTTLS_TYPES.contains(element.tagName()); +} + +/// Checks whether the given \p element is a STARTTLS packet according to +/// <a href="https://xmpp.org/rfcs/rfc6120.html#tls-process-initiate">RFC6120</a> +/// and has the correct type. +/// +/// \param element The element that should be checked for being a STARTTLS packet. +/// \param type The type the element needs to have. +/// +/// \returns True, if the element is a STARTTLS packet and has the correct type. + +bool QXmppStartTlsPacket::isStartTlsPacket(const QDomElement &element, Type type) +{ + return element.namespaceURI() == ns_tls && element.tagName() == STARTTLS_TYPES.at(int(type)); +} diff --git a/src/base/QXmppStartTlsPacket.h b/src/base/QXmppStartTlsPacket.h new file mode 100644 index 00000000..05be4ba8 --- /dev/null +++ b/src/base/QXmppStartTlsPacket.h @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2008-2019 The QXmpp developers + * + * Authors: + * Linus Jahn + * + * 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 QXMPPSTARTTLSPACKET_H +#define QXMPPSTARTTLSPACKET_H + +#include "QXmppStanza.h" + +/// \brief The QXmppStartTlsPacket represents packets used for initiating +/// STARTTLS negotiation when connecting. + +class QXMPP_EXPORT QXmppStartTlsPacket : public QXmppStanza +{ +public: + /// The type of the STARTTLS packet. + enum Type { + StartTls, ///< Used by the client to initiate STARTTLS. + Proceed, ///< Used by the server to accept STARTTLS. + Failure ///< Used by the server to reject STARTTLS. + }; + + QXmppStartTlsPacket(Type type = StartTls); + ~QXmppStartTlsPacket() override; + + Type type() const; + void setType(Type type); + + /// \cond + void parse(const QDomElement &element) override; + void toXml(QXmlStreamWriter *writer) const override; + /// \endcond + + static bool isStartTlsPacket(const QDomElement &element); + static bool isStartTlsPacket(const QDomElement &element, Type type); + +private: + Type m_type; +}; + +Q_DECLARE_METATYPE(QXmppStartTlsPacket::Type); + +#endif // QXMPPSTARTTLSPACKET_H |
