Я начинаю смотреть на реализацию явного FTP, расширяя текущий Twisted FTP.
Большая часть кода была проста, и реализовать AUTH, PBSZ, PROT было легко, и я получил работающий защищенный канал управления.
Моя проблема с каналом данных.
Ошибка на стороне клиента: SSL routines', 'SSL3_READ_BYTES', 'ssl handshake failure'
Похоже, что SSL-рукопожатие и завершение работы вызываются только тогда, когда некоторые данные были отправлены черезканал данных.Это влияет на случай отправки пустых файлов или перечисления пустых папок, так как перед закрытием соединения клиент вызовет отключение SSL.
Я ищу несколько предложений о том, как и где мне следует искать для исправления TLSрукопожатие от Twisted TLS, когда данные не отправляются.
Этот код работает при перечислении папок, которые не являются пустыми ... но завершится ошибкой, если папка не содержит файлов или папок.
Большое спасибо!
def getDTPPort(self, factory):
"""
Return a port for passive access, using C{self.passivePortRange}
attribute.
"""
for portn in self.passivePortRange:
try:
if self.protected_data:
dtpPort = reactor.listenSSL(
port=portn, factory=factory,
contextFactory=self.ssl_context)
else:
dtpPort = self.listenFactory(portn, factory)
except error.CannotListenError:
continue
else:
return dtpPort
raise error.CannotListenError('', portn,
"No port available in range %s" %
(self.passivePortRange,))
Обновление 1
Я обновлю этот текст, так как комментарии не очень хорошо отформатированы:
Итак, я получил:
def getDTPPort(self, factory):
"""
Return a port for passive access, using C{self.passivePortRange}
attribute.
"""
for portn in self.passivePortRange:
try:
if self.protected_data:
tls_factory = TLSMemoryBIOFactory(
contextFactory=self.ssl_context,
isClient=False,
wrappedFactory=factory)
dtpPort = reactor.listenTCP(
port=portn, factory=tls_factory)
else:
dtpPort = self.listenFactory(portn, factory)
except error.CannotListenError:
continue
else:
return dtpPort
raise error.CannotListenError('', portn,
"No port available in range %s" %
(self.passivePortRange,))
Обновление 2
Проблема вызвана тем фактом, что соединение закрыто, пока продолжается квитирование.Я не знаю, как проверить на пустом соединении, что SSL-рукопожатие было сделано.
Так что я получил этот глупый код
def loseConnection(self):
"""
Send a TLS close alert and close the underlying connection.
"""
self.disconnecting = True
def close_connection():
if not self._writeBlockedOnRead:
self._tlsConnection.shutdown()
self._flushSendBIO()
self.transport.loseConnection()
# If we don't know if the handshake was done, we wait for a bit
# and the close the connection.
# This is done to avoid closing the connection in the middle of a
# handshake.
if not self._handshakeDone:
reactor.callLater(0.1, close_connection)
else:
close_connection()