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');
}
}
}