Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Username error message when using Windows Integrated Authentication #1331

Closed
mrsvk opened this issue Jul 12, 2023 · 0 comments · Fixed by #1332
Closed

Username error message when using Windows Integrated Authentication #1331

mrsvk opened this issue Jul 12, 2023 · 0 comments · Fixed by #1332
Labels
auth-issue An issue authenticating to a host

Comments

@mrsvk
Copy link

mrsvk commented Jul 12, 2023

Version

2.2.1

Operating system

Windows

OS version or distribution

Windows Server 2019

Git hosting provider(s)

Azure DevOps Server (TFS/on-prem)

Other hosting provider

No response

(Azure DevOps only) What format is your remote URL?

None

Can you access the remote repository directly in the browser?

Yes, I can access the repository

Expected behavior

We're using provider = generic and interactive = false with an HTTPS url and Windows Integrated Authentication to an on-premise instance of Azure DevOps Server 2022. This worked without issue using GCM 2.1.2.

Actual behavior

With GCM 2.2.1, git commands generate the following output, but do appear to succeed anyway. Downgrading Git for Windows to switch back to GCM 2.1.2 resolves the issue.

E:\dev\SourceCode> git fetch
fatal: Missing 'username' input argument
fatal: Missing 'username' input argument

Logs

URLs have been sanitized.

