public static async Task LoadOperationArguments(Program program, OperationArguments operationArguments) { if (program is null) { throw new ArgumentNullException(nameof(program)); } if (operationArguments is null) { throw new ArgumentNullException(nameof(operationArguments)); } if (operationArguments.TargetUri == null) { program.Die("No host information, unable to continue."); } string value; bool? yesno; if (program.TryReadBoolean(operationArguments, KeyType.ConfigNoLocal, out yesno)) { program.Trace.WriteLine($"{program.KeyTypeName(KeyType.ConfigNoLocal)} = '{yesno}'."); operationArguments.UseConfigLocal = yesno.Value; } if (program.TryReadBoolean(operationArguments, KeyType.ConfigNoSystem, out yesno)) { program.Trace.WriteLine($"{program.KeyTypeName(KeyType.ConfigNoSystem)} = '{yesno}'."); operationArguments.UseConfigSystem = yesno.Value; } // Load/re-load the Git configuration after setting the use local/system config values. await operationArguments.LoadConfiguration(); // If a user-agent has been specified in the environment, set it globally. if (program.TryReadString(operationArguments, KeyType.HttpUserAgent, out value)) { program.Trace.WriteLine($"{program.KeyTypeName(KeyType.HttpUserAgent)} = '{value}'."); Global.UserAgent = value; } // Look for authority settings. if (program.TryReadString(operationArguments, KeyType.Authority, out value)) { program.Trace.WriteLine($"{program.KeyTypeName(KeyType.Authority)} = '{value}'."); if (Program.ConfigKeyComparer.Equals(value, "MSA") || Program.ConfigKeyComparer.Equals(value, "Microsoft") || Program.ConfigKeyComparer.Equals(value, "MicrosoftAccount") || Program.ConfigKeyComparer.Equals(value, "Live") || Program.ConfigKeyComparer.Equals(value, "LiveConnect") || Program.ConfigKeyComparer.Equals(value, "LiveID")) { operationArguments.Authority = AuthorityType.MicrosoftAccount; } else if (Program.ConfigKeyComparer.Equals(value, "AAD") || Program.ConfigKeyComparer.Equals(value, "Azure") || Program.ConfigKeyComparer.Equals(value, "AzureDirectory")) { operationArguments.Authority = AuthorityType.AzureDirectory; } else if (Program.ConfigKeyComparer.Equals(value, "Integrated") || Program.ConfigKeyComparer.Equals(value, "Windows") || Program.ConfigKeyComparer.Equals(value, "TFS") || Program.ConfigKeyComparer.Equals(value, "Kerberos") || Program.ConfigKeyComparer.Equals(value, "NTLM") || Program.ConfigKeyComparer.Equals(value, "SSO")) { operationArguments.Authority = AuthorityType.Ntlm; } else if (Program.ConfigKeyComparer.Equals(value, "GitHub")) { operationArguments.Authority = AuthorityType.GitHub; } else if (Program.ConfigKeyComparer.Equals(value, "Atlassian") || Program.ConfigKeyComparer.Equals(value, "Bitbucket")) { operationArguments.Authority = AuthorityType.Bitbucket; } else { operationArguments.Authority = AuthorityType.Basic; } } // Look for interactivity config settings. if (program.TryReadString(operationArguments, KeyType.Interactive, out value)) { program.Trace.WriteLine($"{program.KeyTypeName(KeyType.Interactive)} = '{value}'."); if (Program.ConfigKeyComparer.Equals(value, "always") || Program.ConfigKeyComparer.Equals(value, "true") || Program.ConfigKeyComparer.Equals(value, "force")) { operationArguments.Interactivity = Interactivity.Always; } else if (Program.ConfigKeyComparer.Equals(value, "never") || Program.ConfigKeyComparer.Equals(value, "false")) { operationArguments.Interactivity = Interactivity.Never; } } // Look for credential validation config settings. if (program.TryReadBoolean(operationArguments, KeyType.Validate, out yesno)) { program.Trace.WriteLine($"{program.KeyTypeName(KeyType.Validate)} = '{yesno}'."); operationArguments.ValidateCredentials = yesno.Value; } // Look for write log config settings. if (program.TryReadBoolean(operationArguments, KeyType.Writelog, out yesno)) { program.Trace.WriteLine($"{program.KeyTypeName(KeyType.Writelog)} = '{yesno}'."); operationArguments.WriteLog = yesno.Value; } // Look for modal prompt config settings. if (program.TryReadBoolean(operationArguments, KeyType.ModalPrompt, out yesno)) { program.Trace.WriteLine($"{program.KeyTypeName(KeyType.ModalPrompt)} = '{yesno}'."); operationArguments.UseModalUi = yesno.Value; } // Look for credential preservation config settings. if (program.TryReadBoolean(operationArguments, KeyType.PreserveCredentials, out yesno)) { program.Trace.WriteLine($"{program.KeyTypeName(KeyType.PreserveCredentials)} = '{yesno}'."); operationArguments.PreserveCredentials = yesno.Value; } else if (operationArguments.EnvironmentVariables.TryGetValue("GCM_PRESERVE_CREDS", out value)) { if (StringComparer.OrdinalIgnoreCase.Equals(value, "true") || StringComparer.OrdinalIgnoreCase.Equals(value, "yes") || StringComparer.OrdinalIgnoreCase.Equals(value, "1") || StringComparer.OrdinalIgnoreCase.Equals(value, "on")) { program.Trace.WriteLine($"GCM_PRESERVE_CREDS = '{yesno}'."); operationArguments.PreserveCredentials = true; program.Trace.WriteLine($"WARNING: the 'GCM_PRESERVE_CREDS' variable has been deprecated, use '{ program.KeyTypeName(KeyType.PreserveCredentials) }' instead."); } } // Look for HTTP path usage config settings. if (program.TryReadBoolean(operationArguments, KeyType.HttpPath, out yesno)) { program.Trace.WriteLine($"{program.KeyTypeName(KeyType.HttpPath)} = '{value}'."); operationArguments.UseHttpPath = yesno.Value; } // Look for HTTP proxy config settings. if ((operationArguments.TargetUri.Scheme.Equals(Uri.UriSchemeHttps, StringComparison.OrdinalIgnoreCase) && program.TryReadString(operationArguments, KeyType.HttpsProxy, out value)) || program.TryReadString(operationArguments, KeyType.HttpProxy, out value)) { program.Trace.WriteLine($"{program.KeyTypeName(KeyType.HttpProxy)} = '{value}'."); operationArguments.SetProxy(value); } // Check environment variables just-in-case. else if ((operationArguments.EnvironmentVariables.TryGetValue("GCM_HTTP_PROXY", out value) && !string.IsNullOrWhiteSpace(value))) { program.Trace.WriteLine($"GCM_HTTP_PROXY = '{value}'."); var keyName = (operationArguments.TargetUri.Scheme.Equals(Uri.UriSchemeHttps, StringComparison.OrdinalIgnoreCase)) ? "HTTPS_PROXY" : "HTTP_PROXY"; var warning = $"WARNING: the 'GCM_HTTP_PROXY' variable has been deprecated, use '{ keyName }' instead."; program.Trace.WriteLine(warning); program.WriteLine(warning); operationArguments.SetProxy(value); } // Check the git-config http.proxy setting just-in-case. else { Git.Configuration.Entry entry; if (operationArguments.GitConfiguration.TryGetEntry("http", operationArguments.QueryUri, "proxy", out entry) && !string.IsNullOrWhiteSpace(entry.Value)) { program.Trace.WriteLine($"http.proxy = '{entry.Value}'."); operationArguments.SetProxy(entry.Value); } } // Look for custom namespace config settings. if (program.TryReadString(operationArguments, KeyType.Namespace, out value)) { program.Trace.WriteLine($"{program.KeyTypeName(KeyType.Namespace)} = '{value}'."); operationArguments.CustomNamespace = value; } // Look for custom token duration settings. if (program.TryReadString(operationArguments, KeyType.TokenDuration, out value)) { program.Trace.WriteLine($"{program.KeyTypeName(KeyType.TokenDuration)} = '{value}'."); int hours; if (int.TryParse(value, out hours)) { operationArguments.TokenDuration = TimeSpan.FromHours(hours); } } // Look for custom VSTS scope settings. if (program.TryReadString(operationArguments, KeyType.VstsScope, out value)) { program.Trace.WriteLine($"{program.KeyTypeName(KeyType.VstsScope)} = '{value}'."); VstsTokenScope vstsTokenScope = VstsTokenScope.None; var scopes = value.Split(TokenScopeSeparatorCharacters.ToCharArray(), StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < scopes.Length; i += 1) { scopes[i] = scopes[i].Trim(); if (VstsTokenScope.Find(scopes[i], out VstsTokenScope scope)) { vstsTokenScope = vstsTokenScope | scope; } else { program.Trace.WriteLine($"Unknown VSTS Token scope: '{scopes[i]}'."); } } operationArguments.VstsTokenScope = vstsTokenScope; } // Check for configuration supplied user-info. if (program.TryReadString(operationArguments, KeyType.Username, out value)) { program.Trace.WriteLine($"{program.KeyTypeName(KeyType.Username)} = '{value}'."); operationArguments.Username = value; } }
internal void Askpass(string[] args) { if (args == null || args.Length == 0) { throw new ArgumentException("Arguments cannot be empty."); } Gui.UserPromptKind promptKind = Gui.UserPromptKind.SshPassphrase; Match match; if ((match = AskPasswordRegex.Match(args[0])).Success) { promptKind = Gui.UserPromptKind.CredentialsPassword; } else if ((match = AskPassphraseRegex.Match(args[0])).Success) { promptKind = Gui.UserPromptKind.SshPassphrase; } if (match.Success) { _context.Trace.WriteLine("querying for passphrase key."); if (match.Groups.Count < 2) { throw new ArgumentException("Unable to understand command."); } // string request = match.Groups[0].Value; string resource = match.Groups[1].Value; _context.Trace.WriteLine($"open dialog for '{resource}'."); // Load operation arguments. OperationArguments operationArguments = new OperationArguments(_context); Task.Run(async() => await operationArguments.LoadConfiguration()).Wait(); // Set the parent window handle. ParentHwnd = operationArguments.ParentHwnd; System.Windows.Application application = new System.Windows.Application(); Gui.UserPromptDialog prompt = new Gui.UserPromptDialog(promptKind, resource, operationArguments.ParentHwnd); application.Run(prompt); if (!prompt.Failed && !string.IsNullOrEmpty(prompt.Response)) { string passphase = prompt.Response; _context.Trace.WriteLine("passphase acquired."); Out.Write(passphase + "\n"); return; } Die("failed to interactively acquire credentials."); } if ((match = AskCredentialRegex.Match(args[0])).Success) { _context.Trace.WriteLine("querying for basic credentials."); if (match.Groups.Count < 3) { throw new ArgumentException("Unable to understand command."); } string seeking = match.Groups[1].Value; string targetUrl = match.Groups[2].Value; string username = string.Empty; string password = string.Empty; Uri targetUri = null; // Since we're looking for HTTP(s) credentials, we can use NetFx `Uri` class. if (Uri.TryCreate(targetUrl, UriKind.Absolute, out targetUri)) { _context.Trace.WriteLine($"success parsing URL, targetUri = '{targetUri}'."); if (TryParseUrlCredentials(targetUrl, out username, out password)) { if (password != null && seeking.Equals("Password", StringComparison.OrdinalIgnoreCase)) { Out.Write(password + '\n'); return; } // print the username if it sought if (seeking.Equals("Username", StringComparison.OrdinalIgnoreCase)) { Out.Write(username + '\n'); return; } } // create a target Url with the credential portion stripped, because Git doesn't // report hosts with credentials targetUrl = targetUri.Scheme + "://"; // Add the username@ portion of the url if it exists if (username != null) { targetUrl += Uri.EscapeDataString(username); targetUrl += '@'; } targetUrl += targetUri.Host; // Retain the port if specified. if (!targetUri.IsDefaultPort) { targetUrl += $":{targetUri.Port}"; } // Retain the path if specified. if (!string.IsNullOrWhiteSpace(targetUri.LocalPath)) { targetUrl += targetUri.LocalPath; } if (Uri.TryCreate(targetUrl, UriKind.Absolute, out targetUri)) { _context.Trace.WriteLine($"success parsing URL, targetUri = '{targetUri}'."); var operationArguments = new OperationArguments(_context); operationArguments.SetTargetUri(targetUri); operationArguments.SetCredentials(username ?? string.Empty, password ?? string.Empty); // Load up the operation arguments, enable tracing, and query for credentials. Task.Run(async() => { await LoadOperationArguments(operationArguments); EnableTraceLogging(operationArguments); Credential credentials; if ((credentials = await QueryCredentials(operationArguments)) != null) { if (seeking.Equals("Username", StringComparison.OrdinalIgnoreCase)) { _context.Trace.WriteLine($"username for '{targetUrl}' asked for and found."); Out.Write(credentials.Username + '\n'); return; } if (seeking.Equals("Password", StringComparison.OrdinalIgnoreCase)) { _context.Trace.WriteLine($"password for '{targetUrl}' asked for and found."); Out.Write(credentials.Password + '\n'); return; } } else { _context.Trace.WriteLine($"user cancelled credential dialog."); return; } }).Wait(); } else { _context.Trace.WriteLine("error: unable to parse target URL."); } } else { _context.Trace.WriteLine("error: unable to parse supplied URL."); } Die($"failed to detect {seeking} in target URL."); } if ((match = AskAuthenticityRegex.Match(args[0])).Success) { string host = match.Groups[1].Value; string fingerprint = match.Groups[2].Value; _context.Trace.WriteLine($"requesting authorization to add {host} ({fingerprint}) to known hosts."); // Load operation arguments. OperationArguments operationArguments = new OperationArguments(_context); Task.Run(async() => await operationArguments.LoadConfiguration()).Wait(); // Set the parent window handle. ParentHwnd = operationArguments.ParentHwnd; System.Windows.Application application = new System.Windows.Application(); Gui.UserPromptDialog prompt = new Gui.UserPromptDialog(host, fingerprint, operationArguments.ParentHwnd); application.Run(prompt); if (prompt.Failed) { _context.Trace.WriteLine("denied authorization of host."); Out.Write("no\n"); } else { _context.Trace.WriteLine("approved authorization of host."); Out.Write("yes\n"); } return; } Die("failed to acquire credentials."); }
public static void LoadOperationArguments(Program program, OperationArguments operationArguments) { if (program is null) { throw new ArgumentNullException(nameof(program)); } if (operationArguments is null) { throw new ArgumentNullException(nameof(operationArguments)); } if (operationArguments.TargetUri == null) { program.Die("No host information, unable to continue."); } string value; bool? yesno; if (program.TryReadBoolean(operationArguments, null, Program.EnvironConfigNoLocalKey, out yesno)) { Git.Trace.WriteLine($"{Program.EnvironConfigNoLocalKey} = '{yesno}'."); operationArguments.UseConfigLocal = yesno.Value; } if (program.TryReadBoolean(operationArguments, null, Program.EnvironConfigNoSystemKey, out yesno)) { Git.Trace.WriteLine($"{Program.EnvironConfigNoSystemKey} = '{yesno}'."); operationArguments.UseConfigSystem = yesno.Value; } // Load/re-load the Git configuration after setting the use local/system config values. operationArguments.LoadConfiguration(); // If a user-agent has been specified in the environment, set it globally. if (program.TryReadString(operationArguments, null, Program.EnvironHttpUserAgent, out value)) { Git.Trace.WriteLine($"{Program.EnvironHttpUserAgent} = '{value}'."); Global.UserAgent = value; } // Look for authority settings. if (program.TryReadString(operationArguments, Program.ConfigAuthorityKey, Program.EnvironAuthorityKey, out value)) { Git.Trace.WriteLine($"{Program.ConfigAuthorityKey} = '{value}'."); if (Program.ConfigKeyComparer.Equals(value, "MSA") || Program.ConfigKeyComparer.Equals(value, "Microsoft") || Program.ConfigKeyComparer.Equals(value, "MicrosoftAccount") || Program.ConfigKeyComparer.Equals(value, "Live") || Program.ConfigKeyComparer.Equals(value, "LiveConnect") || Program.ConfigKeyComparer.Equals(value, "LiveID")) { operationArguments.Authority = AuthorityType.MicrosoftAccount; } else if (Program.ConfigKeyComparer.Equals(value, "AAD") || Program.ConfigKeyComparer.Equals(value, "Azure") || Program.ConfigKeyComparer.Equals(value, "AzureDirectory")) { operationArguments.Authority = AuthorityType.AzureDirectory; } else if (Program.ConfigKeyComparer.Equals(value, "Integrated") || Program.ConfigKeyComparer.Equals(value, "Windows") || Program.ConfigKeyComparer.Equals(value, "TFS") || Program.ConfigKeyComparer.Equals(value, "Kerberos") || Program.ConfigKeyComparer.Equals(value, "NTLM") || Program.ConfigKeyComparer.Equals(value, "SSO")) { operationArguments.Authority = AuthorityType.Ntlm; } else if (Program.ConfigKeyComparer.Equals(value, "GitHub")) { operationArguments.Authority = AuthorityType.GitHub; } else if (Program.ConfigKeyComparer.Equals(value, "Atlassian") || Program.ConfigKeyComparer.Equals(value, "Bitbucket")) { operationArguments.Authority = AuthorityType.Bitbucket; } else { operationArguments.Authority = AuthorityType.Basic; } } // Look for interactivity config settings. if (program.TryReadString(operationArguments, Program.ConfigInteractiveKey, Program.EnvironInteractiveKey, out value)) { Git.Trace.WriteLine($"{Program.EnvironInteractiveKey} = '{value}'."); if (Program.ConfigKeyComparer.Equals(value, "always") || Program.ConfigKeyComparer.Equals(value, "true") || Program.ConfigKeyComparer.Equals(value, "force")) { operationArguments.Interactivity = Interactivity.Always; } else if (Program.ConfigKeyComparer.Equals(value, "never") || Program.ConfigKeyComparer.Equals(value, "false")) { operationArguments.Interactivity = Interactivity.Never; } } // Look for credential validation config settings. if (program.TryReadBoolean(operationArguments, Program.ConfigValidateKey, Program.EnvironValidateKey, out yesno)) { Git.Trace.WriteLine($"{Program.ConfigValidateKey} = '{yesno}'."); operationArguments.ValidateCredentials = yesno.Value; } // Look for write log config settings. if (program.TryReadBoolean(operationArguments, Program.ConfigWritelogKey, Program.EnvironWritelogKey, out yesno)) { Git.Trace.WriteLine($"{Program.ConfigWritelogKey} = '{yesno}'."); operationArguments.WriteLog = yesno.Value; } // Look for modal prompt config settings. if (program.TryReadBoolean(operationArguments, Program.ConfigUseModalPromptKey, Program.EnvironModalPromptKey, out yesno)) { Git.Trace.WriteLine($"{Program.ConfigUseModalPromptKey} = '{yesno}'."); operationArguments.UseModalUi = yesno.Value; } // Look for credential preservation config settings. if (program.TryReadBoolean(operationArguments, Program.ConfigPreserveCredentialsKey, Program.EnvironPreserveCredentialsKey, out yesno)) { Git.Trace.WriteLine($"{Program.ConfigPreserveCredentialsKey} = '{yesno}'."); operationArguments.PreserveCredentials = yesno.Value; } // Look for HTTP path usage config settings. if (program.TryReadBoolean(operationArguments, Program.ConfigUseHttpPathKey, null, out yesno)) { Git.Trace.WriteLine($"{Program.ConfigUseHttpPathKey} = '{value}'."); operationArguments.UseHttpPath = yesno.Value; } // Look for HTTP proxy config settings. if (program.TryReadString(operationArguments, Program.ConfigHttpProxyKey, Program.EnvironHttpProxyKey, out value)) { Git.Trace.WriteLine($"{Program.ConfigHttpProxyKey} = '{value}'."); operationArguments.SetProxy(value); } // Check environment variables just-in-case. else if ((operationArguments.EnvironmentVariables.TryGetValue(Program.EnvironGitHttpsProxyKey, out value) && !string.IsNullOrWhiteSpace(value)) || (operationArguments.EnvironmentVariables.TryGetValue(Program.EnvironGitHttpProxyKey, out value) && !string.IsNullOrWhiteSpace(value))) { Git.Trace.WriteLine($"http.proxy = '{value}'."); operationArguments.SetProxy(value); } // Check the git-config http.proxy setting just-in-case. else { Configuration.Entry entry; if (operationArguments.GitConfiguration.TryGetEntry("http", operationArguments.QueryUri, "proxy", out entry) && !string.IsNullOrWhiteSpace(entry.Value)) { Git.Trace.WriteLine($"http.proxy = '{entry.Value}'."); operationArguments.SetProxy(entry.Value); } } // Look for custom namespace config settings. if (program.TryReadString(operationArguments, Program.ConfigNamespaceKey, Program.EnvironNamespaceKey, out value)) { Git.Trace.WriteLine($"{Program.ConfigNamespaceKey} = '{value}'."); operationArguments.CustomNamespace = value; } // Look for custom token duration settings. if (program.TryReadString(operationArguments, Program.ConfigTokenDuration, Program.EnvironTokenDuration, out value)) { Git.Trace.WriteLine($"{Program.ConfigTokenDuration} = '{value}'."); int hours; if (int.TryParse(value, out hours)) { operationArguments.TokenDuration = TimeSpan.FromHours(hours); } } }
private static void LoadOperationArguments(OperationArguments operationArguments) { if (operationArguments.TargetUri == null) { Die("No host information, unable to continue."); } string value; bool? yesno; if (TryReadBoolean(operationArguments, null, EnvironConfigNoLocalKey, out yesno)) { operationArguments.UseConfigLocal = yesno.Value; } if (TryReadBoolean(operationArguments, null, EnvironConfigNoSystemKey, out yesno)) { operationArguments.UseConfigSystem = yesno.Value; } // load/re-load the Git configuration after setting the use local/system config values operationArguments.LoadConfiguration(); // if a user-agent has been specified in the environment, set it globally if (TryReadString(operationArguments, null, EnvironHttpUserAgent, out value)) { Global.UserAgent = value; } // look for authority settings if (TryReadString(operationArguments, ConfigAuthortyKey, EnvironAuthorityKey, out value)) { Git.Trace.WriteLine($"{ConfigAuthortyKey} = '{value}'."); if (ConfigKeyComparer.Equals(value, "MSA") || ConfigKeyComparer.Equals(value, "Microsoft") || ConfigKeyComparer.Equals(value, "MicrosoftAccount") || ConfigKeyComparer.Equals(value, "Live") || ConfigKeyComparer.Equals(value, "LiveConnect") || ConfigKeyComparer.Equals(value, "LiveID")) { operationArguments.Authority = AuthorityType.MicrosoftAccount; } else if (ConfigKeyComparer.Equals(value, "AAD") || ConfigKeyComparer.Equals(value, "Azure") || ConfigKeyComparer.Equals(value, "AzureDirectory")) { operationArguments.Authority = AuthorityType.AzureDirectory; } else if (ConfigKeyComparer.Equals(value, "Integrated") || ConfigKeyComparer.Equals(value, "Windows") || ConfigKeyComparer.Equals(value, "TFS") || ConfigKeyComparer.Equals(value, "Kerberos") || ConfigKeyComparer.Equals(value, "NTLM") || ConfigKeyComparer.Equals(value, "SSO")) { operationArguments.Authority = AuthorityType.Ntlm; } else if (ConfigKeyComparer.Equals(value, "GitHub")) { operationArguments.Authority = AuthorityType.GitHub; } else { operationArguments.Authority = AuthorityType.Basic; } } // look for interactivity config settings if (TryReadString(operationArguments, ConfigInteractiveKey, EnvironInteractiveKey, out value)) { Git.Trace.WriteLine($"{EnvironInteractiveKey} = '{value}'."); if (ConfigKeyComparer.Equals(value, "always") || ConfigKeyComparer.Equals(value, "true") || ConfigKeyComparer.Equals(value, "force")) { operationArguments.Interactivity = Interactivity.Always; } else if (ConfigKeyComparer.Equals(value, "never") || ConfigKeyComparer.Equals(value, "false")) { operationArguments.Interactivity = Interactivity.Never; } } // look for credential validation config settings if (TryReadBoolean(operationArguments, ConfigValidateKey, EnvironValidateKey, out yesno)) { operationArguments.ValidateCredentials = yesno.Value; } // look for write log config settings if (TryReadBoolean(operationArguments, ConfigWritelogKey, EnvironWritelogKey, out yesno)) { operationArguments.WriteLog = yesno.Value; } // look for modal prompt config settings if (TryReadBoolean(operationArguments, ConfigUseModalPromptKey, EnvironModalPromptKey, out yesno)) { operationArguments.UseModalUi = yesno.Value; } // look for credential preservation config settings if (TryReadBoolean(operationArguments, ConfigPreserveCredentialsKey, EnvironPreserveCredentialsKey, out yesno)) { operationArguments.PreserveCredentials = yesno.Value; } // look for http path usage config settings if (TryReadBoolean(operationArguments, ConfigUseHttpPathKey, null, out yesno)) { operationArguments.UseHttpPath = yesno.Value; } // look for http proxy config settings if (TryReadString(operationArguments, ConfigHttpProxyKey, EnvironHttpProxyKey, out value)) { Git.Trace.WriteLine($"{ConfigHttpProxyKey} = '{value}'."); operationArguments.SetProxy(value); } else { // check the git-config http.proxy setting just-in-case Configuration.Entry entry; if (operationArguments.GitConfiguration.TryGetEntry("http", operationArguments.QueryUri, "proxy", out entry) && !String.IsNullOrWhiteSpace(entry.Value)) { Git.Trace.WriteLine($"http.proxy = '{entry.Value}'."); operationArguments.SetProxy(entry.Value); } } // look for custom namespace config settings if (TryReadString(operationArguments, ConfigNamespaceKey, EnvironNamespaceKey, out value)) { Git.Trace.WriteLine($"{ConfigNamespaceKey} = '{value}'."); operationArguments.CustomNamespace = value; } }