mohanjot
mohanjot

Reputation: 1510

USERAUTH fail using JGit to access git repo securely for PullCommand()

I am trying to do a git pull using JGit's API with the following code

public class gitHubTest {
    JSch jsch = new JSch();

    // Defining the private key file location explicitly
    String userHome = System.getProperty("user.home");
    String privateKey = userHome + "/.ssh/id_rsa";
    String knownHostsFile = userHome + "/.ssh/known_hosts";
    Repository localRepo = new FileRepository("/LocalPath/.git");

    public gitHubTest() throws Exception {
        jsch.setConfig("StrictHostKeyChecking", "no");
        jsch.setKnownHosts(knownHostsFile);
        jsch.addIdentity(privateKey);
        System.out.println("privateKey :" + privateKey);
        Git git = new Git(localRepo);
        PullCommand pullcmd = git.pull();
        pullcmd.call();
    }
}

Error Stack Trace :

org.eclipse.jgit.api.errors.TransportException: [email protected]:remote.git: USERAUTH fail
at org.eclipse.jgit.api.FetchCommand.call(FetchCommand.java:245)
at org.eclipse.jgit.api.PullCommand.call(PullCommand.java:288)
at gitHubTest.<init>(gitHubTest.java:47)
at WebhooksServer.main(WebhooksServer.java:13)
Caused by: org.eclipse.jgit.errors.TransportException: [email protected]:remote.git: USERAUTH fail
at org.eclipse.jgit.transport.JschConfigSessionFactory.getSession(JschConfigSessionFactory.java:160)
at org.eclipse.jgit.transport.SshTransport.getSession(SshTransport.java:137)
at org.eclipse.jgit.transport.TransportGitSsh$SshFetchConnection.<init>(TransportGitSsh.java:274)
at org.eclipse.jgit.transport.TransportGitSsh.openFetch(TransportGitSsh.java:169)
at org.eclipse.jgit.transport.FetchProcess.executeImp(FetchProcess.java:136)
at org.eclipse.jgit.transport.FetchProcess.execute(FetchProcess.java:122)
at org.eclipse.jgit.transport.Transport.fetch(Transport.java:1236)
at org.eclipse.jgit.api.FetchCommand.call(FetchCommand.java:234)
... 3 more

Caused by: com.jcraft.jsch.JSchException: USERAUTH fail
at com.jcraft.jsch.UserAuthPublicKey.start(UserAuthPublicKey.java:119)
at com.jcraft.jsch.Session.connect(Session.java:470)
at org.eclipse.jgit.transport.JschConfigSessionFactory.getSession(JschConfigSessionFactory.java:117)
... 10 more

Some suggestions I have checked show, we need to instantiate JschConfigSessionFactory and then overrride configure() method to pass passphrase . I have tried doing it already. Then it shows an error. I have referred to http://www.codeaffine.com/2014/12/09/jgit-authentication/ which reads just right but not for my PullCommand.

Can anyone please help? I have already read and tried a lot of posts here but nothing addresses my problem accurately.

Code implemenatation with configure() method :

public class gitHubTest {
JSch jsch = new JSch();
String userHome = System.getProperty("user.home");
String privateKey = userHome + "/.ssh/id_rsa";
String knownHostsFile = userHome + "/.ssh/known_hosts";

public gitHubTest() throws IOException, JSchException, GitAPIException {
    Repository localRepo = new FileRepository("/LocalPath/branch.git");
    final String remoteURL = "[email protected]:remote.git";
    JSch.setConfig("StrictHostKeyChecking", "no");
    jsch.setKnownHosts(knownHostsFile);
    jsch.addIdentity(privateKey);
    JschConfigSessionFactory sessionFactory = new JschConfigSessionFactory() {
    @Override
    protected void configure(OpenSshConfig.Host host, Session session) {
        CredentialsProvider cp = new CredentialsProvider() {
            @Override
            public boolean isInteractive() {
                return false;
            }
            @Override
            public boolean supports(CredentialItem... credentialItems) {
                return false;
            }
            @Override
            public boolean get(URIish urIish, CredentialItem... credentialItems) throws UnsupportedCredentialItem {
                return false;
            }
        };
        UserInfo userInfo = new CredentialsProviderUserInfo(session,cp);
        session.setUserInfo(userInfo);
    }
    };
SshSessionFactory.setInstance(sessionFactory);
Git git = new Git(localRepo);
PullCommand pullcmd = git.pull();
pullcmd.call();
}}

this gives the same error.

Upvotes: 0

Views: 5976

Answers (1)

mohanjot
mohanjot

Reputation: 1510

I could figure out some of the issues I was facing. Here's solution to it:

  1. if auth has to be done without the passphrase, generate the id_rsa without passphrase

  2. We needed to override getJSch(final OpenSshConfig.Host hc, FS fs) making use of addIdentity in the configure of SshSessionfactory:

    SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() {
        @Override
        protected void configure(OpenSshConfig.Host host, Session sess ion) {
            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("/path/to/private/key");
            return jsch;
        }
    };
    
  3. We need to call needs to be instantiated differently:

    PullCommand pull = git.pull().setTransportConfigCallback(new TransportConfigCallback() {
    
        @Override
        public void configure(Transport transport) {
            SshTransport sshTransport = (SshTransport) transport;
            sshTransport.setSshSessionFactory(sshSessionFactory);
        }
    });
    

And then call pull instance:

PullResult pullResult = pull.call();

I hope this helps.

Upvotes: 3

Related Questions