E:\dev\SourceCode>git fetch
09:26:25.038018 exec-cmd.c:243          trace: resolved executable dir: C:/Program Files/Git/mingw64/bin
09:26:25.069266 git.c:462               trace: built-in: git fetch
09:26:25.084900 run-command.c:661       trace: run_command: GIT_DIR=.git git remote-https origin https://server.example.com/Project/Software/_git/SourceCode
09:26:25.147396 exec-cmd.c:243          trace: resolved executable dir: C:/Program Files/Git/mingw64/libexec/git-core
09:26:25.147396 git.c:748               trace: exec: git-remote-https origin https://server.example.com/Project/Software/_git/SourceCode
09:26:25.147396 run-command.c:661       trace: run_command: git-remote-https origin https://server.example.com/Project/Software/_git/SourceCode
09:26:25.225524 exec-cmd.c:243          trace: resolved executable dir: C:/Program Files/Git/mingw64/libexec/git-core
09:26:25.350520 run-command.c:661       trace: run_command: 'git credential-manager get'
09:26:25.975523 exec-cmd.c:243          trace: resolved executable dir: C:/Program Files/Git/mingw64/libexec/git-core
09:26:25.975523 git.c:748               trace: exec: git-credential-manager get
09:26:25.975523 run-command.c:661       trace: run_command: git-credential-manager get
09:26:26.350525 exec-cmd.c:243          trace: resolved executable dir: C:/Program Files/Git/mingw64/libexec/git-core
09:26:26.350525 git.c:462               trace: built-in: git config --null --list
09:26:26.428648 ...\Application.cs:106  trace: [RunInternalAsync] Version: 2.2.1.0
09:26:26.428648 ...\Application.cs:107  trace: [RunInternalAsync] Runtime: .NET Framework 4.0.30319.42000
09:26:26.428648 ...\Application.cs:108  trace: [RunInternalAsync] Platform: Windows (x86-64)
09:26:26.428648 ...\Application.cs:109  trace: [RunInternalAsync] OSVersion: 10.0 (build 17763)
09:26:26.428648 ...\Application.cs:110  trace: [RunInternalAsync] AppPath: C:\Program Files\Git\mingw64\bin\git-credential-manager.exe
09:26:26.428648 ...\Application.cs:111  trace: [RunInternalAsync] InstallDir: C:\Program Files\Git\mingw64\bin\
09:26:26.428648 ...\Application.cs:112  trace: [RunInternalAsync] Arguments: get
09:26:26.491144 ...GitCommandBase.cs:32 trace: [ExecuteAsync] Start 'get' command...
09:26:26.506767 ...GitCommandBase.cs:46 trace: [ExecuteAsync] Detecting host provider for input:
09:26:26.522397 ...GitCommandBase.cs:47 trace: [ExecuteAsync]   protocol=https
09:26:26.522397 ...GitCommandBase.cs:47 trace: [ExecuteAsync]   host=server.example.com
09:26:26.522397 ...GitCommandBase.cs:47 trace: [ExecuteAsync]   wwwauth[]=Bearer
09:26:26.522397 ...GitCommandBase.cs:47 trace: [ExecuteAsync]   wwwauth[]=Basic realm="https://server.example.com/"
09:26:26.522397 ...GitCommandBase.cs:47 trace: [ExecuteAsync]   wwwauth[]=Negotiate
09:26:26.522397 ...GitCommandBase.cs:47 trace: [ExecuteAsync]   wwwauth[]=NTLM
09:26:26.522397 ...oviderRegistry.cs:99 trace: [GetProviderAsync] Host provider override was set id='generic'
09:26:26.538020 ...GitCommandBase.cs:49 trace: [ExecuteAsync] Host provider 'Generic' was selected.
09:26:26.538020 ...\HostProvider.cs:126 trace: [GetCredentialAsync] Looking for existing credential in store with service=https://server.example.com account=...
09:26:26.538020 ...\HostProvider.cs:131 trace: [GetCredentialAsync] No existing credentials found.
09:26:26.538020 ...\HostProvider.cs:134 trace: [GetCredentialAsync] Creating new credential...
09:26:26.553645 ...ricOAuthConfig.cs:19 trace: [TryGet] Invalid OAuth configuration - missing/invalid authorize endpoint:
09:26:26.553645 ...icHostProvider.cs:86 trace: [GenerateCredentialAsync] Checking host 'https://server.example.com/' for Windows Integrated Authentication...
09:26:26.553645 ...Authentication.cs:34 trace: [GetIsSupportedAsync] HTTP: HEAD https://server.example.com/
09:26:26.553645 ...pClientFactory.cs:60 trace: [CreateClient] Creating new HTTP client instance...
09:26:26.616145 ...pClientFactory.cs:80 trace: [CreateClient] Git's SSL/TLS backend is: Schannel
09:26:26.694486 exec-cmd.c:243          trace: resolved executable dir: C:/Program Files/Git/mingw64/libexec/git-core
09:26:26.694486 git.c:462               trace: built-in: git version
09:26:26.756773 exec-cmd.c:243          trace: resolved executable dir: C:/Program Files/Git/mingw64/libexec/git-core
09:26:26.772399 git.c:462               trace: built-in: git config --null --type=path http.https://server.example.com.sslCAInfo
09:26:26.834899 exec-cmd.c:243          trace: resolved executable dir: C:/Program Files/Git/mingw64/libexec/git-core
09:26:26.834899 git.c:462               trace: built-in: git config --null --type=path http.server.example.com.sslCAInfo
09:26:26.897402 exec-cmd.c:243          trace: resolved executable dir: C:/Program Files/Git/mingw64/libexec/git-core
09:26:26.913025 git.c:462               trace: built-in: git config --null --type=path http.https://example.com.sslCAInfo
09:26:26.975519 exec-cmd.c:243          trace: resolved executable dir: C:/Program Files/Git/mingw64/libexec/git-core
09:26:26.975519 git.c:462               trace: built-in: git config --null --type=path http.example.com.sslCAInfo
09:26:27.053646 exec-cmd.c:243          trace: resolved executable dir: C:/Program Files/Git/mingw64/libexec/git-core
09:26:27.053646 git.c:462               trace: built-in: git config --null --type=path http.sslCAInfo
09:26:27.131770 exec-cmd.c:243          trace: resolved executable dir: C:/Program Files/Git/mingw64/libexec/git-core
09:26:27.147398 git.c:462               trace: built-in: git config --null --type=path http.https://server.example.com.cookieFile
09:26:27.225522 exec-cmd.c:243          trace: resolved executable dir: C:/Program Files/Git/mingw64/libexec/git-core
09:26:27.225522 git.c:462               trace: built-in: git config --null --type=path http.server.example.com.cookieFile
09:26:27.303651 exec-cmd.c:243          trace: resolved executable dir: C:/Program Files/Git/mingw64/libexec/git-core
09:26:27.303651 git.c:462               trace: built-in: git config --null --type=path http.https://example.com.cookieFile
09:26:27.381771 exec-cmd.c:243          trace: resolved executable dir: C:/Program Files/Git/mingw64/libexec/git-core
09:26:27.381771 git.c:462               trace: built-in: git config --null --type=path http.example.com.cookieFile
09:26:27.459899 exec-cmd.c:243          trace: resolved executable dir: C:/Program Files/Git/mingw64/libexec/git-core
09:26:27.459899 git.c:462               trace: built-in: git config --null --type=path http.cookieFile
09:26:27.584897 ...Authentication.cs:37 trace: [GetIsSupportedAsync] HTTP: Response code ignored.
09:26:27.600518 ...Authentication.cs:39 trace: [GetIsSupportedAsync] Inspecting WWW-Authenticate headers...
09:26:27.600518 ...Authentication.cs:44 trace: [GetIsSupportedAsync] Found WWW-Authenticate header for Negotiate
09:26:27.600518 ...Authentication.cs:49 trace: [GetIsSupportedAsync] Found WWW-Authenticate header for NTLM
09:26:27.600518 ...icHostProvider.cs:95 trace: [GenerateCredentialAsync] Host supports WIA - generating empty credential...
09:26:27.600518 ...\HostProvider.cs:136 trace: [GetCredentialAsync] Credential created.
09:26:27.600518 ...\GetCommand.cs:39    trace: [ExecuteInternalAsync] Writing credentials to output:
09:26:27.600518 ...\GetCommand.cs:40    trace: [ExecuteInternalAsync]   protocol=https
09:26:27.600518 ...\GetCommand.cs:40    trace: [ExecuteInternalAsync]   host=server.example.com
09:26:27.600518 ...\GetCommand.cs:40    trace: [ExecuteInternalAsync]   username=
09:26:27.600518 ...\GetCommand.cs:40    trace: [ExecuteInternalAsync]   password=********
09:26:27.600518 ...GitCommandBase.cs:53 trace: [ExecuteAsync] End 'get' command...
09:26:27.725520 run-command.c:661       trace: run_command: 'git credential-manager store'
09:26:28.084897 exec-cmd.c:243          trace: resolved executable dir: C:/Program Files/Git/mingw64/libexec/git-core
09:26:28.084897 git.c:748               trace: exec: git-credential-manager store
09:26:28.084897 run-command.c:661       trace: run_command: git-credential-manager store
09:26:28.459895 exec-cmd.c:243          trace: resolved executable dir: C:/Program Files/Git/mingw64/libexec/git-core
09:26:28.459895 git.c:462               trace: built-in: git config --null --list
09:26:28.522404 ...\Application.cs:106  trace: [RunInternalAsync] Version: 2.2.1.0
09:26:28.522404 ...\Application.cs:107  trace: [RunInternalAsync] Runtime: .NET Framework 4.0.30319.42000
09:26:28.522404 ...\Application.cs:108  trace: [RunInternalAsync] Platform: Windows (x86-64)
09:26:28.522404 ...\Application.cs:109  trace: [RunInternalAsync] OSVersion: 10.0 (build 17763)
09:26:28.522404 ...\Application.cs:110  trace: [RunInternalAsync] AppPath: C:\Program Files\Git\mingw64\bin\git-credential-manager.exe
09:26:28.538024 ...\Application.cs:111  trace: [RunInternalAsync] InstallDir: C:\Program Files\Git\mingw64\bin\
09:26:28.538024 ...\Application.cs:112  trace: [RunInternalAsync] Arguments: store
09:26:28.600526 ...GitCommandBase.cs:32 trace: [ExecuteAsync] Start 'store' command...
fatal: Missing 'username' input argument
   at GitCredentialManager.Commands.StoreCommand.EnsureMinimumInputArguments(InputArguments input)
   at GitCredentialManager.Commands.GitCommandBase.<ExecuteAsync>d__5.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.CommandLine.Invocation.AnonymousCommandHandler.<InvokeAsync>d__6.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.CommandLine.Invocation.InvocationPipeline.<>c__DisplayClass4_0.<<BuildInvocationChain>b__0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass17_0.<<UseParseErrorReporting>b__0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass15_0.<<AddMiddleware>b__0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass12_0.<<UseHelp>b__0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass22_0.<<UseVersionOption>b__0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass19_0.<<UseTypoCorrections>b__0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c.<<UseSuggestDirective>b__18_0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass16_0.<<UseParseDirective>b__0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c.<<RegisterWithDotnetSuggest>b__5_0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass8_0.<<UseExceptionHandler>b__0>d.MoveNext()
