Ejemplo n.º 1
0
        private void StartNodeServer()
        {
            var logs = new StringBuilder();
            logs.AppendLine("Node listening on:");

            foreach (NodeServerEndpoint listen in this.ConnectionSettings.Bind)
            {
                NetworkPeerConnectionParameters cloneParameters = this.Parameters.Clone();
                NetworkPeerServer server = this.NetworkPeerFactory.CreateNetworkPeerServer(listen.Endpoint, this.ConnectionSettings.ExternalEndpoint, this.Parameters.Version);

                this.Servers.Add(server);
                var cmb = (cloneParameters.TemplateBehaviors.Single(x => x is IConnectionManagerBehavior) as ConnectionManagerBehavior);
                cmb.Whitelisted = listen.Whitelisted;

                server.InboundNetworkPeerConnectionParameters = cloneParameters;
                try
                {
                    server.Listen();
                }
                catch (SocketException e)
                {
                    this.logger.LogCritical("Unable to listen on port {0} (you can change the port using '-port=[number]'). Error message: {1}", listen.Endpoint.Port, e.Message);
                    throw e;
                }

                logs.Append(listen.Endpoint.Address + ":" + listen.Endpoint.Port);
                if (listen.Whitelisted)
                    logs.Append(" (whitelisted)");

                logs.AppendLine();
            }

            this.logger.LogInformation(logs.ToString());
        }
        public void Validate_AllowClientConnection_State(bool inIBD, bool isWhiteListed, bool closeClient)
        {
            // Arrange
            var networkPeerFactory = new Mock <INetworkPeerFactory>();

            networkPeerFactory.Setup(npf => npf.CreateConnectedNetworkPeerAsync(It.IsAny <IPEndPoint>(),
                                                                                It.IsAny <NetworkPeerConnectionParameters>(),
                                                                                It.IsAny <NetworkPeerDisposer>())).Returns(Task.FromResult(new Mock <INetworkPeer>().Object));

            var initialBlockDownloadState = new Mock <IInitialBlockDownloadState>();

            initialBlockDownloadState.Setup(i => i.IsInitialBlockDownload()).Returns(inIBD);

            var nodeSettings = new NodeSettings(KnownNetworks.RegTest);
            var connectionManagerSettings = new ConnectionManagerSettings(nodeSettings);

            var endpointAddNode = new IPEndPoint(IPAddress.Parse("::ffff:192.168.0.1"), 80);

            var asyncProvider = this.CreateAsyncProvider();

            var peerAddressManager = new Mock <IPeerAddressManager>();

            peerAddressManager.Setup(pam => pam.FindPeersByIp(It.IsAny <IPEndPoint>())).Returns(new List <PeerAddress>());

            var networkPeerServer = new NetworkPeerServer(this.Network,
                                                          endpointAddNode,
                                                          endpointAddNode,
                                                          ProtocolVersion.PROTOCOL_VERSION,
                                                          this.extendedLoggerFactory,
                                                          networkPeerFactory.Object,
                                                          initialBlockDownloadState.Object,
                                                          connectionManagerSettings,
                                                          asyncProvider,
                                                          peerAddressManager.Object,
                                                          DateTimeProvider.Default);

            // Mimic external client
            const int portNumber = 80;
            var       client     = new TcpClient("www.stratisplatform.com", portNumber);

            var ipandport = client.Client.RemoteEndPoint.ToString();
            var ip        = ipandport.Replace(ipandport.Substring(ipandport.IndexOf(':')), "");

            var endpointDiscovered = new IPEndPoint(IPAddress.Parse(ip), portNumber);

            // Include the external client as a NodeServerEndpoint.
            connectionManagerSettings.Bind.Add(new NodeServerEndpoint(endpointDiscovered, isWhiteListed));

            // Act
            var result = networkPeerServer.InvokeMethod("AllowClientConnection", client);

            // Assert
            Assert.True((inIBD && !isWhiteListed) == closeClient);

            this.testOutput.WriteLine(
                $"In IBD : {inIBD.ToString()}, " +
                $"Is White Listed : {isWhiteListed.ToString()}, " +
                $"Close Client : {result.ToString()}");
        }
        public void Validate_AllowClientConnection_State(bool inIBD, bool isWhiteListed, bool closeClient)
        {
            // Arrange
            var networkPeerFactory = new Mock <INetworkPeerFactory>();

            networkPeerFactory.Setup(npf => npf.CreateConnectedNetworkPeerAsync(It.IsAny <IPEndPoint>(),
                                                                                It.IsAny <NetworkPeerConnectionParameters>(),
                                                                                It.IsAny <NetworkPeerDisposer>())).Returns(Task.FromResult(new Mock <INetworkPeer>().Object));

            var initialBlockDownloadState = new Mock <IInitialBlockDownloadState>();

            initialBlockDownloadState.Setup(i => i.IsInitialBlockDownload()).Returns(inIBD);

            var nodeSettings = new NodeSettings(KnownNetworks.RegTest);
            var connectionManagerSettings = new ConnectionManagerSettings(nodeSettings);

            var endpointAddNode = new IPEndPoint(IPAddress.Parse("::ffff:192.168.0.1"), 80);

            var asyncProvider = this.CreateAsyncProvider();

            var peerAddressManager = new Mock <IPeerAddressManager>();

            peerAddressManager.Setup(pam => pam.FindPeersByIp(It.IsAny <IPEndPoint>())).Returns(new List <PeerAddress>());

            var networkPeerServer = new NetworkPeerServer(this.Network,
                                                          endpointAddNode,
                                                          endpointAddNode,
                                                          ProtocolVersion.PROTOCOL_VERSION,
                                                          this.extendedLoggerFactory,
                                                          networkPeerFactory.Object,
                                                          initialBlockDownloadState.Object,
                                                          connectionManagerSettings,
                                                          asyncProvider,
                                                          peerAddressManager.Object,
                                                          DateTimeProvider.Default);

            // Mimic external client
            const int portNumber = 80;
            var       client     = new TcpClient("www.stratisplatform.com", portNumber);

            string ip        = string.Empty;
            var    ipandport = client.Client.RemoteEndPoint.ToString();

            if (client.Client.RemoteEndPoint.AddressFamily == AddressFamily.InterNetwork)
            {
                ip = ipandport.Replace(ipandport[ipandport.IndexOf(':')..], "");