diff options
-rw-r--r-- | .qmake.conf | 2 | ||||
-rw-r--r-- | src/mqtt/qmqttclient.cpp | 20 | ||||
-rw-r--r-- | src/mqtt/qmqttclient.h | 8 | ||||
-rw-r--r-- | src/mqtt/qmqttconnection.cpp | 2 | ||||
-rw-r--r-- | src/mqtt/qmqttconnection_p.h | 3 | ||||
-rw-r--r-- | tests/manual/sslconfiguration/main.cpp | 81 | ||||
-rw-r--r-- | tests/manual/sslconfiguration/sslconfiguration.pro | 15 |
7 files changed, 129 insertions, 2 deletions
diff --git a/.qmake.conf b/.qmake.conf index 7b49e2c..879fb0f 100644 --- a/.qmake.conf +++ b/.qmake.conf @@ -1,4 +1,4 @@ load(qt_build_config) CONFIG += warning_clean -MODULE_VERSION = 5.13.0 +MODULE_VERSION = 5.14.0 diff --git a/src/mqtt/qmqttclient.cpp b/src/mqtt/qmqttclient.cpp index c8fc73f..11d3af3 100644 --- a/src/mqtt/qmqttclient.cpp +++ b/src/mqtt/qmqttclient.cpp @@ -509,17 +509,37 @@ void QMqttClient::connectToHost() } /*! + \obsolete + Initiates an encrypted connection to the MQTT broker. \a sslPeerName specifies the peer name to be passed to the socket. + + This function has been deprecated. Use + \l QMqttClient::connectToHostEncrypted(const QSslConfiguration &conf) instead. */ #ifndef QT_NO_SSL +#if QT_DEPRECATED_SINCE(5, 14) void QMqttClient::connectToHostEncrypted(const QString &sslPeerName) { connectToHost(true, sslPeerName); } #endif +/*! + \since 5.14 + Initiates an encrypted connection to the MQTT broker. + + \a conf specifies the SSL configuration to be used for the connection + */ +void QMqttClient::connectToHostEncrypted(const QSslConfiguration &conf) +{ + Q_D(QMqttClient); + d->m_connection.m_sslConfiguration = conf; + connectToHost(true, QString()); +} +#endif + void QMqttClient::connectToHost(bool encrypted, const QString &sslPeerName) { Q_D(QMqttClient); diff --git a/src/mqtt/qmqttclient.h b/src/mqtt/qmqttclient.h index 92e114b..478c7e8 100644 --- a/src/mqtt/qmqttclient.h +++ b/src/mqtt/qmqttclient.h @@ -42,6 +42,9 @@ #include <QtCore/QObject> #include <QtCore/QSharedPointer> #include <QtNetwork/QTcpSocket> +#ifndef QT_NO_SSL +#include <QtNetwork/QSslConfiguration> +#endif QT_BEGIN_NAMESPACE @@ -127,7 +130,10 @@ public: Q_INVOKABLE void connectToHost(); #ifndef QT_NO_SSL - Q_INVOKABLE void connectToHostEncrypted(const QString &sslPeerName = QString()); +#if QT_DEPRECATED_SINCE(5, 14) + QT_DEPRECATED Q_INVOKABLE void connectToHostEncrypted(const QString &sslPeerName = QString()); /// ### Qt 6: remove +#endif + void connectToHostEncrypted(const QSslConfiguration &conf); #endif Q_INVOKABLE void disconnectFromHost(); diff --git a/src/mqtt/qmqttconnection.cpp b/src/mqtt/qmqttconnection.cpp index 483e6f4..bb27f66 100644 --- a/src/mqtt/qmqttconnection.cpp +++ b/src/mqtt/qmqttconnection.cpp @@ -204,6 +204,8 @@ bool QMqttConnection::ensureTransportOpen(const QString &sslPeerName) return sendControlConnect(); m_internalState = BrokerConnecting; + if (!m_sslConfiguration.isNull()) + socket->setSslConfiguration(m_sslConfiguration); socket->connectToHostEncrypted(m_clientPrivate->m_hostname, m_clientPrivate->m_port, sslPeerName); if (!socket->waitForConnected()) { diff --git a/src/mqtt/qmqttconnection_p.h b/src/mqtt/qmqttconnection_p.h index a14f914..626addc 100644 --- a/src/mqtt/qmqttconnection_p.h +++ b/src/mqtt/qmqttconnection_p.h @@ -107,6 +107,9 @@ public: QMqttClient::TransportType m_transportType{QMqttClient::IODevice}; bool m_ownTransport{false}; QMqttClientPrivate *m_clientPrivate{nullptr}; +#ifndef QT_NO_SSL + QSslConfiguration m_sslConfiguration; +#endif private: Q_DISABLE_COPY(QMqttConnection) void finalize_auth(); diff --git a/tests/manual/sslconfiguration/main.cpp b/tests/manual/sslconfiguration/main.cpp new file mode 100644 index 0000000..61862ec --- /dev/null +++ b/tests/manual/sslconfiguration/main.cpp @@ -0,0 +1,81 @@ +/****************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtMqtt module. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +******************************************************************************/ + +#include <QCoreApplication> +#include <QtMqtt> +#include <QtNetwork> + +int main(int argc, char *argv[]) +{ + QCoreApplication a(argc, argv); + + const bool support = QSslSocket::supportsSsl(); + if (!support) { + qWarning() << "This test requires a Qt build with SSL support."; + return -1; + } + + QSslConfiguration sslConfig; + + // You must download the current certificate from the mosquitto test page + // http://test.mosquitto.org and place it next to the binary. + const auto certs = QSslCertificate::fromPath("mosquitto.org.crt"); + + if (certs.isEmpty()) { + qWarning() << "Could not load certificates"; + return -2; + } + + sslConfig.setCaCertificates(certs); + + QMqttClient client; + + client.setHostname("test.mosquitto.org"); + client.setPort(8883); + + a.connect(&client, &QMqttClient::connected, [&client]() { + qDebug() << "MQTT Client connected, subscribing"; + auto sub = client.subscribe(QLatin1String("some/Topic/foo"), 1); + client.connect(sub, &QMqttSubscription::stateChanged, [] (QMqttSubscription::SubscriptionState s) { + qDebug() << "MQTT Subscription new state:" << s; + if (s == QMqttSubscription::Subscribed) + qInfo() << "Connection and Subscription succeeded, test done."; + }); + }); + + a.connect(&client, &QMqttClient::stateChanged, [](QMqttClient::ClientState s) { + qDebug() << "MQTT State:" << s; + }); + a.connect(&client, &QMqttClient::errorChanged, [](QMqttClient::ClientError e) { + qDebug() << "MQTT Error:" << e; + }); + + client.connectToHostEncrypted(sslConfig); + + return a.exec(); +} diff --git a/tests/manual/sslconfiguration/sslconfiguration.pro b/tests/manual/sslconfiguration/sslconfiguration.pro new file mode 100644 index 0000000..a9e744c --- /dev/null +++ b/tests/manual/sslconfiguration/sslconfiguration.pro @@ -0,0 +1,15 @@ +QT -= gui +QT += network mqtt + +CONFIG += c++11 console +CONFIG -= app_bundle + +DEFINES += QT_DEPRECATED_WARNINGS + +SOURCES += \ + main.cpp + +# Default rules for deployment. +qnx: target.path = /tmp/$${TARGET}/bin +else: unix:!android: target.path = /opt/$${TARGET}/bin +!isEmpty(target.path): INSTALLS += target |