summaryrefslogtreecommitdiffstats
path: root/kopete/protocols/jabber/libiris/cutestuff/network/socks.h
blob: a09c14c7e3c49ec2cea27c63ff688c367ad45512 (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
161
162
163
/*
 * 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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 *
 */

#ifndef CS_SOCKS_H
#define CS_SOCKS_H

#include "bytestream.h"

// CS_NAMESPACE_BEGIN

class TQHostAddress;
class SocksClient;
class SocksServer;

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

	void change(const TQString &host, int port);
	void write(const TQByteArray &data);

signals:
	void packetReady(const TQByteArray &data);

private slots:
	void sn_activated(int);

private:
	class Private;
	Private *d;

	friend class SocksClient;
	SocksUDP(SocksClient *sc, const TQString &host, int port, const TQHostAddress &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(TQObject *parent=0);
	SocksClient(int, TQObject *parent=0);
	~SocksClient();

	bool isIncoming() const;

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

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

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

	// remote address
	TQHostAddress peerAddress() const;
	TQ_UINT16 peerPort() const;

	// udp
	TQString udpAddress() const;
	TQ_UINT16 udpPort() const;
	SocksUDP *createUDP(const TQString &host, int port, const TQHostAddress &routeAddr, int routePort);

signals:
	// outgoing
	void connected();

	// incoming
	void incomingMethods(int);
	void incomingAuth(const TQString &user, const TQString &pass);
	void incomingConnectRequest(const TQString &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 TQByteArray &);
	void processIncoming(const TQByteArray &);
	void continueIncoming();
	void writeData(const TQByteArray &a);
};

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

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

	void writeUDP(const TQHostAddress &addr, int port, const TQByteArray &data);

signals:
	void incomingReady();
	void incomingUDP(const TQString &host, int port, const TQHostAddress &addr, int sourcePort, const TQByteArray &data);

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

private:
	class Private;
	Private *d;
};

// CS_NAMESPACE_END

#endif