private ProxyToken HandleV5RequestData(DataAdapterToStream stm) { SocksProxyToken ret = null; IPAddress addr = null; string addrName = null; bool ipv6 = false; ushort port = 0; int ver = stm.ReadByte(); int code = stm.ReadByte(); stm.ReadByte(); // Reserved int type = stm.ReadByte(); if ((ver == 5) && (code == 1)) { byte[] data = null; switch (type) { case 1: // IPv4 { data = GeneralUtils.ReadBytes(stm, 4); addr = new IPAddress(data); addrName = addr.ToString(); } break; case 3: // Domain name { int nameLen = stm.ReadByte(); if (nameLen > 0) { data = GeneralUtils.ReadBytes(stm, nameLen); addrName = Encoding.ASCII.GetString(data); } } break; case 4: // IPv6 data = GeneralUtils.ReadBytes(stm, 16); addr = new IPAddress(data); addrName = addr.ToString(); ipv6 = true; break; default: break; } port = ReadUShort(stm); if ((addrName != null) && (port > 0)) { _logger.LogVerbose(CANAPE.Net.Properties.Resources.SocksProxyServer_V5ConnectionLog, addrName, port); ret = new SocksProxyToken(addr, addrName, port, IpProxyToken.IpClientType.Tcp, ipv6, stm, 5); } } return ret; }
private IDataAdapter HandleSocksV4Response(SocksProxyToken token) { DataAdapterToStream stm = token.Adapter; byte[] resp = new byte[8]; resp[1] = token.Status == NetStatusCodes.Success ? REQUEST_SUCCEEDED : REQUEST_FAILED; stm.Write(resp, 0, resp.Length); if(token.Status == NetStatusCodes.Success) { // Clear adapter value so it wont get disposed token.Adapter = null; return new StreamDataAdapter(stm); } else { return null; } }
private IDataAdapter HandleSocksV5Response(SocksProxyToken token) { DataAdapterToStream stm = token.Adapter; byte[] returnData = new byte[10]; returnData[0] = 5; if(token.Status == NetStatusCodes.Success) { returnData[1] = 0; } else { // General failure returnData[1] = 1; } // Write out data in one go, otherwise Java has a habit of breaking returnData[2] = 0; returnData[3] = 1; stm.Write(returnData, 0, returnData.Length); if (token.Status == NetStatusCodes.Success) { // Clear adapter value so it wont get disposed token.Adapter = null; return new StreamDataAdapter(stm); } else { return null; } }
private ProxyToken HandleSocksv4Request(DataAdapterToStream stm) { SocksProxyToken ret = null; int req = stm.ReadByte(); ushort port = ReadUShort(stm); byte[] addrBytes = GeneralUtils.ReadBytes(stm, 4); IPAddress addr = new IPAddress(addrBytes); string addrName = addr.ToString(); // Discard username ReadZString(stm); if ((addrBytes[0] == 0) && (addrBytes[1] == 0) && (addrBytes[2] == 0) && (addrBytes[3] != 0)) { StringBuilder builder = new StringBuilder(); _logger.LogVerbose(CANAPE.Net.Properties.Resources.SocksProxyServer_V4AUsed); addrName = ReadZString(stm); addr = null; } if (req == 1) { _logger.LogVerbose(CANAPE.Net.Properties.Resources.SocksProxyServer_V4ConnectionLog, addrName, port); ret = new SocksProxyToken(addr, addrName, port, IpProxyToken.IpClientType.Tcp, false, stm, 4); } return ret; }