Example #1
0
        private void HandleGatewayTunnelRequest(
            II2NPHeader msg,
            IEnumerable <AesEGBuildRequestRecord> records,
            EGBuildRequestRecord myrec,
            BuildRequestRecord drec)
        {
            var tunnel   = new GatewayTunnel(drec);
            var replykey = drec.ReplyKey.Key.Clone();
            var replyiv  = drec.ReplyIV.Clone();

            tunnel.EstablishedTime.SetNow();

            var doaccept = AcceptingTunnels(drec);

            var response = doaccept ? BuildResponseRecord.RequestResponse.Accept : BuildResponseRecord.DefaultErrorReply;

            Logging.LogDebug(() => string.Format("HandleGatewayTunnelRequest {3}: {0} Gateway tunnel request: {1} for tunnel id {2}.",
                                                 tunnel.Destination.Id32Short,
                                                 response,
                                                 tunnel.ReceiveTunnelId,
                                                 tunnel.TunnelDebugTrace));
            TunnelProvider.UpdateTunnelBuildReply(records, myrec, replykey, replyiv, response);

            if (response == BuildResponseRecord.RequestResponse.Accept)
            {
                AddTunnel(tunnel);
                TunnelMgr.AddExternalTunnel(tunnel);
                AcceptedTunnelBuildRequest(drec);
            }
            TransportProvider.Send(tunnel.Destination, msg.Message);
        }
        private void HandleEndpointTunnelRequest(
            II2NPHeader msg,
            IEnumerable <AesEGBuildRequestRecord> records,
            EGBuildRequestRecord myrec,
            BuildRequestRecord drec)
        {
            var tunnel   = new EndpointTunnel(drec);
            var replykey = drec.ReplyKey.Key.Clone();
            var replyiv  = drec.ReplyIV.Clone();

            tunnel.EstablishedTime.SetNow();

            var doaccept = AcceptingTunnels(drec);

            var response = doaccept ? BuildResponseRecord.RequestResponse.Accept : BuildResponseRecord.DefaultErrorReply;

            DebugUtils.LogDebug(() => string.Format("HandleEndpointTunnelRequest {3}: {0} Endpoint tunnel request: {1} for tunnel id {2}.",
                                                    tunnel.Destination.Id32Short,
                                                    response,
                                                    tunnel.ReceiveTunnelId,
                                                    tunnel.TunnelDebugTrace));
            TunnelProvider.UpdateTunnelBuildReply(records, myrec, replykey, replyiv, response);

            var responsemessage = new VariableTunnelBuildReplyMessage(records.Select(r => new BuildResponseRecord(r)));
            var buildreplymsg   = new TunnelGatewayMessage(responsemessage.GetHeader16(tunnel.ResponseMessageId), tunnel.ResponseTunnelId);

            if (response == BuildResponseRecord.RequestResponse.Accept)
            {
                AddTunnel(tunnel);
                TunnelMgr.AddExternalTunnel(tunnel);
                AcceptedTunnelBuildRequest(drec);
            }
            TransportProvider.Send(tunnel.Destination, buildreplymsg);
        }
Example #3
0
        public ApiContext(DbContextOptions <ApiContext> options)
            : base(options)
        {
            // Build Default ConnStr
            string endpoint = new NpgsqlConnectionStringBuilder(_dbSection["ConnectionString"]).Host;

            _logger.LogInformation($"Buffer endpoint: {endpoint}");
            uint port = uint.Parse(_dbSection["Port"]);

            // Tunnel:SshClient DatabaseHook
            _client = TunnelProvider.CreateClient();
            (SshClient TunnelClient, ForwardedPortLocal PortLocal)tunnel =
                TunnelProvider.HookDatabase(_client, endpoint, port);
            _client = tunnel.TunnelClient;

            // Check:Active SshClientConnections
            TunnelProvider.ActiveSshConnections(_client);

            // Check:Tunnel WebPortForwardState
            TunnelProvider.SshPortForwardState(_client);

            // Set:Database Connection String
            _connectionStr =
                new NpgsqlConnectionStringBuilder(_dbSection["ConnectionString"])
            {
                Host           = tunnel.PortLocal.BoundHost,
                Port           = (int)tunnel.PortLocal.BoundPort,
                CommandTimeout = 30,
                KeepAlive      = 30,
            }.ToString();
        }
Example #4
0
 public TunnelsApiController(TunnelProvider tunnelProvider, UsersProvider usersProvider, IOptions <TunnelConfig> config, IStringLocalizer <TunnelsApiController> localizer)
 {
     _tunnelProvider = tunnelProvider;
     _usersProvider  = usersProvider;
     _tunnelConfig   = config.Value;
     _localizer      = localizer;
 }
Example #5
0
        internal ClientTunnelProvider(TunnelProvider tp)
        {
            TunnelMgr = tp;

/*
 *          DefaultDestination = new ClientDestination( this, false, null );
 *          //Clients.Add( DefaultDestination );
 *
 *          TestDestination = new ClientDestination( this, false, null );
 *          Clients.Add( TestDestination );
 *
 *          TestSource = new ClientDestination( this, false, TestDestination );
 *          Clients.Add( TestSource );
 */
        }
