From 8f0c73f6002e4041d829a7e1d371d124dd64740a Mon Sep 17 00:00:00 2001 From: maksim Date: Sun, 8 Dec 2019 21:09:18 +0100 Subject: [PATCH] test and refactoring all code --- examples/client.js | 23 --------- examples/createClient.js | 19 ++++++++ examples/createServer.js | 33 ++++--------- examples/createServerWithAuth.js | 32 +++++-------- examples/createServerWithFilter.js | 30 ++++-------- index.js | 77 +++++++++++++++++++----------- 6 files changed, 98 insertions(+), 116 deletions(-) delete mode 100644 examples/client.js create mode 100644 examples/createClient.js diff --git a/examples/client.js b/examples/client.js deleted file mode 100644 index 595a2d7..0000000 --- a/examples/client.js +++ /dev/null @@ -1,23 +0,0 @@ -const proxy = require("../index"); - -const setting = { - host: "217.160.63.243", // 217.160.63.243 - port: "5550", // 5550 for prod, 1080 for dev - name: "lexa12", - password: "darksouls3" -}; - -const server = proxy.createClient(setting); -server.listen(2080); - -setInterval(() => { - const memoryUsage = process.memoryUsage(); - const perfomance = { - heapTotal: `${memoryUsage.heapTotal / (1024 * 1024)}mb`, - heapUsed: `${memoryUsage.heapUsed / (1024 * 1024)}mb`, - rss: `${memoryUsage.rss / (1024 * 1024)}mb` - }; - console.log(" \n\n\n Process ", perfomance, "\n\n\n"); -}, 2000); - -server.on("error", err => console.error(`Client Server Error ---> ${err}`)); diff --git a/examples/createClient.js b/examples/createClient.js new file mode 100644 index 0000000..be20c16 --- /dev/null +++ b/examples/createClient.js @@ -0,0 +1,19 @@ +const { createClient } = require("../index"); + +const setting = { + host: "127.0.0.1", // your socks 5 verison server + port: "1080", // port your server + login: "foo", + password: "bar" +}; + +const server = createClient(setting); +server.listen(2080); + +server.on("listening", () => { + console.log( + `server listening ${server.address().address}:${server.address().port}` + ); +}); + +server.on("error", err => console.error(`Client Server Error ---> ${err}`)); diff --git a/examples/createServer.js b/examples/createServer.js index 6fb76b0..55c4c3a 100644 --- a/examples/createServer.js +++ b/examples/createServer.js @@ -1,25 +1,9 @@ -const socks5 = require("../index"); - -// const setAddr = new Set(["tools.ietf.org"]); - -const server = socks5.createServer({ - authenticate(name, password) { - // verify name/password - if (name !== "lexa12" || password !== "darksouls3") { - console.log("Пшел на хуй", name, password); - // respond with auth failure (can be any error) - return true; - } - // return successful authentication - return false; - } - // filter(addr) { - // console.log(addr); - // return setAddr.has(addr); - // } -}); +const { createServer } = require("../index"); + + +const server = createServer(); -server.listen(5550); // 5550 for prod, 1080 for dev +server.listen(1080); server.on("connect", info => console.log(`connected to remote server at ${info.addr}:${info.port}`) @@ -32,12 +16,11 @@ server.on("listening", () => { }); server.on("connection", socket => { - console.log("connection", socket.remoteAddress, socket.remotePort); + console.log("new socks connection", socket.remoteAddress, socket.remotePort); }); -// server.on("data", data => console.log(data)); +server.on("data", data => console.log(data)); server.on("error", err => { - console.error("server ERROR"); - console.error(err); + console.error(`server ERROR ---> ${err}`); }); diff --git a/examples/createServerWithAuth.js b/examples/createServerWithAuth.js index 6fb76b0..e9a803f 100644 --- a/examples/createServerWithAuth.js +++ b/examples/createServerWithAuth.js @@ -1,25 +1,20 @@ -const socks5 = require("../index"); +const { createServer } = require("../index"); -// const setAddr = new Set(["tools.ietf.org"]); - -const server = socks5.createServer({ - authenticate(name, password) { +const server = createServer({ + authenticate(login, password) { // verify name/password - if (name !== "lexa12" || password !== "darksouls3") { - console.log("Пшел на хуй", name, password); - // respond with auth failure (can be any error) - return true; + if (login !== "foo" || password !== "bar") { + console.log("authentication failed", login); + return false; + // authentication failed } + console.log(`user ${login} connect`); // return successful authentication - return false; + return true; } - // filter(addr) { - // console.log(addr); - // return setAddr.has(addr); - // } }); -server.listen(5550); // 5550 for prod, 1080 for dev +server.listen(1080); server.on("connect", info => console.log(`connected to remote server at ${info.addr}:${info.port}`) @@ -32,12 +27,11 @@ server.on("listening", () => { }); server.on("connection", socket => { - console.log("connection", socket.remoteAddress, socket.remotePort); + console.log("new socks connection", socket.remoteAddress, socket.remotePort); }); -// server.on("data", data => console.log(data)); +server.on("data", data => console.log(data)); server.on("error", err => { - console.error("server ERROR"); - console.error(err); + console.error(`server ERROR ---> ${err}`); }); diff --git a/examples/createServerWithFilter.js b/examples/createServerWithFilter.js index 6fb76b0..033e0f1 100644 --- a/examples/createServerWithFilter.js +++ b/examples/createServerWithFilter.js @@ -1,25 +1,16 @@ const socks5 = require("../index"); -// const setAddr = new Set(["tools.ietf.org"]); +const setAddr = new Set(["tools.ietf.org", "github.com", "2ip.ru"]); const server = socks5.createServer({ - authenticate(name, password) { - // verify name/password - if (name !== "lexa12" || password !== "darksouls3") { - console.log("Пшел на хуй", name, password); - // respond with auth failure (can be any error) - return true; - } - // return successful authentication - return false; + filter(addr) { + const result = !setAddr.has(addr); + if(!result) console.log(`host ${addr} unreachable`); + return result; } - // filter(addr) { - // console.log(addr); - // return setAddr.has(addr); - // } }); -server.listen(5550); // 5550 for prod, 1080 for dev +server.listen(1080); server.on("connect", info => console.log(`connected to remote server at ${info.addr}:${info.port}`) @@ -32,12 +23,11 @@ server.on("listening", () => { }); server.on("connection", socket => { - console.log("connection", socket.remoteAddress, socket.remotePort); + console.log("new socks connection", socket.remoteAddress, socket.remotePort); }); -// server.on("data", data => console.log(data)); +server.on("data", data => console.log(data)); server.on("error", err => { - console.error("server ERROR"); - console.error(err); -}); + console.error(`server ERROR ---> ${err}`); +}); \ No newline at end of file diff --git a/index.js b/index.js index 021eb6a..5bcdf45 100644 --- a/index.js +++ b/index.js @@ -3,6 +3,7 @@ const constants = require("./lib/constants"); const { getAddress, getPort } = require("./lib/handler"); const createServer = options => { + options = options || {}; const server = net.createServer(socket => { const authenticate = buffer => { // +----+------+----------+------+----------+ @@ -17,22 +18,28 @@ const createServer = options => { // check socks version if (buffer[0] !== constants.AUTH_VERSION) { - console.log(`auth wrong socks version: ${buffer[0]}`); + server.emit( + "error", + `${socket.remoteAddress} : + ${socket.remotePort} auth wrong socks version: ${buffer[0]}` + ); const response = Buffer.from([ constants.AUTH_VERSION, constants.AUTH_REPLIES.GENERAL_FAILURE ]); socket.end(response); + return; } const auth = options.authenticate(name, password); - if (auth) { + if (!auth) { const response = Buffer.from([ constants.AUTH_VERSION, constants.AUTH_REPLIES.GENERAL_FAILURE ]); socket.end(response); + return; } const response = Buffer.from([ @@ -58,38 +65,53 @@ const createServer = options => { const port = getPort(buffer); if (buffer[0] !== constants.VERSION) { - console.error(`socks5 connect: wrong socks version: ${buffer[0]}`); + server.emit( + "error", + `${socket.remoteAddress}: + ${socket.remotePort} socks5 connect: wrong socks version: + ${buffer[0]}` + ); const response = Buffer.from([0x05, constants.REPLIES.GENERAL_FAILURE]); socket.end(response); + return; } if (!addr) { - console.log("Unsuported address -- disconnecting"); + server.emit( + "error", + `${socket.remoteAddress}: ${socket.remotePort} Unsuported address -- disconnecting` + ); const response = Buffer.from([ 0x05, constants.REPLIES.ADDRESS_TYPE_NOT_SUPPORTED ]); socket.end(response); + return; } if (cmd !== constants.COMMANDS.CONNECT) { // Unsuported udp and bind metod - console.log("Unsuported metod command"); + server.emit( + "error", + `${socket.remoteAddress}: ${socket.remotePort} Unsuported metod command` + ); const response = Buffer.from([ 0x05, constants.REPLIES.COMMAND_NOT_SUPPORTED ]); socket.end(response); + return; } if (typeof options.filter === "function") { const result = options.filter(addr); - if (result) { + if (!result) { const response = Buffer.from([ constants.VERSION, constants.REPLIES.HOST_UNREACHABLE ]); socket.end(response); + return; } } @@ -122,6 +144,7 @@ const createServer = options => { constants.REPLIES.HOST_UNREACHABLE ]); socket.end(response); + return; } if (err.code === "ECONNREFUSED") { @@ -130,6 +153,7 @@ const createServer = options => { constants.REPLIES.CONNECTION_REFUSED ]); socket.end(response); + return; } const response = Buffer.from([ 0x05, @@ -148,9 +172,14 @@ const createServer = options => { // SOCKS Version 5 is the only support version if (buffer[0] !== constants.VERSION) { - console.error(`wrong socks version: ${buffer[0]}`); + server.emit( + "error", + `${socket.remoteAddress}: ${socket.remotePort} wrong socks version: + ${buffer[0]}` + ); const response = Buffer.from([0x05, constants.REPLIES.GENERAL_FAILURE]); socket.end(response); + return; } const auth = typeof options.authenticate === "function"; @@ -166,12 +195,15 @@ const createServer = options => { response[1] = constants.METHODS.NO_AUTHENTICATION; next = connect; } else { - console.log( - "Unsuported authentication method -- disconnecting, method", - buffer[2] + server.emit( + "error", + `${socket.remoteAddress}: ${socket.remotePort} + Unsuported authentication method -- disconnecting, method + ${buffer[2]}` ); response[1] = constants.METHODS.NO_ACCEPTABLE_METHODS; socket.end(response); + return; } socket.write(response, () => { @@ -190,34 +222,29 @@ const createServer = options => { }; const createClient = options => { - console.log(options); - const { name, password } = options; + const { login, password } = options; const server = net.createServer(socket => { - const handshakeClient = data => { + const handshakeClient = () => { socket.write( Buffer.from([constants.VERSION, constants.METHODS.NO_AUTHENTICATION]) ); - console.log("Browser data ", data); socket.once("data", connectClient); }; const connectServer = (mainServ, buffer) => { - mainServ.once("data", data => { - console.log("mainServ data ", data); + mainServ.once("data", () => { const res = Buffer.from([ constants.AUTH_VERSION, - name.length, - ...Buffer.from(name, "utf8"), + login.length, + ...Buffer.from(login, "utf8"), password.length, ...Buffer.from(password, "utf8") ]); mainServ.write(res, () => { - mainServ.once("data", data => { - console.log("mainserv 2 data ", data); - + mainServ.once("data", () => { mainServ.write(buffer, () => { mainServ.pipe(socket); socket.pipe(mainServ); @@ -228,14 +255,6 @@ const createClient = options => { }; const connectClient = buffer => { - const cmd = buffer[1]; - const atyp = buffer[3]; - const addr = getAddress(buffer); - const port = getPort(buffer); - - console.log("Browser 2 data", buffer[0], cmd, atyp, addr, port); - console.log("Browser 2 data buffer ", buffer); - const mainServ = net.connect(options); mainServ.on("error", err => {