I am trying to use NGit to connect to Github (ie using a private key as well as a password).
Can someone walk me through it?
My normal fetch would be:
var git = Git.CloneRepository()
.SetDirectory(_properties.OutputPath)
.SetURI(_properties.SourceUrlPath)
.SetBranchesToClone(new Collection<string>() { "master" })
.SetCredentialsProvider(new UsernamePasswordCredentialsProvider("username","password"))
.SetTimeout(3600)
.Call();
how would I do this with a private key?
After a long battle, many many google searches for Jgit examples and much more pain, I have found the solution!
Basically you override and SessionFactory with your own and inject your certificate at connection time:
public class CustomConfigSessionFactory : JschConfigSessionFactory
{
public string PrivateKey { get; set; }
public string PublicKey { get; set; }
protected override void Configure(OpenSshConfig.Host hc, Session session)
{
var config = new Properties();
config["StrictHostKeyChecking"] = "no";
config["PreferredAuthentications"] = "publickey";
session.SetConfig(config);
var jsch = this.GetJSch(hc, FS.DETECTED);
jsch.AddIdentity("KeyPair", Encoding.UTF8.GetBytes(PrivateKey), Encoding.UTF8.GetBytes(PublicKey), null);
}
}
And then inject it like so:
var customConfigSessionFactory = new CustomConfigSessionFactory();
customConfigSessionFactory.PrivateKey = properties.PrivateKey;
customConfigSessionFactory.PublicKey = properties.PublicKey;
NGit.Transport.JschConfigSessionFactory.SetInstance(customConfigSessionFactory);
var git = Git.CloneRepository()
.SetDirectory(properties.OutputPath)
.SetURI(properties.SourceUrlPath)
.SetBranchesToClone(new Collection<string>() { "master" })
.Call();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With