Skip to content

Commit e6023bc

Browse files
refactor: replace URLEncoder with URIEscapers to ensure RFC 3986-compliant path encoding
1 parent 74339bd commit e6023bc

2 files changed

Lines changed: 8 additions & 8 deletions

File tree

  • pulsar-package-management/core/src

pulsar-package-management/core/src/main/java/org/apache/pulsar/packages/management/core/common/PackageName.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@
2323
import com.google.common.cache.CacheBuilder;
2424
import com.google.common.cache.CacheLoader;
2525
import com.google.common.cache.LoadingCache;
26-
import java.net.URLEncoder;
27-
import java.nio.charset.StandardCharsets;
26+
import com.google.common.net.UrlEscapers;
2827
import java.util.List;
2928
import java.util.Objects;
3029
import java.util.concurrent.ExecutionException;
@@ -138,12 +137,13 @@ public String toString() {
138137
}
139138

140139
public String toRestPath() {
140+
// Use Guava's urlPathSegmentEscaper to safely encode each segment and prevents Path Traversal (CWE-22)
141141
return String.format("%s/%s/%s/%s/%s",
142-
type,
143-
URLEncoder.encode(tenant, StandardCharsets.UTF_8),
144-
URLEncoder.encode(namespace, StandardCharsets.UTF_8),
145-
URLEncoder.encode(name, StandardCharsets.UTF_8),
146-
URLEncoder.encode(version, StandardCharsets.UTF_8));
142+
type.toString(),
143+
UrlEscapers.urlPathSegmentEscaper().escape(tenant),
144+
UrlEscapers.urlPathSegmentEscaper().escape(namespace),
145+
UrlEscapers.urlPathSegmentEscaper().escape(name),
146+
UrlEscapers.urlPathSegmentEscaper().escape(version));
147147
}
148148

149149
@Override

pulsar-package-management/core/src/test/java/org/apache/pulsar/packages/management/core/common/PackageNameTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ public void testPathTraversalBypassConstructor() throws Exception {
125125
java.lang.reflect.Field tenantField = PackageName.class.getDeclaredField("tenant");
126126
tenantField.setAccessible(true);
127127
tenantField.set(packageName, "tenant-a/../../system-tenant");
128-
// Define what the SAFE, patched output should look like (URL Encoded)
128+
// Define what the SAFE, patched output should look like
129129
String expectedSafePath = "function/tenant-a%2F..%2F..%2Fsystem-tenant/ns/name/v1";
130130

131131
// Trigger the vulnerable method

0 commit comments

Comments
 (0)