diff options
Diffstat (limited to 'src/websockets')
-rw-r--r-- | src/websockets/doc/src/qtwebsockets-module.qdoc | 4 | ||||
-rw-r--r-- | src/websockets/qsslserver.cpp | 1 | ||||
-rw-r--r-- | src/websockets/qsslserver_p.h | 2 | ||||
-rw-r--r-- | src/websockets/qwebsocket.cpp | 22 | ||||
-rw-r--r-- | src/websockets/qwebsocket.h | 1 | ||||
-rw-r--r-- | src/websockets/qwebsocket_p.cpp | 31 | ||||
-rw-r--r-- | src/websockets/qwebsocket_p.h | 2 | ||||
-rw-r--r-- | src/websockets/qwebsockethandshakeresponse.cpp | 2 | ||||
-rw-r--r-- | src/websockets/qwebsocketserver.cpp | 23 | ||||
-rw-r--r-- | src/websockets/qwebsocketserver.h | 1 | ||||
-rw-r--r-- | src/websockets/qwebsocketserver_p.cpp | 2 | ||||
-rw-r--r-- | src/websockets/websockets.pro | 2 |
12 files changed, 71 insertions, 22 deletions
diff --git a/src/websockets/doc/src/qtwebsockets-module.qdoc b/src/websockets/doc/src/qtwebsockets-module.qdoc index 6c717f4..971e22c 100644 --- a/src/websockets/doc/src/qtwebsockets-module.qdoc +++ b/src/websockets/doc/src/qtwebsockets-module.qdoc @@ -48,7 +48,7 @@ */ /*! - \qmlmodule QtWebSockets 1.0 + \qmlmodule QtWebSockets 1.1 \title Qt WebSockets QML Types \ingroup qmlmodules \brief Provides QML types for WebSocket-based communication. @@ -56,7 +56,7 @@ The QML types are accessed by using: \code - import QtWebSockets 1.0 + import QtWebSockets 1.1 \endcode \note Prior to Qt 5.5, the import statement was \c{import Qt.WebSockets 1.0} diff --git a/src/websockets/qsslserver.cpp b/src/websockets/qsslserver.cpp index 41db66a..5df59f7 100644 --- a/src/websockets/qsslserver.cpp +++ b/src/websockets/qsslserver.cpp @@ -119,6 +119,7 @@ void QSslServer::incomingConnection(qintptr socket) connect(pSslSocket, static_cast<sslErrorsSignal>(&QSslSocket::sslErrors), this, &QSslServer::sslErrors); connect(pSslSocket, &QSslSocket::encrypted, this, &QSslServer::newEncryptedConnection); + connect(pSslSocket, &QSslSocket::preSharedKeyAuthenticationRequired, this, &QSslServer::preSharedKeyAuthenticationRequired); addPendingConnection(pSslSocket); diff --git a/src/websockets/qsslserver_p.h b/src/websockets/qsslserver_p.h index 538e3b5..d5e581a 100644 --- a/src/websockets/qsslserver_p.h +++ b/src/websockets/qsslserver_p.h @@ -54,6 +54,7 @@ #include <QtNetwork/QTcpServer> #include <QtNetwork/QSslError> #include <QtNetwork/QSslConfiguration> +#include <QtNetwork/QSslPreSharedKeyAuthenticator> #include <QtCore/QList> QT_BEGIN_NAMESPACE @@ -74,6 +75,7 @@ Q_SIGNALS: void sslErrors(const QList<QSslError> &errors); void peerVerifyError(const QSslError &error); void newEncryptedConnection(); + void preSharedKeyAuthenticationRequired(QSslPreSharedKeyAuthenticator *authenticator); protected: virtual void incomingConnection(qintptr socket); diff --git a/src/websockets/qwebsocket.cpp b/src/websockets/qwebsocket.cpp index 90973d6..ba343e4 100644 --- a/src/websockets/qwebsocket.cpp +++ b/src/websockets/qwebsocket.cpp @@ -239,6 +239,28 @@ not been filled in with new information when the signal returns. QWebSocket::ignoreSslErrors() will have no effect. */ /*! + \fn void QWebSocket::preSharedKeyAuthenticationRequired(QSslPreSharedKeyAuthenticator *authenticator) + \since 5.8 + + This signal is emitted if the SSL/TLS handshake negotiates a PSK + ciphersuite, and therefore a PSK authentication is then required. + + When using PSK, the client must send to the server a valid identity and a + valid pre shared key, in order for the SSL handshake to continue. + Applications can provide this information in a slot connected to this + signal, by filling in the passed \a authenticator object according to their + needs. + + \note Ignoring this signal, or failing to provide the required credentials, + will cause the handshake to fail, and therefore the connection to be aborted. + + \note The \a authenticator object is owned by the websocket and must not be + deleted by the application. + + \sa QSslPreSharedKeyAuthenticator + \sa QSslSocket::preSharedKeyAuthenticationRequired() +*/ +/*! \fn void QWebSocket::pong(quint64 elapsedTime, const QByteArray &payload) Emitted when a pong message is received in reply to a previous ping. diff --git a/src/websockets/qwebsocket.h b/src/websockets/qwebsocket.h index e6c2473..cbe53ca 100644 --- a/src/websockets/qwebsocket.h +++ b/src/websockets/qwebsocket.h @@ -142,6 +142,7 @@ Q_SIGNALS: #ifndef QT_NO_SSL void sslErrors(const QList<QSslError> &errors); + void preSharedKeyAuthenticationRequired(QSslPreSharedKeyAuthenticator *authenticator); #endif private: diff --git a/src/websockets/qwebsocket_p.cpp b/src/websockets/qwebsocket_p.cpp index be8cb88..8f55e24 100644 --- a/src/websockets/qwebsocket_p.cpp +++ b/src/websockets/qwebsocket_p.cpp @@ -60,6 +60,7 @@ #ifndef QT_NO_SSL #include <QtNetwork/QSslConfiguration> #include <QtNetwork/QSslError> +#include <QtNetwork/QSslPreSharedKeyAuthenticator> #endif #include <QtCore/QDebug> @@ -304,11 +305,9 @@ QWebSocket *QWebSocketPrivate::upgradeFrom(QTcpSocket *pTcpSocket, QWebSocket *pWebSocket = new QWebSocket(pTcpSocket, response.acceptedVersion(), parent); if (Q_LIKELY(pWebSocket)) { QNetworkRequest netRequest(request.requestUrl()); - QMapIterator<QString, QString> headerIter(request.headers()); - while (headerIter.hasNext()) { - headerIter.next(); - netRequest.setRawHeader(headerIter.key().toLatin1(), headerIter.value().toLatin1()); - } + const auto headers = request.headers(); + for (auto it = headers.begin(), end = headers.end(); it != end; ++it) + netRequest.setRawHeader(it.key().toLatin1(), it.value().toLatin1()); #ifndef QT_NO_SSL if (QSslSocket *sslSock = qobject_cast<QSslSocket *>(pTcpSocket)) pWebSocket->setSslConfiguration(sslSock->sslConfiguration()); @@ -592,6 +591,8 @@ void QWebSocketPrivate::makeConnections(const QTcpSocket *pTcpSocket) #ifndef QT_NO_SSL const QSslSocket * const sslSocket = qobject_cast<const QSslSocket *>(pTcpSocket); if (sslSocket) { + QObject::connect(sslSocket, &QSslSocket::preSharedKeyAuthenticationRequired, q, + &QWebSocket::preSharedKeyAuthenticationRequired); QObject::connect(sslSocket, &QSslSocket::encryptedBytesWritten, q, &QWebSocket::bytesWritten); typedef void (QSslSocket:: *sslErrorSignalType)(const QList<QSslError> &); @@ -708,12 +709,11 @@ QByteArray QWebSocketPrivate::getFrameHeader(QWebSocketProtocol::OpCode opCode, bool lastFrame) { QByteArray header; - quint8 byte = 0x00; bool ok = payloadLength <= 0x7FFFFFFFFFFFFFFFULL; if (Q_LIKELY(ok)) { //FIN, RSV1-3, opcode (RSV-1, RSV-2 and RSV-3 are zero) - byte = static_cast<quint8>((opCode & 0x0F) | (lastFrame ? 0x80 : 0x00)); + quint8 byte = static_cast<quint8>((opCode & 0x0F) | (lastFrame ? 0x80 : 0x00)); header.append(static_cast<char>(byte)); byte = 0x00; @@ -773,7 +773,6 @@ qint64 QWebSocketPrivate::doWriteFrames(const QByteArray &data, bool isBinary) if (Q_UNLIKELY(numFrames == 0)) numFrames = 1; quint64 currentPosition = 0; - qint64 bytesWritten = 0; quint64 bytesLeft = data.size(); for (int i = 0; i < numFrames; ++i) { @@ -789,7 +788,7 @@ qint64 QWebSocketPrivate::doWriteFrames(const QByteArray &data, bool isBinary) : QWebSocketProtocol::OpCodeContinue; //write header - bytesWritten += m_pSocket->write(getFrameHeader(opcode, size, maskingKey, isLastFrame)); + m_pSocket->write(getFrameHeader(opcode, size, maskingKey, isLastFrame)); //write payload if (Q_LIKELY(size > 0)) { @@ -798,7 +797,6 @@ qint64 QWebSocketPrivate::doWriteFrames(const QByteArray &data, bool isBinary) QWebSocketProtocol::mask(currentData, size, maskingKey); qint64 written = m_pSocket->write(currentData, static_cast<qint64>(size)); if (Q_LIKELY(written > 0)) { - bytesWritten += written; payloadWritten += written; } else { m_pSocket->flush(); @@ -881,7 +879,7 @@ qint64 QWebSocketPrivate::writeFrame(const QByteArray &frame) /*! \internal */ -QString readLine(QTcpSocket *pSocket) +static QString readLine(QTcpSocket *pSocket) { Q_ASSERT(pSocket); QString line; @@ -1087,7 +1085,8 @@ void QWebSocketPrivate::processStateChanged(QAbstractSocket::SocketState socketS m_key = generateKey(); QList<QPair<QString, QString> > headers; - foreach (const QByteArray &key, m_request.rawHeaderList()) + const auto keys = m_request.rawHeaderList(); + for (const QByteArray &key : keys) headers << qMakePair(QString::fromLatin1(key), QString::fromLatin1(m_request.rawHeader(key))); @@ -1203,7 +1202,7 @@ QString QWebSocketPrivate::createHandShakeRequest(QString resourceName, QString extensions, QString protocols, QByteArray key, - QList<QPair<QString, QString> > headers) + const QList<QPair<QString, QString> > &headers) { QStringList handshakeRequest; if (resourceName.contains(QStringLiteral("\r\n"))) { @@ -1246,11 +1245,9 @@ QString QWebSocketPrivate::createHandShakeRequest(QString resourceName, if (protocols.length() > 0) handshakeRequest << QStringLiteral("Sec-WebSocket-Protocol: ") % protocols; - QListIterator<QPair<QString, QString> > headerIter(headers); - while (headerIter.hasNext()) { - const QPair<QString,QString> &header = headerIter.next(); + for (const auto &header : headers) handshakeRequest << header.first % QStringLiteral(": ") % header.second; - } + handshakeRequest << QStringLiteral("\r\n"); return handshakeRequest.join(QStringLiteral("\r\n")); diff --git a/src/websockets/qwebsocket_p.h b/src/websockets/qwebsocket_p.h index 139c7ff..4863de7 100644 --- a/src/websockets/qwebsocket_p.h +++ b/src/websockets/qwebsocket_p.h @@ -193,7 +193,7 @@ private: QString extensions, QString protocols, QByteArray key, - QList<QPair<QString, QString> > headers); + const QList<QPair<QString, QString> > &headers); static QWebSocket *upgradeFrom(QTcpSocket *tcpSocket, const QWebSocketHandshakeRequest &request, diff --git a/src/websockets/qwebsockethandshakeresponse.cpp b/src/websockets/qwebsockethandshakeresponse.cpp index b5e1052..ee57d5c 100644 --- a/src/websockets/qwebsockethandshakeresponse.cpp +++ b/src/websockets/qwebsockethandshakeresponse.cpp @@ -207,7 +207,7 @@ QString QWebSocketHandshakeResponse::getHandshakeResponse( if (Q_UNLIKELY(!m_canUpgrade)) { response << QStringLiteral("HTTP/1.1 400 Bad Request"); QStringList versions; - Q_FOREACH (QWebSocketProtocol::Version version, supportedVersions) + for (QWebSocketProtocol::Version version : supportedVersions) versions << QString::number(static_cast<int>(version)); response << QStringLiteral("Sec-WebSocket-Version: ") % versions.join(QStringLiteral(", ")); diff --git a/src/websockets/qwebsocketserver.cpp b/src/websockets/qwebsocketserver.cpp index ab5da31..f8ecdf2 100644 --- a/src/websockets/qwebsocketserver.cpp +++ b/src/websockets/qwebsocketserver.cpp @@ -193,6 +193,29 @@ */ /*! + \fn void QWebSocketServer::preSharedKeyAuthenticationRequired(QSslPreSharedKeyAuthenticator *authenticator) + \since 5.8 + + QWebSocketServer emits this signal when it negotiates a PSK ciphersuite, and + therefore a PSK authentication is then required. + + When using PSK, the client must send to the server a valid identity and a + valid pre shared key, in order for the SSL handshake to continue. + Applications can provide this information in a slot connected to this + signal, by filling in the passed \a authenticator object according to their + needs. + + \note Ignoring this signal, or failing to provide the required credentials, + will cause the handshake to fail, and therefore the connection to be aborted. + + \note The \a authenticator object is owned by the socket and must not be + deleted by the application. + + \sa QSslPreSharedKeyAuthenticator + \sa QSslSocket::preSharedKeyAuthenticationRequired() +*/ + +/*! \enum QWebSocketServer::SslMode Indicates whether the server operates over wss (SecureMode) or ws (NonSecureMode) diff --git a/src/websockets/qwebsocketserver.h b/src/websockets/qwebsocketserver.h index 58a3d54..47113e4 100644 --- a/src/websockets/qwebsocketserver.h +++ b/src/websockets/qwebsocketserver.h @@ -128,6 +128,7 @@ Q_SIGNALS: #ifndef QT_NO_SSL void peerVerifyError(const QSslError &error); void sslErrors(const QList<QSslError> &errors); + void preSharedKeyAuthenticationRequired(QSslPreSharedKeyAuthenticator *authenticator); #endif void closed(); }; diff --git a/src/websockets/qwebsocketserver_p.cpp b/src/websockets/qwebsocketserver_p.cpp index 288c05b..91bfafc 100644 --- a/src/websockets/qwebsocketserver_p.cpp +++ b/src/websockets/qwebsocketserver_p.cpp @@ -104,6 +104,8 @@ void QWebSocketServerPrivate::init() q_ptr, &QWebSocketServer::peerVerifyError); QObject::connect(pSslServer, &QSslServer::sslErrors, q_ptr, &QWebSocketServer::sslErrors); + QObject::connect(pSslServer, &QSslServer::preSharedKeyAuthenticationRequired, + q_ptr, &QWebSocketServer::preSharedKeyAuthenticationRequired); } #else qFatal("SSL not supported on this platform."); diff --git a/src/websockets/websockets.pro b/src/websockets/websockets.pro index b9a513b..e4366ba 100644 --- a/src/websockets/websockets.pro +++ b/src/websockets/websockets.pro @@ -40,7 +40,7 @@ SOURCES += \ $$PWD/qmaskgenerator.cpp \ $$PWD/qdefaultmaskgenerator_p.cpp -contains(QT_CONFIG, ssl) | contains(QT_CONFIG, openssl) | contains(QT_CONFIG, openssl-linked) { +qtConfig(ssl) { SOURCES += $$PWD/qsslserver.cpp PRIVATE_HEADERS += $$PWD/qsslserver_p.h } |