summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDawit Alemayehu <adawit@kde.org>2011-08-25 04:29:14 (GMT)
committerDawit Alemayehu <adawit@kde.org>2011-08-25 17:34:06 (GMT)
commit23e4ab03091e9d824e78171ea92a2da2326256d8 (patch)
tree8a92203bd1f7f0179b28c1fec0c5515c935a2a7f
parent8c4c4ddb8f9e9d48e69370bbeeb0aba97827f603 (diff)
Fix the logic for user name change redirection so it won't break normal
login into sftp servers.
-rw-r--r--kioslave/sftp/kio_sftp.cpp70
-rw-r--r--kioslave/sftp/kio_sftp.h5
2 files changed, 40 insertions, 35 deletions
diff --git a/kioslave/sftp/kio_sftp.cpp b/kioslave/sftp/kio_sftp.cpp
index eb5c8a8..2a55ff9 100644
--- a/kioslave/sftp/kio_sftp.cpp
+++ b/kioslave/sftp/kio_sftp.cpp
@@ -429,12 +429,11 @@ sftpProtocol::~sftpProtocol() {
}
void sftpProtocol::setHost(const QString& host, quint16 port, const QString& user, const QString& pass) {
- kDebug(KIO_SFTP_DB) << "setHost(): " << user << "@" << host << ":" << port;
+ kDebug(KIO_SFTP_DB) << user << "@" << host << ":" << port;
// Close connection if the request is to another server...
- if (mConnected &&
- (host != mHost || port != mPort ||
- user != mUsername || pass != mPassword)) {
+ if (host != mHost || port != mPort ||
+ user != mUsername || pass != mPassword) {
closeConnection();
}
@@ -451,9 +450,7 @@ void sftpProtocol::setHost(const QString& host, quint16 port, const QString& use
}
}
- kDebug(KIO_SFTP_DB) << "setHost(): mPort=" << mPort;
-
- mUsername = mOrigUsername = user;
+ mUsername = user;
mPassword = pass;
}
@@ -479,6 +476,7 @@ void sftpProtocol::openConnection() {
info.url.setPort(mPort);
info.url.setUser(mUsername);
info.username = mUsername;
+ const QString origPasswd (mPassword);
// Check for cached authentication info if no password is specified...
if (mPassword.isEmpty()) {
@@ -497,6 +495,7 @@ void sftpProtocol::openConnection() {
int rc, state, hlen;
int timeout_sec = 30, timeout_usec = 0;
+login_start:
mSession = ssh_new();
if (mSession == NULL) {
error(KIO::ERR_INTERNAL, i18n("Could not create a new SSH session."));
@@ -722,8 +721,12 @@ void sftpProtocol::openConnection() {
firstTime = false;
if (!mUsername.isEmpty() && mUsername != info.username) {
- info.url.setUser(info.username); // update the AuthInfo URL's username
kDebug(KIO_SFTP_DB) << "Username changed from" << mUsername << "to" << info.username;
+ info.url.setUser(info.username);
+ mUsername = info.username;
+ mPassword = info.password;
+ closeConnection();
+ goto login_start;
}
}
@@ -770,6 +773,7 @@ void sftpProtocol::openConnection() {
setTimeoutSpecialCommand(KIO_SFTP_SPECIAL_TIMEOUT);
mConnected = true;
+ mPassword = origPasswd;
connected();
info.password.fill('x');
@@ -777,13 +781,17 @@ void sftpProtocol::openConnection() {
}
void sftpProtocol::closeConnection() {
- kDebug(KIO_SFTP_DB) << "closeConnection()";
+ kDebug(KIO_SFTP_DB);
- sftp_free(mSftp);
- mSftp = NULL;
+ if (mSftp) {
+ sftp_free(mSftp);
+ mSftp = NULL;
+ }
- ssh_disconnect(mSession);
- mSession = NULL;
+ if (mSession) {
+ ssh_disconnect(mSession);
+ mSession = NULL;
+ }
mConnected = false;
}
@@ -1824,28 +1832,28 @@ sftpProtocol::GetRequest::~GetRequest() {
sftp_attributes_free(mSb);
}
-bool sftpProtocol::requiresUserNameRedirection()
+void sftpProtocol::requiresUserNameRedirection()
{
- kDebug(KIO_SFTP_DB) << "Connected ?" << mConnected << "Original:" << mOrigUsername << "Current:" << mUsername;
- if (!mConnected || mOrigUsername.isEmpty() || mOrigUsername == mUsername)
- return false;
-
- KUrl realURL;
- realURL.setProtocol( QLatin1String("sftp") );
- realURL.setUser( mUsername );
- realURL.setPass( mPassword );
- realURL.setHost( mHost );
- if ( mPort > 0)
- realURL.setPort( mPort );
- kDebug(KIO_SFTP_DB) << "User name changed! Redirecting to" << realURL.prettyUrl();
- redirection( realURL );
- finished();
- mOrigUsername = mUsername;
- return true;
+ KUrl redirectUrl;
+ redirectUrl.setProtocol( QLatin1String("sftp") );
+ redirectUrl.setUser( mUsername );
+ redirectUrl.setPass( mPassword );
+ redirectUrl.setHost( mHost );
+ if (mPort > 0)
+ redirectUrl.setPort( mPort );
+ kDebug(KIO_SFTP_DB) << "redirecting to" << redirectUrl;
+ redirection( redirectUrl );
}
bool sftpProtocol::sftpConnect()
{
+ const QString origUsername = mUsername;
openConnection();
- return !requiresUserNameRedirection();
+ kDebug(KIO_SFTP_DB) << "connected ?" << mConnected << "username: old=" << origUsername << "new=" << mUsername;
+ if (!origUsername.isEmpty() && origUsername != mUsername) {
+ requiresUserNameRedirection();
+ finished();
+ return false;
+ }
+ return true;
}
diff --git a/kioslave/sftp/kio_sftp.h b/kioslave/sftp/kio_sftp.h
index 7cd16d1..c937e2e 100644
--- a/kioslave/sftp/kio_sftp.h
+++ b/kioslave/sftp/kio_sftp.h
@@ -101,9 +101,6 @@ private: // Private variables
/** The sftp session for the connection */
sftp_session mSftp;
- /** Username originally set when setHost was called. */
- QString mOrigUsername;
-
/** Username to use when connecting */
QString mUsername;
@@ -194,7 +191,7 @@ private: // private methods
KIO::UDSEntry &entry, short int details);
QString canonicalizePath(const QString &path);
- bool requiresUserNameRedirection();
+ void requiresUserNameRedirection();
bool sftpConnect();
};