mirror of
https://github.com/git/git
synced 2024-08-27 11:39:22 +00:00
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 <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
3fc3ee7332
commit
1e481b38ac
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -33,6 +33,7 @@
|
||||||
/git-credential-cache
|
/git-credential-cache
|
||||||
/git-credential-cache--daemon
|
/git-credential-cache--daemon
|
||||||
/git-credential-store
|
/git-credential-store
|
||||||
|
/git-credential-getpass
|
||||||
/git-cvsexportcommit
|
/git-cvsexportcommit
|
||||||
/git-cvsimport
|
/git-cvsimport
|
||||||
/git-cvsserver
|
/git-cvsserver
|
||||||
|
|
58
Documentation/git-credential-getpass.txt
Normal file
58
Documentation/git-credential-getpass.txt
Normal file
|
@ -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
|
1
Makefile
1
Makefile
|
@ -423,6 +423,7 @@ PROGRAM_OBJS += sh-i18n--envsubst.o
|
||||||
PROGRAM_OBJS += credential-cache.o
|
PROGRAM_OBJS += credential-cache.o
|
||||||
PROGRAM_OBJS += credential-cache--daemon.o
|
PROGRAM_OBJS += credential-cache--daemon.o
|
||||||
PROGRAM_OBJS += credential-store.o
|
PROGRAM_OBJS += credential-store.o
|
||||||
|
PROGRAM_OBJS += credential-getpass.o
|
||||||
|
|
||||||
PROGRAMS += $(patsubst %.o,git-%$X,$(PROGRAM_OBJS))
|
PROGRAMS += $(patsubst %.o,git-%$X,$(PROGRAM_OBJS))
|
||||||
|
|
||||||
|
|
37
credential-getpass.c
Normal file
37
credential-getpass.c
Normal file
|
@ -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;
|
||||||
|
}
|
Loading…
Reference in a new issue