On Sat, Jul 06, 2019 at 10:51:32PM -0700, Masaya Suzuki wrote: > The credentials API calls credentials helpers in order. If a > username/password pair is returned the helpers and if it's used for > authentication successfully, it's announced to the helpers and they can > store it for later use. > > Some credentials are valid only for the limited time and should not be > cached. In this case, because the credential is announced to all helpers > and they can independently decide whether they will cache it or not, > those short-lived credentials can be cached. > > This change adds an option that a credential helper can specify that the > credential returned by the helper should not be cached. If this is > specified, even after the credential is used successfully, it won't be > announced to other helpers for store. I think this makes sense to do, though note that there's an old discussion which covers some alternatives: https://public-inbox.org/git/20120407033417.GA13914@xxxxxxxxxxxxxxxxxxxxx/ In that patch, I essentially proposed making all gathered credentials as nocache. That's a more secure default (though in some cases less convenient). It did break a case Shawn had of caching the result of another helper. I showed some options there for providing a mechanism to chain helpers together explicitly. We also discussed helpers passing out an explicit ttl. That's a more general case of your nocache flag (i.e., ttl=0 covers that case, but we could additionally pass "ttl" to the cache helper to let it be smarter). Given the age of that discussion and the fact that nobody has really complained much in the interim, I'm OK to go with your much simpler approach. But I think it's worth at least thinking for a few minutes on whether there's anything to pull from that discussion. :) (As a side note, I've had all those patches on my "to revisit and send upstream" queue for 7 years; if we take yours, maybe I can finally let them go. ;) ). > Documentation/technical/api-credentials.txt | 4 +++- > credential.c | 4 +++- > credential.h | 3 ++- > t/t0300-credentials.sh | 9 +++++++++ > 4 files changed, 17 insertions(+), 3 deletions(-) The patch itself looks good; two minor comments: > @@ -296,7 +298,7 @@ void credential_approve(struct credential *c) > { > int i; > > - if (c->approved) > + if (c->approved || c->no_cache) > return; > if (!c->username || !c->password) > return; Here we're disallowing a "nocache" credential from being passed to _any_ helper, whether it's caching or not. It could be storing permanently, though perhaps that's semantic nitpicking (if it's not to be cached, it probably shouldn't be stored permanently either). Other helpers could in theory be doing something else with the data, though in practice I doubt here are any uses beyond debugging. I dunno. I started writing that paragraph to suggest calling it "nostore" or something, but I think that is really no better than "nocache". If we did have a ttl, I'd expect to see a check for "ttl=0" here, but then otherwise pass the ttl along to the helper (and a matching change in credential-cache to use the minimum of the credential-specific ttl or the global-configured one). > diff --git a/t/t0300-credentials.sh b/t/t0300-credentials.sh > index 82eaaea0f4..ad06f6fe11 100755 > --- a/t/t0300-credentials.sh > +++ b/t/t0300-credentials.sh > @@ -118,6 +118,15 @@ test_expect_success 'do not bother storing password-less credential' ' > EOF > ' > > +test_expect_success 'credential_approve does not call helpers for nocache' ' > + check approve useless <<-\EOF > + username=foo > + password=bar > + nocache=1 > + -- > + -- > + EOF > +' At first I thought this test was doing nothing, since we don't generally expect a helper to produce output for an "approve" request (and there are cases in lib-credential.sh that rely on that). But the "useless" helper is intentionally chatty, so it produces output for all requests, and this would fail without your patch. Good. The cases in lib-credential also omit the "--" for empty sections, but I see the similar "do not bother..." test above includes them. It shouldn't matter either way. So I think this looks good. -Peff