mirror of
https://github.com/git-for-windows/git.git
synced 2025-12-15 12:58:18 -06:00
Merge branch 'mingit-2.45.x-releases'
Synchronize with Git for Windows' v2.45.x release train. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
This commit is contained in:
commit
61df50cc51
@ -524,6 +524,8 @@ include::config/sequencer.txt[]
|
||||
|
||||
include::config/showbranch.txt[]
|
||||
|
||||
include::config/sideband.txt[]
|
||||
|
||||
include::config/sparse.txt[]
|
||||
|
||||
include::config/splitindex.txt[]
|
||||
|
||||
@ -14,6 +14,17 @@ credential.useHttpPath::
|
||||
or https URL to be important. Defaults to false. See
|
||||
linkgit:gitcredentials[7] for more information.
|
||||
|
||||
credential.sanitizePrompt::
|
||||
By default, user names and hosts that are shown as part of the
|
||||
password prompt are not allowed to contain control characters (they
|
||||
will be URL-encoded by default). Configure this setting to `false` to
|
||||
override that behavior.
|
||||
|
||||
credential.protectProtocol::
|
||||
By default, Carriage Return characters are not allowed in the protocol
|
||||
that is used when Git talks to a credential helper. This setting allows
|
||||
users to override this default.
|
||||
|
||||
credential.username::
|
||||
If no username is set for a network authentication, use this username
|
||||
by default. See credential.<context>.* below, and
|
||||
|
||||
16
Documentation/config/sideband.txt
Normal file
16
Documentation/config/sideband.txt
Normal file
@ -0,0 +1,16 @@
|
||||
sideband.allowControlCharacters::
|
||||
By default, control characters that are delivered via the sideband
|
||||
are masked, except ANSI color sequences. This prevents potentially
|
||||
unwanted ANSI escape sequences from being sent to the terminal. Use
|
||||
this config setting to override this behavior:
|
||||
+
|
||||
--
|
||||
color::
|
||||
Allow ANSI color sequences, line feeds and horizontal tabs,
|
||||
but mask all other control characters. This is the default.
|
||||
false::
|
||||
Mask all control characters other than line feeds and
|
||||
horizontal tabs.
|
||||
true::
|
||||
Allow all control characters to be sent to the terminal.
|
||||
--
|
||||
49
credential.c
49
credential.c
@ -125,6 +125,10 @@ static int credential_config_callback(const char *var, const char *value,
|
||||
}
|
||||
else if (!strcmp(key, "usehttppath"))
|
||||
c->use_http_path = git_config_bool(var, value);
|
||||
else if (!strcmp(key, "sanitizeprompt"))
|
||||
c->sanitize_prompt = git_config_bool(var, value);
|
||||
else if (!strcmp(key, "protectprotocol"))
|
||||
c->protect_protocol = git_config_bool(var, value);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -222,7 +226,8 @@ static void credential_format(struct credential *c, struct strbuf *out)
|
||||
strbuf_addch(out, '@');
|
||||
}
|
||||
if (c->host)
|
||||
strbuf_addstr(out, c->host);
|
||||
strbuf_add_percentencode(out, c->host,
|
||||
STRBUF_ENCODE_HOST_AND_PORT);
|
||||
if (c->path) {
|
||||
strbuf_addch(out, '/');
|
||||
strbuf_add_percentencode(out, c->path, 0);
|
||||
@ -236,7 +241,10 @@ static char *credential_ask_one(const char *what, struct credential *c,
|
||||
struct strbuf prompt = STRBUF_INIT;
|
||||
char *r;
|
||||
|
||||
credential_describe(c, &desc);
|
||||
if (c->sanitize_prompt)
|
||||
credential_format(c, &desc);
|
||||
else
|
||||
credential_describe(c, &desc);
|
||||
if (desc.len)
|
||||
strbuf_addf(&prompt, "%s for '%s': ", what, desc.buf);
|
||||
else
|
||||
@ -355,7 +363,8 @@ int credential_read(struct credential *c, FILE *fp,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void credential_write_item(FILE *fp, const char *key, const char *value,
|
||||
static void credential_write_item(const struct credential *c,
|
||||
FILE *fp, const char *key, const char *value,
|
||||
int required)
|
||||
{
|
||||
if (!value && required)
|
||||
@ -364,6 +373,10 @@ static void credential_write_item(FILE *fp, const char *key, const char *value,
|
||||
return;
|
||||
if (strchr(value, '\n'))
|
||||
die("credential value for %s contains newline", key);
|
||||
if (c->protect_protocol && strchr(value, '\r'))
|
||||
die("credential value for %s contains carriage return\n"
|
||||
"If this is intended, set `credential.protectProtocol=false`",
|
||||
key);
|
||||
fprintf(fp, "%s=%s\n", key, value);
|
||||
}
|
||||
|
||||
@ -371,34 +384,34 @@ void credential_write(const struct credential *c, FILE *fp,
|
||||
enum credential_op_type op_type)
|
||||
{
|
||||
if (credential_has_capability(&c->capa_authtype, op_type))
|
||||
credential_write_item(fp, "capability[]", "authtype", 0);
|
||||
credential_write_item(c, fp, "capability[]", "authtype", 0);
|
||||
if (credential_has_capability(&c->capa_state, op_type))
|
||||
credential_write_item(fp, "capability[]", "state", 0);
|
||||
credential_write_item(c, fp, "capability[]", "state", 0);
|
||||
|
||||
if (credential_has_capability(&c->capa_authtype, op_type)) {
|
||||
credential_write_item(fp, "authtype", c->authtype, 0);
|
||||
credential_write_item(fp, "credential", c->credential, 0);
|
||||
credential_write_item(c, fp, "authtype", c->authtype, 0);
|
||||
credential_write_item(c, fp, "credential", c->credential, 0);
|
||||
if (c->ephemeral)
|
||||
credential_write_item(fp, "ephemeral", "1", 0);
|
||||
credential_write_item(c, fp, "ephemeral", "1", 0);
|
||||
}
|
||||
credential_write_item(fp, "protocol", c->protocol, 1);
|
||||
credential_write_item(fp, "host", c->host, 1);
|
||||
credential_write_item(fp, "path", c->path, 0);
|
||||
credential_write_item(fp, "username", c->username, 0);
|
||||
credential_write_item(fp, "password", c->password, 0);
|
||||
credential_write_item(fp, "oauth_refresh_token", c->oauth_refresh_token, 0);
|
||||
credential_write_item(c, fp, "protocol", c->protocol, 1);
|
||||
credential_write_item(c, fp, "host", c->host, 1);
|
||||
credential_write_item(c, fp, "path", c->path, 0);
|
||||
credential_write_item(c, fp, "username", c->username, 0);
|
||||
credential_write_item(c, fp, "password", c->password, 0);
|
||||
credential_write_item(c, fp, "oauth_refresh_token", c->oauth_refresh_token, 0);
|
||||
if (c->password_expiry_utc != TIME_MAX) {
|
||||
char *s = xstrfmt("%"PRItime, c->password_expiry_utc);
|
||||
credential_write_item(fp, "password_expiry_utc", s, 0);
|
||||
credential_write_item(c, fp, "password_expiry_utc", s, 0);
|
||||
free(s);
|
||||
}
|
||||
for (size_t i = 0; i < c->wwwauth_headers.nr; i++)
|
||||
credential_write_item(fp, "wwwauth[]", c->wwwauth_headers.v[i], 0);
|
||||
credential_write_item(c, fp, "wwwauth[]", c->wwwauth_headers.v[i], 0);
|
||||
if (credential_has_capability(&c->capa_state, op_type)) {
|
||||
if (c->multistage)
|
||||
credential_write_item(fp, "continue", "1", 0);
|
||||
credential_write_item(c, fp, "continue", "1", 0);
|
||||
for (size_t i = 0; i < c->state_headers_to_send.nr; i++)
|
||||
credential_write_item(fp, "state[]", c->state_headers_to_send.v[i], 0);
|
||||
credential_write_item(c, fp, "state[]", c->state_headers_to_send.v[i], 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -168,7 +168,9 @@ struct credential {
|
||||
multistage: 1,
|
||||
quit:1,
|
||||
use_http_path:1,
|
||||
username_from_proto:1;
|
||||
username_from_proto:1,
|
||||
sanitize_prompt:1,
|
||||
protect_protocol:1;
|
||||
|
||||
struct credential_capability capa_authtype;
|
||||
struct credential_capability capa_state;
|
||||
@ -195,6 +197,8 @@ struct credential {
|
||||
.wwwauth_headers = STRVEC_INIT, \
|
||||
.state_headers = STRVEC_INIT, \
|
||||
.state_headers_to_send = STRVEC_INIT, \
|
||||
.sanitize_prompt = 1, \
|
||||
.protect_protocol = 1, \
|
||||
}
|
||||
|
||||
/* Initialize a credential structure, setting all fields to empty. */
|
||||
|
||||
78
sideband.c
78
sideband.c
@ -23,6 +23,12 @@ static struct keyword_entry keywords[] = {
|
||||
{ "error", GIT_COLOR_BOLD_RED },
|
||||
};
|
||||
|
||||
static enum {
|
||||
ALLOW_NO_CONTROL_CHARACTERS = 0,
|
||||
ALLOW_ALL_CONTROL_CHARACTERS = 1,
|
||||
ALLOW_ANSI_COLOR_SEQUENCES = 2
|
||||
} allow_control_characters = ALLOW_ANSI_COLOR_SEQUENCES;
|
||||
|
||||
/* Returns a color setting (GIT_COLOR_NEVER, etc). */
|
||||
static int use_sideband_colors(void)
|
||||
{
|
||||
@ -36,6 +42,25 @@ static int use_sideband_colors(void)
|
||||
if (use_sideband_colors_cached >= 0)
|
||||
return use_sideband_colors_cached;
|
||||
|
||||
switch (git_config_get_maybe_bool("sideband.allowcontrolcharacters", &i)) {
|
||||
case 0: /* Boolean value */
|
||||
allow_control_characters = i ? ALLOW_ALL_CONTROL_CHARACTERS :
|
||||
ALLOW_NO_CONTROL_CHARACTERS;
|
||||
break;
|
||||
case -1: /* non-Boolean value */
|
||||
if (git_config_get_string("sideband.allowcontrolcharacters",
|
||||
&value))
|
||||
; /* huh? `get_maybe_bool()` returned -1 */
|
||||
else if (!strcmp(value, "color"))
|
||||
allow_control_characters = ALLOW_ANSI_COLOR_SEQUENCES;
|
||||
else
|
||||
warning(_("unrecognized value for `sideband."
|
||||
"allowControlCharacters`: '%s'"), value);
|
||||
break;
|
||||
default:
|
||||
break; /* not configured */
|
||||
}
|
||||
|
||||
if (!git_config_get_string(key, &value)) {
|
||||
use_sideband_colors_cached = git_config_colorbool(key, value);
|
||||
} else if (!git_config_get_string("color.ui", &value)) {
|
||||
@ -64,6 +89,55 @@ void list_config_color_sideband_slots(struct string_list *list, const char *pref
|
||||
list_config_item(list, prefix, keywords[i].keyword);
|
||||
}
|
||||
|
||||
static int handle_ansi_color_sequence(struct strbuf *dest, const char *src, int n)
|
||||
{
|
||||
int i;
|
||||
|
||||
/*
|
||||
* Valid ANSI color sequences are of the form
|
||||
*
|
||||
* ESC [ [<n> [; <n>]*] m
|
||||
*/
|
||||
|
||||
if (allow_control_characters != ALLOW_ANSI_COLOR_SEQUENCES ||
|
||||
n < 3 || src[0] != '\x1b' || src[1] != '[')
|
||||
return 0;
|
||||
|
||||
for (i = 2; i < n; i++) {
|
||||
if (src[i] == 'm') {
|
||||
strbuf_add(dest, src, i + 1);
|
||||
return i;
|
||||
}
|
||||
if (!isdigit(src[i]) && src[i] != ';')
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void strbuf_add_sanitized(struct strbuf *dest, const char *src, int n)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (allow_control_characters == ALLOW_ALL_CONTROL_CHARACTERS) {
|
||||
strbuf_add(dest, src, n);
|
||||
return;
|
||||
}
|
||||
|
||||
strbuf_grow(dest, n);
|
||||
for (; n && *src; src++, n--) {
|
||||
if (!iscntrl(*src) || *src == '\t' || *src == '\n')
|
||||
strbuf_addch(dest, *src);
|
||||
else if ((i = handle_ansi_color_sequence(dest, src, n))) {
|
||||
src += i;
|
||||
n -= i;
|
||||
} else {
|
||||
strbuf_addch(dest, '^');
|
||||
strbuf_addch(dest, 0x40 + *src);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Optionally highlight one keyword in remote output if it appears at the start
|
||||
* of the line. This should be called for a single line only, which is
|
||||
@ -79,7 +153,7 @@ static void maybe_colorize_sideband(struct strbuf *dest, const char *src, int n)
|
||||
int i;
|
||||
|
||||
if (!want_color_stderr(use_sideband_colors())) {
|
||||
strbuf_add(dest, src, n);
|
||||
strbuf_add_sanitized(dest, src, n);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -112,7 +186,7 @@ static void maybe_colorize_sideband(struct strbuf *dest, const char *src, int n)
|
||||
}
|
||||
}
|
||||
|
||||
strbuf_add(dest, src, n);
|
||||
strbuf_add_sanitized(dest, src, n);
|
||||
}
|
||||
|
||||
|
||||
|
||||
4
strbuf.c
4
strbuf.c
@ -495,7 +495,9 @@ void strbuf_add_percentencode(struct strbuf *dst, const char *src, int flags)
|
||||
unsigned char ch = src[i];
|
||||
if (ch <= 0x1F || ch >= 0x7F ||
|
||||
(ch == '/' && (flags & STRBUF_ENCODE_SLASH)) ||
|
||||
strchr(URL_UNSAFE_CHARS, ch))
|
||||
((flags & STRBUF_ENCODE_HOST_AND_PORT) ?
|
||||
!isalnum(ch) && !strchr("-.:[]", ch) :
|
||||
!!strchr(URL_UNSAFE_CHARS, ch)))
|
||||
strbuf_addf(dst, "%%%02X", (unsigned char)ch);
|
||||
else
|
||||
strbuf_addch(dst, ch);
|
||||
|
||||
1
strbuf.h
1
strbuf.h
@ -356,6 +356,7 @@ void strbuf_expand_bad_format(const char *format, const char *command);
|
||||
void strbuf_addbuf_percentquote(struct strbuf *dst, const struct strbuf *src);
|
||||
|
||||
#define STRBUF_ENCODE_SLASH 1
|
||||
#define STRBUF_ENCODE_HOST_AND_PORT 2
|
||||
|
||||
/**
|
||||
* Append the contents of a string to a strbuf, percent-encoding any characters
|
||||
|
||||
@ -77,6 +77,10 @@ test_expect_success 'setup helper scripts' '
|
||||
test -z "$pexpiry" || echo password_expiry_utc=$pexpiry
|
||||
EOF
|
||||
|
||||
write_script git-credential-cntrl-in-username <<-\EOF &&
|
||||
printf "username=\\007latrix Lestrange\\n"
|
||||
EOF
|
||||
|
||||
PATH="$PWD$PATH_SEP$PATH"
|
||||
'
|
||||
|
||||
@ -697,6 +701,19 @@ test_expect_success 'match percent-encoded values in username' '
|
||||
EOF
|
||||
'
|
||||
|
||||
test_expect_success 'match percent-encoded values in hostname' '
|
||||
test_config "credential.https://a%20b%20c/.helper" "$HELPER" &&
|
||||
check fill <<-\EOF
|
||||
url=https://a b c/
|
||||
--
|
||||
protocol=https
|
||||
host=a b c
|
||||
username=foo
|
||||
password=bar
|
||||
--
|
||||
EOF
|
||||
'
|
||||
|
||||
test_expect_success 'fetch with multiple path components' '
|
||||
test_unconfig credential.helper &&
|
||||
test_config credential.https://example.com/foo/repo.git.helper "verbatim foo bar" &&
|
||||
@ -886,6 +903,22 @@ test_expect_success 'url parser rejects embedded newlines' '
|
||||
test_cmp expect stderr
|
||||
'
|
||||
|
||||
test_expect_success 'url parser rejects embedded carriage returns' '
|
||||
test_config credential.helper "!true" &&
|
||||
test_must_fail git credential fill 2>stderr <<-\EOF &&
|
||||
url=https://example%0d.com/
|
||||
EOF
|
||||
cat >expect <<-\EOF &&
|
||||
fatal: credential value for host contains carriage return
|
||||
If this is intended, set `credential.protectProtocol=false`
|
||||
EOF
|
||||
test_cmp expect stderr &&
|
||||
GIT_ASKPASS=true \
|
||||
git -c credential.protectProtocol=false credential fill <<-\EOF
|
||||
url=https://example%0d.com/
|
||||
EOF
|
||||
'
|
||||
|
||||
test_expect_success 'host-less URLs are parsed as empty host' '
|
||||
check fill "verbatim foo bar" <<-\EOF
|
||||
url=cert:///path/to/cert.pem
|
||||
@ -995,4 +1028,20 @@ test_expect_success 'credential config with partial URLs' '
|
||||
test_grep "skipping credential lookup for key" stderr
|
||||
'
|
||||
|
||||
BEL="$(printf '\007')"
|
||||
|
||||
test_expect_success 'interactive prompt is sanitized' '
|
||||
check fill cntrl-in-username <<-EOF
|
||||
protocol=https
|
||||
host=example.org
|
||||
--
|
||||
protocol=https
|
||||
host=example.org
|
||||
username=${BEL}latrix Lestrange
|
||||
password=askpass-password
|
||||
--
|
||||
askpass: Password for ${SQ}https://%07latrix%20Lestrange@example.org${SQ}:
|
||||
EOF
|
||||
'
|
||||
|
||||
test_done
|
||||
|
||||
@ -98,4 +98,34 @@ test_expect_success 'fallback to color.ui' '
|
||||
grep "<BOLD;RED>error<RESET>: error" decoded
|
||||
'
|
||||
|
||||
test_expect_success 'disallow (color) control sequences in sideband' '
|
||||
write_script .git/color-me-surprised <<-\EOF &&
|
||||
printf "error: Have you \\033[31mread\\033[m this?\\a\\n" >&2
|
||||
exec "$@"
|
||||
EOF
|
||||
test_config_global uploadPack.packObjectshook ./color-me-surprised &&
|
||||
test_commit need-at-least-one-commit &&
|
||||
|
||||
git clone --no-local . throw-away 2>stderr &&
|
||||
test_decode_color <stderr >decoded &&
|
||||
test_grep RED decoded &&
|
||||
test_grep "\\^G" stderr &&
|
||||
tr -dc "\\007" <stderr >actual &&
|
||||
test_must_be_empty actual &&
|
||||
|
||||
rm -rf throw-away &&
|
||||
git -c sideband.allowControlCharacters=false \
|
||||
clone --no-local . throw-away 2>stderr &&
|
||||
test_decode_color <stderr >decoded &&
|
||||
test_grep ! RED decoded &&
|
||||
test_grep "\\^G" stderr &&
|
||||
|
||||
rm -rf throw-away &&
|
||||
git -c sideband.allowControlCharacters clone --no-local . throw-away 2>stderr &&
|
||||
test_decode_color <stderr >decoded &&
|
||||
test_grep RED decoded &&
|
||||
tr -dc "\\007" <stderr >actual &&
|
||||
test_file_not_empty actual
|
||||
'
|
||||
|
||||
test_done
|
||||
|
||||
@ -343,7 +343,7 @@ test_expect_success 'push over smart http with auth' '
|
||||
git push "$HTTPD_URL"/auth/smart/test_repo.git &&
|
||||
git --git-dir="$HTTPD_DOCUMENT_ROOT_PATH/test_repo.git" \
|
||||
log -1 --format=%s >actual &&
|
||||
expect_askpass both user@host &&
|
||||
expect_askpass both user%40host &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
@ -355,7 +355,7 @@ test_expect_success 'push to auth-only-for-push repo' '
|
||||
git push "$HTTPD_URL"/auth-push/smart/test_repo.git &&
|
||||
git --git-dir="$HTTPD_DOCUMENT_ROOT_PATH/test_repo.git" \
|
||||
log -1 --format=%s >actual &&
|
||||
expect_askpass both user@host &&
|
||||
expect_askpass both user%40host &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
@ -385,7 +385,7 @@ test_expect_success 'push into half-auth-complete requires password' '
|
||||
git push "$HTTPD_URL/half-auth-complete/smart/half-auth.git" &&
|
||||
git --git-dir="$HTTPD_DOCUMENT_ROOT_PATH/half-auth.git" \
|
||||
log -1 --format=%s >actual &&
|
||||
expect_askpass both user@host &&
|
||||
expect_askpass both user%40host &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
|
||||
@ -111,13 +111,13 @@ test_expect_success 'http auth can use user/pass in URL' '
|
||||
test_expect_success 'http auth can use just user in URL' '
|
||||
set_askpass wrong pass@host &&
|
||||
git clone "$HTTPD_URL_USER/auth/dumb/repo.git" clone-auth-pass &&
|
||||
expect_askpass pass user@host
|
||||
expect_askpass pass user%40host
|
||||
'
|
||||
|
||||
test_expect_success 'http auth can request both user and pass' '
|
||||
set_askpass user@host pass@host &&
|
||||
git clone "$HTTPD_URL/auth/dumb/repo.git" clone-auth-both &&
|
||||
expect_askpass both user@host
|
||||
expect_askpass both user%40host
|
||||
'
|
||||
|
||||
test_expect_success 'http auth respects credential helper config' '
|
||||
@ -135,14 +135,14 @@ test_expect_success 'http auth can get username from config' '
|
||||
test_config_global "credential.$HTTPD_URL.username" user@host &&
|
||||
set_askpass wrong pass@host &&
|
||||
git clone "$HTTPD_URL/auth/dumb/repo.git" clone-auth-user &&
|
||||
expect_askpass pass user@host
|
||||
expect_askpass pass user%40host
|
||||
'
|
||||
|
||||
test_expect_success 'configured username does not override URL' '
|
||||
test_config_global "credential.$HTTPD_URL.username" wrong &&
|
||||
set_askpass wrong pass@host &&
|
||||
git clone "$HTTPD_URL_USER/auth/dumb/repo.git" clone-auth-user2 &&
|
||||
expect_askpass pass user@host
|
||||
expect_askpass pass user%40host
|
||||
'
|
||||
|
||||
test_expect_success 'set up repo with http submodules' '
|
||||
@ -163,7 +163,7 @@ test_expect_success 'cmdline credential config passes to submodule via clone' '
|
||||
set_askpass wrong pass@host &&
|
||||
git -c "credential.$HTTPD_URL.username=user@host" \
|
||||
clone --recursive super super-clone &&
|
||||
expect_askpass pass user@host
|
||||
expect_askpass pass user%40host
|
||||
'
|
||||
|
||||
test_expect_success 'cmdline credential config passes submodule via fetch' '
|
||||
@ -174,7 +174,7 @@ test_expect_success 'cmdline credential config passes submodule via fetch' '
|
||||
git -C super-clone \
|
||||
-c "credential.$HTTPD_URL.username=user@host" \
|
||||
fetch --recurse-submodules &&
|
||||
expect_askpass pass user@host
|
||||
expect_askpass pass user%40host
|
||||
'
|
||||
|
||||
test_expect_success 'cmdline credential config passes submodule update' '
|
||||
@ -191,7 +191,7 @@ test_expect_success 'cmdline credential config passes submodule update' '
|
||||
git -C super-clone \
|
||||
-c "credential.$HTTPD_URL.username=user@host" \
|
||||
submodule update &&
|
||||
expect_askpass pass user@host
|
||||
expect_askpass pass user%40host
|
||||
'
|
||||
|
||||
test_expect_success 'fetch changes via http' '
|
||||
|
||||
@ -181,7 +181,7 @@ test_expect_success 'clone from password-protected repository' '
|
||||
echo two >expect &&
|
||||
set_askpass user@host pass@host &&
|
||||
git clone --bare "$HTTPD_URL/auth/smart/repo.git" smart-auth &&
|
||||
expect_askpass both user@host &&
|
||||
expect_askpass both user%40host &&
|
||||
git --git-dir=smart-auth log -1 --format=%s >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
@ -199,7 +199,7 @@ test_expect_success 'clone from auth-only-for-objects repository' '
|
||||
echo two >expect &&
|
||||
set_askpass user@host pass@host &&
|
||||
git clone --bare "$HTTPD_URL/auth-fetch/smart/repo.git" half-auth &&
|
||||
expect_askpass both user@host &&
|
||||
expect_askpass both user%40host &&
|
||||
git --git-dir=half-auth log -1 --format=%s >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
@ -224,14 +224,14 @@ test_expect_success 'redirects send auth to new location' '
|
||||
set_askpass user@host pass@host &&
|
||||
git -c credential.useHttpPath=true \
|
||||
clone $HTTPD_URL/smart-redir-auth/repo.git repo-redir-auth &&
|
||||
expect_askpass both user@host auth/smart/repo.git
|
||||
expect_askpass both user%40host auth/smart/repo.git
|
||||
'
|
||||
|
||||
test_expect_success 'GIT_TRACE_CURL redacts auth details' '
|
||||
rm -rf redact-auth trace &&
|
||||
set_askpass user@host pass@host &&
|
||||
GIT_TRACE_CURL="$(pwd)/trace" git clone --bare "$HTTPD_URL/auth/smart/repo.git" redact-auth &&
|
||||
expect_askpass both user@host &&
|
||||
expect_askpass both user%40host &&
|
||||
|
||||
# Ensure that there is no "Basic" followed by a base64 string, but that
|
||||
# the auth details are redacted
|
||||
@ -243,7 +243,7 @@ test_expect_success 'GIT_CURL_VERBOSE redacts auth details' '
|
||||
rm -rf redact-auth trace &&
|
||||
set_askpass user@host pass@host &&
|
||||
GIT_CURL_VERBOSE=1 git clone --bare "$HTTPD_URL/auth/smart/repo.git" redact-auth 2>trace &&
|
||||
expect_askpass both user@host &&
|
||||
expect_askpass both user%40host &&
|
||||
|
||||
# Ensure that there is no "Basic" followed by a base64 string, but that
|
||||
# the auth details are redacted
|
||||
@ -256,7 +256,7 @@ test_expect_success 'GIT_TRACE_CURL does not redact auth details if GIT_TRACE_RE
|
||||
set_askpass user@host pass@host &&
|
||||
GIT_TRACE_REDACT=0 GIT_TRACE_CURL="$(pwd)/trace" \
|
||||
git clone --bare "$HTTPD_URL/auth/smart/repo.git" redact-auth &&
|
||||
expect_askpass both user@host &&
|
||||
expect_askpass both user%40host &&
|
||||
|
||||
grep -i "Authorization: Basic [0-9a-zA-Z+/]" trace
|
||||
'
|
||||
@ -578,7 +578,7 @@ test_expect_success 'http auth remembers successful credentials' '
|
||||
# the first request prompts the user...
|
||||
set_askpass user@host pass@host &&
|
||||
git ls-remote "$HTTPD_URL/auth/smart/repo.git" >/dev/null &&
|
||||
expect_askpass both user@host &&
|
||||
expect_askpass both user%40host &&
|
||||
|
||||
# ...and the second one uses the stored value rather than
|
||||
# prompting the user.
|
||||
@ -609,7 +609,7 @@ test_expect_success 'http auth forgets bogus credentials' '
|
||||
# us to prompt the user again.
|
||||
set_askpass user@host pass@host &&
|
||||
git ls-remote "$HTTPD_URL/auth/smart/repo.git" >/dev/null &&
|
||||
expect_askpass both user@host
|
||||
expect_askpass both user%40host
|
||||
'
|
||||
|
||||
test_expect_success 'client falls back from v2 to v0 to match server' '
|
||||
|
||||
@ -747,7 +747,7 @@ test_expect_success MINGW 'handle clean & core.longpaths = false nicely' '
|
||||
test_must_fail git clean -xdf 2>.git/err &&
|
||||
# grepping for a strerror string is unportable but it is OK here with
|
||||
# MINGW prereq
|
||||
test_grep "too long" .git/err
|
||||
test_grep -e "too long" -e "No such file or directory" .git/err
|
||||
'
|
||||
|
||||
test_expect_success 'clean untracked paths by pathspec' '
|
||||
|
||||
@ -80,7 +80,7 @@ int unix_stream_connect(const char *path, int disallow_chdir)
|
||||
struct unix_sockaddr_context ctx;
|
||||
|
||||
if (unix_sockaddr_init(&sa, path, &ctx, disallow_chdir) < 0)
|
||||
return -1;
|
||||
goto fail;
|
||||
fd = socket(AF_UNIX, SOCK_STREAM, 0);
|
||||
if (fd < 0)
|
||||
goto fail;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user