Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qsocks5socketengine_p.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5#ifndef QSOCKS5SOCKETENGINE_P_H
6#define QSOCKS5SOCKETENGINE_P_H
7
8//
9// W A R N I N G
10// -------------
11//
12// This file is not part of the Qt API. It exists purely as an
13// implementation detail. This header file may change from version to
14// version without notice, or even be removed.
15//
16// We mean it.
17//
18
19#include <QtNetwork/private/qtnetworkglobal_p.h>
20
21#include <QtNetwork/qnetworkproxy.h>
22
24
25QT_REQUIRE_CONFIG(socks5);
26
27QT_BEGIN_NAMESPACE
28
29class QSocks5SocketEnginePrivate;
30
31class Q_AUTOTEST_EXPORT QSocks5SocketEngine : public QAbstractSocketEngine
32{
33 Q_OBJECT
34public:
35 QSocks5SocketEngine(QObject *parent = nullptr);
36 ~QSocks5SocketEngine();
37
38 bool initialize(QAbstractSocket::SocketType type, QAbstractSocket::NetworkLayerProtocol protocol = QAbstractSocket::IPv4Protocol) override;
39 bool initialize(qintptr socketDescriptor, QAbstractSocket::SocketState socketState = QAbstractSocket::ConnectedState) override;
40
41 void setProxy(const QNetworkProxy &networkProxy);
42
43 qintptr socketDescriptor() const override;
44
45 bool isValid() const override;
46
47 bool connectInternal();
48 bool connectToHost(const QHostAddress &address, quint16 port) override;
49 bool connectToHostByName(const QString &name, quint16 port) override;
50 bool bind(const QHostAddress &address, quint16 port) override;
51 bool listen(int backlog) override;
52 qintptr accept() override;
53 void close() override;
54
55 qint64 bytesAvailable() const override;
56
57 qint64 read(char *data, qint64 maxlen) override;
58 qint64 write(const char *data, qint64 len) override;
59
60#ifndef QT_NO_UDPSOCKET
61#ifndef QT_NO_NETWORKINTERFACE
62 bool joinMulticastGroup(const QHostAddress &groupAddress,
63 const QNetworkInterface &iface) override;
64 bool leaveMulticastGroup(const QHostAddress &groupAddress,
65 const QNetworkInterface &iface) override;
66 QNetworkInterface multicastInterface() const override;
67 bool setMulticastInterface(const QNetworkInterface &iface) override;
68#endif // QT_NO_NETWORKINTERFACE
69
70 bool hasPendingDatagrams() const override;
71 qint64 pendingDatagramSize() const override;
72#endif // QT_NO_UDPSOCKET
73
74 qint64 readDatagram(char *data, qint64 maxlen, QIpPacketHeader * = nullptr,
75 PacketHeaderOptions = WantNone) override;
76 qint64 writeDatagram(const char *data, qint64 len, const QIpPacketHeader &) override;
77 qint64 bytesToWrite() const override;
78
79 int option(SocketOption option) const override;
80 bool setOption(SocketOption option, int value) override;
81
82 bool waitForRead(QDeadlineTimer deadline = QDeadlineTimer{DefaultTimeout},
83 bool *timedOut = nullptr) override;
84 bool waitForWrite(QDeadlineTimer deadline = QDeadlineTimer{DefaultTimeout},
85 bool *timedOut = nullptr) override;
86 bool waitForReadOrWrite(bool *readyToRead, bool *readyToWrite,
87 bool checkRead, bool checkWrite,
88 QDeadlineTimer deadline = QDeadlineTimer{DefaultTimeout},
89 bool *timedOut = nullptr) override;
90
91 bool isReadNotificationEnabled() const override;
92 void setReadNotificationEnabled(bool enable) override;
93 bool isWriteNotificationEnabled() const override;
94 void setWriteNotificationEnabled(bool enable) override;
95 bool isExceptionNotificationEnabled() const override;
96 void setExceptionNotificationEnabled(bool enable) override;
97
98private:
99 Q_DECLARE_PRIVATE(QSocks5SocketEngine)
100 Q_DISABLE_COPY_MOVE(QSocks5SocketEngine)
101 Q_PRIVATE_SLOT(d_func(), void _q_controlSocketConnected())
102 Q_PRIVATE_SLOT(d_func(), void _q_controlSocketReadNotification())
103 Q_PRIVATE_SLOT(d_func(), void _q_controlSocketErrorOccurred(QAbstractSocket::SocketError))
104#ifndef QT_NO_UDPSOCKET
105 Q_PRIVATE_SLOT(d_func(), void _q_udpSocketReadNotification())
106#endif
107 Q_PRIVATE_SLOT(d_func(), void _q_controlSocketBytesWritten())
108 Q_PRIVATE_SLOT(d_func(), void _q_emitPendingReadNotification())
109 Q_PRIVATE_SLOT(d_func(), void _q_emitPendingWriteNotification())
110 Q_PRIVATE_SLOT(d_func(), void _q_emitPendingConnectionNotification())
111 Q_PRIVATE_SLOT(d_func(), void _q_controlSocketDisconnected())
112 Q_PRIVATE_SLOT(d_func(), void _q_controlSocketStateChanged(QAbstractSocket::SocketState))
113
114};
115
116
117class QTcpSocket;
118
120{
121public:
123 virtual ~QSocks5Authenticator();
124 virtual char methodId();
125 virtual bool beginAuthenticate(QTcpSocket *socket, bool *completed);
126 virtual bool continueAuthenticate(QTcpSocket *socket, bool *completed);
127
128 bool seal(const QByteArray &buf, QByteArray *sealedBuf);
129 bool unSeal(const QByteArray &sealedBuf, QByteArray *buf);
130 bool unSeal(QTcpSocket *sealedSocket, QByteArray *buf);
131
132 virtual QString errorString() { return QString(); }
133};
134
136{
137public:
138 QSocks5PasswordAuthenticator(const QString &userName, const QString &password);
139 char methodId() override;
140 bool beginAuthenticate(QTcpSocket *socket, bool *completed) override;
141 bool continueAuthenticate(QTcpSocket *socket, bool *completed) override;
142
143 QString errorString() override;
144
145private:
146 QString userName;
147 QString password;
148};
149
150struct QSocks5Data;
151struct QSocks5ConnectData;
153struct QSocks5BindData;
154
156{
157 Q_DECLARE_PUBLIC(QSocks5SocketEngine)
158public:
161
179
188
202
203 void initialize(Socks5Mode socks5Mode);
204
205 void setErrorState(Socks5State state, const QString &extraMessage = QString());
206 void setErrorState(Socks5State state, Socks5Error socks5error);
207
208 void reauthenticate();
211 void sendRequestMethod();
214
215 bool waitForConnected(QDeadlineTimer deadline, bool *timedOut);
216
220#ifndef QT_NO_UDPSOCKET
222#endif
226
227 QNetworkProxy proxyInfo;
228
230
232
235#ifndef QT_NO_UDPSOCKET
237#endif
241
244
254};
255
256class Q_AUTOTEST_EXPORT QSocks5SocketEngineHandler : public QSocketEngineHandler
257{
258public:
259 virtual QAbstractSocketEngine *createSocketEngine(QAbstractSocket::SocketType socketType,
260 const QNetworkProxy &, QObject *parent) override;
261 virtual QAbstractSocketEngine *createSocketEngine(qintptr socketDescriptor, QObject *parent) override;
262};
263
264QT_END_NAMESPACE
265
266#endif // QSOCKS5SOCKETENGINE_H
\inmodule QtCore
Definition qmutex.h:346
\inmodule QtCore
Definition qmutex.h:342
virtual bool beginAuthenticate(QTcpSocket *socket, bool *completed)
virtual bool continueAuthenticate(QTcpSocket *socket, bool *completed)
virtual QString errorString()
bool seal(const QByteArray &buf, QByteArray *sealedBuf)
bool unSeal(QTcpSocket *sealedSocket, QByteArray *buf)
bool unSeal(const QByteArray &sealedBuf, QByteArray *buf)
void add(qintptr socketDescriptor, QSocks5BindData *bindData)
QHash< qintptr, QSocks5BindData * > store
void timerEvent(QTimerEvent *event) override
This event handler can be reimplemented in a subclass to receive timer events for the object.
QSocks5BindData * retrieve(qintptr socketDescriptor)
bool contains(qintptr socketDescriptor)
bool beginAuthenticate(QTcpSocket *socket, bool *completed) override
bool continueAuthenticate(QTcpSocket *socket, bool *completed) override
QSocks5PasswordAuthenticator(const QString &userName, const QString &password)
QSocks5UdpAssociateData * udpData
void setErrorState(Socks5State state, const QString &extraMessage=QString())
void _q_controlSocketStateChanged(QAbstractSocket::SocketState)
void _q_controlSocketErrorOccurred(QAbstractSocket::SocketError)
void setErrorState(Socks5State state, Socks5Error socks5error)
bool waitForConnected(QDeadlineTimer deadline, bool *timedOut)
void initialize(Socks5Mode socks5Mode)
#define S5_BIND
#define S5_VERSION_5
static int qt_socks5_get_host_address_and_port(const QByteArray &buf, QHostAddress *pAddress, quint16 *pPort, int *pPos)
#define S5_IP_V6
#define S5_AUTHMETHOD_NONE
static const int MaxWriteBufferSize
static bool qt_socks5_set_host_address_and_port(const QHostAddress &address, quint16 port, QByteArray *pBuf)
#define S5_DOMAINNAME
#define QSOCKS5_Q_DEBUG
#define S5_IP_V4
#define S5_SUCCESS
static QString dump(const QByteArray &)
#define S5_CONNECT
#define S5_PASSWORDAUTH_VERSION
#define Q_INIT_CHECK(returnValue)
#define S5_AUTHMETHOD_NOTACCEPTABLE
static int nextDescriptor()
#define QSOCKS5_D_DEBUG
#define S5_UDP_ASSOCIATE
#define QSOCKS5_DEBUG
static QString s5StateToString(QSocks5SocketEnginePrivate::Socks5State)
static constexpr auto Socks5BlockingBindTimeout
static bool qt_socks5_set_host_name_and_port(const QString &hostname, quint16 port, QByteArray *pBuf)
QSocks5Authenticator * authenticator
QTcpSocket * controlSocket
QQueue< QSocks5RevivedDatagram > pendingDatagrams