namespace marlin.core.functional;
using System.Diagnostics;
using System.Text;
///
/// 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).
///
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 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(NoopAsyncDisposable.Instance);
}
}