From 1e481b38ac77c9ab32a54bd419d0e60e6d5ee5d1 Mon Sep 17 00:00:00 2001 From: Jeff King Date: Mon, 18 Jul 2011 03:58:59 -0400 Subject: [PATCH] credentials: add "getpass" helper This just does the normal "ask on the terminal, or use GIT_ASKPASS" logic that we already do. But it's useful for writers of third-party helpers. See the documentation for an example. Signed-off-by: Jeff King Signed-off-by: Junio C Hamano --- .gitignore | 1 + Documentation/git-credential-getpass.txt | 58 ++++++++++++++++++++++++ Makefile | 1 + credential-getpass.c | 37 +++++++++++++++ 4 files changed, 97 insertions(+) create mode 100644 Documentation/git-credential-getpass.txt create mode 100644 credential-getpass.c diff --git a/.gitignore b/.gitignore index 2b7a3f9876..a26ad005ff 100644 --- a/.gitignore +++ b/.gitignore @@ -33,6 +33,7 @@ /git-credential-cache /git-credential-cache--daemon /git-credential-store +/git-credential-getpass /git-cvsexportcommit /git-cvsimport /git-cvsserver diff --git a/Documentation/git-credential-getpass.txt b/Documentation/git-credential-getpass.txt new file mode 100644 index 0000000000..a37c7a2f97 --- /dev/null +++ b/Documentation/git-credential-getpass.txt @@ -0,0 +1,58 @@ +git-credential-getpass(1) +========================= + +NAME +---- +git-credential-getpass - helper to request credentials from a user + +SYNOPSIS +-------- +[verse] +git credential-getpass + +DESCRIPTION +----------- + +This command requests credentials from the user using git's "default" +scheme, including asking via the terminal and respecting the +`GIT_ASKPASS` environment variable; see linkgit:gitcredentials[7] for a +complete description. The helpers are provided on stdout using git's +credential helper protocol. + +There is no point in using this program as a credential helper by +itself; it is exactly equivalent to git's behavior when no helper is +configured. + +However, writers of third-party helpers may want to invoke this program +to simulate git's behavior. + +EXAMPLES +-------- + +Here's a simple, silly example of a helper that stores credentials on +disk (similar to linkgit:git-credential-store[1]), and how it could use +the `getpass` helper. + +------------------------------------------- +#!/bin/sh + +STORAGE=$HOME/.credentials + +for i in "$@"; do + case "$i" in + --unique=*) + unique=${i#--unique=} ;; + esac +done + +if ! test -e "$STORAGE/$unique"; then + mkdir -m 0700 "$STORAGE" + git credential-getpass "$@" >"$STORAGE/$unique" +fi + +cat "$STORAGE/$unique" +------------------------------------------- + +GIT +--- +Part of the linkgit:git[1] suite diff --git a/Makefile b/Makefile index 22e2afc946..1af45895b2 100644 --- a/Makefile +++ b/Makefile @@ -423,6 +423,7 @@ PROGRAM_OBJS += sh-i18n--envsubst.o PROGRAM_OBJS += credential-cache.o PROGRAM_OBJS += credential-cache--daemon.o PROGRAM_OBJS += credential-store.o +PROGRAM_OBJS += credential-getpass.o PROGRAMS += $(patsubst %.o,git-%$X,$(PROGRAM_OBJS)) diff --git a/credential-getpass.c b/credential-getpass.c new file mode 100644 index 0000000000..6bfb8f8c72 --- /dev/null +++ b/credential-getpass.c @@ -0,0 +1,37 @@ +#include "cache.h" +#include "credential.h" +#include "parse-options.h" +#include "string-list.h" + +int main(int argc, const char **argv) +{ + const char * const usage[] = { + "git credential-getpass [options]", + NULL + }; + struct credential c = { NULL }; + int reject = 0; + struct option options[] = { + OPT_BOOLEAN(0, "reject", &reject, + "reject a stored credential"), + OPT_STRING(0, "username", &c.username, "name", + "an existing username"), + OPT_STRING(0, "description", &c.description, "desc", + "human-readable description of the credential"), + OPT_STRING(0, "unique", &c.unique, "token", + "a unique context for the credential"), + OPT_END() + }; + + argc = parse_options(argc, argv, NULL, options, usage, 0); + if (argc) + usage_with_options(usage, options); + + if (reject) + return 0; + + credential_getpass(&c); + printf("username=%s\n", c.username); + printf("password=%s\n", c.password); + return 0; +}