86362f7205
Credential helpers are asked in turn until one of them give positive response, which is cumbersome to turn off when you need to run Git in an automated setting. The credential helper interface learned to allow a helper to say "stop, don't ask other helpers." Also GIT_TERMINAL_PROMPT environment can be set to false to disable our built-in prompt mechanism for passwords. * jk/credential-quit: prompt: respect GIT_TERMINAL_PROMPT to disable terminal prompts credential: let helpers tell us to quit
81 lines
1.5 KiB
C
81 lines
1.5 KiB
C
#include "cache.h"
|
|
#include "run-command.h"
|
|
#include "strbuf.h"
|
|
#include "prompt.h"
|
|
#include "compat/terminal.h"
|
|
|
|
static char *do_askpass(const char *cmd, const char *prompt)
|
|
{
|
|
struct child_process pass = CHILD_PROCESS_INIT;
|
|
const char *args[3];
|
|
static struct strbuf buffer = STRBUF_INIT;
|
|
int err = 0;
|
|
|
|
args[0] = cmd;
|
|
args[1] = prompt;
|
|
args[2] = NULL;
|
|
|
|
pass.argv = args;
|
|
pass.out = -1;
|
|
|
|
if (start_command(&pass))
|
|
return NULL;
|
|
|
|
strbuf_reset(&buffer);
|
|
if (strbuf_read(&buffer, pass.out, 20) < 0)
|
|
err = 1;
|
|
|
|
close(pass.out);
|
|
|
|
if (finish_command(&pass))
|
|
err = 1;
|
|
|
|
if (err) {
|
|
error("unable to read askpass response from '%s'", cmd);
|
|
strbuf_release(&buffer);
|
|
return NULL;
|
|
}
|
|
|
|
strbuf_setlen(&buffer, strcspn(buffer.buf, "\r\n"));
|
|
|
|
return buffer.buf;
|
|
}
|
|
|
|
char *git_prompt(const char *prompt, int flags)
|
|
{
|
|
char *r = NULL;
|
|
|
|
if (flags & PROMPT_ASKPASS) {
|
|
const char *askpass;
|
|
|
|
askpass = getenv("GIT_ASKPASS");
|
|
if (!askpass)
|
|
askpass = askpass_program;
|
|
if (!askpass)
|
|
askpass = getenv("SSH_ASKPASS");
|
|
if (askpass && *askpass)
|
|
r = do_askpass(askpass, prompt);
|
|
}
|
|
|
|
if (!r) {
|
|
const char *err;
|
|
|
|
if (git_env_bool("GIT_TERMINAL_PROMPT", 1)) {
|
|
r = git_terminal_prompt(prompt, flags & PROMPT_ECHO);
|
|
err = strerror(errno);
|
|
} else {
|
|
err = "terminal prompts disabled";
|
|
}
|
|
if (!r) {
|
|
/* prompts already contain ": " at the end */
|
|
die("could not read %s%s", prompt, err);
|
|
}
|
|
}
|
|
return r;
|
|
}
|
|
|
|
char *git_getpass(const char *prompt)
|
|
{
|
|
return git_prompt(prompt, PROMPT_ASKPASS);
|
|
}
|