Example #6
0
        /// <summary>
        /// Start the router with the current RouterContext settings.
        /// </summary>
        public static void Start()
        {
            lock ( StartedLock )
            {
                if (Started)
                {
                    return;
                }

                try
                {
                    var rci = RouterContext.Inst;
                    NetDb.Start();

                    Logging.Log("I: " + RouterContext.Inst.MyRouterInfo.ToString());
                    Logging.Log("Published: " + RouterContext.Inst.Published.ToString());

                    Logging.Log("Connecting...");
                    TransportProvider.Start();
                    TunnelProvider.Start();

                    ClientMgr        = new ClientTunnelProvider(TunnelProvider.Inst);
                    ExplorationMgr   = new ExplorationTunnelProvider(TunnelProvider.Inst);
                    TransitTunnelMgr = new TransitTunnelProvider(TunnelProvider.Inst);

                    Worker = new Thread(Run)
                    {
                        Name         = "Router",
                        IsBackground = true
                    };
                    Worker.Start();

                    NetDb.Inst.IdentHashLookup.LeaseSetReceived += IdentHashLookup_LeaseSetReceived;
                    NetDb.Inst.IdentHashLookup.LookupFailure    += IdentHashLookup_LookupFailure;

                    Started = true;
                }
                catch (Exception ex)
                {
                    Logging.Log(ex);
                }
            }
        }
Example #7
0
        public static void Start()
        {
            if (Started)
            {
                return;
            }

            var rci = RouterContext.Inst;

            NetDb.Start();

            Logging.Log("I: " + RouterContext.Inst.MyRouterInfo.ToString());
            Logging.Log("Published: " + RouterContext.Inst.Published.ToString());

            Logging.Log("Connecting...");
            TransportProvider.Start();
            TunnelProvider.Start();

            Started = true;
        }
 internal ExplorationTunnelProvider(TunnelProvider tp)
 {
     TunnelMgr = tp;
 }
Example #9
0
 internal PassthroughTunnelProvider(TunnelProvider tp)
 {
     TunnelMgr = tp;
 }
Example #10
0
 internal ExplorationTunnelProvider(TunnelProvider tp)
 {
     TunnelMgr = tp;
     ReadAppConfig();
 }
Example #11
0
        private bool HandleReceiveQueue()
        {
            II2NPHeader msg = null;
            List <TunnelDataMessage> tdmsgs = null;

            lock ( ReceiveQueue )
            {
                if (ReceiveQueue.Count == 0)
                {
                    return(true);
                }

                if (ReceiveQueue.Any(mq => mq.MessageType == I2NPMessage.MessageTypes.TunnelData))
                {
                    var removelist = ReceiveQueue.Where(mq => mq.MessageType == I2NPMessage.MessageTypes.TunnelData);
                    tdmsgs = removelist.Select(mq => (TunnelDataMessage)mq.Message).ToList();
                    foreach (var one in removelist.ToArray())
                    {
                        ReceiveQueue.Remove(one);
                    }
                }
                else
                {
                    msg = ReceiveQueue.Last.Value;
                    ReceiveQueue.RemoveLast();
                }
            }

            if (tdmsgs != null)
            {
                HandleTunnelData(tdmsgs);
                return(true);
            }

            DebugUtils.LogDebug("InboundTunnel " + TunnelDebugTrace + " HandleReceiveQueue: " + msg.MessageType.ToString());

            switch (msg.MessageType)
            {
            case I2NPMessage.MessageTypes.TunnelData:
                throw new NotImplementedException("Should not happen " + TunnelDebugTrace);

            case I2NPMessage.MessageTypes.TunnelBuildReply:
                ThreadPool.QueueUserWorkItem(cb =>
                {
                    TunnelProvider.Inst.HandleTunnelBuildReply((II2NPHeader16)msg, (TunnelBuildReplyMessage)msg.Message);
                });
                return(true);

            case I2NPMessage.MessageTypes.VariableTunnelBuildReply:
                ThreadPool.QueueUserWorkItem(cb =>
                {
                    TunnelProvider.Inst.HandleVariableTunnelBuildReply((II2NPHeader16)msg, (VariableTunnelBuildReplyMessage)msg.Message);
                });
                return(true);

            case I2NPMessage.MessageTypes.DeliveryStatus:
#if LOG_ALL_TUNNEL_TRANSFER
                DebugUtils.LogDebug("InboundTunnel " + TunnelDebugTrace + ": DeliveryStatus: " + msg.Message.ToString());
#endif

                ThreadPool.QueueUserWorkItem(cb => {
                    lock (DeliveryStatusReceivedLock) if (DeliveryStatusReceived != null)
                        {
                            DeliveryStatusReceived((DeliveryStatusMessage)msg.Message);
                        }
                });
                break;

            case I2NPMessage.MessageTypes.DatabaseStore:
                var ds = (DatabaseStoreMessage)msg.Message;
                ThreadPool.QueueUserWorkItem(cb =>
                {
                    TunnelProvider.HandleDatabaseStore(ds);
                });
                break;

            case I2NPMessage.MessageTypes.Garlic:
#if LOG_ALL_TUNNEL_TRANSFER
                DebugUtils.Log("InboundTunnel " + TunnelDebugTrace + ": Garlic: " + msg.Message.ToString());
#endif

                ThreadPool.QueueUserWorkItem(cb =>
                {
                    lock (GarlicMessageReceivedLock) if (GarlicMessageReceived != null)
                        {
                            GarlicMessageReceived((GarlicMessage)msg.Message);
                        }
                });
                break;

            default:
                DebugUtils.LogWarning("InboundTunnel " + TunnelDebugTrace + " HandleReceiveQueue: Dropped " + msg.ToString());
                break;
            }

            return(true);
        }
Example #12
0
 internal ClientTunnelProvider(TunnelProvider tp)
 {
     TunnelMgr = tp;
 }
Example #13
0
 public TunnelController(UsersProvider usersProvider, TunnelProvider tunnelProvider, IOptions <TunnelConfig> config)
 {
     _usersProvider  = usersProvider;
     _tunnelProvider = tunnelProvider;
     _tunnelConfig   = config.Value;
 }