mirror of
https://github.com/git/git.git
synced 2026-03-14 10:53:25 +01:00
allow the user to configure credential helpers
The functionality for helpers is already there; we just need to give the users a way to turn it on. The new functionality is enabled whenever a caller of the credentials API passes a NULL method list. This will enable it for all current callers (i.e., the http code). Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
20a93d32fa
commit
00b1daa2c1
@@ -25,8 +25,9 @@ Data Structures
|
||||
The credential functions take a `string_list` of methods for
|
||||
acquiring credentials. Each string specifies an external
|
||||
helper which will be run, in order, to acquire credentials,
|
||||
until both a username and password have been acquired. A NULL or
|
||||
empty methods list indicates that the internal
|
||||
until both a username and password have been acquired. A NULL
|
||||
parameter means to use the default list (as configured by
|
||||
`credential.helper`); an empty list indicates that the internal
|
||||
`credential_getpass` function should be used.
|
||||
|
||||
|
||||
|
||||
4
config.c
4
config.c
@@ -9,6 +9,7 @@
|
||||
#include "exec_cmd.h"
|
||||
#include "strbuf.h"
|
||||
#include "quote.h"
|
||||
#include "credential.h"
|
||||
|
||||
#define MAXNAME (256)
|
||||
|
||||
@@ -791,6 +792,9 @@ int git_default_config(const char *var, const char *value, void *dummy)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!prefixcmp(var, "credential."))
|
||||
return git_default_credential_config(var, value);
|
||||
|
||||
/* Add other config variables here and to Documentation/config.txt. */
|
||||
return 0;
|
||||
}
|
||||
|
||||
31
credential.c
31
credential.c
@@ -4,6 +4,8 @@
|
||||
#include "string-list.h"
|
||||
#include "run-command.h"
|
||||
|
||||
static struct string_list default_methods;
|
||||
|
||||
static int credential_config_callback(const char *var, const char *value,
|
||||
void *data)
|
||||
{
|
||||
@@ -173,15 +175,18 @@ void credential_fill(struct credential *c, const struct string_list *methods)
|
||||
{
|
||||
struct strbuf err = STRBUF_INIT;
|
||||
|
||||
if (!methods)
|
||||
methods = &default_methods;
|
||||
|
||||
if (!credential_fill_gently(c, methods))
|
||||
return;
|
||||
|
||||
strbuf_addstr(&err, "unable to get credentials");
|
||||
if (c->description)
|
||||
strbuf_addf(&err, "for '%s'", c->description);
|
||||
if (methods && methods->nr == 1)
|
||||
if (methods->nr == 1)
|
||||
strbuf_addf(&err, "; tried '%s'", methods->items[0].string);
|
||||
else if (methods) {
|
||||
else {
|
||||
int i;
|
||||
strbuf_addstr(&err, "; tried:");
|
||||
for (i = 0; i < methods->nr; i++)
|
||||
@@ -198,7 +203,10 @@ int credential_fill_gently(struct credential *c,
|
||||
if (c->username && c->password)
|
||||
return 0;
|
||||
|
||||
if (!methods || !methods->nr)
|
||||
if (!methods)
|
||||
methods = &default_methods;
|
||||
|
||||
if (!methods->nr)
|
||||
return credential_getpass(c);
|
||||
|
||||
for (i = 0; i < methods->nr; i++) {
|
||||
@@ -214,7 +222,10 @@ void credential_reject(struct credential *c, const struct string_list *methods)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (methods && c->username) {
|
||||
if (!methods)
|
||||
methods = &default_methods;
|
||||
|
||||
if (c->username) {
|
||||
for (i = 0; i < methods->nr; i++) {
|
||||
/* ignore errors, there's nothing we can do */
|
||||
credential_do(c, methods->items[i].string, "--reject");
|
||||
@@ -226,3 +237,15 @@ void credential_reject(struct credential *c, const struct string_list *methods)
|
||||
free(c->password);
|
||||
c->password = NULL;
|
||||
}
|
||||
|
||||
int git_default_credential_config(const char *var, const char *value)
|
||||
{
|
||||
if (!strcmp(var, "credential.helper")) {
|
||||
if (!value)
|
||||
return config_error_nonbool(var);
|
||||
string_list_append(&default_methods, xstrdup(value));
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -17,4 +17,6 @@ int credential_fill_gently(struct credential *, const struct string_list *method
|
||||
void credential_fill(struct credential *, const struct string_list *methods);
|
||||
void credential_reject(struct credential *, const struct string_list *methods);
|
||||
|
||||
int git_default_credential_config(const char *var, const char *value);
|
||||
|
||||
#endif /* CREDENTIAL_H */
|
||||
|
||||
@@ -93,6 +93,19 @@ test_expect_success 'http auth can pull user from config' '
|
||||
test_cmp askpass-expect-pass askpass-query
|
||||
'
|
||||
|
||||
test_expect_success 'http auth respects credential helpers' '
|
||||
cat >credential-helper <<-\EOF &&
|
||||
#!/bin/sh
|
||||
echo username=user@host
|
||||
echo password=user@host
|
||||
EOF
|
||||
chmod +x credential-helper &&
|
||||
git config --global credential.helper "\"$PWD/credential-helper\"" &&
|
||||
>askpass-query &&
|
||||
git clone "$HTTPD_URL/auth/repo.git" clone-auth-helper &&
|
||||
test_cmp askpass-expect-none askpass-query
|
||||
'
|
||||
|
||||
test_expect_success 'fetch changes via http' '
|
||||
echo content >>file &&
|
||||
git commit -a -m two &&
|
||||
|
||||
Reference in New Issue
Block a user