Example #1
0
        /// <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);
        }
Example #2
0
        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);
            }
        }
Example #3
0
        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);
        }
Example #4
0
        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);
            }
        }
Example #5
0
        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);
        }