8000 SSH API Implementation by Therzok · Pull Request #852 · libgit2/libgit2sharp · GitHub
[go: up one dir, main page]

Skip to content

SSH API Implementation #852

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 6 commits into from
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Introduce SshAgentCredentials, SshUserKeyCredentials and UsernameQuer…
…yCredentials
  • Loading branch information
Therzok committed Apr 6, 2015
commit d76453840a5f2abd442c4778140735f96d9a0942
5 changes: 5 additions & 0 deletions LibGit2Sharp/Core/GitCredentialType.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,5 +32,10 @@ internal enum GitCredentialType
/// TODO
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Update this?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yea. I will.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, SshInteractive isn't implemented. So it's fine like this.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I won't be implementing interactive support due to lack of time at the moment. Maybe later, since it requires exposing structs from libssh2 land and lots of binding.

Sorry. 🍶

/// </summary>
SshInteractive = (1 << 4),

/// <summary>
/// Username only information.
/// </summary>
UsernameQuery = (1 << 5),
}
}
18 changes: 18 additions & 0 deletions LibGit2Sharp/Core/NativeMethods.cs
Original file line number Diff line number Diff line change
Expand Up @@ -398,6 +398,24 @@ internal static extern int git_cred_userpass_plaintext_new(
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof (StrictUtf8Marshaler))] string username,
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof (StrictUtf8Marshaler))] string password);

[DllImport(libgit2)]
internal static extern int git_cred_ssh_key_new(
out IntPtr cred,
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(StrictUtf8Marshaler))] string username,
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(StrictUtf8Marshaler))] string publickey,
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(StrictUtf8Marshaler))] string privatekey,
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(StrictUtf8Marshaler))] string passphrase);
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is most likely wrong, we need an ASCII string passed, from what I saw.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

/cc @carlosmn

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't see why we would want to restrict this to ASCII. UTF-8 is compatible with ASCII and what happens if I write my password in Spanish or German? I would need more letters than ASCII there.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, dunno why sending the passphrase in the current state isn't succeeding authentication.

I thought maybe libssh2 or something didn't support unicode, I'll investigate


[DllImport(libgit2)]
internal static extern int git_cred_username_new(
out IntPtr cred,
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(StrictUtf8Marshaler))] string username);

[DllImport(libgit2)]
internal static extern int git_cred_ssh_key_from_agent(
out IntPtr cred,
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(StrictUtf8Marshaler))] string username);

