public void CompleteTunnel(ref SelectControl selectControl, Socket socket) { lock (connectedSocket) { if (connectedTunnel != null) { throw new InvalidOperationException("CodeBug: This tunnel has already been completed"); } // // Send all the buffered data // if (bufferLength > 0) { try { socket.Send(buffer.array, 0, bufferLength, SocketFlags.None); } catch (Exception) { selectControl.ShutdownDisposeAndRemoveReceiveSocket(connectedSocket); selectControl.ShutdownDisposeAndRemoveReceiveSocket(socket); return; } } connectedTunnel = new ConnectedTunnel(connectedSocket, socket); selectControl.UpdateHandler(socket, connectedTunnel.BToAHandler); } }
static void ReceivedTunnelKey(ref SelectControl selectControl, Socket socket, Byte[] receivedKey) { // // Get Tunnel // if (receivedKey.Length != 4) { Console.WriteLine("{0} Expected tunnel key to be 4 byte but is {1}", DateTime.Now, receivedKey.Length); selectControl.ShutdownDisposeAndRemoveReceiveSocket(socket); return; } Int32 key = (Int32)( (0xFF000000 & (receivedKey[0] << 24)) | (0x00FF0000 & (receivedKey[1] << 16)) | (0x0000FF00 & (receivedKey[2] << 8)) | (0x000000FF & (receivedKey[3]))); DisconnectedTunnel disconnectedTunnel; if (!incompleteTunnels.TryGetValue(key, out disconnectedTunnel)) { Console.WriteLine("{0} Could not find tunnel for key {1}", DateTime.Now, key); selectControl.ShutdownDisposeAndRemoveReceiveSocket(socket); return; } disconnectedTunnel.CompleteTunnel(ref selectControl, socket); }
public void Dispose(ref SelectControl selectControl) { if (connectedTunnel != null) { connectedTunnel.Dispose(ref selectControl); } else { selectControl.ShutdownDisposeAndRemoveReceiveSocket(connectedSocket); } }
void GotHeaders(ref SelectControl selectControl, Socket clientSocket, Byte[] headers, UInt32 totalLength) { String serverIPOrHost = null; UInt16 serverPort = 0; try { serverIPOrHost = GetServerFromHeaders(out serverPort, out isConnect, headers, ref headersLength, ref totalLength, clientLogString); } catch (Exception e) { if (AppLayerProxy.ErrorLogger != null) { AppLayerProxy.ErrorLogger.WriteLine("{0} Failed to get server from HTTP Headers: {1}", clientLogString, e); } } if (serverIPOrHost == null) { selectControl.ShutdownDisposeAndRemoveReceiveSocket(clientSocket); return; } this.serverLogString = serverIPOrHost + ":" + serverPort.ToString(); Boolean needToConnect; if (AppLayerProxy.ForwardProxy == null) { // TODO: Fix so this does not block during DNS resolution IPAddress serverIP; try { serverIP = EndPoints.ParseIPOrResolveHost(serverIPOrHost, DnsPriority.IPv4ThenIPv6); } catch (SocketException) { if (AppLayerProxy.ErrorLogger != null) { AppLayerProxy.ErrorLogger.WriteLine("{0} Failed to resolve server hostname '{1}'", clientLogString, serverIPOrHost); } selectControl.ShutdownDisposeAndRemoveReceiveSocket(clientSocket); return; } IPEndPoint serverEndPoint = new IPEndPoint(serverIP, serverPort); serverSocket = new Socket(serverEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); serverSocket.Blocking = false; needToConnect = NonBlockingSocket.ConnectNonBlocking(serverSocket, serverEndPoint); } else { this.serverEndPointForProxy = new StringEndPoint(serverIPOrHost, serverPort); Console.WriteLine("[DEBUG] Connecting to proxy '{0}'", AppLayerProxy.ForwardProxy.host.CreateTargetString()); serverSocket = new Socket(AppLayerProxy.ForwardProxy.host.GetAddressFamilyForTcp(), SocketType.Stream, ProtocolType.Tcp); serverSocket.Blocking = false; throw new NotImplementedException(); //needToConnect = NonBlockingSocket.ConnectNonBlocking(serverSocket, AppLayerProxy.ForwardProxy.endPoint); } //Console.WriteLine("[DEBUG] {0} > {1} Connecting...", clientLogString, serverLogString); if (needToConnect) { selectControl.RemoveReceiveSocket(clientSocket); // Remove the clientSocket from the read list // until the connection gets established or lost selectControl.AddConnectSocket(serverSocket, ServerSocketConnected); // Save Data if (isConnect) { if (totalLength == headersLength) { clientBuffer = null; // Clean up the client buffer (if there is one) } } else { if (clientBuffer == null) { clientBuffer = new ByteBuilder(totalLength); Array.Copy(headers, clientBuffer.bytes, totalLength); clientBuffer.contentLength = totalLength; } else { // Data already in the client buffer } } } else { if (AppLayerProxy.Logger != null) { AppLayerProxy.Logger.WriteLine("{0} > {1} Connection Completed Synchronously (CornerCase)", clientLogString, serverLogString); } if (!clientSocket.Connected) { selectControl.DisposeAndRemoveReceiveSocket(clientSocket); if (serverSocket.Connected) { if (AppLayerProxy.Logger != null) { AppLayerProxy.Logger.WriteLine("{0} > {1} Server Connected but Client Disconnected...Closing Server", clientLogString, serverLogString); } try { serverSocket.Shutdown(SocketShutdown.Both); } catch (Exception) { } } else { if (AppLayerProxy.Logger != null) { AppLayerProxy.Logger.WriteLine("{0} > {1} Client disconnected before server could connect", clientLogString, serverLogString); } } serverSocket.Close(); } else if (!serverSocket.Connected) { if (AppLayerProxy.Logger != null) { AppLayerProxy.Logger.WriteLine("{0} > {1} Failed to connect to server..Closing Client", clientLogString, serverLogString); } selectControl.ShutdownDisposeAndRemoveReceiveSocket(clientSocket); serverSocket.Close(); } else { if (AppLayerProxy.Logger != null) { AppLayerProxy.Logger.WriteLine("{0} > {1} Connected to Server", clientLogString, serverLogString); } if (isConnect) { uint extraChars = totalLength - headersLength; FinishConnection(headers, headersLength, extraChars); } else { FinishConnection(headers, 0, totalLength); } TcpBridge bridge = new TcpBridge(clientLogString, clientSocket, serverLogString, serverSocket); selectControl.UpdateHandler(clientSocket, bridge.ReceiveHandler); selectControl.AddReceiveSocket(serverSocket, bridge.ReceiveHandler); } } }
public void Dispose(ref SelectControl selectControl) { selectControl.ShutdownDisposeAndRemoveReceiveSocket(a); selectControl.ShutdownDisposeAndRemoveReceiveSocket(b); }
/* * 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); } }