Search in sources :

Example 1 with SshTransport

use of org.eclipse.jgit.transport.SshTransport in project che by eclipse.

the class JGitConnection method executeRemoteCommand.

/**
     * Execute remote jgit command.
     *
     * @param remoteUrl
     *         remote url
     * @param command
     *         command to execute
     * @return executed command
     * @throws GitException
     * @throws GitAPIException
     * @throws UnauthorizedException
     */
@VisibleForTesting
Object executeRemoteCommand(String remoteUrl, TransportCommand command, @Nullable String username, @Nullable String password) throws GitException, GitAPIException, UnauthorizedException {
    File keyDirectory = null;
    UserCredential credentials = null;
    try {
        if (GitUrlUtils.isSSH(remoteUrl)) {
            keyDirectory = Files.createTempDir();
            final File sshKey = writePrivateKeyFile(remoteUrl, keyDirectory);
            SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() {

                @Override
                protected void configure(OpenSshConfig.Host host, Session session) {
                    session.setConfig("StrictHostKeyChecking", "no");
                }

                @Override
                protected JSch getJSch(final OpenSshConfig.Host hc, FS fs) throws JSchException {
                    JSch jsch = super.getJSch(hc, fs);
                    jsch.removeAllIdentity();
                    jsch.addIdentity(sshKey.getAbsolutePath());
                    return jsch;
                }
            };
            command.setTransportConfigCallback(transport -> {
                if (transport instanceof SshTransport) {
                    ((SshTransport) transport).setSshSessionFactory(sshSessionFactory);
                }
            });
        } else {
            if (remoteUrl != null && GIT_URL_WITH_CREDENTIALS_PATTERN.matcher(remoteUrl).matches()) {
                username = remoteUrl.substring(remoteUrl.indexOf("://") + 3, remoteUrl.lastIndexOf(":"));
                password = remoteUrl.substring(remoteUrl.lastIndexOf(":") + 1, remoteUrl.indexOf("@"));
                command.setCredentialsProvider(new UsernamePasswordCredentialsProvider(username, password));
            } else {
                if (username != null && password != null) {
                    command.setCredentialsProvider(new UsernamePasswordCredentialsProvider(username, password));
                } else {
                    credentials = credentialsLoader.getUserCredential(remoteUrl);
                    if (credentials != null) {
                        command.setCredentialsProvider(new UsernamePasswordCredentialsProvider(credentials.getUserName(), credentials.getPassword()));
                    }
                }
            }
        }
        ProxyAuthenticator.initAuthenticator(remoteUrl);
        return command.call();
    } catch (GitException | TransportException exception) {
        if ("Unable get private ssh key".equals(exception.getMessage())) {
            throw new UnauthorizedException(exception.getMessage(), ErrorCodes.UNABLE_GET_PRIVATE_SSH_KEY);
        } else if (exception.getMessage().contains(ERROR_AUTHENTICATION_REQUIRED)) {
            final ProviderInfo info = credentialsLoader.getProviderInfo(remoteUrl);
            if (info != null) {
                throw new UnauthorizedException(exception.getMessage(), ErrorCodes.UNAUTHORIZED_GIT_OPERATION, ImmutableMap.of(PROVIDER_NAME, info.getProviderName(), AUTHENTICATE_URL, info.getAuthenticateUrl(), "authenticated", Boolean.toString(credentials != null)));
            }
            throw new UnauthorizedException(exception.getMessage(), ErrorCodes.UNAUTHORIZED_GIT_OPERATION);
        } else {
            throw exception;
        }
    } finally {
        if (keyDirectory != null && keyDirectory.exists()) {
            try {
                FileUtils.delete(keyDirectory, FileUtils.RECURSIVE);
            } catch (IOException exception) {
                throw new GitException("Can't remove SSH key directory", exception);
            }
        }
        ProxyAuthenticator.resetAuthenticator();
    }
}
Also used : UserCredential(org.eclipse.che.api.git.UserCredential) UsernamePasswordCredentialsProvider(org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider) GitException(org.eclipse.che.api.git.exception.GitException) IOException(java.io.IOException) SshSessionFactory(org.eclipse.jgit.transport.SshSessionFactory) JSch(com.jcraft.jsch.JSch) FS(org.eclipse.jgit.util.FS) TransportException(org.eclipse.jgit.api.errors.TransportException) ProviderInfo(org.eclipse.che.api.git.shared.ProviderInfo) UnauthorizedException(org.eclipse.che.api.core.UnauthorizedException) JschConfigSessionFactory(org.eclipse.jgit.transport.JschConfigSessionFactory) DiffCommitFile(org.eclipse.che.api.git.shared.DiffCommitFile) File(java.io.File) SshTransport(org.eclipse.jgit.transport.SshTransport) Session(com.jcraft.jsch.Session) VisibleForTesting(com.google.common.annotations.VisibleForTesting)

Example 2 with SshTransport

use of org.eclipse.jgit.transport.SshTransport in project che by eclipse.

the class JGitConnectionTest method shouldSetSshSessionFactoryWhenSshTransportReceived.

@Test
public void shouldSetSshSessionFactoryWhenSshTransportReceived() throws Exception {
    //given
    SshTransport sshTransport = mock(SshTransport.class);
    when(sshKeyProvider.getPrivateKey(anyString())).thenReturn(new byte[0]);
    doAnswer(invocation -> {
        TransportConfigCallback callback = (TransportConfigCallback) invocation.getArguments()[0];
        callback.configure(sshTransport);
        return null;
    }).when(transportCommand).setTransportConfigCallback(any());
    //when
    jGitConnection.executeRemoteCommand("ssh://host.xz/repo.git", transportCommand, null, null);
    //then
    verify(sshTransport).setSshSessionFactory(any());
}
Also used : TransportConfigCallback(org.eclipse.jgit.api.TransportConfigCallback) SshTransport(org.eclipse.jgit.transport.SshTransport) Test(org.testng.annotations.Test)

Aggregations

SshTransport (org.eclipse.jgit.transport.SshTransport)2 VisibleForTesting (com.google.common.annotations.VisibleForTesting)1 JSch (com.jcraft.jsch.JSch)1 Session (com.jcraft.jsch.Session)1 File (java.io.File)1 IOException (java.io.IOException)1 UnauthorizedException (org.eclipse.che.api.core.UnauthorizedException)1 UserCredential (org.eclipse.che.api.git.UserCredential)1 GitException (org.eclipse.che.api.git.exception.GitException)1 DiffCommitFile (org.eclipse.che.api.git.shared.DiffCommitFile)1 ProviderInfo (org.eclipse.che.api.git.shared.ProviderInfo)1 TransportConfigCallback (org.eclipse.jgit.api.TransportConfigCallback)1 TransportException (org.eclipse.jgit.api.errors.TransportException)1 JschConfigSessionFactory (org.eclipse.jgit.transport.JschConfigSessionFactory)1 SshSessionFactory (org.eclipse.jgit.transport.SshSessionFactory)1 UsernamePasswordCredentialsProvider (org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider)1 FS (org.eclipse.jgit.util.FS)1 Test (org.testng.annotations.Test)1