/// <summary> /// /// </summary> /// <param name="token"></param> /// <param name="client"></param> /// <param name="globalMeta"></param> /// <param name="meta"></param> /// <param name="service"></param> /// <returns></returns> public override IDataAdapter Complete(ProxyToken token, MetaDictionary meta, MetaDictionary globalMeta, ProxyNetworkService service, IDataAdapter client) { SocksProxyToken socksToken = (SocksProxyToken)token; if (IsSupported(socksToken.Version)) { if (socksToken.Version == 4) { return(HandleSocksV4Response(socksToken)); } else if (socksToken.Version == 5) { return(HandleSocksV5Response(socksToken)); } else { // We shouldn't get here throw new InvalidOperationException(CANAPE.Net.Properties.Resources.SocksProxyServer_IsSupportedError); } } else { _logger.LogError(CANAPE.Net.Properties.Resources.SocksProxyServer_UnsupportedTokenVersion, socksToken.Version); } 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); }
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 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); }