09:26:28.725521 run-command.c:661       trace: run_command: 'git credential-manager store'
09:26:29.116157 exec-cmd.c:243          trace: resolved executable dir: C:/Program Files/Git/mingw64/libexec/git-core
09:26:29.116157 git.c:748               trace: exec: git-credential-manager store
09:26:29.116157 run-command.c:661       trace: run_command: git-credential-manager store
09:26:29.444280 exec-cmd.c:243          trace: resolved executable dir: C:/Program Files/Git/mingw64/libexec/git-core
09:26:29.444280 git.c:462               trace: built-in: git config --null --list
09:26:29.538026 ...\Application.cs:106  trace: [RunInternalAsync] Version: 2.2.1.0
09:26:29.538026 ...\Application.cs:107  trace: [RunInternalAsync] Runtime: .NET Framework 4.0.30319.42000
09:26:29.538026 ...\Application.cs:108  trace: [RunInternalAsync] Platform: Windows (x86-64)
09:26:29.538026 ...\Application.cs:109  trace: [RunInternalAsync] OSVersion: 10.0 (build 17763)
09:26:29.538026 ...\Application.cs:110  trace: [RunInternalAsync] AppPath: C:\Program Files\Git\mingw64\bin\git-credential-manager.exe
09:26:29.538026 ...\Application.cs:111  trace: [RunInternalAsync] InstallDir: C:\Program Files\Git\mingw64\bin\
09:26:29.538026 ...\Application.cs:112  trace: [RunInternalAsync] Arguments: store
09:26:29.600522 ...GitCommandBase.cs:32 trace: [ExecuteAsync] Start 'store' command...
fatal: Missing 'username' input argument
   at GitCredentialManager.Commands.StoreCommand.EnsureMinimumInputArguments(InputArguments input)
   at GitCredentialManager.Commands.GitCommandBase.<ExecuteAsync>d__5.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.CommandLine.Invocation.AnonymousCommandHandler.<InvokeAsync>d__6.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.CommandLine.Invocation.InvocationPipeline.<>c__DisplayClass4_0.<<BuildInvocationChain>b__0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass17_0.<<UseParseErrorReporting>b__0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass15_0.<<AddMiddleware>b__0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass12_0.<<UseHelp>b__0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass22_0.<<UseVersionOption>b__0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass19_0.<<UseTypoCorrections>b__0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c.<<UseSuggestDirective>b__18_0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass16_0.<<UseParseDirective>b__0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c.<<RegisterWithDotnetSuggest>b__5_0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass8_0.<<UseExceptionHandler>b__0>d.MoveNext()
