This is an automated email from the ASF dual-hosted git repository. sijie pushed a commit to branch branch-2.1 in repository https://gitbox.apache.org/repos/asf/incubator-pulsar.git
The following commit(s) were added to refs/heads/branch-2.1 by this push: new 1ef9d0d add encoding for WebTargets parts (#2359) 1ef9d0d is described below commit 1ef9d0daa1492d948ba31625a09c0f1792709121 Author: Jia Zhai <jiaz...@users.noreply.github.com> AuthorDate: Mon Aug 13 04:36:41 2018 +0800 add encoding for WebTargets parts (#2359) ### Motivation Fixes #2304 Issue #2304 reported that Pulsar admin commands will fail with some url style parts, ``` root@pulsar-admin:/pulsar# pulsar-admin namespaces grant-permission --actions produce,consume --role 'spiffe://developer/passport' core-platform/testing HTTP 404 Not Found Reason: HTTP 404 Not Found ``` This PR try to fix it. ### Modifications - use URLEncoder to encode webTarget parts. - add tests to verify ### Result all UT passed --- .../java/org/apache/pulsar/broker/admin/AdminApiTest.java | 6 ++++++ .../apache/pulsar/client/admin/internal/WebTargets.java | 14 +++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiTest.java index c9d973d..ae72737 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiTest.java @@ -620,11 +620,15 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest { // Ok, got the non authorized exception since usc cluster is not in the allowed clusters list. } + // test with url style role. + admin.namespaces().grantPermissionOnNamespace("prop-xyz/ns1", + "spiffe://developer/passport-role", EnumSet.allOf(AuthAction.class)); admin.namespaces().grantPermissionOnNamespace("prop-xyz/ns1", "my-role", EnumSet.allOf(AuthAction.class)); Policies policies = new Policies(); policies.replication_clusters = Sets.newHashSet("test"); policies.bundles = Policies.defaultBundle(); + policies.auth_policies.namespace_auth.put("spiffe://developer/passport-role", EnumSet.allOf(AuthAction.class)); policies.auth_policies.namespace_auth.put("my-role", EnumSet.allOf(AuthAction.class)); assertEquals(admin.namespaces().getPolicies("prop-xyz/ns1"), policies); @@ -632,7 +636,9 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest { assertEquals(admin.namespaces().getTopics("prop-xyz/ns1"), Lists.newArrayList()); + admin.namespaces().revokePermissionsOnNamespace("prop-xyz/ns1", "spiffe://developer/passport-role"); admin.namespaces().revokePermissionsOnNamespace("prop-xyz/ns1", "my-role"); + policies.auth_policies.namespace_auth.remove("spiffe://developer/passport-role"); policies.auth_policies.namespace_auth.remove("my-role"); assertEquals(admin.namespaces().getPolicies("prop-xyz/ns1"), policies); diff --git a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/WebTargets.java b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/WebTargets.java index 35b04f1..3de248c 100644 --- a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/WebTargets.java +++ b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/WebTargets.java @@ -18,14 +18,26 @@ */ package org.apache.pulsar.client.admin.internal; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import javax.ws.rs.client.WebTarget; +import lombok.extern.slf4j.Slf4j; +@Slf4j class WebTargets { static WebTarget addParts(WebTarget target, String[] parts) { if (parts != null && parts.length > 0) { for (String part : parts) { - target = target.path(part); + String encode; + try { + encode = URLEncoder.encode(part, StandardCharsets.UTF_8.toString()); + } catch (UnsupportedEncodingException e) { + log.error(String.format("%s is Unknown", StandardCharsets.UTF_8.toString()) + "exception - [{}]", e); + encode = part; + } + target = target.path(encode); } } return target;