Merge branch 'ae/anon-fetch-info'

* ae/anon-fetch-info:
  fetch: Strip usernames from url's before storing them
This commit is contained in:
Junio C Hamano 2009-05-18 08:59:27 -07:00
commit 983e9b63ae
3 changed files with 54 additions and 2 deletions

View file

@ -289,7 +289,7 @@ static int update_local_ref(struct ref *ref,
} }
} }
static int store_updated_refs(const char *url, const char *remote_name, static int store_updated_refs(const char *raw_url, const char *remote_name,
struct ref *ref_map) struct ref *ref_map)
{ {
FILE *fp; FILE *fp;
@ -298,11 +298,13 @@ static int store_updated_refs(const char *url, const char *remote_name,
char note[1024]; char note[1024];
const char *what, *kind; const char *what, *kind;
struct ref *rm; struct ref *rm;
char *filename = git_path("FETCH_HEAD"); char *url, *filename = git_path("FETCH_HEAD");
fp = fopen(filename, "a"); fp = fopen(filename, "a");
if (!fp) if (!fp)
return error("cannot open %s: %s\n", filename, strerror(errno)); return error("cannot open %s: %s\n", filename, strerror(errno));
url = transport_anonymize_url(raw_url);
for (rm = ref_map; rm; rm = rm->next) { for (rm = ref_map; rm; rm = rm->next) {
struct ref *ref = NULL; struct ref *ref = NULL;
@ -382,6 +384,7 @@ static int store_updated_refs(const char *url, const char *remote_name,
fprintf(stderr, " %s\n", note); fprintf(stderr, " %s\n", note);
} }
} }
free(url);
fclose(fp); fclose(fp);
if (rc & 2) if (rc & 2)
error("some local refs could not be updated; try running\n" error("some local refs could not be updated; try running\n"

View file

@ -1083,3 +1083,51 @@ int transport_disconnect(struct transport *transport)
free(transport); free(transport);
return ret; return ret;
} }
/*
* Strip username (and password) from an url and return
* it in a newly allocated string.
*/
char *transport_anonymize_url(const char *url)
{
char *anon_url, *scheme_prefix, *anon_part;
size_t anon_len, prefix_len = 0;
anon_part = strchr(url, '@');
if (is_local(url) || !anon_part)
goto literal_copy;
anon_len = strlen(++anon_part);
scheme_prefix = strstr(url, "://");
if (!scheme_prefix) {
if (!strchr(anon_part, ':'))
/* cannot be "me@there:/path/name" */
goto literal_copy;
} else {
const char *cp;
/* make sure scheme is reasonable */
for (cp = url; cp < scheme_prefix; cp++) {
switch (*cp) {
/* RFC 1738 2.1 */
case '+': case '.': case '-':
break; /* ok */
default:
if (isalnum(*cp))
break;
/* it isn't */
goto literal_copy;
}
}
/* @ past the first slash does not count */
cp = strchr(scheme_prefix + 3, '/');
if (cp && cp < anon_part)
goto literal_copy;
prefix_len = scheme_prefix - url + 3;
}
anon_url = xcalloc(1, 1 + prefix_len + anon_len);
memcpy(anon_url, url, prefix_len);
memcpy(anon_url + prefix_len, anon_part, anon_len);
return anon_url;
literal_copy:
return xstrdup(url);
}

View file

@ -74,5 +74,6 @@ const struct ref *transport_get_remote_refs(struct transport *transport);
int transport_fetch_refs(struct transport *transport, const struct ref *refs); int transport_fetch_refs(struct transport *transport, const struct ref *refs);
void transport_unlock_pack(struct transport *transport); void transport_unlock_pack(struct transport *transport);
int transport_disconnect(struct transport *transport); int transport_disconnect(struct transport *transport);
char *transport_anonymize_url(const char *url);
#endif #endif