Bug 166361 [SSH2] Connection is attempted to server before prompting for a password
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/IConnectionMethod.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/IConnectionMethod.java
index 29eadb8..979b087 100644
--- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/IConnectionMethod.java
+++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/IConnectionMethod.java
@@ -32,6 +32,7 @@
 	/**
 	 * Creates a new server connection using the given repository root
 	 * (which includes the user name) and the given password.
+	 * If password is not given, null will be passed.
 	 */
 	public IServerConnection createConnection(ICVSRepositoryLocation location, String password);
 	
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/connection/CVSRepositoryLocation.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/connection/CVSRepositoryLocation.java
index fcddc7c..b7b9612 100644
--- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/connection/CVSRepositoryLocation.java
+++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/connection/CVSRepositoryLocation.java
@@ -775,8 +775,8 @@
 						// This is possible if the cache was cleared somehow for a location with a mutable username
 						throw new CVSAuthenticationException(new CVSStatus(IStatus.ERROR, CVSAuthenticationException.RETRY, CVSMessages.CVSRepositoryLocation_usernameRequired)); 
 					}
-					if (password == null)
-						password = "";//$NON-NLS-1$ 
+					//if (password == null)
+					//	password = "";//$NON-NLS-1$ 
 					Connection connection = createConnection(password, monitor);
 					if (cacheNeedsUpdate)
 					    updateCachedLocation();
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/connection/ExtConnectionMethod.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/connection/ExtConnectionMethod.java
index aeae789..d18e95e 100644
--- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/connection/ExtConnectionMethod.java
+++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/connection/ExtConnectionMethod.java
@@ -25,6 +25,9 @@
 	 * @see IConnectionMethod#createConnection
 	 */
 	public IServerConnection createConnection(ICVSRepositoryLocation repositoryRoot, String password) {
+		if(password==null){
+			password=""; //$NON-NLS-1$
+		}
 		return new ExtConnection(repositoryRoot, password);
 	}
 	
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/connection/PServerConnectionMethod.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/connection/PServerConnectionMethod.java
index 8075e6c..d56f5b8 100644
--- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/connection/PServerConnectionMethod.java
+++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/connection/PServerConnectionMethod.java
@@ -18,6 +18,9 @@
 	 * @see IConnectionMethod#createConnection(ICVSRepositoryLocation, String)
 	 */
 	public IServerConnection createConnection(ICVSRepositoryLocation location, String password) {
+		if(password==null){
+			password=""; //$NON-NLS-1$
+		}
 		return new PServerConnection(location, password);
 	}
 	/**
diff --git a/bundles/org.eclipse.team.cvs.ssh/META-INF/MANIFEST.MF b/bundles/org.eclipse.team.cvs.ssh/META-INF/MANIFEST.MF
index 4bb4afe..d35f118 100644
--- a/bundles/org.eclipse.team.cvs.ssh/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.team.cvs.ssh/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.team.cvs.ssh
-Bundle-Version: 3.2.0.qualifier
+Bundle-Version: 3.2.1.qualifier
 Bundle-Activator: org.eclipse.team.internal.ccvs.ssh.SSHPlugin
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
diff --git a/bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/SSHServerConnection.java b/bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/SSHServerConnection.java
index bce0a10..4ea043f 100644
--- a/bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/SSHServerConnection.java
+++ b/bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/SSHServerConnection.java
@@ -42,6 +42,9 @@
 	Client client;
 
 	public SSHServerConnection(ICVSRepositoryLocation location, String password) {
+		if (password == null) {
+			password = ""; //$NON-NLS-1$
+		}
 		this.location = location;
 		this.password = password;
 	}
diff --git a/bundles/org.eclipse.team.cvs.ssh2/META-INF/MANIFEST.MF b/bundles/org.eclipse.team.cvs.ssh2/META-INF/MANIFEST.MF
index 6c1f042..5867694 100644
--- a/bundles/org.eclipse.team.cvs.ssh2/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.team.cvs.ssh2/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.team.cvs.ssh2; singleton:=true
-Bundle-Version: 3.2.0.qualifier
+Bundle-Version: 3.2.1.qualifier
 Bundle-Activator: org.eclipse.team.internal.ccvs.ssh2.CVSSSH2Plugin
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
diff --git a/bundles/org.eclipse.team.cvs.ssh2/src/org/eclipse/team/internal/ccvs/ssh2/JSchSession.java b/bundles/org.eclipse.team.cvs.ssh2/src/org/eclipse/team/internal/ccvs/ssh2/JSchSession.java
index 88c9863..71a14ec 100644
--- a/bundles/org.eclipse.team.cvs.ssh2/src/org/eclipse/team/internal/ccvs/ssh2/JSchSession.java
+++ b/bundles/org.eclipse.team.cvs.ssh2/src/org/eclipse/team/internal/ccvs/ssh2/JSchSession.java
@@ -474,7 +474,8 @@
             session.setProxy(proxy);
         }
         session.setTimeout(getCVSTimeoutInMillis());
-        session.setPassword(password);
+        if (password != null)
+			session.setPassword(password);
         session.setUserInfo(wrapperUI);
         session.setSocketFactory(socketFactory);
         // This is where the server is contacted and authentication occurs
diff --git a/bundles/org.eclipse.team.cvs.ssh2/src/org/eclipse/team/internal/ccvs/ssh2/PServerSSH2ServerConnection.java b/bundles/org.eclipse.team.cvs.ssh2/src/org/eclipse/team/internal/ccvs/ssh2/PServerSSH2ServerConnection.java
index b362890..52343c2 100644
--- a/bundles/org.eclipse.team.cvs.ssh2/src/org/eclipse/team/internal/ccvs/ssh2/PServerSSH2ServerConnection.java
+++ b/bundles/org.eclipse.team.cvs.ssh2/src/org/eclipse/team/internal/ccvs/ssh2/PServerSSH2ServerConnection.java
@@ -87,7 +87,7 @@
 		int retry = 1;
 		while (true) {
 			try {
-				session = JSchSession.getSession(location, ssh_user, "", ssh_host, ssh_port, monitor).getSession(); //$NON-NLS-1$
+				session = JSchSession.getSession(location, ssh_user, null, ssh_host, ssh_port, monitor).getSession();
 				String[] list = session.getPortForwardingL();
 				String name = ":" + rhost + ":" + rport; //$NON-NLS-1$ //$NON-NLS-2$
 				boolean done = false;
@@ -123,10 +123,14 @@
 		
 		// CVSROOT=":pserver:localhost:"+lport+""cvs_root
 		try {
+			// If user does not give a password, it must be null.
+			String _password = ""; //$NON-NLS-1$
+			if (password != null)
+				_password = password;
 			Properties prop = new Properties();
 			prop.put("connection", "pserver"); //$NON-NLS-1$ //$NON-NLS-2$
 			prop.put("user", location.getUsername()); //$NON-NLS-1$
-			prop.put("password", password); //$NON-NLS-1$
+			prop.put("password", _password); //$NON-NLS-1$
 			prop.put("host", "localhost"); //$NON-NLS-1$ //$NON-NLS-2$
 			prop.put("port", Integer.toString(lport)); //$NON-NLS-1$
 			prop.put("root", cvs_root); //$NON-NLS-1$
@@ -134,7 +138,7 @@
 			CVSRepositoryLocation cvsrl = CVSRepositoryLocation.fromProperties(prop);
 
 			IConnectionMethod method = cvsrl.getMethod();
-			psc = method.createConnection(cvsrl, password);
+			psc = method.createConnection(cvsrl, _password);
 		} catch (Exception e) {
 			throw new CVSAuthenticationException(e.toString(), CVSAuthenticationException.NO_RETRY);
 		}