[DllImport(libgit2)]
internal static extern int git_describe_commit(
out DescribeResultSafeHandle describe,
Expand Down
3 changes: 3 additions & 0 deletions LibGit2Sharp/LibGit2Sharp.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -340,6 +340,9 @@
<Compile Include="Core\RawContentStream.cs" />
<Compile Include="Core\Handles\OdbStreamSafeHandle.cs" />
<Compile Include="SupportedCredentialTypes.cs" />
<Compile Include="SshUserKeyCredentials.cs" />
<Compile Include="SshAgentCredentials.cs" />
<Compile Include="UsernameQueryCredentials.cs" />
</ItemGroup>
<ItemGroup>
<CodeAnalysisDictionary Include="CustomDictionary.xml" />
Expand Down
8 changes: 8 additions & 0 deletions LibGit2Sharp/RemoteCallbacks.cs
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,14 @@ private int GitCredentialHandler(out IntPtr ptr, IntPtr cUrl, IntPtr usernameFro
{
types |= SupportedCredentialTypes.Default;
}
if (credTypes.HasFlag(GitCredentialType.SshKey))
{
types |= SupportedCredentialTypes.Ssh;
}
if (credTypes.HasFlag(GitCredentialType.UsernameQuery))
{
types |= SupportedCredentialTypes.UsernameQuery;
}

var cred = CredentialsProvider(url, username, types);

Expand Down
32 changes: 32 additions & 0 deletions LibGit2Sharp/SshAgentCredentials.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
using System;
using LibGit2Sharp.Core;

namespace LibGit2Sharp
{
/// <summary>
/// Class that holds SSH agent credentials for remote repository access.
/// </summary>
public sealed class SshAgentCredentials : Credentials
{
/// <summary>
/// Callback to acquire a credential object.
/// </summary>
/// <param name="cred">The newly created credential object.</param>
/// <returns>0 for success, &lt; 0 to indicate an error, &gt; 0 to indicate no credential was acquired.</returns>
protected internal override int GitCredentialHandler(out IntPtr cred)
{
if (Username == null)
{
throw new InvalidOperationException("SshAgentCredentials contains a null Username.");
}

return NativeMethods.git_cred_ssh_key_from_agent(out cred, Username);
}

/// <summary>
/// Username for SSH authentication.
/// </summary>
public string Username { get; set; }
}
}

61 changes: 61 additions & 0 deletions LibGit2Sharp/SshUserKeyCredentials.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
using System;
using LibGit2Sharp.Core;

namespace LibGit2Sharp
{
/// <summary>
/// Class that holds SSH username with key credentials for remote repository access.
/// </summary>
public sealed class SshUserKeyCredentials : Credentials
{
/// <summary>
/// Callback to acquire a credential object.
/// </summary>
/// <param name="cred">The newly created credential object.</param>
/// <returns>0 for success, &lt; 0 to indicate an error, &gt; 0 to indicate no credential was acquired.</returns>
protected internal override int GitCredentialHandler(out IntPtr cred)
{
if (Username == null)
{
throw new InvalidOperationException("SshUserKeyCredentials contains a null Username.");
}

if (Passphrase == null)
{
throw new InvalidOperationException("SshUserKeyCredentials contains a null Passphrase.");
}

if (PublicKey == null)
{
throw new InvalidOperationException("SshUserKeyCredentials contains a null PublicKey.");
}

if (PrivateKey == null)
{
throw new InvalidOperationException("SshUserKeyCredentials contains a null PrivateKey.");
}

return NativeMethods.git_cred_ssh_key_new(out cred, Username, PublicKey, PrivateKey, Passphrase);
}

/// <summary>
/// Username for SSH authentication.
/// </summary>
public string Username { get; set; }

/// <summary>
/// Public key file location for SSH authentication.
/// </summary>
public string PublicKey { get; set; }

/// <summary>
/// Private key file location for SSH authentication.
/// </summary>
public string PrivateKey { get; set; }

/// <summary>
/// Passphrase for SSH authentication.
/// </summary>
public string Passphrase { get; set; }
}
}
10 changes: 10 additions & 0 deletions LibGit2Sharp/SupportedCredentialTypes.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,15 @@ public enum SupportedCredentialTypes
/// Ask Windows to provide its default credentials for the current user (e.g. NTLM)
/// </summary>
Default = (1 << 1),

/// <summary>
/// SSH with username and public/private key. (SshUserKeyCredentials, SshAgentCredentials)
/// </summary>
Ssh = (1 << 2),

/// <summary>
/// Queries the server with the specified username, then later returns the supported credential types.
/// </summary>
UsernameQuery = (1 << 3),
}
}
31 changes: 31 additions & 0 deletions LibGit2Sharp/UsernameQueryCredentials.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
using System;
using LibGit2Sharp.Core;

namespace LibGit2Sharp
{
/// <summary>
/// Class that holds username query credentials for remote repository access.
/// </summary>
public sealed class UsernameQueryCredentials : Credentials
{
/// <summary>
/// Callback to acquire a credential object.
/// </summary>
/// <param name="cred">The newly created credential object.</param>
/// <returns>0 for success, &lt; 0 to indicate an error, &gt; 0 to indicate no credential was acquired.</returns>
protected internal override int GitCredentialHandler(out IntPtr cred)
{
if (Username == null)
{
throw new InvalidOperationException("UsernameQueryCredentials contains a null Username.");
}

return NativeMethods.git_cred_username_new(out cred, Username);
}

/// <summary>
/// Username for querying the server for supported authentication.
/// </summary>
public string Username { get; set; }
}
}
0