public Cap ConnectCap(string uri) { if (_isDisposed) { return(null); } if (this.State == ManagerState.Stop) { return(null); } var garbages = new List <IDisposable>(); try { var config = this.Config; var result = UriUtils.Parse(uri); if (result == null) { throw new Exception(); } string scheme = result.GetValue <string>("Scheme"); string address = result.GetValue <string>("Address"); int port = result.GetValueOrDefault <int>("Port", () => 4050); var connectionFilter = config.ConnectionFilters.FirstOrDefault(n => n.Scheme == scheme); if (connectionFilter == null || connectionFilter.Type == ConnectionType.None) { return(null); } if (connectionFilter.Type == ConnectionType.Tcp) { // Check { IPAddress ipAddress; if (!IPAddress.TryParse(address, out ipAddress)) { return(null); } #if !DEBUG if (!CheckGlobalIpAddress(ipAddress)) { return(null); } #endif if (!_catharsisManager.Check(ipAddress)) { _blockCount.Increment(); return(null); } } var socket = Connect(new IPEndPoint(IPAddress.Parse(address), port)); garbages.Add(socket); var cap = new SocketCap(socket); garbages.Add(cap); return(cap); } else if (connectionFilter.Type == ConnectionType.Socks5Proxy || connectionFilter.Type == ConnectionType.HttpProxy) { var result2 = UriUtils.Parse(connectionFilter.ProxyUri); if (result2 == null) { throw new Exception(); } string proxyScheme = result2.GetValue <string>("Scheme"); if (proxyScheme != "tcp") { throw new Exception(); } if (connectionFilter.Type == ConnectionType.HttpProxy) { string proxyAddress = result2.GetValue <string>("Address"); int proxyPort = result2.GetValueOrDefault <int>("Port", () => 1080); var socket = Connect(new IPEndPoint(GetIpAddress(proxyAddress), proxyPort)); garbages.Add(socket); var proxy = new HttpProxyClient(address, port); proxy.Create(socket, new TimeSpan(0, 0, 30)); var cap = new SocketCap(socket); garbages.Add(cap); return(cap); } else if (connectionFilter.Type == ConnectionType.Socks5Proxy) { string proxyAddress = result2.GetValue <string>("Address"); int proxyPort = result2.GetValueOrDefault <int>("Port", () => 80); var socket = Connect(new IPEndPoint(GetIpAddress(proxyAddress), proxyPort)); garbages.Add(socket); var proxy = new Socks5ProxyClient(address, port); proxy.Create(socket, new TimeSpan(0, 0, 30)); var cap = new SocketCap(socket); garbages.Add(cap); return(cap); } } } catch (Exception) { foreach (var item in garbages) { item.Dispose(); } } return(null); }
public Cap ConnectCap(string uri) { if (_disposed) { return(null); } if (this.State == ManagerState.Stop) { return(null); } if (!uri.StartsWith("tcp:")) { return(null); } var garbages = new List <IDisposable>(); try { var config = this.Config; var result = UriUtils.Parse(uri); if (result == null) { throw new Exception(); } string scheme = result.GetValue <string>("Scheme"); if (scheme != "tcp") { return(null); } string address = result.GetValue <string>("Address"); int port = result.GetValueOrDefault <int>("Port", () => 4050); // Check { IPAddress ipAddress; if (!IPAddress.TryParse(address, out ipAddress)) { return(null); } #if !DEBUG if (!IsGlobalIpAddress(ipAddress)) { return(null); } #endif if (!config.Type.HasFlag(TcpConnectionType.Ipv4) && ipAddress.AddressFamily == AddressFamily.InterNetwork) { return(null); } if (!config.Type.HasFlag(TcpConnectionType.Ipv6) && ipAddress.AddressFamily == AddressFamily.InterNetworkV6) { return(null); } if (!_catharsisManager.Check(ipAddress)) { _blockCount.Increment(); return(null); } } if (!string.IsNullOrWhiteSpace(config.ProxyUri)) { var result2 = UriUtils.Parse(config.ProxyUri); if (result2 == null) { throw new Exception(); } string proxyScheme = result2.GetValue <string>("Scheme"); if (proxyScheme == "socks" || proxyScheme == "socks5") { string proxyAddress = result2.GetValue <string>("Address"); int proxyPort = result2.GetValueOrDefault <int>("Port", () => 1080); var socket = Connect(new IPEndPoint(GetIpAddress(proxyAddress), proxyPort)); garbages.Add(socket); var proxy = new Socks5ProxyClient(address, port); proxy.Create(socket, new TimeSpan(0, 0, 30)); var cap = new SocketCap(socket); garbages.Add(cap); return(cap); } else if (proxyScheme == "http") { string proxyAddress = result2.GetValue <string>("Address"); int proxyPort = result2.GetValueOrDefault <int>("Port", () => 80); var socket = Connect(new IPEndPoint(GetIpAddress(proxyAddress), proxyPort)); garbages.Add(socket); var proxy = new HttpProxyClient(address, port); proxy.Create(socket, new TimeSpan(0, 0, 30)); var cap = new SocketCap(socket); garbages.Add(cap); return(cap); } } else { var socket = Connect(new IPEndPoint(IPAddress.Parse(address), port)); garbages.Add(socket); var cap = new SocketCap(socket); garbages.Add(cap); return(cap); } } catch (Exception) { foreach (var item in garbages) { item.Dispose(); } } return(null); }
public async ValueTask <Cap?> ConnectAsync(OmniAddress address, CancellationToken token = default) { if (this.IsDisposed) { return(null); } if (this.StateType != ServiceStateType.Running) { return(null); } var config = _tcpConnectOptions; if (config == null || !config.Enabled) { return(null); } if (!TryGetEndpoint(address, out var ipAddress, out ushort port)) { return(null); } var disposableList = new List <IDisposable>(); try { #if !DEBUG if (!IsGlobalIpAddress(ipAddress)) { return(null); } #endif if (config.ProxyOptions != null) { if (!TryGetEndpoint(config.ProxyOptions.Address, out var proxyAddress, out ushort proxyPort, true)) { return(null); } if (config.ProxyOptions.Type == TcpProxyType.Socks5Proxy) { var socket = await ConnectSocketAsync(new IPEndPoint(proxyAddress, proxyPort)); if (socket == null) { return(null); } disposableList.Add(socket); var proxy = new Socks5ProxyClient(ipAddress.ToString(), port); proxy.Create(socket, token); var cap = new SocketCap(socket, false); disposableList.Add(cap); return(cap); } else if (config.ProxyOptions.Type == TcpProxyType.HttpProxy) { var socket = await ConnectSocketAsync(new IPEndPoint(proxyAddress, proxyPort)); if (socket == null) { return(null); } disposableList.Add(socket); var proxy = new HttpProxyClient(ipAddress.ToString(), port); proxy.Create(socket, token); var cap = new SocketCap(socket, false); disposableList.Add(cap); return(cap); } } else { var socket = await ConnectSocketAsync(new IPEndPoint(ipAddress, port)); if (socket == null) { return(null); } disposableList.Add(socket); var cap = new SocketCap(socket, false); disposableList.Add(cap); return(cap); } } catch (Exception e) { _logger.Error(e); foreach (var item in disposableList) { item.Dispose(); } } return(null); }