private static void Askpass() { Match match; if ((match = AskCredentialRegex.Match(Environment.CommandLine)).Success) { Git.Trace.WriteLine("querying for HTTPS 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; Uri targetUri = new Uri(targetUrl); Credential credential = null; // config stored credentials come in the format of <username>[:<password>]@<url> with password being optional int tokenIndex = targetUrl.IndexOf('@'); if (tokenIndex > 0) { Git.Trace.WriteLine("'@' symbol found in URL, assuming credential prefix."); string prefix = targetUrl.Substring(0, tokenIndex); targetUrl = targetUrl.Substring(tokenIndex + 1, targetUrl.Length - tokenIndex - 1); string username = null; string password = null; tokenIndex = prefix.IndexOf(':'); if (tokenIndex > 0) { Git.Trace.WriteLine("':' token found in credential prefix, parsing username & password."); username = prefix.Substring(0, tokenIndex); password = prefix.Substring(tokenIndex + 1, prefix.Length - tokenIndex - 1); } credential = new Credential(username, password); } if (Uri.TryCreate(targetUrl, UriKind.Absolute, out targetUri)) { Git.Trace.WriteLine($"success parsing URL, targetUri = '{targetUri}'."); OperationArguments operationArguments = new OperationArguments(targetUri); LoadOperationArguments(operationArguments); EnableTraceLogging(operationArguments); if (StringComparer.InvariantCultureIgnoreCase.Equals(seeking, "Username")) { if (string.IsNullOrEmpty(credential?.Username)) { Git.Trace.WriteLine("username not supplied in config, need to query for value."); QueryCredentials(operationArguments); credential = new Credential(operationArguments.CredUsername, operationArguments.CredPassword); } if (!string.IsNullOrEmpty(credential?.Username)) { Git.Trace.WriteLine($"username for '{targetUrl}' asked for and found."); Console.Out.Write(credential.Username + "\n"); return; } } if (StringComparer.InvariantCultureIgnoreCase.Equals(seeking, "Password")) { if (string.IsNullOrEmpty(credential?.Password)) { Git.Trace.WriteLine("password not supplied in config, need to query for value."); QueryCredentials(operationArguments); // only honor the password if the stored credentials username was not supplied by or matches config if (string.IsNullOrEmpty(credential?.Username) || StringComparer.InvariantCultureIgnoreCase.Equals(credential.Username, operationArguments.CredUsername)) { credential = new Credential(operationArguments.CredUsername, operationArguments.CredPassword); } } if (!string.IsNullOrEmpty(credential?.Password)) { Git.Trace.WriteLine($"password for '{targetUrl}' asked for and found."); Console.Out.Write(credential.Password + "\n"); return; } } } else { Git.Trace.WriteLine("unable to parse URL."); } } else if ((match = AskPasswordRegex.Match(Environment.CommandLine)).Success || (match = AskPassphraseRegex.Match(Environment.CommandLine)).Success) { Git.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; Git.Trace.WriteLine($"open dialog for '{resource}'."); System.Windows.Application application = new System.Windows.Application(); Gui.PassphraseWindow prompt = new Gui.PassphraseWindow(resource); application.Run(prompt); if (!prompt.Cancelled && !string.IsNullOrEmpty(prompt.Passphrase)) { string passphase = prompt.Passphrase; Git.Trace.WriteLine("passphase acquired."); Console.Out.Write(passphase + "\n"); return; } } Git.Trace.WriteLine("failed to acquire credentials."); }
private static void Askpass(string[] args) { if (args == null || args.Length == 0) throw new ArgumentException("Arguments cannot be empty."); Match match; if ((match = AskPasswordRegex.Match(args[0])).Success || (match = AskPassphraseRegex.Match(args[0])).Success) { Git.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; Git.Trace.WriteLine($"open dialog for '{resource}'."); System.Windows.Application application = new System.Windows.Application(); Gui.PassphraseWindow prompt = new Gui.PassphraseWindow(resource); application.Run(prompt); if (!prompt.Cancelled && !string.IsNullOrEmpty(prompt.Passphrase)) { string passphase = prompt.Passphrase; Git.Trace.WriteLine("passphase acquired."); Console.Out.Write(passphase + "\n"); return; } Git.Trace.WriteLine("failed to interactively acquire credentials."); } if ((match = AskCredentialRegex.Match(args[0])).Success) { Git.Trace.WriteLine("querying for HTTPS 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; Uri targetUri; if (Uri.TryCreate(targetUrl, UriKind.Absolute, out targetUri)) { Git.Trace.WriteLine($"success parsing URL, targetUri = '{targetUri}'."); // config stored credentials come in the format of <username>[:<password>]@<url> with password being optional // scheme terminator is actually "://" so we need adjust to get the correct index int schemeTerminator = targetUrl.IndexOf(':') + 2; int credentialTerminator = targetUrl.IndexOf('@', schemeTerminator + 1); if (credentialTerminator > 0) { Git.Trace.WriteLine("'@' symbol found in URL, assuming credential prefix."); string username = null; string password = null; int passwordTerminator = targetUrl.IndexOf(':', schemeTerminator + 1); if (passwordTerminator > 0) { Git.Trace.WriteLine("':' symbol found in URL, assuming credential prefix contains password."); username = targetUrl.Substring(schemeTerminator + 1, passwordTerminator - schemeTerminator - 1); password = targetUrl.Substring(passwordTerminator + 1, credentialTerminator - passwordTerminator + 1); // print the password if it sought if (seeking.Equals("Password", StringComparison.OrdinalIgnoreCase)) { Console.Out.Write(password + '\n'); return; } } else { username = targetUrl.Substring(schemeTerminator + 1, credentialTerminator - schemeTerminator - 1); } // print the username if it sought if (seeking.Equals("Username", StringComparison.OrdinalIgnoreCase)) { Console.Out.Write(username + '\n'); return; } } // create a target Url with the credential portion stripped, because Git doesn't report hosts with credentials targetUrl = String.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}://{1}", targetUri.Scheme, 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)) { Git.Trace.WriteLine($"success parsing URL, targetUri = '{targetUri}'."); OperationArguments operationArguments = new OperationArguments(targetUri); // load up the operation arguments, enable tracing, and query for credentials LoadOperationArguments(operationArguments); EnableTraceLogging(operationArguments); if (QueryCredentials(operationArguments)) { if (seeking.Equals("Username", StringComparison.OrdinalIgnoreCase)) { Git.Trace.WriteLine($"username for '{targetUrl}' asked for and found."); Console.Out.Write(operationArguments.CredUsername + '\n'); return; } if (seeking.Equals("Password", StringComparison.OrdinalIgnoreCase)) { Git.Trace.WriteLine($"password for '{targetUrl}' asked for and found."); Console.Out.Write(operationArguments.CredPassword + '\n'); return; } } } else { Git.Trace.WriteLine("error: unable to parse target URL."); } } else { Git.Trace.WriteLine("error: unable to parse supplied URL."); } Git.Trace.WriteLine($"failed to detect {seeking} in target URL."); } Git.Trace.WriteLine("failed to acquire credentials."); }
private static void Askpass(string[] args) { if (args == null || args.Length == 0) { throw new ArgumentException("Arguments cannot be empty."); } Match match; if ((match = AskPasswordRegex.Match(args[0])).Success || (match = AskPassphraseRegex.Match(args[0])).Success) { Git.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; Git.Trace.WriteLine($"open dialog for '{resource}'."); System.Windows.Application application = new System.Windows.Application(); Gui.PassphraseWindow prompt = new Gui.PassphraseWindow(resource); application.Run(prompt); if (!prompt.Cancelled && !string.IsNullOrEmpty(prompt.Passphrase)) { string passphase = prompt.Passphrase; Git.Trace.WriteLine("passphase acquired."); Console.Out.Write(passphase + "\n"); return; } Git.Trace.WriteLine("failed to interactively acquire credentials."); } if ((match = AskCredentialRegex.Match(args[0])).Success) { Git.Trace.WriteLine("querying for HTTPS 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; Uri targetUri; if (Uri.TryCreate(targetUrl, UriKind.Absolute, out targetUri)) { Git.Trace.WriteLine($"success parsing URL, targetUri = '{targetUri}'."); // config stored credentials come in the format of <username>[:<password>]@<url> with password being optional // scheme terminator is actually "://" so we need adjust to get the correct index int schemeTerminator = targetUrl.IndexOf(':') + 2; int credentialTerminator = targetUrl.IndexOf('@', schemeTerminator + 1); if (credentialTerminator > 0) { Git.Trace.WriteLine("'@' symbol found in URL, assuming credential prefix."); string username = null; string password = null; int passwordTerminator = targetUrl.IndexOf(':', schemeTerminator + 1); if (passwordTerminator > 0) { Git.Trace.WriteLine("':' symbol found in URL, assuming credential prefix contains password."); username = targetUrl.Substring(schemeTerminator + 1, passwordTerminator - schemeTerminator - 1); password = targetUrl.Substring(passwordTerminator + 1, credentialTerminator - passwordTerminator + 1); // print the password if it sought if (seeking.Equals("Password", StringComparison.OrdinalIgnoreCase)) { Console.Out.Write(password + '\n'); return; } } else { username = targetUrl.Substring(schemeTerminator + 1, credentialTerminator - schemeTerminator - 1); } // print the username if it sought if (seeking.Equals("Username", StringComparison.OrdinalIgnoreCase)) { Console.Out.Write(username + '\n'); return; } } // create a target Url with the credential portion stripped, because Git doesn't report hosts with credentials targetUrl = String.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}://{1}", targetUri.Scheme, 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)) { Git.Trace.WriteLine($"success parsing URL, targetUri = '{targetUri}'."); OperationArguments operationArguments = new OperationArguments(targetUri); // load up the operation arguments, enable tracing, and query for credentials LoadOperationArguments(operationArguments); EnableTraceLogging(operationArguments); if (QueryCredentials(operationArguments)) { if (seeking.Equals("Username", StringComparison.OrdinalIgnoreCase)) { Git.Trace.WriteLine($"username for '{targetUrl}' asked for and found."); Console.Out.Write(operationArguments.CredUsername + '\n'); return; } if (seeking.Equals("Password", StringComparison.OrdinalIgnoreCase)) { Git.Trace.WriteLine($"password for '{targetUrl}' asked for and found."); Console.Out.Write(operationArguments.CredPassword + '\n'); return; } } } else { Git.Trace.WriteLine("error: unable to parse target URL."); } } else { Git.Trace.WriteLine("error: unable to parse supplied URL."); } Git.Trace.WriteLine($"failed to detect {seeking} in target URL."); } Git.Trace.WriteLine("failed to acquire credentials."); }