/// <summary>Parameterless constructor for dependency injection.</summary> protected PeerConnector( IAsyncLoopFactory asyncLoopFactory, IDateTimeProvider dateTimeProvider, ILoggerFactory loggerFactory, Network network, INetworkPeerFactory networkPeerFactory, INodeLifetime nodeLifetime, NodeSettings nodeSettings, IPeerAddressManager peerAddressManager) { this.asyncLoopFactory = asyncLoopFactory; this.ConnectedPeers = new NetworkPeerCollection(); this.dateTimeProvider = dateTimeProvider; this.loggerFactory = loggerFactory; this.logger = loggerFactory.CreateLogger(this.GetType().FullName); this.network = network; this.networkPeerFactory = networkPeerFactory; this.nodeLifetime = nodeLifetime; this.NodeSettings = nodeSettings; this.peerAddressManager = peerAddressManager; this.Requirements = new NetworkPeerRequirement { MinVersion = this.NodeSettings.ProtocolVersion }; }
public ConnectionManager( IDateTimeProvider dateTimeProvider, ILoggerFactory loggerFactory, Network network, INetworkPeerFactory networkPeerFactory, NodeSettings nodeSettings, INodeLifetime nodeLifetime, NetworkPeerConnectionParameters parameters, IPeerAddressManager peerAddressManager, IEnumerable <IPeerConnector> peerConnectors, IPeerDiscovery peerDiscovery, ConnectionManagerSettings connectionSettings) { this.connectedPeers = new NetworkPeerCollection(); this.dateTimeProvider = dateTimeProvider; this.loggerFactory = loggerFactory; this.logger = loggerFactory.CreateLogger(this.GetType().FullName); this.Network = network; this.NetworkPeerFactory = networkPeerFactory; this.NodeSettings = nodeSettings; this.nodeLifetime = nodeLifetime; this.peerAddressManager = peerAddressManager; this.PeerConnectors = peerConnectors; this.peerDiscovery = peerDiscovery; this.ConnectionSettings = connectionSettings; this.Servers = new List <NetworkPeerServer>(); this.Parameters = parameters; this.Parameters.ConnectCancellation = this.nodeLifetime.ApplicationStopping; this.Parameters.UserAgent = $"{this.NodeSettings.Agent}:{this.GetVersion()}"; this.Parameters.Version = this.NodeSettings.ProtocolVersion; this.downloads = new Dictionary <INetworkPeer, PerformanceSnapshot>(); this.ConnectionSettings.Load(this.NodeSettings); }
/// <summary>Constructor used by dependency injection.</summary> internal PeerConnector(Network network, INodeLifetime nodeLifeTime, NodeConnectionParameters parameters, NodeRequirement nodeRequirements, Func <IPEndPoint, byte[]> groupSelector, IAsyncLoopFactory asyncLoopFactory, IPeerAddressManager peerAddressManager, PeerIntroductionType peerIntroductionType) { this.asyncLoopFactory = asyncLoopFactory; this.ConnectedPeers = new NodesCollection(); this.groupSelector = groupSelector; this.MaximumNodeConnections = 8; this.network = network; this.nodeLifetime = nodeLifeTime; this.parentParameters = parameters; this.peerAddressManager = peerAddressManager; this.peerIntroductionType = peerIntroductionType; this.Requirements = nodeRequirements; this.currentParameters = this.parentParameters.Clone(); this.currentParameters.TemplateBehaviors.Add(new PeerConnectorBehaviour(this)); this.currentParameters.ConnectCancellation = this.nodeLifetime.ApplicationStopping; }
public void WhenRefreshWhitelist_AndInactivePeersInWhitelist_ThenWhitelistDoesNotContainInactivePeers() { // Arrange. Mock <IDateTimeProvider> mockDateTimeProvider = new Mock <IDateTimeProvider>(); Mock <ILogger> mockLogger = new Mock <ILogger>(); Mock <ILoggerFactory> mockLoggerFactory = new Mock <ILoggerFactory>(); mockLoggerFactory.Setup(l => l.CreateLogger(It.IsAny <string>())).Returns(mockLogger.Object); ILoggerFactory loggerFactory = mockLoggerFactory.Object; mockDateTimeProvider.Setup(d => d.GetTimeOffset()).Returns(new DateTimeOffset(new DateTime(2017, 8, 30, 1, 2, 3))).Verifiable(); IDateTimeProvider dateTimeProvider = mockDateTimeProvider.Object; int inactiveTimePeriod = 3000; IPAddress activeIpAddressOne = IPAddress.Parse("::ffff:192.168.0.1"); NetworkAddress activeNetworkAddressOne = new NetworkAddress(activeIpAddressOne, 80); IPAddress activeIpAddressTwo = IPAddress.Parse("::ffff:192.168.0.2"); NetworkAddress activeNetworkAddressTwo = new NetworkAddress(activeIpAddressTwo, 80); IPAddress activeIpAddressThree = IPAddress.Parse("::ffff:192.168.0.3"); NetworkAddress activeNetworkAddressThree = new NetworkAddress(activeIpAddressThree, 80); IPAddress activeIpAddressFour = IPAddress.Parse("::ffff:192.168.0.4"); NetworkAddress activeNetworkAddressFour = new NetworkAddress(activeIpAddressFour, 80); List <Tuple <NetworkAddress, DateTimeOffset> > activeTestDataSet = new List <Tuple <NetworkAddress, DateTimeOffset> >() { new Tuple <NetworkAddress, DateTimeOffset> (activeNetworkAddressOne, dateTimeProvider.GetTimeOffset().AddSeconds(-inactiveTimePeriod).AddSeconds(10)), new Tuple <NetworkAddress, DateTimeOffset>(activeNetworkAddressTwo, dateTimeProvider.GetTimeOffset().AddSeconds(-inactiveTimePeriod).AddSeconds(20)), new Tuple <NetworkAddress, DateTimeOffset>(activeNetworkAddressThree, dateTimeProvider.GetTimeOffset().AddSeconds(-inactiveTimePeriod).AddSeconds(30)), new Tuple <NetworkAddress, DateTimeOffset>(activeNetworkAddressFour, dateTimeProvider.GetTimeOffset().AddSeconds(-inactiveTimePeriod).AddSeconds(40)) }; IPAddress inactiveIpAddressOne = IPAddress.Parse("::ffff:192.168.100.1"); NetworkAddress inactiveNetworkAddressOne = new NetworkAddress(inactiveIpAddressOne, 80); IPAddress inactiveIpAddressTwo = IPAddress.Parse("::ffff:192.168.100.2"); NetworkAddress inactiveNetworkAddressTwo = new NetworkAddress(inactiveIpAddressTwo, 80); IPAddress inactiveIpAddressThree = IPAddress.Parse("::ffff:192.168.100.3"); NetworkAddress inactiveNetworkAddressThree = new NetworkAddress(inactiveIpAddressThree, 80); List <Tuple <NetworkAddress, DateTimeOffset> > inactiveTestDataSet = new List <Tuple <NetworkAddress, DateTimeOffset> >() { new Tuple <NetworkAddress, DateTimeOffset> (inactiveNetworkAddressOne, dateTimeProvider.GetTimeOffset().AddSeconds(-inactiveTimePeriod).AddSeconds(-10)), new Tuple <NetworkAddress, DateTimeOffset>(inactiveNetworkAddressTwo, dateTimeProvider.GetTimeOffset().AddSeconds(-inactiveTimePeriod).AddSeconds(-20)), new Tuple <NetworkAddress, DateTimeOffset>(inactiveNetworkAddressThree, dateTimeProvider.GetTimeOffset().AddSeconds(-inactiveTimePeriod).AddSeconds(-30)) }; IPeerAddressManager peerAddressManager = this.CreateTestPeerAddressManager(activeTestDataSet.Concat(inactiveTestDataSet).ToList()); IMasterFile spiedMasterFile = null; Mock <IDnsServer> mockDnsServer = new Mock <IDnsServer>(); mockDnsServer.Setup(d => d.SwapMasterfile(It.IsAny <IMasterFile>())) .Callback <IMasterFile>(m => { spiedMasterFile = m; }) .Verifiable(); NodeSettings nodeSettings = NodeSettings.Default(); DnsSettings dnsSettings = new Mock <DnsSettings>().Object; dnsSettings.DnsPeerBlacklistThresholdInSeconds = inactiveTimePeriod; dnsSettings.DnsHostName = "Purple.test.com"; WhitelistManager whitelistManager = new WhitelistManager(dateTimeProvider, loggerFactory, peerAddressManager, mockDnsServer.Object, nodeSettings, dnsSettings); // Act. whitelistManager.RefreshWhitelist(); // Assert. spiedMasterFile.Should().NotBeNull(); Question question = new Question(new Domain(dnsSettings.DnsHostName), RecordType.AAAA); IList <IResourceRecord> resourceRecords = spiedMasterFile.Get(question); resourceRecords.Should().NotBeNullOrEmpty(); IList <IPAddressResourceRecord> ipAddressResourceRecords = resourceRecords.OfType <IPAddressResourceRecord>().ToList(); ipAddressResourceRecords.Should().HaveSameCount(activeTestDataSet); foreach (Tuple <NetworkAddress, DateTimeOffset> testData in activeTestDataSet) { ipAddressResourceRecords.SingleOrDefault(i => i.IPAddress.Equals(testData.Item1.Endpoint.Address)).Should().NotBeNull("the ip address is active and should be in DNS"); } foreach (Tuple <NetworkAddress, DateTimeOffset> testData in inactiveTestDataSet) { ipAddressResourceRecords.SingleOrDefault(i => i.IPAddress.Equals(testData.Item1.Endpoint.Address)).Should().BeNull("the ip address is inactive and should not be returned from DNS"); } }
public void WhenRefreshWhitelist_AndOwnIPInPeers_AndAreRunningFullNode_ThenWhitelistDoesContainOwnIP() { // Arrange. Mock <IDateTimeProvider> mockDateTimeProvider = new Mock <IDateTimeProvider>(); Mock <ILogger> mockLogger = new Mock <ILogger>(); Mock <ILoggerFactory> mockLoggerFactory = new Mock <ILoggerFactory>(); mockLoggerFactory.Setup(l => l.CreateLogger(It.IsAny <string>())).Returns(mockLogger.Object); ILoggerFactory loggerFactory = mockLoggerFactory.Object; mockDateTimeProvider.Setup(d => d.GetTimeOffset()).Returns(new DateTimeOffset(new DateTime(2017, 8, 30, 1, 2, 3))).Verifiable(); IDateTimeProvider dateTimeProvider = mockDateTimeProvider.Object; int inactiveTimePeriod = 5000; IPAddress activeIpAddressOne = IPAddress.Parse("::ffff:192.168.0.1"); NetworkAddress activeNetworkAddressOne = new NetworkAddress(activeIpAddressOne, 80); IPAddress activeIpAddressTwo = IPAddress.Parse("::ffff:192.168.0.2"); NetworkAddress activeNetworkAddressTwo = new NetworkAddress(activeIpAddressTwo, 80); IPAddress activeIpAddressThree = IPAddress.Parse("::ffff:192.168.0.3"); NetworkAddress activeNetworkAddressThree = new NetworkAddress(activeIpAddressThree, 80); IPAddress externalIPAdress = IPAddress.Parse("::ffff:192.168.99.99"); int externalPort = 80; NetworkAddress externalNetworkAddress = new NetworkAddress(externalIPAdress, externalPort); List <Tuple <NetworkAddress, DateTimeOffset> > activeTestDataSet = new List <Tuple <NetworkAddress, DateTimeOffset> >() { new Tuple <NetworkAddress, DateTimeOffset> (activeNetworkAddressOne, dateTimeProvider.GetTimeOffset().AddSeconds(-inactiveTimePeriod).AddSeconds(10)), new Tuple <NetworkAddress, DateTimeOffset>(activeNetworkAddressTwo, dateTimeProvider.GetTimeOffset().AddSeconds(-inactiveTimePeriod).AddSeconds(20)), new Tuple <NetworkAddress, DateTimeOffset>(activeNetworkAddressThree, dateTimeProvider.GetTimeOffset().AddSeconds(-inactiveTimePeriod).AddSeconds(30)), new Tuple <NetworkAddress, DateTimeOffset> (externalNetworkAddress, dateTimeProvider.GetTimeOffset().AddSeconds(-inactiveTimePeriod).AddSeconds(40)) }; IPeerAddressManager peerAddressManager = this.CreateTestPeerAddressManager(activeTestDataSet); string[] args = new string[] { $"-dnspeeractivethreshold={inactiveTimePeriod.ToString()}", $"-externalip={externalNetworkAddress.Endpoint.Address.ToString()}", $"-port={externalPort.ToString()}", }; IMasterFile spiedMasterFile = null; Mock <IDnsServer> mockDnsServer = new Mock <IDnsServer>(); mockDnsServer.Setup(d => d.SwapMasterfile(It.IsAny <IMasterFile>())) .Callback <IMasterFile>(m => { spiedMasterFile = m; }) .Verifiable(); Network network = Network.PurpleTest; NodeSettings nodeSettings = new NodeSettings(network.Name, network).LoadArguments(args); DnsSettings dnsSettings = new Mock <DnsSettings>().Object; dnsSettings.DnsFullNode = true; dnsSettings.DnsPeerBlacklistThresholdInSeconds = inactiveTimePeriod; dnsSettings.DnsHostName = "Purple.test.com"; WhitelistManager whitelistManager = new WhitelistManager(dateTimeProvider, loggerFactory, peerAddressManager, mockDnsServer.Object, nodeSettings, dnsSettings); // Act. whitelistManager.RefreshWhitelist(); // Assert. spiedMasterFile.Should().NotBeNull(); Question question = new Question(new Domain(dnsSettings.DnsHostName), RecordType.AAAA); IList <IResourceRecord> resourceRecords = spiedMasterFile.Get(question); resourceRecords.Should().NotBeNullOrEmpty(); IList <IPAddressResourceRecord> ipAddressResourceRecords = resourceRecords.OfType <IPAddressResourceRecord>().ToList(); ipAddressResourceRecords.Should().HaveSameCount(activeTestDataSet); foreach (Tuple <NetworkAddress, DateTimeOffset> testData in activeTestDataSet) { ipAddressResourceRecords.SingleOrDefault(i => i.IPAddress.Equals(testData.Item1.Endpoint.Address)).Should().NotBeNull(); } }
/// <summary> /// Initializes a new instance of the <see cref="WhitelistManager"/> class. /// </summary> /// <param name="dateTimeProvider">The provider for datetime.</param> /// <param name="loggerFactory">The factory to create the logger.</param> /// <param name="peerAddressManager">The manager implementation for peer addresses.</param> /// <param name="dnsServer">The DNS server.</param> /// <param name="connectionSettings">The connection settings.</param> public WhitelistManager(IDateTimeProvider dateTimeProvider, ILoggerFactory loggerFactory, IPeerAddressManager peerAddressManager, IDnsServer dnsServer, ConnectionManagerSettings connectionSettings, DnsSettings dnsSettings) { Guard.NotNull(dateTimeProvider, nameof(dateTimeProvider)); Guard.NotNull(loggerFactory, nameof(loggerFactory)); Guard.NotNull(peerAddressManager, nameof(peerAddressManager)); Guard.NotNull(dnsServer, nameof(dnsServer)); Guard.NotNull(dnsSettings, nameof(dnsSettings)); Guard.NotNull(connectionSettings, nameof(connectionSettings)); this.dateTimeProvider = dateTimeProvider; this.logger = loggerFactory.CreateLogger(this.GetType().FullName); this.peerAddressManager = peerAddressManager; this.dnsServer = dnsServer; this.dnsSettings = dnsSettings; this.externalEndpoint = connectionSettings.ExternalEndpoint; }
public void WhenRefreshWhitelist_AndActivePeersAvailable_ThenWhitelistContainsActivePeers() { // Arrange. Mock <IDateTimeProvider> mockDateTimeProvider = new Mock <IDateTimeProvider>(); Mock <ILogger> mockLogger = new Mock <ILogger>(); Mock <ILoggerFactory> mockLoggerFactory = new Mock <ILoggerFactory>(); mockLoggerFactory.Setup(l => l.CreateLogger(It.IsAny <string>())).Returns(mockLogger.Object); ILoggerFactory loggerFactory = mockLoggerFactory.Object; mockDateTimeProvider.Setup(d => d.GetTimeOffset()).Returns(new DateTimeOffset(new DateTime(2017, 8, 30, 1, 2, 3))).Verifiable(); IDateTimeProvider dateTimeProvider = mockDateTimeProvider.Object; int inactiveTimePeriod = 2000; IPAddress activeIpAddressOne = IPAddress.Parse("::ffff:192.168.0.1"); var activeEndpointOne = new IPEndPoint(activeIpAddressOne, 80); IPAddress activeIpAddressTwo = IPAddress.Parse("::ffff:192.168.0.2"); var activeEndpointTwo = new IPEndPoint(activeIpAddressTwo, 80); IPAddress activeIpAddressThree = IPAddress.Parse("::ffff:192.168.0.3"); var activeEndpointThree = new IPEndPoint(activeIpAddressThree, 80); IPAddress activeIpAddressFour = IPAddress.Parse("::ffff:192.168.0.4"); var activeEndpointFour = new IPEndPoint(activeIpAddressFour, 80); var testDataSet = new List <Tuple <IPEndPoint, DateTimeOffset> >() { new Tuple <IPEndPoint, DateTimeOffset> (activeEndpointOne, dateTimeProvider.GetTimeOffset().AddSeconds(-inactiveTimePeriod).AddSeconds(10)), new Tuple <IPEndPoint, DateTimeOffset>(activeEndpointTwo, dateTimeProvider.GetTimeOffset().AddSeconds(-inactiveTimePeriod).AddSeconds(20)), new Tuple <IPEndPoint, DateTimeOffset>(activeEndpointThree, dateTimeProvider.GetTimeOffset().AddSeconds(-inactiveTimePeriod).AddSeconds(30)), new Tuple <IPEndPoint, DateTimeOffset>(activeEndpointFour, dateTimeProvider.GetTimeOffset().AddSeconds(-inactiveTimePeriod).AddSeconds(40)) }; IPeerAddressManager peerAddressManager = this.CreateTestPeerAddressManager(testDataSet); IMasterFile spiedMasterFile = null; Mock <IDnsServer> mockDnsServer = new Mock <IDnsServer>(); mockDnsServer.Setup(d => d.SwapMasterfile(It.IsAny <IMasterFile>())) .Callback <IMasterFile>(m => { spiedMasterFile = m; }) .Verifiable(); NodeSettings nodeSettings = NodeSettings.Default(); DnsSettings dnsSettings = new Mock <DnsSettings>().Object; dnsSettings.DnsPeerBlacklistThresholdInSeconds = inactiveTimePeriod; dnsSettings.DnsHostName = "stratis.test.com"; ConnectionManagerSettings connectionSettings = new ConnectionManagerSettings(); connectionSettings.Load(nodeSettings); WhitelistManager whitelistManager = new WhitelistManager(dateTimeProvider, loggerFactory, peerAddressManager, mockDnsServer.Object, connectionSettings, dnsSettings); // Act. whitelistManager.RefreshWhitelist(); // Assert. spiedMasterFile.Should().NotBeNull(); Question question = new Question(new Domain(dnsSettings.DnsHostName), RecordType.AAAA); IList <IResourceRecord> resourceRecords = spiedMasterFile.Get(question); resourceRecords.Should().NotBeNullOrEmpty(); IList <IPAddressResourceRecord> ipAddressResourceRecords = resourceRecords.OfType <IPAddressResourceRecord>().ToList(); ipAddressResourceRecords.Should().HaveSameCount(testDataSet); foreach (Tuple <IPEndPoint, DateTimeOffset> testData in testDataSet) { ipAddressResourceRecords.SingleOrDefault(i => i.IPAddress.Equals(testData.Item1.Address)).Should().NotBeNull(); } }
public void WhenRefreshWhitelist_AndOwnIPInPeers_AndNotRunningFullNode_ThenWhitelistDoesNotContainOwnIP() { // Arrange. var mockDateTimeProvider = new Mock <IDateTimeProvider>(); var mockLogger = new Mock <ILogger>(); var mockLoggerFactory = new Mock <ILoggerFactory>(); mockLoggerFactory.Setup(l => l.CreateLogger(It.IsAny <string>())).Returns(mockLogger.Object); ILoggerFactory loggerFactory = mockLoggerFactory.Object; mockDateTimeProvider.Setup(d => d.GetTimeOffset()).Returns(new DateTimeOffset(new DateTime(2017, 8, 30, 1, 2, 3))).Verifiable(); IDateTimeProvider dateTimeProvider = mockDateTimeProvider.Object; int inactiveTimePeriod = 5000; IPAddress activeIpAddressOne = IPAddress.Parse("::ffff:192.168.0.1"); var activeEndpointOne = new IPEndPoint(activeIpAddressOne, 80); IPAddress activeIpAddressTwo = IPAddress.Parse("::ffff:192.168.0.2"); var activeEndpointTwo = new IPEndPoint(activeIpAddressTwo, 80); IPAddress activeIpAddressThree = IPAddress.Parse("::ffff:192.168.0.3"); var activeEndpointThree = new IPEndPoint(activeIpAddressThree, 80); var activeTestDataSet = new List <Tuple <IPEndPoint, DateTimeOffset> >() { new Tuple <IPEndPoint, DateTimeOffset> (activeEndpointOne, dateTimeProvider.GetTimeOffset().AddSeconds(-inactiveTimePeriod).AddSeconds(10)), new Tuple <IPEndPoint, DateTimeOffset>(activeEndpointTwo, dateTimeProvider.GetTimeOffset().AddSeconds(-inactiveTimePeriod).AddSeconds(20)), new Tuple <IPEndPoint, DateTimeOffset>(activeEndpointThree, dateTimeProvider.GetTimeOffset().AddSeconds(-inactiveTimePeriod).AddSeconds(30)), }; IPAddress externalIPAdress = IPAddress.Parse("::ffff:192.168.99.99"); int externalPort = 80; var externalEndpoint = new IPEndPoint(externalIPAdress, externalPort); var externalIPTestDataSet = new List <Tuple <IPEndPoint, DateTimeOffset> >() { new Tuple <IPEndPoint, DateTimeOffset> (externalEndpoint, dateTimeProvider.GetTimeOffset().AddSeconds(-inactiveTimePeriod).AddSeconds(40)), }; IPeerAddressManager peerAddressManager = this.CreateTestPeerAddressManager(activeTestDataSet.Union(externalIPTestDataSet).ToList()); var args = new string[] { $"-dnspeeractivethreshold={inactiveTimePeriod.ToString()}", $"-externalip={externalEndpoint.Address.ToString()}", $"-port={externalPort.ToString()}", }; IMasterFile spiedMasterFile = null; var mockDnsServer = new Mock <IDnsServer>(); mockDnsServer.Setup(d => d.SwapMasterfile(It.IsAny <IMasterFile>())) .Callback <IMasterFile>(m => { spiedMasterFile = m; }) .Verifiable(); Network network = KnownNetworks.StratisTest; var nodeSettings = new NodeSettings(network, args: args); DnsSettings dnsSettings = new DnsSettings(NodeSettings.Default(this.Network)); dnsSettings.DnsPeerBlacklistThresholdInSeconds = inactiveTimePeriod; dnsSettings.DnsHostName = "stratis.test.com"; dnsSettings.DnsFullNode = false; ConnectionManagerSettings connectionSettings = new ConnectionManagerSettings(nodeSettings); var whitelistManager = new WhitelistManager(dateTimeProvider, loggerFactory, peerAddressManager, mockDnsServer.Object, connectionSettings, dnsSettings, this.peerBanning); // Act. whitelistManager.RefreshWhitelist(); // Assert. spiedMasterFile.Should().NotBeNull(); var question = new Question(new Domain(dnsSettings.DnsHostName), RecordType.A); IList <IResourceRecord> resourceRecords = spiedMasterFile.Get(question); resourceRecords.Should().NotBeNullOrEmpty(); IList <IPAddressResourceRecord> ipAddressResourceRecords = resourceRecords.OfType <IPAddressResourceRecord>().ToList(); ipAddressResourceRecords.Should().HaveSameCount(activeTestDataSet); foreach (Tuple <IPEndPoint, DateTimeOffset> testData in activeTestDataSet) { ipAddressResourceRecords.SingleOrDefault(i => i.IPAddress.Equals(testData.Item1.Address.MapToIPv4())).Should().NotBeNull(); } // External IP. ipAddressResourceRecords.SingleOrDefault(i => i.IPAddress.Equals(externalEndpoint)).Should().BeNull("the external IP peer should not be in DNS as not running full node."); }
public void WhenRefreshWhitelist_AndActivePeersAvailable_ThenWhitelistContainsActivePeers() { // Arrange. var mockDateTimeProvider = new Mock <IDateTimeProvider>(); var mockLogger = new Mock <ILogger>(); var mockLoggerFactory = new Mock <ILoggerFactory>(); mockLoggerFactory.Setup(l => l.CreateLogger(It.IsAny <string>())).Returns(mockLogger.Object); ILoggerFactory loggerFactory = mockLoggerFactory.Object; mockDateTimeProvider.Setup(d => d.GetTimeOffset()).Returns(new DateTimeOffset(new DateTime(2017, 8, 30, 1, 2, 3))).Verifiable(); IDateTimeProvider dateTimeProvider = mockDateTimeProvider.Object; int inactiveTimePeriod = 2000; IPAddress activeIpAddressOne = IPAddress.Parse("::ffff:192.168.0.1"); var activeEndpointOne = new IPEndPoint(activeIpAddressOne, 80); IPAddress activeIpAddressTwo = IPAddress.Parse("::ffff:192.168.0.2"); var activeEndpointTwo = new IPEndPoint(activeIpAddressTwo, 80); IPAddress activeIpAddressThree = IPAddress.Parse("::ffff:192.168.0.3"); var activeEndpointThree = new IPEndPoint(activeIpAddressThree, 80); IPAddress activeIpAddressFour = IPAddress.Parse("::ffff:192.168.0.4"); var activeEndpointFour = new IPEndPoint(activeIpAddressFour, 80); IPAddress activeIpAddressFive = IPAddress.Parse("2607:f8b0:4009:80e::200e"); var activeEndpointFive = new IPEndPoint(activeIpAddressFive, 80); var testDataSet = new List <Tuple <IPEndPoint, DateTimeOffset> >() { new Tuple <IPEndPoint, DateTimeOffset>(activeEndpointOne, dateTimeProvider.GetTimeOffset().AddSeconds(-inactiveTimePeriod).AddSeconds(10)), new Tuple <IPEndPoint, DateTimeOffset>(activeEndpointTwo, dateTimeProvider.GetTimeOffset().AddSeconds(-inactiveTimePeriod).AddSeconds(20)), new Tuple <IPEndPoint, DateTimeOffset>(activeEndpointThree, dateTimeProvider.GetTimeOffset().AddSeconds(-inactiveTimePeriod).AddSeconds(30)), new Tuple <IPEndPoint, DateTimeOffset>(activeEndpointFour, dateTimeProvider.GetTimeOffset().AddSeconds(-inactiveTimePeriod).AddSeconds(40)), new Tuple <IPEndPoint, DateTimeOffset>(activeEndpointFive, dateTimeProvider.GetTimeOffset().AddSeconds(-inactiveTimePeriod).AddSeconds(50)) }; // PeerAddressManager does not support IPv4 addresses that are not represented as embedded IPv4 addresses in an IPv6 address. IPeerAddressManager peerAddressManager = this.CreateTestPeerAddressManager(testDataSet); IMasterFile spiedMasterFile = null; var mockDnsServer = new Mock <IDnsServer>(); mockDnsServer.Setup(d => d.SwapMasterfile(It.IsAny <IMasterFile>())) .Callback <IMasterFile>(m => { spiedMasterFile = m; }) .Verifiable(); NodeSettings nodeSettings = NodeSettings.Default(this.Network); DnsSettings dnsSettings = new DnsSettings(NodeSettings.Default(this.Network)); dnsSettings.DnsPeerBlacklistThresholdInSeconds = inactiveTimePeriod; dnsSettings.DnsHostName = "stratis.test.com"; ConnectionManagerSettings connectionSettings = new ConnectionManagerSettings(nodeSettings); var whitelistManager = new WhitelistManager(dateTimeProvider, loggerFactory, peerAddressManager, mockDnsServer.Object, connectionSettings, dnsSettings, this.peerBanning); // Act. whitelistManager.RefreshWhitelist(); // Assert. spiedMasterFile.Should().NotBeNull(); // Check for A records (IPv4 embedded in IPv6 and IPv4 addresses). var question4 = new Question(new Domain(dnsSettings.DnsHostName), RecordType.A); IList <IResourceRecord> resourceRecordsIpv4 = spiedMasterFile.Get(question4); resourceRecordsIpv4.Should().NotBeNullOrEmpty(); IList <IPAddressResourceRecord> ipAddressResourceRecords4 = resourceRecordsIpv4.OfType <IPAddressResourceRecord>().ToList(); ipAddressResourceRecords4.Should().HaveCount(4); // Check for AAAA records (IPv6 addresses). var question6 = new Question(new Domain(dnsSettings.DnsHostName), RecordType.AAAA); IList <IResourceRecord> resourceRecordsIpv6 = spiedMasterFile.Get(question6); resourceRecordsIpv6.Should().NotBeNullOrEmpty(); IList <IPAddressResourceRecord> ipAddressResourceRecords6 = resourceRecordsIpv6.OfType <IPAddressResourceRecord>().ToList(); ipAddressResourceRecords6.Should().HaveCount(1); foreach (Tuple <IPEndPoint, DateTimeOffset> testData in testDataSet) { if (testData.Item1.Address.IsIPv4MappedToIPv6) { ipAddressResourceRecords4.SingleOrDefault(i => i.IPAddress.Equals(testData.Item1.Address.MapToIPv4())).Should().NotBeNull(); } else { ipAddressResourceRecords6.SingleOrDefault(i => i.IPAddress.Equals(testData.Item1.Address)).Should().NotBeNull(); } } }
public PeerBanning(IConnectionManager connectionManager, ILoggerFactory loggerFactory, IDateTimeProvider dateTimeProvider, IPeerAddressManager peerAddressManager) { this.logger = loggerFactory.CreateLogger("Impleum.Bitcoin.FullNode"); this.connectionManager = connectionManager; this.dateTimeProvider = dateTimeProvider; this.peerAddressManager = peerAddressManager; }
private IConnectionManager CreateConnectionManager(NodeSettings nodeSettings, ConnectionManagerSettings connectionSettings, IPeerAddressManager peerAddressManager, IPeerConnector peerConnector) { var connectionManager = new ConnectionManager( DateTimeProvider.Default, this.loggerFactory, this.network, this.networkPeerFactory, nodeSettings, this.nodeLifetime, this.networkPeerParameters, peerAddressManager, new IPeerConnector[] { peerConnector }, null, connectionSettings); return(connectionManager); }
private PeerConnectorDiscovery CreatePeerConnectorDiscovery(NodeSettings nodeSettings, ConnectionManagerSettings connectionSettings, IPeerAddressManager peerAddressManager) { var peerConnector = new PeerConnectorDiscovery(this.asyncLoopFactory, DateTimeProvider.Default, this.extendedLoggerFactory, this.network, this.networkPeerFactory, this.nodeLifetime, nodeSettings, connectionSettings, peerAddressManager); var connectionManager = CreateConnectionManager(nodeSettings, connectionSettings, peerAddressManager, peerConnector); peerConnector.Initialize(connectionManager); return(peerConnector); }
private IConnectionManager CreateConnectionManager(NodeSettings nodeSettings, ConnectionManagerSettings connectionSettings, IPeerAddressManager peerAddressManager, IPeerConnector peerConnector) { var networkPeerFactory = new Mock <INetworkPeerFactory>(); var connectionManager = new ConnectionManager( DateTimeProvider.Default, this.LoggerFactory.Object, this.network, networkPeerFactory.Object, nodeSettings, this.nodeLifetime, this.networkPeerParameters, peerAddressManager, new IPeerConnector[] { peerConnector }, null, connectionSettings, new VersionProvider()); return(connectionManager); }
public PeerBanning(IConnectionManager connectionManager, ILoggerFactory loggerFactory, IDateTimeProvider dateTimeProvider, IPeerAddressManager peerAddressManager) { this.logger = loggerFactory.CreateLogger(this.GetType().FullName); this.connectionManager = connectionManager; this.dateTimeProvider = dateTimeProvider; this.peerAddressManager = peerAddressManager; }
/// <summary> /// Initializes a new instance of the <see cref="WhitelistManager"/> class. /// </summary> /// <param name="dateTimeProvider">The provider for datetime.</param> /// <param name="loggerFactory">The factory to create the logger.</param> /// <param name="peerAddressManager">The manager implementation for peer addresses.</param> /// <param name="dnsServer">The DNS server.</param> /// <param name="nodeSettings">The node settings.</param> public WhitelistManager(IDateTimeProvider dateTimeProvider, ILoggerFactory loggerFactory, IPeerAddressManager peerAddressManager, IDnsServer dnsServer, NodeSettings nodeSettings, DnsSettings dnsSettings) { Guard.NotNull(dateTimeProvider, nameof(dateTimeProvider)); Guard.NotNull(loggerFactory, nameof(loggerFactory)); Guard.NotNull(peerAddressManager, nameof(peerAddressManager)); Guard.NotNull(dnsServer, nameof(dnsServer)); Guard.NotNull(nodeSettings, nameof(nodeSettings)); Guard.NotNull(dnsSettings, nameof(dnsSettings)); Guard.NotNull(dnsSettings.DnsHostName, nameof(dnsSettings.DnsHostName)); Guard.NotNull(nodeSettings.ConnectionManager, nameof(nodeSettings.ConnectionManager)); this.dateTimeProvider = dateTimeProvider; this.logger = loggerFactory.CreateLogger(this.GetType().FullName); this.peerAddressManager = peerAddressManager; this.dnsServer = dnsServer; this.dnsPeerBlacklistThresholdInSeconds = dnsSettings.DnsPeerBlacklistThresholdInSeconds; this.dnsHostName = dnsSettings.DnsHostName; this.externalEndpoint = nodeSettings.ConnectionManager.ExternalEndpoint; this.fullNodeMode = dnsSettings.DnsFullNode; }
/// <summary>Constructor used for unit testing.</summary> public PeerConnectorConnectNode(NodeSettings nodeSettings, IPeerAddressManager peerAddressManager) : base(nodeSettings, peerAddressManager) { }
/// <summary> /// Initializes a new instance of the <see cref="WhitelistManager"/> class. /// </summary> /// <param name="dateTimeProvider">The provider for datetime.</param> /// <param name="loggerFactory">The factory to create the logger.</param> /// <param name="peerAddressManager">The manager implementation for peer addresses.</param> /// <param name="dnsServer">The DNS server.</param> /// <param name="connectionSettings">The connection settings.</param> /// <param name="dnsSettings">The DNS settings.</param> /// <param name="peerBanning">Peer banning component.</param> public WhitelistManager(IDateTimeProvider dateTimeProvider, ILoggerFactory loggerFactory, IPeerAddressManager peerAddressManager, IDnsServer dnsServer, ConnectionManagerSettings connectionSettings, DnsSettings dnsSettings, IPeerBanning peerBanning) { Guard.NotNull(dateTimeProvider, nameof(dateTimeProvider)); Guard.NotNull(loggerFactory, nameof(loggerFactory)); Guard.NotNull(peerAddressManager, nameof(peerAddressManager)); Guard.NotNull(dnsServer, nameof(dnsServer)); Guard.NotNull(dnsSettings, nameof(dnsSettings)); Guard.NotNull(connectionSettings, nameof(connectionSettings)); Guard.NotNull(peerBanning, nameof(peerBanning)); this.dateTimeProvider = dateTimeProvider; this.logger = loggerFactory.CreateLogger("Impleum.Bitcoin.Fullnode"); this.peerAddressManager = peerAddressManager; this.dnsServer = dnsServer; this.dnsSettings = dnsSettings; this.externalEndpoint = connectionSettings.ExternalEndpoint; this.peerBanning = peerBanning; }