summaryrefslogtreecommitdiff
path: root/src/marlin.core/functional/TokenGitCredential.cs
blob: 5dfef66f8aa9db69061d27713b04fba4b7430d54 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
namespace marlin.core.functional;

using System.Diagnostics;
using System.Text;

/// <summary>
/// HTTPS auth via a bearer/basic token. Injected as an Authorization header for a
/// single git invocation through GIT_CONFIG_* env vars, so it never appears in argv
/// (visible via ps) or in git's own error output (which echoes the URL, not headers).
/// </summary>
public sealed class TokenGitCredential : IGitCredential
{
    private readonly string _username;
    private readonly string _token;

    public TokenGitCredential(string token, string username = "x-access-token")
    {
        this._token = token;
        this._username = username;
    }

    public Task<IAsyncDisposable> ApplyAsync(ProcessStartInfo psi)
    {
        string header = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{this._username}:{this._token}"));

        psi.Environment["GIT_CONFIG_COUNT"] = "1";
        psi.Environment["GIT_CONFIG_KEY_0"] = "http.extraheader";
        psi.Environment["GIT_CONFIG_VALUE_0"] = $"AUTHORIZATION: basic {header}";

        return Task.FromResult<IAsyncDisposable>(NoopAsyncDisposable.Instance);
    }
}