/* * 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; }
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); }
/* * 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); } }
static void LostTmpControlConnection(TmpControlConnection tmpControlConnection) { tmpControlConnections.Remove(tmpControlConnection); serverNameToControlConnection.Remove(tmpControlConnection.ServerInfoName); }