Beispiel #1
0
 /// <summary>
 /// Overridden OnWrite to ensure that the base only gets called when in running state.
 /// </summary>
 /// <param name="sock"></param>
 /// <param name="buf"></param>
 /// <param name="offset"></param>
 /// <param name="length"></param>
 public override void OnWrite(bedrock.net.BaseSocket sock, byte[] buf, int offset, int length)
 {
     if (m_state == States.Running)
     {
         base.OnWrite(sock, buf, offset, length);
     }
 }
Beispiel #2
0
 /// <summary>
 /// overridden OnConnect to start off Socks5 protocol.
 /// </summary>
 /// <param name="sock"></param>
 public override void OnConnect(bedrock.net.BaseSocket sock)
 {
     if (m_state == States.Connecting)
     {
         byte [] buffer = new Byte[4];
         buffer[0] = 5; // protocol version.
         buffer[1] = 2; // number of methods.
         buffer[2] = 0; // no auth.
         buffer[3] = 2; // username password.
         Debug.WriteLine("sending auth methods to proxy...");
         Write(buffer);
         RequestRead();
         m_state = States.GettingMethods;
     }
 }
Beispiel #3
0
        /// <summary>
        /// Overridden OnRead to handle 4 Socks5 states...
        /// </summary>
        /// <param name="sock"></param>
        /// <param name="buf"></param>
        /// <param name="offset"></param>
        /// <param name="length"></param>
        /// <returns></returns>
        public override bool OnRead(bedrock.net.BaseSocket sock, byte[] buf, int offset, int length)
        {
            switch (m_state)
            {
            case States.RequestingProxy:
                bool ret = HandleRequestResponse(buf[offset], buf[offset + 1]);
                if (ret)
                {
                    m_listener.OnConnect(sock);     // tell the real listener that we're connected.
                    // they'll call RequestRead(), so we can return false here.
                }
                return(false);

            default:
                return(base.OnRead(sock, buf, offset, length));
            }
        }
Beispiel #4
0
        /// <summary>
        /// overridden OnConnect to start off SHTTP protocol.
        /// </summary>
        /// <param name="sock"></param>
        public override void OnConnect(bedrock.net.BaseSocket sock)
        {
            if (m_state == States.Connecting)
            { // CONNECT users.instapix.com:5222 HTTP/1.0
                m_state = States.WaitingForAuth;
                string cmd = string.Format(@"CONNECT {0}:{1} HTTP/1.1
Host: {0}
", RemoteAddress.Hostname, RemoteAddress.Port);

                // if authinfo is set, send it.
                if (Username != null && Username.Length > 0 && Password != null && Password.Length > 0)
                {
                    string auth = Convert.ToBase64String(Encoding.ASCII.GetBytes(Username + ":" + Password));
                    cmd += "Proxy-Authorization: Basic " + auth + "\r\n";
                }
                cmd += "\r\n";
                Debug.WriteLine("PSEND:" + cmd);
                Write(Encoding.ASCII.GetBytes(cmd));
                RequestRead();
            }
        }
Beispiel #5
0
        /// <summary>
        /// overridden OnConnect to start off Socks5 protocol.
        /// </summary>
        /// <param name="sock"></param>
        public override void OnConnect(bedrock.net.BaseSocket sock)
        {
            if (m_state == States.Connecting)
            {
                IPHostEntry server  = Dns.GetHostEntry(RemoteAddress.Hostname);
                IPAddress   ip_addr = server.AddressList[0];

                byte[] addr = ip_addr.GetAddressBytes();

                int     port   = RemoteAddress.Port;
                byte [] buffer = new Byte[14];
                buffer[0] = 4;  // protocol version.
                buffer[1] = 1;  // connect.
                buffer[2] = (byte)(port >> 8);
                buffer[3] = (byte)port;
                // TODO: test byte order!
                buffer[4]  = addr[3];
                buffer[5]  = addr[2];
                buffer[6]  = addr[1];
                buffer[7]  = addr[0];
                buffer[8]  = (byte)'i';
                buffer[9]  = (byte)'d';
                buffer[10] = (byte)'e';
                buffer[11] = (byte)'n';
                buffer[12] = (byte)'t';
                buffer[13] = 0;

                /*
                 +----+----+----+----+----+----+----+----+----+----+....+----+
                 | VN | CD | DSTPORT |      DSTIP        | USERID       |NULL|
                 +----+----+----+----+----+----+----+----+----+----+....+----+
                 # of bytes:    1    1      2              4           variable       1
                 */


                Write(buffer);
                RequestRead();
                m_state = States.RequestingProxy;
            }
        }
Beispiel #6
0
        /// <summary>
        /// Overridden OnRead to handle 4 Socks5 states...
        /// </summary>
        /// <param name="sock"></param>
        /// <param name="buf"></param>
        /// <param name="offset"></param>
        /// <param name="length"></param>
        /// <returns></returns>
        public override bool OnRead(bedrock.net.BaseSocket sock, byte[] buf, int offset, int length)
        {
            switch (m_state)
            {
            case States.WaitingForAuth:
                m_headerstream.Write(buf, offset, length);
                int state = 0;
                int line  = 0;
                foreach (byte b in buf)
                {
                    // Look for \r\n\r\n for end of response header
                    switch (state)
                    {
                    case 0:
                        if (b == '\r')
                        {
                            state++;
                        }
                        break;

                    case 1:
                        if (b == '\n')
                        {
                            byte[] hs = m_headerstream.ToArray();
                            string s  = System.Text.Encoding.UTF8.GetString(hs);
                            Debug.Write("PRECV: " + s);
                            m_headers.Add(s);
                            m_headerstream.SetLength(0);
                            state++;
                            line++;
                        }
                        else
                        {
                            state = 0;
                        }
                        break;

                    case 2:
                        if (b == '\r')
                        {
                            state++;
                        }
                        else
                        {
                            state = 0;
                        }
                        break;

                    case 3:
                        if (b == '\n')
                        {
                            Debug.WriteLine("End of proxy headers");
                            string line0 = (string)m_headers[0];
                            if (line0.IndexOf("200") == -1)
                            {
                                Debug.WriteLine("200 response not detected.  Closing.");
                                m_state = States.Error;
                                this.Close();
                            }
                            else
                            {
                                Debug.WriteLine("Proxy connected");
                                m_listener.OnConnect(sock); // tell the real listener that we're connected.
                                m_state = States.Running;
                            }
                            // they'll call RequestRead(), so we can return false here.
                            return(false);
                        }
                        else
                        {
                            state = 0;
                        }
                        break;
                    }
                }
                return(true);

            case States.Error:
                throw new InvalidOperationException("Cannot read after error");

            default:
                return(base.OnRead(sock, buf, offset, length));
            }
        }