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. Signed-off-by: Masaya Suzuki <masayasuzuki@xxxxxxxxxx> --- Documentation/technical/api-credentials.txt | 4 +++- credential.c | 4 +++- credential.h | 3 ++- t/t0300-credentials.sh | 9 +++++++++ 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/Documentation/technical/api-credentials.txt b/Documentation/technical/api-credentials.txt index 75368f26ca..3db5841b40 100644 --- a/Documentation/technical/api-credentials.txt +++ b/Documentation/technical/api-credentials.txt @@ -251,7 +251,9 @@ even no values at all if it has nothing useful to provide. Any provided attributes will overwrite those already known about by Git. If a helper outputs a `quit` attribute with a value of `true` or `1`, no further helpers will be consulted, nor will the user be prompted (if no -credential has been provided, the operation will then fail). +credential has been provided, the operation will then fail). If a helper outputs +a `nocache` attribute with a value of `true` or `1`, `credential_approve` will +not be called even after the credential is used for authentication sucessfully. For a `store` or `erase` operation, the helper's output is ignored. If it fails to perform the requested operation, it may complain to diff --git a/credential.c b/credential.c index 62be651b03..db7b351447 100644 --- a/credential.c +++ b/credential.c @@ -179,6 +179,8 @@ int credential_read(struct credential *c, FILE *fp) credential_from_url(c, value); } else if (!strcmp(key, "quit")) { c->quit = !!git_config_bool("quit", value); + } else if (!strcmp(key, "nocache")) { + c->no_cache= !!git_config_bool("nocache", value); } /* * Ignore other lines; we don't know what they mean, but @@ -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; diff --git a/credential.h b/credential.h index 6b0cd16be2..be0f35d841 100644 --- a/credential.h +++ b/credential.h @@ -8,7 +8,8 @@ struct credential { unsigned approved:1, configured:1, quit:1, - use_http_path:1; + use_http_path:1, + no_cache:1; char *username; char *password; 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 +' test_expect_success 'credential_reject calls all helpers' ' check reject useless "verbatim one two" <<-\EOF -- 2.22.0.410.gd8fdbe21b5-goog