summaryrefslogtreecommitdiffstats
path: root/kopete/protocols/jabber/libiris/cutestuff/network/socks.h
blob: 8f1e4ddc69aff047993e03663f85b7724bd3e6d5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
/*
 * socks.h - SOCKS5 TCP proxy client/server
 * Copyright (C) 2003  Justin Karneges
 *
 * 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.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */

#ifndef CS_SOCKS_H
#define CS_SOCKS_H

#include"bytestream.h"

// CS_NAMESPACE_BEGIN

class QHostAddress;
class SocksClient;
class SocksServer;

class SocksUDP : public QObject
{
	Q_OBJECT
public:
	~SocksUDP();

	void change(const QString &host, int port);
	void write(const QByteArray &data);

signals:
	void packetReady(const QByteArray &data);

private slots:
	void sn_activated(int);

private:
	class Private;
	Private *d;

	friend class SocksClient;
	SocksUDP(SocksClient *sc, const QString &host, int port, const QHostAddress &routeAddr, int routePort);
};

class SocksClient : public ByteStream
{
	Q_OBJECT
public:
	enum Error { ErrConnectionRefused = ErrCustom, ErrHostNotFound, ErrProxyConnect, ErrProxyNeg, ErrProxyAuth };
	enum Method { AuthNone=0x0001, AuthUsername=0x0002 };
	enum Request { ReqConnect, ReqUDPAssociate };
	SocksClient(QObject *parent=0);
	SocksClient(int, QObject *parent=0);
	~SocksClient();

	bool isIncoming() const;

	// outgoing
	void setAuth(const QString &user, const QString &pass="");
	void connectToHost(const QString &proxyHost, int proxyPort, const QString &host, int port, bool udpMode=false);

	// incoming
	void chooseMethod(int);
	void authGrant(bool);
	void requestDeny();
	void grantConnect();
	void grantUDPAssociate(const QString &relayHost, int relayPort);

	// from ByteStream
	bool isOpen() const;
	void close();
	void write(const QByteArray &);
	QByteArray read(int bytes=0);
	int bytesAvailable() const;
	int bytesToWrite() const;

	// remote address
	QHostAddress peerAddress() const;
	Q_UINT16 peerPort() const;

	// udp
	QString udpAddress() const;
	Q_UINT16 udpPort() const;
	SocksUDP *createUDP(const QString &host, int port, const QHostAddress &routeAddr, int routePort);

signals:
	// outgoing
	void connected();

	// incoming
	void incomingMethods(int);
	void incomingAuth(const QString &user, const QString &pass);
	void incomingConnectRequest(const QString &host, int port);
	void incomingUDPAssociateRequest();

private slots:
	void sock_connected();
	void sock_connectionClosed();
	void sock_delayedCloseFinished();
	void sock_readyRead();
	void sock_bytesWritten(int);
	void sock_error(int);
	void serve();

private:
	class Private;
	Private *d;

	void init();
	void reset(bool clear=false);
	void do_request();
	void processOutgoing(const QByteArray &);
	void processIncoming(const QByteArray &);
	void continueIncoming();
	void writeData(const QByteArray &a);
};

class SocksServer : public QObject
{
	Q_OBJECT
public:
	SocksServer(QObject *parent=0);
	~SocksServer();

	bool isActive() const;
	bool listen(Q_UINT16 port, bool udp=false);
	void stop();
	int port() const;
	QHostAddress address() const;
	SocksClient *takeIncoming();

	void writeUDP(const QHostAddress &addr, int port, const QByteArray &data);

signals:
	void incomingReady();
	void incomingUDP(const QString &host, int port, const QHostAddress &addr, int sourcePort, const QByteArray &data);

private slots:
	void connectionReady(int);
	void connectionError();
	void sn_activated(int);

private:
	class Private;
	Private *d;
};

// CS_NAMESPACE_END

#endif