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; } }
/// <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); }