This is an automated email from the ASF dual-hosted git repository.

xyz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pulsar.git


The following commit(s) were added to refs/heads/master by this push:
     new aa230bc41ac [fix][admin] Tenant AdminRoles can not contains whitespace 
in the beginning or end. (#22450)
aa230bc41ac is described below

commit aa230bc41ac11685f1656137f5d497bbd1bd657c
Author: Phineas <[email protected]>
AuthorDate: Mon May 27 16:11:46 2024 +0800

    [fix][admin] Tenant AdminRoles can not contains whitespace in the beginning 
or end. (#22450)
---
 .../pulsar/broker/admin/impl/TenantsBase.java      | 16 ++++++++++++
 .../org/apache/pulsar/client/api/TenantTest.java   | 29 ++++++++++++++++++++--
 2 files changed, 43 insertions(+), 2 deletions(-)

diff --git 
a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/TenantsBase.java
 
b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/TenantsBase.java
index 74c0367e0b9..93eb7f33faf 100644
--- 
a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/TenantsBase.java
+++ 
b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/TenantsBase.java
@@ -122,6 +122,7 @@ public class TenantsBase extends PulsarWebResource {
         validateSuperUserAccessAsync()
                 .thenCompose(__ -> validatePoliciesReadOnlyAccessAsync())
                 .thenCompose(__ -> validateClustersAsync(tenantInfo))
+                .thenCompose(__ -> validateAdminRoleAsync(tenantInfo))
                 .thenCompose(__ -> tenantResources().tenantExistsAsync(tenant))
                 .thenAccept(exist -> {
                     if (exist) {
@@ -167,6 +168,7 @@ public class TenantsBase extends PulsarWebResource {
         validateSuperUserAccessAsync()
                 .thenCompose(__ -> validatePoliciesReadOnlyAccessAsync())
                 .thenCompose(__ -> validateClustersAsync(newTenantAdmin))
+                .thenCompose(__ -> validateAdminRoleAsync(newTenantAdmin))
                 .thenCompose(__ -> tenantResources().getTenantAsync(tenant))
                 .thenCompose(tenantAdmin -> {
                     if (!tenantAdmin.isPresent()) {
@@ -282,4 +284,18 @@ public class TenantsBase extends PulsarWebResource {
             }
         });
     }
+
+    private CompletableFuture<Void> validateAdminRoleAsync(TenantInfoImpl 
info) {
+        if (info.getAdminRoles() != null && !info.getAdminRoles().isEmpty()) {
+            for (String adminRole : info.getAdminRoles()) {
+                if (!StringUtils.trim(adminRole).equals(adminRole)) {
+                    log.warn("[{}] Failed to validate due to adminRole {} 
contains whitespace in the beginning or end.",
+                            clientAppId(), adminRole);
+                    return FutureUtil.failedFuture(new 
RestException(Status.PRECONDITION_FAILED,
+                            "AdminRoles contains whitespace in the beginning 
or end."));
+                }
+            }
+        }
+        return CompletableFuture.completedFuture(null);
+    }
 }
diff --git 
a/pulsar-broker/src/test/java/org/apache/pulsar/client/api/TenantTest.java 
b/pulsar-broker/src/test/java/org/apache/pulsar/client/api/TenantTest.java
index 15c5d55cbea..e5b5e211582 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/client/api/TenantTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/client/api/TenantTest.java
@@ -34,7 +34,7 @@ public class TenantTest extends MockedPulsarServiceBaseTest {
     @BeforeMethod
     @Override
     protected void setup() throws Exception {
-        
+
     }
 
     @AfterMethod(alwaysRun = true)
@@ -66,5 +66,30 @@ public class TenantTest extends MockedPulsarServiceBaseTest {
             admin.tenants().createTenant("testTenant-unlimited" + i, 
tenantInfo);
         }
     }
-    
+
+    @Test
+    public void testBlankAdminRoleTenant() throws Exception {
+        super.internalSetup();
+        admin.clusters().createCluster("test", 
ClusterData.builder().serviceUrl(brokerUrl.toString()).build());
+        TenantInfoImpl blankAdminRoleTenantInfo =
+                new TenantInfoImpl(Sets.newHashSet(""), 
Sets.newHashSet("test"));
+        TenantInfoImpl containsWhitespaceAdminRoleTenantInfo =
+                new TenantInfoImpl(Sets.newHashSet("   role1   "), 
Sets.newHashSet("test"));
+        TenantInfoImpl noneBlankAdminRoleTenantInfo =
+                new TenantInfoImpl(Sets.newHashSet("role1"), 
Sets.newHashSet("test"));
+        admin.tenants().createTenant("testTenant1", 
noneBlankAdminRoleTenantInfo);
+        try {
+            admin.tenants().createTenant("testTenant2", 
blankAdminRoleTenantInfo);
+        } catch (PulsarAdminException e) {
+            Assert.assertEquals(e.getStatusCode(), 412);
+            Assert.assertEquals(e.getHttpError(), "AdminRoles contains 
whitespace in the beginning or end.");
+        }
+
+        try {
+            admin.tenants().createTenant("testTenant3", 
containsWhitespaceAdminRoleTenantInfo);
+        } catch (PulsarAdminException e) {
+            Assert.assertEquals(e.getStatusCode(), 412);
+            Assert.assertEquals(e.getHttpError(), "AdminRoles contains 
whitespace in the beginning or end.");
+        }
+    }
 }

Reply via email to