09:26:29.788037 run-command.c:661       trace: run_command: git rev-list --objects --stdin --not --exclude-hidden=fetch --all --quiet --alternate-refs
09:26:30.038024 run-command.c:1529      run_processes_parallel: preparing to run up to 1 tasks
09:26:30.038024 run-command.c:1557      run_processes_parallel: done
09:26:30.038024 run-command.c:661       trace: run_command: git maintenance run --auto --no-quiet
09:26:30.100530 exec-cmd.c:243          trace: resolved executable dir: C:/Program Files/Git/mingw64/libexec/git-core
09:26:30.100530 git.c:462               trace: built-in: git maintenance run --auto --no-quiet
@mrsvk mrsvk added the auth-issue An issue authenticating to a host label Jul 12, 2023
mjcheetham added a commit that referenced this issue Jul 12, 2023
Before 2.2.0, we only accepted input arguments in the form `key=value`.
To support the new `wwwauth[]` argument from Git, we added support for
these multi-value args `key[]=value`.

In changing from an dictionary of `string:string` to
`string:list<string>` we accidentally changed the behaviour of
dictionary parsing in the case that an empty valued (non-multi) argument
was provided. For example:

```text
username=\n
```

Previously this was returned as an empty string. Post 2.2.0 this became
`null`, causing an error in scenarios were before there was none.

One such scenario is with Windows Integrated Authentication (for example
when connecting to Azure DevOps Server/TFS instances), whereby we return
an empty username and password to Git to signal this auth mode. Git then
returns to us the empty username and password in a `store` call.

Update the handling in `ParseMultiLine` to restore the previous
behaviour for empty-valued arguments being mapped to the empty string.

Fixes #1331

---

**Bug reproduction steps:**

```console
% printf "url=https://example.com\nusername=\npassword=\n\n" | git credential approve
fatal: Missing 'username' input argument
```
mjcheetham added a commit that referenced this issue Jul 12, 2023
**Changes since 2.2.1:**

- Fix an issue where duplicate "Personal Access Token" GitHub account
options are shown when Visual Studio has a GitHub account signed-in
(#1325 #1328)
- Fix an issue with Azure DevOps Server (TFS) and Windows Integrated
Authentication (#1331 #1332)
- Fix an issue with OAuth redirects GitHub Enterprise Server (#1329
#1330)
- Correctly handle non-ASCII username/passwords with the WPF UI helpers
(#1287 #1326)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
auth-issue An issue authenticating to a host
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant