return null;
}
+ @Nullable
+ @Override
+ public String getPreferredSshAuthMethods() {
+ String value = myBuild.getSharedConfigParameters().get("teamcity.git.sshPreferredAuthMethods");
+ if (!StringUtil.isEmpty(value))
+ return value;
+ return "publickey,keyboard-interactive,password";
+ }
+
@Override
public boolean isProvideCredHelper() {
return myConfig.isProvideCredHelper();
@Nullable
String getSshMacType();
+ @Nullable
+ String getPreferredSshAuthMethods();
+
boolean isProvideCredHelper();
}
if (settings.isUseNativeSsh()) {
return CommandUtil.runCommand(this, settings.getTimeout());
} else {
- SshHandler h = new SshHandler(mySsh, mySshKeyManager, authSettings, this, myTmpDir, myCtx.getSshMacType());
+ SshHandler h = new SshHandler(mySsh, mySshKeyManager, authSettings, this, myTmpDir, myCtx);
try {
return CommandUtil.runCommand(this, settings.getTimeout());
} finally {
package jetbrains.buildServer.buildTriggers.vcs.git.agent;
-import com.jcraft.jsch.*;
+import com.jcraft.jsch.ChannelExec;
+import com.jcraft.jsch.JSch;
+import com.jcraft.jsch.Logger;
+import com.jcraft.jsch.Session;
import jetbrains.buildServer.buildTriggers.vcs.git.GitUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.git4idea.ssh.GitSSHHandler;
+import javax.security.auth.callback.Callback;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.callback.UnsupportedCallbackException;
import java.io.File;
import java.io.InputStream;
+import java.security.Security;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
}
}
+ String authMethods = System.getenv(GitSSHHandler.TEAMCITY_SSH_PREFERRED_AUTH_METHODS);
+ if (authMethods != null && authMethods.length() > 0)
+ session.setConfig("PreferredAuthentications", authMethods);
+
+ EmptySecurityCallbackHandler.install();
+
session.connect();
channel = (ChannelExec) session.openChannel("exec");
return "UNKNOWN";
}
}
+
+
+ // Doesn't provide any credentials, used instead the default handler from jdk
+ // which reads credentials them from stdin.
+ public static class EmptySecurityCallbackHandler implements CallbackHandler {
+ @Override
+ public void handle(final Callback[] callbacks) throws UnsupportedCallbackException {
+ if (callbacks.length > 0) {
+ throw new UnsupportedCallbackException(callbacks[0], "Unsupported callback");
+ }
+ }
+
+ static void install() {
+ Security.setProperty("auth.login.defaultCallbackHandler", EmptySecurityCallbackHandler.class.getName());
+ }
+ }
}
return null;
}
+ @Nullable
+ @Override
+ public String getPreferredSshAuthMethods() {
+ return null;
+ }
+
@Override
public boolean isProvideCredHelper() {
return false;
import jetbrains.buildServer.buildTriggers.vcs.git.AuthSettings;
import jetbrains.buildServer.buildTriggers.vcs.git.AuthenticationMethod;
+import jetbrains.buildServer.buildTriggers.vcs.git.agent.Context;
import jetbrains.buildServer.buildTriggers.vcs.git.agent.GitCommandLine;
import jetbrains.buildServer.log.Loggers;
import jetbrains.buildServer.ssh.TeamCitySshKey;
@NotNull AuthSettings authSettings,
@NotNull GitCommandLine cmd,
@NotNull File tmpDir,
- @Nullable String customSshMacType) throws VcsException {
+ @NotNull Context ctx) throws VcsException {
mySsh = ssh;
myAuthSettings = authSettings;
cmd.addEnvParam(GitSSHHandler.SSH_PORT_ENV, Integer.toString(mySsh.getXmlRcpPort()));
}
}
}
- if (customSshMacType != null)
- cmd.addEnvParam(GitSSHHandler.TEAMCITY_SSH_MAC_TYPE, customSshMacType);
+ if (ctx.getSshMacType() != null)
+ cmd.addEnvParam(GitSSHHandler.TEAMCITY_SSH_MAC_TYPE, ctx.getSshMacType());
+ if (ctx.getPreferredSshAuthMethods() != null)
+ cmd.addEnvParam(GitSSHHandler.TEAMCITY_SSH_PREFERRED_AUTH_METHODS, ctx.getPreferredSshAuthMethods());
cmd.addEnvParam(GitSSHHandler.TEAMCITY_DEBUG_SSH, String.valueOf(Loggers.VCS.isDebugEnabled()));
try {
cmd.addEnvParam(GitSSHHandler.GIT_SSH_ENV, ssh.getScriptPath());
String TEAMCITY_PASSPHRASE = "TEAMCITY_PASSPHRASE";
String TEAMCITY_DEBUG_SSH = "TEAMCITY_DEBUG_SSH";
String TEAMCITY_SSH_MAC_TYPE = "TEAMCITY_SSH_MAC_TYPE";
+ String TEAMCITY_SSH_PREFERRED_AUTH_METHODS = "TEAMCITY_SSH_MAC_TYPE";
String TEAMCITY_VERSION = "TEAMCITY_VERSION";
/**