From: Dmitry Kurochkin Date: Mon, 1 Jul 2013 12:00:20 +0000 (+0400) Subject: FTP gateway: interception mode for ftp_port. X-Git-Tag: SQUID_3_5_0_1~117^2~65 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=125894baa444800e58acd60cf1ee6d7dcb75df05;p=thirdparty%2Fsquid.git FTP gateway: interception mode for ftp_port. --- diff --git a/src/FtpGatewayServer.cc b/src/FtpGatewayServer.cc index 0321dfceec..fe9012aada 100644 --- a/src/FtpGatewayServer.cc +++ b/src/FtpGatewayServer.cc @@ -60,7 +60,7 @@ protected: }; typedef void (ServerStateData::*SM_FUNC)(); static const SM_FUNC SM_FUNCS[]; - void readWelcome(); + void readGreeting(); void sendCommand(); void readReply(); void readPasvReply(); @@ -76,7 +76,7 @@ protected: CBDATA_CLASS_INIT(ServerStateData); const ServerStateData::SM_FUNC ServerStateData::SM_FUNCS[] = { - &ServerStateData::readWelcome, // BEGIN + &ServerStateData::readGreeting, // BEGIN &ServerStateData::readReply, // SENT_COMMAND &ServerStateData::readPasvReply, // SENT_PASV &ServerStateData::readDataReply, // SENT_DATA_REQUEST @@ -101,7 +101,7 @@ ServerStateData::~ServerStateData() void ServerStateData::start() { - if (clientState() == ConnStateData::FTP_BEGIN) + if (!fwd->request->clientConnectionManager->ftp.readGreeting) Ftp::ServerStateData::start(); else if (clientState() == ConnStateData::FTP_HANDLE_DATA_REQUEST || @@ -331,15 +331,17 @@ ServerStateData::startDataUpload() } void -ServerStateData::readWelcome() +ServerStateData::readGreeting() { - assert(clientState() == ConnStateData::FTP_BEGIN); + assert(!fwd->request->clientConnectionManager->ftp.readGreeting); switch (ctrl.replycode) { case 220: - clientState(ConnStateData::FTP_CONNECTED); + fwd->request->clientConnectionManager->ftp.readGreeting = true; + if (clientState() == ConnStateData::FTP_BEGIN) + clientState(ConnStateData::FTP_CONNECTED); ctrl.replycode = 120; // change status for forwarded server greeting - forwardPreliminaryReply(&ServerStateData::sendCommand); + forwardPreliminaryReply(&ServerStateData::start); break; case 120: if (NULL != ctrl.message) diff --git a/src/client_side.cc b/src/client_side.cc index 6d5f089451..3efa6661b4 100644 --- a/src/client_side.cc +++ b/src/client_side.cc @@ -3920,6 +3920,15 @@ ftpAccept(const CommAcceptCbParams ¶ms) // Socket is ready, setup the connection manager to start using it ConnStateData *connState = connStateCreate(params.conn, s); + if (connState->transparent()) { + char buf[MAX_IPSTRLEN]; + connState->clientConnection->local.ToURL(buf,MAX_IPSTRLEN); + connState->ftp.uri = "ftp://"; + connState->ftp.uri.append(buf); + connState->ftp.uri.append("/"); + debugs(33, 5, HERE << "FTP transparent URL: " << connState->ftp.uri); + } + FtpWriteGreeting(connState); } @@ -5371,6 +5380,8 @@ FtpHandleUserRequest(ConnStateData *connState, const String &cmd, String ¶ms const String::size_type eou = params.find('@'); if (eou == String::npos || eou + 1 >= params.size()) { + if (connState->ftp.uri.size() > 0) + return true; FtpWriteEarlyReply(connState, 501, "Missing host"); return false; } diff --git a/src/client_side.h b/src/client_side.h index c0fab7ca17..93340b8d10 100644 --- a/src/client_side.h +++ b/src/client_side.h @@ -346,6 +346,7 @@ public: struct { String uri; FtpState state; + bool readGreeting; Comm::ConnectionPointer dataListenConn; Comm::ConnectionPointer dataConn; Ip::Address serverDataAddr;