You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by te...@apache.org on 2024/12/17 03:38:19 UTC
(pulsar) branch master updated: [fix][admin] Verify is policies read only before revoke permissions on topic (#23730)
This is an automated email from the ASF dual-hosted git repository.
technoboy 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 069cc3db7c7 [fix][admin] Verify is policies read only before revoke permissions on topic (#23730)
069cc3db7c7 is described below
commit 069cc3db7c741a7b1fc64c79733ada847dca873e
Author: 道君 <da...@apache.org>
AuthorDate: Tue Dec 17 11:38:13 2024 +0800
[fix][admin] Verify is policies read only before revoke permissions on topic (#23730)
---
.../broker/admin/impl/PersistentTopicsBase.java | 3 ++-
.../pulsar/broker/admin/PersistentTopicsTest.java | 30 ++++++++++++++++++++++
2 files changed, 32 insertions(+), 1 deletion(-)
diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/PersistentTopicsBase.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/PersistentTopicsBase.java
index 9a306f6b4ff..1300cd3449c 100644
--- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/PersistentTopicsBase.java
+++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/PersistentTopicsBase.java
@@ -289,7 +289,8 @@ public class PersistentTopicsBase extends AdminResource {
protected void internalRevokePermissionsOnTopic(AsyncResponse asyncResponse, String role) {
// This operation should be reading from zookeeper and it should be allowed without having admin privileges
CompletableFuture<Void> validateAccessForTenantCf =
- validateAdminAccessForTenantAsync(namespaceName.getTenant());
+ validateAdminAccessForTenantAsync(namespaceName.getTenant())
+ .thenCompose(__ -> validatePoliciesReadOnlyAccessAsync());
var checkIfTopicExists = !pulsar().getConfiguration().isAllowAclChangesOnNonExistentTopics();
if (checkIfTopicExists) {
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/PersistentTopicsTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/PersistentTopicsTest.java
index cca5049ed50..30294890344 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/PersistentTopicsTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/PersistentTopicsTest.java
@@ -1030,6 +1030,36 @@ public class PersistentTopicsTest extends MockedPulsarServiceBaseTest {
}
}
+ @Test
+ public void testRevokePartitionedTopicWithReadonlyPolicies() throws Exception {
+ final String partitionedTopicName = "testRevokePartitionedTopicWithReadonlyPolicies-topic";
+ final int numPartitions = 5;
+ AsyncResponse response = mock(AsyncResponse.class);
+ ArgumentCaptor<Response> responseCaptor = ArgumentCaptor.forClass(Response.class);
+ persistentTopics.createPartitionedTopic(
+ response, testTenant, testNamespace, partitionedTopicName, numPartitions, true);
+ verify(response, timeout(5000).times(1)).resume(responseCaptor.capture());
+ Assert.assertEquals(responseCaptor.getValue().getStatus(), Response.Status.NO_CONTENT.getStatusCode());
+ String role = "role";
+ Set<AuthAction> expectActions = new HashSet<>();
+ expectActions.add(AuthAction.produce);
+ response = mock(AsyncResponse.class);
+ responseCaptor = ArgumentCaptor.forClass(Response.class);
+ persistentTopics.grantPermissionsOnTopic(response, testTenant, testNamespace, partitionedTopicName, role,
+ expectActions);
+ verify(response, timeout(5000).times(1)).resume(responseCaptor.capture());
+ Assert.assertEquals(responseCaptor.getValue().getStatus(), Response.Status.NO_CONTENT.getStatusCode());
+ response = mock(AsyncResponse.class);
+ doReturn(CompletableFuture.failedFuture(
+ new RestException(Response.Status.FORBIDDEN, "Broker is forbidden to do read-write operations"))
+ ).when(persistentTopics).validatePoliciesReadOnlyAccessAsync();
+ persistentTopics.revokePermissionsOnTopic(response, testTenant, testNamespace, partitionedTopicName, role);
+ ArgumentCaptor<RestException> exceptionCaptor = ArgumentCaptor.forClass(RestException.class);
+ verify(response, timeout(5000).times(1)).resume(exceptionCaptor.capture());
+ Assert.assertEquals(exceptionCaptor.getValue().getResponse().getStatus(),
+ Response.Status.FORBIDDEN.getStatusCode());
+ }
+
@Test
public void testTriggerCompactionTopic() {
final String partitionTopicName = "test-part";