git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: credentials are being erased from credential manager via git credential-wincred erase command

From
Jeff King <peff@peff.net>
Date
Apr 13, 2016, 22:00 UTC
Message-ID
<20160413220054.GB8712@sigill.intra.peff.net>
In-Reply-To
<CAGyf7-FJcJyP_CdRZLO7Eh6DoWp8XRU2CNczCdaYJO_MS6rnmw@mail.gmail.com>
On Wed, Apr 13, 2016 at 01:12:06PM -0600, Bryan Turner wrote:
Show 7 quoted lines
> From the credentials code in Git (which I could be mis-reading; I'm
> sure others on the list will correct me if I'm wrong), it appears the
> erase is done after a cached credential is rejected by the server.
> That implies that, periodically, authentication with your Stash server
> is failing and that that failed authentication results in Git clearing
> the "bad" credential. That's likely why you see this happen on
> seemingly random builds.

Yes, that's right. For HTTP, Git will erase the credential only for an HTTP 401 (or a 407 for the proxy credential). So an intermittent failure shouldn't cause us to erase the credential there.

But it's possible that a server whose credentials are backed by something more complicated than a password file (e.g., LDAP or something) may return a 401 intermittently when the backend process fails (e.g., connection to the LDAP server fails). And I agree with your second paragraph (that I snipped) that finding the intermittent failure is the best first step.

We could potentially teach Git _not_ to erase credentials in such a case (with a config option). But the downside would be that the user would then have to manually erase and re-populate the credentials if they do change.

IMHO, that responsibility really lies with the credential helpers themselves. Helpers like git-credential-wincred are meant to transparently cache and update credentials. I think for an automated process like this, what the user really wants is more like "I'll stick some credentials in a secure place, and I want Git _only_ to access them, never update them".

You can hack together something like that today with:
  git config credential.helper '!f() {
    case "$1" in
      get|store) git credential-wincred "$@" ;;
    esac
  }; f'
and then you can populate it with:
  echo url=https://example.com |
  git credential fill |
  git credential approve

The "fill" will prompt you and generate the proper response to feed to "approve", which will actually store it in your helper of choice. Or you can just do a "fetch" from the repository in question, and it will happen automatically.

If this pattern is something a lot of people want to use, I think we could wrap that shell snippet into a "git credential-static" or something that chained to another helper, and you'd configure it like:

  git config credential.helper 'static wincred'
or something.
-Peff
Previous: Bryan Turner
Message 3 of 3 in “credentials are being erased from credential manager via git credential-wincred erase command”
  1. O'Connell, KenApr 13, 2016
  2. Bryan TurnerApr 13, 2016
  3. Jeff KingApr 13, 2016

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.