45
47
// CS_NAMESPACE_BEGIN
47
49
//----------------------------------------------------------------------------
51
//----------------------------------------------------------------------------
52
static QByteArray sp_create_udp(const QString &host, Q_UINT16 port, const QByteArray &buf)
54
// detect for IP addresses
56
//if(addr.setAddress(host))
57
// return sp_set_request(addr, port, cmd1);
59
QCString h = host.utf8();
61
h = QString::fromUtf8(h).utf8(); // delete any partial characters?
62
int hlen = h.length();
66
a[at++] = 0x00; // reserved
67
a[at++] = 0x00; // reserved
68
a[at++] = 0x00; // frag
69
a[at++] = 0x03; // address type = domain
74
memcpy(a.data() + at, h.data(), hlen);
79
unsigned short p = htons(port);
80
memcpy(a.data() + at, &p, 2);
83
a.resize(at+buf.size());
84
memcpy(a.data() + at, buf.data(), buf.size());
96
static int sp_read_udp(QByteArray *from, SPS_UDP *s)
99
if((int)from->size() < full_len)
104
unsigned char atype = from->at(3);
108
if((int)from->size() < full_len)
111
memcpy(&ip4, from->data() + 4, 4);
112
addr.setAddress(ntohl(ip4));
113
host = addr.toString();
115
else if(atype == 0x03) {
117
if((int)from->size() < full_len)
119
unsigned char host_len = from->at(4);
120
full_len += host_len;
121
if((int)from->size() < full_len)
123
QCString cs(host_len+1);
124
memcpy(cs.data(), from->data() + 5, host_len);
125
host = QString::fromLatin1(cs);
127
else if(atype == 0x04) {
129
if((int)from->size() < full_len)
132
memcpy(a6, from->data() + 4, 16);
134
host = addr.toString();
138
if((int)from->size() < full_len)
142
memcpy(&p, from->data() + full_len - 2, 2);
146
s->data.resize(from->size() - full_len);
147
memcpy(s->data.data(), from->data() + full_len, s->data.size());
152
class SocksUDP::Private
158
QHostAddress routeAddr;
164
SocksUDP::SocksUDP(SocksClient *sc, const QString &host, int port, const QHostAddress &routeAddr, int routePort)
169
d->sd = new QSocketDevice(QSocketDevice::Datagram);
170
d->sd->setBlocking(false);
171
d->sn = new QSocketNotifier(d->sd->socket(), QSocketNotifier::Read);
172
connect(d->sn, SIGNAL(activated(int)), SLOT(sn_activated(int)));
175
d->routeAddr = routeAddr;
176
d->routePort = routePort;
179
SocksUDP::~SocksUDP()
186
void SocksUDP::change(const QString &host, int port)
192
void SocksUDP::write(const QByteArray &data)
194
QByteArray buf = sp_create_udp(d->host, d->port, data);
195
d->sd->setBlocking(true);
196
d->sd->writeBlock(buf.data(), buf.size(), d->routeAddr, d->routePort);
197
d->sd->setBlocking(false);
200
void SocksUDP::sn_activated(int)
202
QByteArray buf(8192);
203
int actual = d->sd->readBlock(buf.data(), buf.size());
208
//----------------------------------------------------------------------------
49
210
//----------------------------------------------------------------------------
211
#define REQ_CONNECT 0x01
212
#define REQ_BIND 0x02
213
#define REQ_UDPASSOCIATE 0x03
215
#define RET_SUCCESS 0x00
216
#define RET_UNREACHABLE 0x04
217
#define RET_CONNREFUSED 0x05
51
219
// spc = socks packet client
52
220
// sps = socks packet server
231
static QByteArray sp_set_connectRequest(const QString &host, Q_UINT16 port, unsigned char cmd1=0x01)
399
static QByteArray sp_set_request(const QString &host, Q_UINT16 port, unsigned char cmd1)
233
401
// detect for IP addresses
234
402
QHostAddress addr;
235
403
if(addr.setAddress(host))
236
return sp_set_connectRequest(addr, port, cmd1);
404
return sp_set_request(addr, port, cmd1);
238
406
QCString h = host.utf8();
815
1014
continueIncoming();
818
void SocksClient::requestGrant(bool b)
820
if(d->step != StepRequest || !d->waiting)
827
cmd1 = 0x00; // success
829
cmd1 = 0x04; // host not found
830
writeData(sp_set_connectRequest(d->rhost, d->rport, cmd1));
1017
void SocksClient::requestDeny()
1019
if(d->step != StepRequest || !d->waiting)
1024
writeData(sp_set_request(d->rhost, d->rport, RET_UNREACHABLE));
1028
void SocksClient::grantConnect()
1030
if(d->step != StepRequest || !d->waiting)
1035
writeData(sp_set_request(d->rhost, d->rport, RET_SUCCESS));
835
1036
d->active = true;
836
1037
#ifdef PROX_DEBUG
837
1038
fprintf(stderr, "SocksClient: server << Success >>\n");
854
1073
return d->sock.peerPort();
1076
QString SocksClient::udpAddress() const
1081
Q_UINT16 SocksClient::udpPort() const
1086
SocksUDP *SocksClient::createUDP(const QString &host, int port, const QHostAddress &routeAddr, int routePort)
1088
return new SocksUDP(this, host, port, routeAddr, routePort);
857
1091
//----------------------------------------------------------------------------
859
1093
//----------------------------------------------------------------------------
885
1124
return d->serv.isActive();
888
bool SocksServer::listen(Q_UINT16 port)
1127
bool SocksServer::listen(Q_UINT16 port, bool udp)
890
return d->serv.listen(port);
1130
if(!d->serv.listen(port))
1133
d->sd = new QSocketDevice(QSocketDevice::Datagram);
1134
d->sd->setBlocking(false);
1135
if(!d->sd->bind(QHostAddress(), port)) {
1141
d->sn = new QSocketNotifier(d->sd->socket(), QSocketNotifier::Read);
1142
connect(d->sn, SIGNAL(activated(int)), SLOT(sn_activated(int)));
893
1147
void SocksServer::stop()