public void openConnectionInternal()

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);
            }
        }
    }