Пример #1
0
        /*
         * void SocketFromTmpServerClosed(Socket closedSocket)
         * {
         *  Console.WriteLine("{0} WARNING: Socket closed using the default initial SocketCloseHandler", DateTime.Now);
         * }
         */
        static void GotServerName(String oldServerName, String newServerName, TmpControlConnection controlConnection)
        {
            if (oldServerName != null)
            {
                if (oldServerName.Equals(newServerName))
                {
                    return;
                }
                serverNameToControlConnection.Remove(oldServerName);
            }

            //
            // Check if this server name already exists, if so, dispose that connection
            //
            TmpControlConnection existingConnection;

            if (serverNameToControlConnection.TryGetValue(newServerName, out existingConnection))
            {
                if (existingConnection == controlConnection)
                {
                    return;
                }

                Console.WriteLine("{0} Got ServerInfo from new TmpControlConnection with Name='{1}', however, a connection with that name already exists...disposing the old one and using the new one",
                                  DateTime.Now, newServerName);
                existingConnection.Dispose();
            }

            serverNameToControlConnection[newServerName] = controlConnection;
        }
Пример #2
0
            public void AcceptClientHandler(ref SelectControl control, Socket listenSocket, Buf safeBuffer)
            //(Socket listenSocket, Socket socket, Buf safeBuffer)
            {
                //return tmpConnectionManager.AcceptAndInitiateTunnel(this, socket, safeBuffer);

                Socket clientSocket = listenSocket.Accept();

                Console.WriteLine("{0} [{1}] Received tunnel connection for server '{2}' to connect to target '{3}:{4}'",
                                  DateTime.Now, clientSocket.SafeRemoteEndPointString(), serverName, targetHost, targetPort);

                //
                // Check if server is connected
                //
                TmpControlConnection tmpControlConnection = TryGetTmpControlConnection(serverName);

                if (tmpControlConnection == null)
                {
                    Console.WriteLine("{0} [{1}] Server '{2}' is not currently connected", DateTime.Now, clientSocket.SafeRemoteEndPointString(), serverName);
                    clientSocket.ShutdownAndDispose();
                    return;
                }

                //
                // Generate a tunnel key
                //
                Int32 randomKey = random.Next();

                //
                // TODO: This would generate an infinite loop if every single key was taken up in the dictionary,
                //       however, I'm not sure if I should worry about this or not? Maybe there's a better way to do
                //       this?
                //
                while (true)
                {
                    if (!incompleteTunnels.ContainsKey(randomKey))
                    {
                        break;
                    }
                    randomKey++;
                }

                DisconnectedTunnel disconnectedTunnel = new DisconnectedTunnel(clientSocket);

                incompleteTunnels.Add(randomKey, disconnectedTunnel);

                Byte[] tunnelKey = new Byte[4];
                tunnelKey[0] = (Byte)(randomKey >> 24);
                tunnelKey[1] = (Byte)(randomKey >> 16);
                tunnelKey[2] = (Byte)(randomKey >> 8);
                tunnelKey[3] = (Byte)(randomKey);

                //
                // Send Open Tunnel command to TmpServer
                //
                OpenAccessorTunnelRequest request = new OpenAccessorTunnelRequest(0,
                                                                                  targetHostBytes, targetPort, tunnelKey);
                UInt32 commandLength = Tmp.SerializeCommand <OpenAccessorTunnelRequest>(OpenAccessorTunnelRequest.Serializer,
                                                                                        Tmp.ToServerOpenAccessorTunnelRequestID, request, safeBuffer, 0);

                tmpControlConnection.dataSender.HandleData(safeBuffer.array, 0, commandLength);

                //
                // Create a diconnected tunnel handler
                //
                control.AddReceiveSocket(clientSocket, disconnectedTunnel.ConnectedSocketReceiveHandler);
            }
Пример #3
0
        /*
         * public SimpleSelectHandler HandleConnectionFromTmpServer(Socket listenSocket, Socket socket, Buf safeBuffer)
         * {
         *  Console.WriteLine("{0} [{1}] Accepted TmpServer Socket", DateTime.Now, socket.SafeRemoteEndPointString());
         *  return HandleInitialConnectionInfo;
         * }
         */
        static void HandleInitialConnectionInfo(ref SelectControl selectControl, Socket socket, Buf safeBuffer)
        {
            Int32 bytesRead = socket.Receive(safeBuffer.array, 1, SocketFlags.None);

            if (bytesRead <= 0)
            {
                Console.WriteLine("{0} WARNING: Socket closed", DateTime.Now);
                selectControl.DisposeAndRemoveReceiveSocket(socket);
                return;
            }

            Byte connectionInfo = safeBuffer.array[0];

            Boolean accessorRequiresTls, isTunnel;

            Tmp.ReadConnectionInfoFromTmpServer(connectionInfo, out accessorRequiresTls, out isTunnel);

            //
            // Determine if TLS should be set up
            //
            Boolean setupTls;

            if (accessorRequiresTls)
            {
                setupTls = true;
            }
            else if (!isTunnel)
            {
                // The TmpServer is waiting for a response to indicate whether it should setup TLS
                setupTls = GlobalTlsSettings.requireTlsForTmpConnections;
                socket.Send(new Byte[] { setupTls ? (Byte)1 : (Byte)0 });
            }
            else
            {
                setupTls = false;
            }

            IDataHandler sendDataHandler   = new SocketSendDataHandler(socket);
            IDataFilter  receiveDataFilter = null;

            //
            // Setup TLS if necessary
            //
            if (setupTls)
            {
                //
                // Negotiate TLS, setup sendDataHandler and receiveDataFilter
                //
                Console.WriteLine("{0} [{1}] This connection requires tls but it is not currently supported",
                                  DateTime.Now, socket.SafeRemoteEndPointString());
                selectControl.ShutdownDisposeAndRemoveReceiveSocket(socket);
                return;
            }

            IPEndPoint remoteEndPoint = (IPEndPoint)(socket.RemoteEndPoint);

            if (isTunnel)
            {
                Console.WriteLine("{0} [{1}] Is a Tunnel Connection", DateTime.Now, remoteEndPoint.ToString());
                TmpServerSideTunnelKeyReceiver keyReceiver = new TmpServerSideTunnelKeyReceiver();
                selectControl.UpdateHandler(socket, keyReceiver.SocketReceiverHandler);
            }
            else
            {
                Console.WriteLine("{0} [{1}] Is a Control Connection", DateTime.Now, remoteEndPoint.ToString());
                TmpControlConnection tmpControlConnection = new TmpControlConnection(GlobalTlsSettings,
                                                                                     remoteEndPoint, socket, sendDataHandler, receiveDataFilter);
                tmpControlConnections.Add(tmpControlConnection);
                selectControl.UpdateHandler(socket, tmpControlConnection.SocketReceiverHandler);
            }
        }
Пример #4
0
 static void LostTmpControlConnection(TmpControlConnection tmpControlConnection)
 {
     tmpControlConnections.Remove(tmpControlConnection);
     serverNameToControlConnection.Remove(tmpControlConnection.ServerInfoName);
 }