// http://www.ietf.org/rfc/rfc1928.txt // Tested with: curl http://www.google.se/ --socks5 1080 --proxy-user foo:bar var States = { CONNECTED:0, VERIFYING:1, READY:2, PROXY: 3 }; var AuthMethods = { NOAUTH:0, GSSAPI:1, USERPASS:2 } var CommandType ={ TCPConnect:1, TCPBind:2, UDPBind:3 } var AddressTypes = { IPv4: 0x01, DomainName: 0x03, IPv6: 0x04, read: function(buffer,offset){ if(buffer[offset] == AddressTypes.IPv4){ return buffer[offset+1] + "." + buffer[offset+2] + "." + buffer[offset+3] + "." + buffer[offset+4]; }else if(buffer[offset] == AddressTypes.DomainName){ return buffer.toString('utf8', buffer[offset+2], buffer[offset+2+buffer[offset+1]] ); }else if(buffer[offset] == AddressTypes.IPv6){ return buffer.slice(buffer[offset+1], buffer[offset+1+16]) } }, sizeOf: function(buffer,offset){ if(buffer[offset] == AddressTypes.IPv4){ return 4; }else if(buffer[offset] == AddressTypes.DomainName){ return buffer[offset+1]; }else if(buffer[offset] == AddressTypes.IPv6){ return 16; } } } var net = require('net'); var clients = []; function accept(socket){ clients.push(socket); socket.pstate = States.CONNECTED; socket.on('end',function(){ clients.splice(clients.indexOf(socket),1); }); var handshake = function(chunk){ socket.removeListener('data',handshake); //SOCKS Version if(chunk[0]!= 5){ socket.end(); } n= chunk[1]; // Number of auth methods socket.methods=[]; for(i=0;i