]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
FTP gateway: interception mode for ftp_port.
authorDmitry Kurochkin <dmitry.kurochkin@measurement-factory.com>
Mon, 1 Jul 2013 12:00:20 +0000 (16:00 +0400)
committerDmitry Kurochkin <dmitry.kurochkin@measurement-factory.com>
Mon, 1 Jul 2013 12:00:20 +0000 (16:00 +0400)
src/FtpGatewayServer.cc
src/client_side.cc
src/client_side.h

index 0321dfceecb60253ad7077b5b017629d55e21834..fe9012aadadedfa421632cbb021ab92afcc246a0 100644 (file)
@@ -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)
index 6d5f0894516e950938956ba2c59225f906ba1648..3efa6661b4920cc120dde181fc61b77e9c450b75 100644 (file)
@@ -3920,6 +3920,15 @@ ftpAccept(const CommAcceptCbParams &params)
     // 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 &params
 
     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;
     }
index c0fab7ca173995af25af59c79f32df9236dcb28c..93340b8d10d1594c4cf8e835e205234ad8ff3b86 100644 (file)
@@ -346,6 +346,7 @@ public:
     struct {
         String uri;
         FtpState state;
+        bool readGreeting;
         Comm::ConnectionPointer dataListenConn;
         Comm::ConnectionPointer dataConn;
         Ip::Address serverDataAddr;