From kde-devel Wed Jun 27 12:54:22 2001 From: Michael Goffioul Date: Wed, 27 Jun 2001 12:54:22 +0000 To: kde-devel Subject: Patch to add direct FTP proxy support in kio_ftp X-MARC-Message: https://marc.info/?l=kde-devel&m=99364770706669 MIME-Version: 1 Content-Type: multipart/mixed; boundary="--------------8D63CC80CBA41480A74594D4" This is a multi-part message in MIME format. --------------8D63CC80CBA41480A74594D4 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Hi, Following the small discussion about the problems when using a real FTP proxy server (not an HTTP proxy, but a real FTP server that acts as a proxy, like DeLeGate), and after being bored of changing everytime the '@' char to '%40'. I decided to hack kio_ftp to see if it was possible to add direct FTP proxy support. Indeed it's only a matter of redirecting the connection and using a processed login. This results in the attached patch, which could be commited to CVS if anybody finds it useful. Changes are: - KProtocolManager::proxyForURL : override standard FTP proxy settings if we're using a FTP proxy, to have a direct connection instead of a HTTP slave. - Ftp::openConnection : redirect the connection to a specified host/port - Ftp::ftpLogin : transform the login into login@remote:port - Ftp::openDataConnection : enhancement of the PASV disabling The nice thing with this patch is that now I can simply enter a normal address like ftp://ftp.kde.org: much easier and no problem anymore with encoding the '@'. Configuration takes place in kio_ftprc, using the entries: UseFtpProxyServer: boolean FtpProxyServer: string FtpProxyPort: integer FtpProxyDisablePASV: boolean Will it be commited? (just to know if I have to patch my CVS on each update or not). Michael. -- ------------------------------------------------------------------ Michael Goffioul IMEC-DESICS-MIRA e-mail: goffioul@imec.be (Mixed-Signal and RF Applications) Tel: +32/16/28-8510 Kapeldreef, 75 Fax: +32/16/28-1515 3001 HEVERLEE, BELGIUM ------------------------------------------------------------------ --------------8D63CC80CBA41480A74594D4 Content-Type: text/plain; charset=us-ascii; name="kio-diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="kio-diff" Index: kprotocolmanager.cpp =================================================================== RCS file: /home/kde/kdelibs/kio/kprotocolmanager.cpp,v retrieving revision 1.93 diff -u -r1.93 kprotocolmanager.cpp --- kprotocolmanager.cpp 2001/06/16 16:06:40 1.93 +++ kprotocolmanager.cpp 2001/06/27 12:43:22 @@ -295,6 +295,11 @@ QString proxy; ProxyType pt = proxyType(); + // this overrides any proxy settings in order to use real FTP + // proxy server like DeLeGate + if ( url.protocol() == "ftp" && KIO::SlaveConfig::self()->configData( "ftp", QString::null, "UseFtpProxyServer" ) == "true" ) + return QString::fromLatin1( "DIRECT" ); + switch (pt) { case PACProxy: Index: ftp/ftp.cc =================================================================== RCS file: /home/kde/kdelibs/kio/ftp/ftp.cc,v retrieving revision 1.141 diff -u -r1.141 ftp.cc --- ftp/ftp.cc 2001/06/26 18:22:08 1.141 +++ ftp/ftp.cc 2001/06/27 12:43:23 @@ -285,7 +285,25 @@ m_initialPath = QString::null; - if (!connect( m_host, m_port )) + // real values to be used + QString r_host( m_host ); + int r_port ( m_port ); + MetaData cfgData = KIO::SlaveConfig::self()->configData( "ftp", QString::null ); + if ( cfgData[ "UseFtpProxyServer" ] == "true" ) + { + bool ok; + + r_host = cfgData[ "FtpProxyServer" ]; + r_port = cfgData[ "FtpProxyPort" ].toInt( &ok ); + if ( r_host.isEmpty() ) + r_host = QString::fromLatin1( "ftpproxy" ); + if ( r_port <= 0 || !ok ) + r_port = 8028; + + kdDebug(7102) << "using FTP proxy server host=" << r_host << " port=" << r_port << endl; + } + + if (!connect( r_host, r_port )) return; // error emitted by connect m_bFtpStarted = true; @@ -383,6 +401,7 @@ QString user = m_user; QString pass = m_pass; + bool useFtpProxy = ( KIO::SlaveConfig::self()->configData( "ftp", QString::null, "UseFtpProxyServer" ) == "true" ); if ( config()->readBoolEntry("EnableAutoLogin") ) { @@ -395,7 +414,7 @@ } kdDebug(7102) << "ftpLogin " << user << endl; - if ( !user.isEmpty() ) + if ( !user.isEmpty() || useFtpProxy ) { AuthInfo info; QCString tempbuf; @@ -454,6 +473,16 @@ tempbuf = "user "; tempbuf += user.latin1(); + if ( useFtpProxy ) + { + tempbuf += "@"; + tempbuf += m_host.latin1(); + if ( m_port > 0 && m_port != 21 ) + { + tempbuf += ":"; + tempbuf += QString::number( m_port ).latin1(); + } + } kdDebug(7102) << "Sending Login name: " << user << endl; bool loggedIn = (ftpSendCmd( tempbuf, '2' ) && !strncmp( rspbuf, "230", 3)); bool needPass = !strncmp( rspbuf, "331", 3); @@ -814,8 +843,10 @@ char buf[64]; int on = 1; + MetaData cfgData = KIO::SlaveConfig::self()->configData( "ftp", QString::null ); ////////////// First try passive (EPSV & PASV) modes - if ( KIO::SlaveConfig::self()->configData( "ftp", m_host, "DisablePassiveMode" ) != "true" ) + if ( KIO::SlaveConfig::self()->configData( "ftp", m_host, "DisablePassiveMode" ) != "true" && + ( cfgData[ "UseFtpProxyServer" ] != "true" || cfgData[ "FtpProxyDisablePASV" ] != "true" )) { if (ftpOpenEPSVDataConnection()) return true; --------------8D63CC80CBA41480A74594D4-- >> Visit http://master.kde.org/mailman/listinfo/kde-devel#unsub to unsubscribe <<