Exemplo n.º 1
0
        private void ExecuteCommand(TunnelCommand command, byte[] data, int size)
        {
            if (TimeSpan.FromTicks(DateTime.UtcNow.Ticks - LastCommandTick).TotalSeconds < COMMAND_RATE_LIMIT ||
                MaintenancePassword.Length == 0)
            {
                return;
            }

            LastCommandTick = DateTime.UtcNow.Ticks;

            byte[] commandPasswordSha1 = new byte[20];
            Array.Copy(data, 9, commandPasswordSha1, 0, 20);

            if (!commandPasswordSha1.SequenceEqual(MaintenancePasswordSha1))
            {
                return;
            }

            switch (command)
            {
            case TunnelCommand.MaintenanceMode:
                MaintenanceModeEnabled = !MaintenanceModeEnabled;
                break;
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// 创建HttpTunnel
        /// </summary>
        /// <param name="proxyClient"></param>
        /// <param name="cmd"></param>
        /// <returns></returns>
        /// <exception cref="System.Net.TunnelStateMissingException"></exception>
        private HttpClient CreateTunnel(TunnelCommand cmd, TcpClient proxyClient)
        {
            var tunnel = new HttpClient((Uri)xHttpServer.GetRandom(this.ServerBalance));

            switch (cmd)
            {
            case TunnelCommand.KeepAlive:
                tunnel.KeepAlive = false;
                break;

            default:
                tunnel.KeepAlive = true;
                break;
            }
            tunnel.SendReceiveTimeout = xHttpHandler.Timeout * 1000;
            var cred = this.Credential;

            tunnel.Headers[xHttpHandler.AgentAuth] = CryptoManaged.MD5Hex(string.Format("{0}:{1}", cred.UserName, cred.Password));
            if (proxyClient != null)
            {
                var state = this.GetClientState(proxyClient);
                tunnel.Headers[xHttpHandler.AgentSock]   = state.UniqueID.ToString("N");
                tunnel.Headers[xHttpHandler.AgentDirect] = state.ToString();
            }
            var rRemoteID = this.ReverseRemoteID;

            if (rRemoteID != null)
            {
                tunnel.Headers[xHttpHandler.AgentReverse] = string.Format("{0}#{1}", _clientID.ToString("N"), rRemoteID.Value.ToString("N"));
            }
            tunnel.Form[xHttpHandler.AgentCommand] = ((int)cmd).ToString();
            return(tunnel);
        }