enterExtendedPassiveMode method

Future<void> enterExtendedPassiveMode()

Implementation

Future<void> enterExtendedPassiveMode() async {
  try {
    // Close any previous passive listener to avoid leaking sockets
    dataListener?.close();
    dataListener = null;
    _secureDataListener?.close();
    _secureDataListener = null;
    dataSocket?.close();
    dataSocket = null;

    if (protectionLevel == ProtectionLevel.private_ &&
        securityContext != null) {
      _secureDataListener = await SecureServerSocket.bind(
        InternetAddress.anyIPv4,
        0,
        securityContext!,
      );
      int port = _secureDataListener!.port;
      sendResponse('229 Entering Extended Passive Mode (|||$port|)');
    } else {
      dataListener = await ServerSocket.bind(InternetAddress.anyIPv4, 0);
      int port = dataListener!.port;
      sendResponse('229 Entering Extended Passive Mode (|||$port|)');
    }

    _gettingDataSocket =
        waitForClientDataSocket(timeout: Duration(seconds: 30));
  } catch (e) {
    if (e is TlsException || e is HandshakeException) {
      sendResponse('522 TLS negotiation failed on data connection');
      logger.generalLog('TLS negotiation failed on data connection: $e');
    } else {
      sendResponse('425 Can\'t enter extended passive mode');
      logger.generalLog('Error entering extended passive mode: $e');
    }
  }
}