public static bool AuthCodePrompt(Program program, TargetUri targetUri, Github.GitHubAuthenticationResultType resultType, string username, out string authenticationCode) { // ReadConsole 32768 fail, 32767 ok @linquize [https://github.com/Microsoft/Git-Credential-Manager-for-Windows/commit/a62b9a19f430d038dcd85a610d97e5f763980f85] const int BufferReadSize = 16 * 1024; Debug.Assert(targetUri != null); StringBuilder buffer = new StringBuilder(BufferReadSize); uint read = 0; uint written = 0; authenticationCode = null; NativeMethods.FileAccess fileAccessFlags = NativeMethods.FileAccess.GenericRead | NativeMethods.FileAccess.GenericWrite; NativeMethods.FileAttributes fileAttributes = NativeMethods.FileAttributes.Normal; NativeMethods.FileCreationDisposition fileCreationDisposition = NativeMethods.FileCreationDisposition.OpenExisting; NativeMethods.FileShare fileShareFlags = NativeMethods.FileShare.Read | NativeMethods.FileShare.Write; using (SafeFileHandle stdout = NativeMethods.CreateFile(NativeMethods.ConsoleOutName, fileAccessFlags, fileShareFlags, IntPtr.Zero, fileCreationDisposition, fileAttributes, IntPtr.Zero)) using (SafeFileHandle stdin = NativeMethods.CreateFile(NativeMethods.ConsoleInName, fileAccessFlags, fileShareFlags, IntPtr.Zero, fileCreationDisposition, fileAttributes, IntPtr.Zero)) { string type = resultType == Github.GitHubAuthenticationResultType.TwoFactorApp ? "app" : "sms"; Git.Trace.WriteLine($"2fa type = '{type}'."); buffer.AppendLine() .Append("authcode (") .Append(type) .Append("): "); if (!NativeMethods.WriteConsole(stdout, buffer, (uint)buffer.Length, out written, IntPtr.Zero)) { int error = Marshal.GetLastWin32Error(); throw new Win32Exception(error, "Unable to write to standard output (" + NativeMethods.Win32Error.GetText(error) + ")."); } buffer.Clear(); // read input from the user if (!NativeMethods.ReadConsole(stdin, buffer, BufferReadSize, out read, IntPtr.Zero)) { int error = Marshal.GetLastWin32Error(); throw new Win32Exception(error, "Unable to read from standard input (" + NativeMethods.Win32Error.GetText(error) + ")."); } authenticationCode = buffer.ToString(0, (int)read); authenticationCode = authenticationCode.Trim(Program.NewLineChars); } return(authenticationCode != null); }
internal bool GitHubAuthCodePrompt(TargetUri targetUri, Github.GitHubAuthenticationResultType resultType, string username, out string authenticationCode) => _gitHubAuthCodePrompt(this, targetUri, resultType, username, out authenticationCode);
public static bool AuthCodePrompt(Program program, TargetUri targetUri, Github.GitHubAuthenticationResultType resultType, string username, out string authenticationCode) { // ReadConsole 32768 fail, 32767 ok @linquize [https://github.com/Microsoft/Git-Credential-Manager-for-Windows/commit/a62b9a19f430d038dcd85a610d97e5f763980f85] const int BufferReadSize = 16 * 1024; if (program is null) { throw new ArgumentNullException(nameof(program)); } if (targetUri is null) { throw new ArgumentNullException(nameof(targetUri)); } var trace = program.Trace; StringBuilder buffer = new StringBuilder(BufferReadSize); uint read = 0; uint written = 0; authenticationCode = null; var fileAccessFlags = FileAccess.GenericRead | FileAccess.GenericWrite; var fileAttributes = FileAttributes.Normal; var fileCreationDisposition = FileCreationDisposition.OpenExisting; var fileShareFlags = FileShare.Read | FileShare.Write; using (SafeFileHandle stdout = CreateFile(fileName: ConsoleOutName, desiredAccess: fileAccessFlags, shareMode: fileShareFlags, securityAttributes: IntPtr.Zero, creationDisposition: fileCreationDisposition, flagsAndAttributes: fileAttributes, templateFile: IntPtr.Zero)) using (SafeFileHandle stdin = CreateFile(fileName: ConsoleInName, desiredAccess: fileAccessFlags, shareMode: fileShareFlags, securityAttributes: IntPtr.Zero, creationDisposition: fileCreationDisposition, flagsAndAttributes: fileAttributes, templateFile: IntPtr.Zero)) { string type = resultType == Github.GitHubAuthenticationResultType.TwoFactorApp ? "app" : "sms"; trace.WriteLine($"2fa type = '{type}'."); buffer.AppendLine() .Append("authcode (") .Append(type) .Append("): "); if (!WriteConsole(buffer: buffer, consoleOutputHandle: stdout, numberOfCharsToWrite: (uint)buffer.Length, numberOfCharsWritten: out written, reserved: IntPtr.Zero)) { int error = Marshal.GetLastWin32Error(); throw new Win32Exception(error, "Unable to write to standard output (" + NativeMethods.Win32Error.GetText(error) + ")."); } buffer.Clear(); // read input from the user if (!ReadConsole(buffer: buffer, consoleInputHandle: stdin, numberOfCharsToRead: BufferReadSize, numberOfCharsRead: out read, reserved: IntPtr.Zero)) { int error = Marshal.GetLastWin32Error(); throw new Win32Exception(error, "Unable to read from standard input (" + Win32Error.GetText(error) + ")."); } authenticationCode = buffer.ToString(0, (int)read); authenticationCode = authenticationCode.Trim(program.NewLineChars); } return(authenticationCode != null); }