3
#include<qapplication.h>
23
App::App(int port, const QString &user, const QString &pass)
30
connect(d->c, SIGNAL(connectionClosed()), SLOT(con_connectionClosed()));
31
connect(d->c, SIGNAL(readyRead()), SLOT(con_readyRead()));
35
d->serv = new SocksServer;
36
connect(d->serv, SIGNAL(incomingReady()), SLOT(ss_incomingReady()));
37
d->serv->listen(port);
39
fprintf(stderr, "socksd: listening on port %d\n", port);
45
d->client->deleteLater();
51
void App::st_connectionClosed()
53
fprintf(stderr, "socksd: Connection closed by foreign host.\n");
57
void App::st_delayedCloseFinished()
62
void App::st_readyRead()
64
QByteArray a = d->bs->read();
68
void App::st_error(int x)
70
fprintf(stderr, "socksd: Stream error [%d].\n", x);
74
void App::con_connectionClosed()
76
fprintf(stderr, "adconn: Closing.\n");
78
if(d->bs->bytesToWrite() == 0)
82
void App::con_readyRead()
84
QByteArray a = d->c->read();
88
void App::ss_incomingReady()
90
fprintf(stderr, "incoming connection!\n");
91
SocksClient *c = d->serv->takeIncoming();
94
fprintf(stderr, "accepted\n");
95
connect(c, SIGNAL(incomingMethods(int)), SLOT(sc_incomingMethods(int)));
96
connect(c, SIGNAL(incomingAuth(const QString &, const QString &)), SLOT(sc_incomingAuth(const QString &, const QString &)));
97
connect(c, SIGNAL(incomingRequest(const QString &, int)), SLOT(sc_incomingRequest(const QString &, int)));
98
connect(c, SIGNAL(error(int)), SLOT(sc_error(int)));
102
void App::sc_incomingMethods(int m)
104
fprintf(stderr, "m=%d\n", m);
105
if(d->user.isEmpty() && m & SocksClient::AuthNone)
106
d->client->chooseMethod(SocksClient::AuthNone);
107
else if(m & SocksClient::AuthUsername)
108
d->client->chooseMethod(SocksClient::AuthUsername);
110
d->client->deleteLater();
112
fprintf(stderr, "unsupported method!\n");
116
void App::sc_incomingAuth(const QString &user, const QString &pass)
118
fprintf(stderr, "incoming auth: user=[%s], pass=[%s]\n", user.latin1(), pass.latin1());
119
if(user == d->user && pass == d->pass) {
120
d->client->authGrant(true);
123
d->client->authGrant(false);
124
d->client->deleteLater();
129
void App::sc_incomingRequest(const QString &host, int port)
131
fprintf(stderr, "request: host=[%s], port=[%d]\n", host.latin1(), port);
133
disconnect(d->client, SIGNAL(error(int)), this, SLOT(sc_error(int)));
134
connect(d->client, SIGNAL(connectionClosed()), SLOT(st_connectionClosed()));
135
connect(d->client, SIGNAL(delayedCloseFinished()), SLOT(st_delayedCloseFinished()));
136
connect(d->client, SIGNAL(readyRead()), SLOT(st_readyRead()));
137
connect(d->client, SIGNAL(error(int)), SLOT(st_error(int)));
140
d->client->requestGrant(true);
141
fprintf(stderr, "<< Active >>\n");
144
void App::sc_error(int)
146
d->client->deleteLater();
149
fprintf(stderr, "error!\n");
153
int main(int argc, char **argv)
155
QApplication app(argc, argv, false);
158
printf("usage: socksd [port] [user] [pass]\n\n");
163
int port = p.toInt();
171
App *a = new App(port, user, pass);
172
QObject::connect(a, SIGNAL(quit()), &app, SLOT(quit()));