@@ -1083,3 +1083,51 @@ int transport_disconnect(struct transport *transport)
10831083 free (transport );
10841084 return ret ;
10851085}
1086+
1087+ /*
1088+ * Strip username (and password) from an url and return
1089+ * it in a newly allocated string.
1090+ */
1091+ char * transport_anonymize_url (const char * url )
1092+ {
1093+ char * anon_url , * scheme_prefix , * anon_part ;
1094+ size_t anon_len , prefix_len = 0 ;
1095+
1096+ anon_part = strchr (url , '@' );
1097+ if (is_local (url ) || !anon_part )
1098+ goto literal_copy ;
1099+
1100+ anon_len = strlen (++ anon_part );
1101+ scheme_prefix = strstr (url , "://" );
1102+ if (!scheme_prefix ) {
1103+ if (!strchr (anon_part , ':' ))
1104+ /* cannot be "me@there:/path/name" */
1105+ goto literal_copy ;
1106+ } else {
1107+ const char * cp ;
1108+ /* make sure scheme is reasonable */
1109+ for (cp = url ; cp < scheme_prefix ; cp ++ ) {
1110+ switch (* cp ) {
1111+ /* RFC 1738 2.1 */
1112+ case '+' : case '.' : case '-' :
1113+ break ; /* ok */
1114+ default :
1115+ if (isalnum (* cp ))
1116+ break ;
1117+ /* it isn't */
1118+ goto literal_copy ;
1119+ }
1120+ }
1121+ /* @ past the first slash does not count */
1122+ cp = strchr (scheme_prefix + 3 , '/' );
1123+ if (cp && cp < anon_part )
1124+ goto literal_copy ;
1125+ prefix_len = scheme_prefix - url + 3 ;
1126+ }
1127+ anon_url = xcalloc (1 , 1 + prefix_len + anon_len );
1128+ memcpy (anon_url , url , prefix_len );
1129+ memcpy (anon_url + prefix_len , anon_part , anon_len );
1130+ return anon_url ;
1131+ literal_copy :
1132+ return xstrdup (url );
1133+ }
0 commit comments