git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 4/5] credential: use the last matching username in the config

From
brian m. carlson <sandals@crustytoothpaste.net>
Date
Feb 20, 2020, 02:24 UTC
Message-ID
<20200220022413.258026-5-sandals@crustytoothpaste.net>
In-Reply-To
<20200220022413.258026-1-sandals@crustytoothpaste.net>
From: brian m. carlson <bk2204@github.com>

Everywhere else in the codebase, we use the rule that the last matching configuration option is the one that takes effect. This is helpful because it allows more specific configuration settings (e.g., per-repo configuration) to override less specific settings (e.g., per-user configuration).

However, in the credential code, we didn't honor this setting, and instead picked the first setting we had, and stuck with it. This was likely to ensure we picked the value from the URL, which we want to honor over the configuration.

It's possible to do both, though, so let's check if the value is the one we've gotten over our protocol connection, which if present will have come from the URL, and keep it if so. Otherwise, let's overwrite the value with the latest version we've got from the configuration, so we keep the last configuration value.

Signed-off-by: brian m. carlson <bk2204@github.com>
---
 credential.c           | 9 ++++++++-
 credential.h           | 3 ++-
 t/t0300-credentials.sh | 2 +-
 3 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/credential.c b/credential.c
index 62be651b03..5701e32792 100644
--- a/credential.c
+++ b/credential.c
@@ -71,8 +71,10 @@ static int credential_config_callback(const char *var, const char *value,
 		else
 			string_list_clear(&c->helpers, 0);
 	} else if (!strcmp(key, "username")) {
-		if (!c->username)
+		if (!c->username_from_proto) {
+			free(c->username);
 			c->username = xstrdup(value);
+		}
 	}
 	else if (!strcmp(key, "usehttppath"))
 		c->use_http_path = git_config_bool(var, value);
@@ -163,6 +165,7 @@ int credential_read(struct credential *c, FILE *fp)
 		if (!strcmp(key, "username")) {
 			free(c->username);
 			c->username = xstrdup(value);
+			c->username_from_proto = 1;
 		} else if (!strcmp(key, "password")) {
 			free(c->password);
 			c->password = xstrdup(value);
@@ -349,10 +352,14 @@ void credential_from_url(struct credential *c, const char *url)
 	else if (!colon || at <= colon) {
 		/* Case (2) */
 		c->username = url_decode_mem(cp, at - cp);
+		if (c->username && *c->username)
+			c->username_from_proto = 1;
 		host = at + 1;
 	} else {
 		/* Case (3) */
 		c->username = url_decode_mem(cp, colon - cp);
+		if (c->username && *c->username)
+			c->username_from_proto = 1;
 		c->password = url_decode_mem(colon + 1, at - (colon + 1));
 		host = at + 1;
 	}
diff --git a/credential.h b/credential.h
index a5a3ee9bb8..fec7815dd0 100644
--- a/credential.h
+++ b/credential.h
@@ -118,7 +118,8 @@ struct credential {
 	unsigned approved:1,
 		 configured:1,
 		 quit:1,
-		 use_http_path:1;
+		 use_http_path:1,
+		 username_from_proto:1;
 
 	char *username;
 	char *password;
diff --git a/t/t0300-credentials.sh b/t/t0300-credentials.sh
index 4593a0cd3d..8f87599056 100755
--- a/t/t0300-credentials.sh
+++ b/t/t0300-credentials.sh
@@ -344,7 +344,7 @@ test_expect_success 'honors username from URL over helper (components)' '
 	EOF
 '
 
-test_expect_failure 'last matching username wins' '
+test_expect_success 'last matching username wins' '
 	test_config credential.https://example.com/path.git.username bob &&
 	test_config credential.https://example.com.username alice &&
 	test_config credential.https://example.com.helper "verbatim \"\" bar" &&
Previous: brian m. carlsonNext: brian m. carlson
Message 4 of 8 in “Wildcard matching for credentials”
  1. 0/5 Wildcard matching for credentialsbrian m. carlson, Feb 20, 2020
  2. 1/5 mailmap: add an additional email address for brian m. carlsonbrian m. carlson, Feb 20, 2020
  3. 2/5 t1300: add test for urlmatch with multiple wildcardsbrian m. carlson, Feb 20, 2020
  4. 4/5 credential: use the last matching username in the configbrian m. carlson, Feb 20, 2020
  5. 3/5 t0300: add tests for some additional casesbrian m. carlson, Feb 20, 2020
  6. 5/5 credential: allow wildcard patterns when matching configbrian m. carlson, Feb 20, 2020
  7. Junio C HamanoFeb 20, 2020
  8. Jeff KingFeb 21, 2020

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.