in wagon-providers/wagon-ssh/src/main/java/org/apache/maven/wagon/providers/ssh/jsch/AbstractJschWagon.java [107:253]
public void openConnectionInternal() throws AuthenticationException {
if (authenticationInfo == null) {
authenticationInfo = new AuthenticationInfo();
}
if (!interactive) {
uIKeyboardInteractive = null;
setInteractiveUserInfo(new NullInteractiveUserInfo());
}
JSch sch = new JSch();
File privateKey;
try {
privateKey = ScpHelper.getPrivateKey(authenticationInfo);
} catch (FileNotFoundException e) {
throw new AuthenticationException(e.getMessage());
}
// can only pick one method of authentication
if (privateKey != null && privateKey.exists()) {
fireSessionDebug("Using private key: " + privateKey);
try {
sch.addIdentity(privateKey.getAbsolutePath(), authenticationInfo.getPassphrase());
} catch (JSchException e) {
throw new AuthenticationException("Cannot connect. Reason: " + e.getMessage(), e);
}
} else {
try {
Connector connector = ConnectorFactory.getDefault().createConnector();
if (connector != null) {
IdentityRepository repo = new RemoteIdentityRepository(connector);
sch.setIdentityRepository(repo);
}
} catch (AgentProxyException e) {
fireSessionDebug("Unable to connect to agent: " + e.toString());
}
}
String host = getRepository().getHost();
int port =
repository.getPort() == WagonConstants.UNKNOWN_PORT ? ScpHelper.DEFAULT_SSH_PORT : repository.getPort();
try {
String userName = authenticationInfo.getUserName();
if (userName == null) {
userName = System.getProperty("user.name");
}
session = sch.getSession(userName, host, port);
session.setTimeout(getTimeout());
} catch (JSchException e) {
throw new AuthenticationException("Cannot connect. Reason: " + e.getMessage(), e);
}
Proxy proxy = null;
ProxyInfo proxyInfo =
getProxyInfo(ProxyInfo.PROXY_SOCKS5, getRepository().getHost());
if (proxyInfo != null && proxyInfo.getHost() != null) {
proxy = new ProxySOCKS5(proxyInfo.getHost(), proxyInfo.getPort());
((ProxySOCKS5) proxy).setUserPasswd(proxyInfo.getUserName(), proxyInfo.getPassword());
} else {
proxyInfo = getProxyInfo(ProxyInfo.PROXY_HTTP, getRepository().getHost());
if (proxyInfo != null && proxyInfo.getHost() != null) {
proxy = new ProxyHTTP(proxyInfo.getHost(), proxyInfo.getPort());
((ProxyHTTP) proxy).setUserPasswd(proxyInfo.getUserName(), proxyInfo.getPassword());
} else {
// Backwards compatibility
proxyInfo = getProxyInfo(
getRepository().getProtocol(), getRepository().getHost());
if (proxyInfo != null && proxyInfo.getHost() != null) {
// if port == 1080 we will use SOCKS5 Proxy, otherwise will use HTTP Proxy
if (proxyInfo.getPort() == SOCKS5_PROXY_PORT) {
proxy = new ProxySOCKS5(proxyInfo.getHost(), proxyInfo.getPort());
((ProxySOCKS5) proxy).setUserPasswd(proxyInfo.getUserName(), proxyInfo.getPassword());
} else {
proxy = new ProxyHTTP(proxyInfo.getHost(), proxyInfo.getPort());
((ProxyHTTP) proxy).setUserPasswd(proxyInfo.getUserName(), proxyInfo.getPassword());
}
}
}
}
session.setProxy(proxy);
// username and password will be given via UserInfo interface.
UserInfo ui = new WagonUserInfo(authenticationInfo, getInteractiveUserInfo());
if (uIKeyboardInteractive != null) {
ui = new UserInfoUIKeyboardInteractiveProxy(ui, uIKeyboardInteractive);
}
Properties config = new Properties();
if (getKnownHostsProvider() != null) {
try {
String contents = getKnownHostsProvider().getContents();
if (contents != null) {
sch.setKnownHosts(new ByteArrayInputStream(contents.getBytes()));
}
} catch (JSchException e) {
// continue without known_hosts
}
if (strictHostKeyChecking == null) {
strictHostKeyChecking = getKnownHostsProvider().getHostKeyChecking();
}
config.setProperty("StrictHostKeyChecking", strictHostKeyChecking);
}
if (preferredAuthentications != null) {
config.setProperty("PreferredAuthentications", preferredAuthentications);
}
config.setProperty("BatchMode", interactive ? "no" : "yes");
session.setConfig(config);
session.setUserInfo(ui);
try {
session.connect();
} catch (JSchException e) {
if (e.getMessage().startsWith("UnknownHostKey:") || e.getMessage().startsWith("reject HostKey:")) {
throw new UnknownHostException(host, e);
} else if (e.getMessage().contains("HostKey has been changed")) {
throw new KnownHostChangedException(host, e);
} else {
throw new AuthenticationException("Cannot connect. Reason: " + e.getMessage(), e);
}
}
if (getKnownHostsProvider() != null) {
HostKeyRepository hkr = sch.getHostKeyRepository();
HostKey[] hk = hkr.getHostKey(host, null);
try {
if (hk != null) {
for (HostKey hostKey : hk) {
KnownHostEntry knownHostEntry =
new KnownHostEntry(hostKey.getHost(), hostKey.getType(), hostKey.getKey());
getKnownHostsProvider().addKnownHost(knownHostEntry);
}
}
} catch (IOException e) {
closeConnection();
throw new AuthenticationException(
"Connection aborted - failed to write to known_hosts. Reason: " + e.getMessage(), e);
}
}
}