enterPassiveMode method

Future<void> enterPassiveMode()

Implementation

Future<void> enterPassiveMode() 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;
      int p1 = port >> 8;
      int p2 = port & 0xFF;
      var address = (await _getIpAddress()).replaceAll('.', ',');
      sendResponse('227 Entering Passive Mode ($address,$p1,$p2)');
    } else {
      dataListener = await ServerSocket.bind(InternetAddress.anyIPv4, 0);
      int port = dataListener!.port;
      int p1 = port >> 8;
      int p2 = port & 0xFF;
      var address = (await _getIpAddress()).replaceAll('.', ',');
      sendResponse('227 Entering Passive Mode ($address,$p1,$p2)');
    }

    _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 passive mode');
      logger.generalLog('Error entering passive mode: $e');
    }
  }
}