Skip to content

Commit c2bf668

Browse files
committed
Redact URL-encoded characters in userinfo of URLs
1 parent e6f1e72 commit c2bf668

File tree

3 files changed

+43
-7
lines changed

3 files changed

+43
-7
lines changed

src/main/java/com/gradle/CustomBuildScanEnhancements.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,7 @@ public void execute(BuildScanAdapter buildScan) {
421421
String gitStatus = execAndGetStdOut("git", "status", "--porcelain");
422422

423423
if (isNotEmpty(gitRepo)) {
424-
buildScan.value("Git repository", redactUserInfo(gitRepo));
424+
redactUserInfo(gitRepo).ifPresent(redactedGitRepo -> buildScan.value("Git repository", redactedGitRepo));
425425
}
426426
if (isNotEmpty(gitCommitId)) {
427427
buildScan.value("Git commit id", gitCommitId);

src/main/java/com/gradle/Utils.java

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -94,14 +94,24 @@ static String urlEncode(String str) {
9494
}
9595
}
9696

97-
static String redactUserInfo(String url) {
97+
static Optional<String> redactUserInfo(String url) {
98+
if (!url.startsWith("http")) {
99+
return Optional.of(url);
100+
}
101+
98102
try {
99-
String userInfo = new URI(url).getUserInfo();
100-
return userInfo == null
101-
? url
102-
: url.replace(userInfo + '@', "******@");
103+
URI uri = new URI(url);
104+
URI redactedUri = new URI(
105+
uri.getScheme(),
106+
uri.getUserInfo() == null || uri.getUserInfo().isEmpty() ? null : "******",
107+
uri.getHost(),
108+
uri.getPort(),
109+
uri.getRawPath(),
110+
uri.getRawQuery(),
111+
uri.getRawFragment());
112+
return Optional.of(redactedUri.toString());
103113
} catch (URISyntaxException e) {
104-
return url;
114+
return Optional.empty();
105115
}
106116
}
107117

src/test/java/com/gradle/UtilsTest.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import org.junit.jupiter.params.provider.ArgumentsSource;
88

99
import java.net.URI;
10+
import java.util.HashMap;
11+
import java.util.Map;
1012
import java.util.Optional;
1113
import java.util.Set;
1214
import java.util.stream.Collectors;
@@ -31,6 +33,12 @@ public void testToWebRepoUri_enterpriseUri(String repositoryHost, String reposit
3133
assertEquals(Optional.of(expectedWebRepoUri), toWebRepoUri(String.format(repositoryUri, repositoryHost)));
3234
}
3335

36+
@ParameterizedTest
37+
@ArgumentsSource(UserInfoArgumentsProvider.class)
38+
public void testUserInfoRedacted(String inputUrl, String expectedRedactedUrl) {
39+
assertEquals(expectedRedactedUrl, Utils.redactUserInfo(inputUrl).orElse(null));
40+
}
41+
3442
private static class WebRepoUriArgumentsProvider implements ArgumentsProvider {
3543

3644
@Override
@@ -40,6 +48,8 @@ public Stream<? extends Arguments> provideArguments(ExtensionContext context) {
4048
"https://%s.com/acme-inc/my-project",
4149
"https://%s.com:443/acme-inc/my-project",
4250
"https://user:secret@%s.com/acme-inc/my-project",
51+
"https://user:secret%%1Fpassword@%s.com/acme-inc/my-project",
52+
"https://user:secret%%1password@%s.com/acme-inc/my-project",
4353
"ssh://git@%s.com/acme-inc/my-project.git",
4454
"ssh://git@%s.com:22/acme-inc/my-project.git",
4555
"git://%s.com/acme-inc/my-project.git",
@@ -61,4 +71,20 @@ public Stream<? extends Arguments> provideArguments(ExtensionContext context) {
6171
return host.stream().flatMap(h -> remoteRepositoryUris.stream().map(r -> Arguments.arguments(h, r)));
6272
}
6373
}
74+
75+
private static class UserInfoArgumentsProvider implements ArgumentsProvider {
76+
77+
@Override
78+
public Stream<? extends Arguments> provideArguments(ExtensionContext context) {
79+
Map<String, String> cases = new HashMap<>();
80+
cases.put("https://user:[email protected]/acme-inc/my-project", "https://******@acme.com/acme-inc/my-project");
81+
cases.put("https://user%1Fname:[email protected]/acme-inc/my-project", "https://******@acme.com/acme-inc/my-project");
82+
cases.put("https://user:secret%[email protected]/acme-inc/my-project", "https://******@acme.com/acme-inc/my-project");
83+
cases.put("https://user:secret%[email protected]/acme-inc/my-project", null);
84+
cases.put("[email protected]:gradle/common-custom-user-data-gradle-plugin.git", "[email protected]:gradle/common-custom-user-data-gradle-plugin.git");
85+
86+
return cases.entrySet().stream()
87+
.map(entry -> Arguments.arguments(entry.getKey(), entry.getValue()));
88+
}
89+
}
6490
}

0 commit comments

Comments
 (0)