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

jamesnetherton pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git


The following commit(s) were added to refs/heads/main by this push:
     new 318f9eb615 Enable Jolokia Camel restrictor allowed MBean domains to be 
configurable
318f9eb615 is described below

commit 318f9eb615a920237e0929864169190c131fa24c
Author: James Netherton <[email protected]>
AuthorDate: Tue Feb 25 11:18:55 2025 +0000

    Enable Jolokia Camel restrictor allowed MBean domains to be configurable
    
    Fixes #7051
---
 .../ROOT/pages/reference/extensions/jolokia.adoc   | 22 ++++++++--
 .../jolokia/runtime/src/main/doc/usage.adoc        | 13 +++++-
 .../jolokia/config/JolokiaBuildTimeConfig.java     |  8 ++++
 .../jolokia/restrictor/CamelJolokiaRestrictor.java | 10 ++++-
 ...ava => JolokiaCustomRestrictorDomainsTest.java} | 48 ++++++++++++----------
 .../quarkus/component/jolokia/it/JolokiaTest.java  | 30 ++++++++++++++
 6 files changed, 102 insertions(+), 29 deletions(-)

diff --git a/docs/modules/ROOT/pages/reference/extensions/jolokia.adoc 
b/docs/modules/ROOT/pages/reference/extensions/jolokia.adoc
index 67d3cf7c3f..513186eef7 100644
--- a/docs/modules/ROOT/pages/reference/extensions/jolokia.adoc
+++ b/docs/modules/ROOT/pages/reference/extensions/jolokia.adoc
@@ -84,10 +84,20 @@ By default, a Jolokia restrictor is automatically 
registered that exposes access
 * `java.lang`
 * `java.nio`
 
-If this is too restrictive, then you can either disable the default 
restrictor, or create your own custom restrictor.
+If this is too restrictive, then you can either specify your own MBean 
domains, disable the default restrictor, or create a custom restrictor.
 
-[id="extensions-jolokia-usage-disable-the-default-restrictor"]
-==== Disable the default restrictor
+[id="extensions-jolokia-usage-default-restrictor-mbean-domains"]
+==== Default restrictor MBean domains
+
+You can modify the set of MBean domains referenced by the default restrictor 
by adding configuration like the following to `application.properties`.
+
+[source]
+----
+quarkus.camel.jolokia.camel-restrictor-allowed-mbean-domains=org.apache.camel
+----
+
+[id="extensions-jolokia-usage-disabling-the-default-restrictor"]
+==== Disabling the default restrictor
 
 The following configuration added to `application.properties` disables the 
default restrictor.
 
@@ -182,6 +192,12 @@ have quarkus-vertx-http on the application classpath.
 | `boolean`
 | `true`
 
+|icon:lock[title=Fixed at build time] 
[[quarkus.camel.jolokia.camel-restrictor-allowed-mbean-domains]]`link:#quarkus.camel.jolokia.camel-restrictor-allowed-mbean-domains[quarkus.camel.jolokia.camel-restrictor-allowed-mbean-domains]`
+
+Comma separated list of allowed MBean domains used by CamelJolokiaRestrictor.
+| List of `string`
+| `org.apache.camel,java.lang,java.nio`
+
 |icon:lock[title=Fixed at build time] 
[[quarkus.camel.jolokia.kubernetes.expose-container-port]]`link:#quarkus.camel.jolokia.kubernetes.expose-container-port[quarkus.camel.jolokia.kubernetes.expose-container-port]`
 
 When {@code true} and the quarkus-kubernetes extension is present, a container 
port named jolokia will
diff --git a/extensions-jvm/jolokia/runtime/src/main/doc/usage.adoc 
b/extensions-jvm/jolokia/runtime/src/main/doc/usage.adoc
index 4da0826ee9..dfc0345318 100644
--- a/extensions-jvm/jolokia/runtime/src/main/doc/usage.adoc
+++ b/extensions-jvm/jolokia/runtime/src/main/doc/usage.adoc
@@ -44,9 +44,18 @@ By default, a Jolokia restrictor is automatically registered 
that exposes access
 * `java.lang`
 * `java.nio`
 
-If this is too restrictive, then you can either disable the default 
restrictor, or create your own custom restrictor.
+If this is too restrictive, then you can either specify your own MBean 
domains, disable the default restrictor, or create a custom restrictor.
 
-==== Disable the default restrictor
+==== Default restrictor MBean domains
+
+You can modify the set of MBean domains referenced by the default restrictor 
by adding configuration like the following to `application.properties`.
+
+[source]
+----
+quarkus.camel.jolokia.camel-restrictor-allowed-mbean-domains=org.apache.camel
+----
+
+==== Disabling the default restrictor
 
 The following configuration added to `application.properties` disables the 
default restrictor.
 
diff --git 
a/extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/config/JolokiaBuildTimeConfig.java
 
b/extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/config/JolokiaBuildTimeConfig.java
index afa7dcf180..97cd06cd55 100644
--- 
a/extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/config/JolokiaBuildTimeConfig.java
+++ 
b/extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/config/JolokiaBuildTimeConfig.java
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.quarkus.jolokia.config;
 
+import java.util.Set;
+
 import io.quarkus.runtime.annotations.ConfigPhase;
 import io.quarkus.runtime.annotations.ConfigRoot;
 import io.smallrye.config.ConfigMapping;
@@ -47,6 +49,12 @@ public interface JolokiaBuildTimeConfig {
     @WithDefault("true")
     boolean registerManagementEndpoint();
 
+    /**
+     * Comma separated list of allowed MBean domains used by 
CamelJolokiaRestrictor.
+     */
+    @WithDefault("org.apache.camel,java.lang,java.nio")
+    Set<String> camelRestrictorAllowedMbeanDomains();
+
     /**
      * Jolokia Kubernetes build time configuration.
      */
diff --git 
a/extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/restrictor/CamelJolokiaRestrictor.java
 
b/extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/restrictor/CamelJolokiaRestrictor.java
index 43b5016792..225a41dfec 100644
--- 
a/extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/restrictor/CamelJolokiaRestrictor.java
+++ 
b/extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/restrictor/CamelJolokiaRestrictor.java
@@ -16,14 +16,20 @@
  */
 package org.apache.camel.quarkus.jolokia.restrictor;
 
-import java.util.List;
+import java.util.Set;
 
 import javax.management.ObjectName;
 
+import io.smallrye.config.SmallRyeConfig;
+import org.apache.camel.quarkus.jolokia.config.JolokiaBuildTimeConfig;
+import org.eclipse.microprofile.config.ConfigProvider;
 import org.jolokia.server.core.restrictor.AllowAllRestrictor;
 
 public final class CamelJolokiaRestrictor extends AllowAllRestrictor {
-    private static final List<String> ALLOWED_DOMAINS = 
List.of("org.apache.camel", "java.lang", "java.nio");
+    private static final Set<String> ALLOWED_DOMAINS = 
ConfigProvider.getConfig()
+            .unwrap(SmallRyeConfig.class)
+            .getConfigMapping(JolokiaBuildTimeConfig.class)
+            .camelRestrictorAllowedMbeanDomains();
 
     @Override
     public boolean isAttributeReadAllowed(ObjectName objectName, String 
attribute) {
diff --git 
a/integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaTest.java
 
b/integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomRestrictorDomainsTest.java
similarity index 53%
copy from 
integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaTest.java
copy to 
integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomRestrictorDomainsTest.java
index fd90c66e21..526ac4b69d 100644
--- 
a/integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaTest.java
+++ 
b/integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomRestrictorDomainsTest.java
@@ -16,53 +16,57 @@
  */
 package org.apache.camel.quarkus.component.jolokia.it;
 
+import java.util.Map;
+
 import io.quarkus.test.junit.QuarkusTest;
+import io.quarkus.test.junit.QuarkusTestProfile;
+import io.quarkus.test.junit.TestProfile;
 import io.restassured.RestAssured;
-import io.restassured.http.ContentType;
-import org.apache.camel.quarkus.jolokia.restrictor.CamelJolokiaRestrictor;
-import org.eclipse.microprofile.config.ConfigProvider;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
 import static org.hamcrest.Matchers.equalTo;
 
+@TestProfile(JolokiaCustomRestrictorDomainsTest.JolokiaAdditionalPropertiesProfile.class)
 @QuarkusTest
-class JolokiaTest {
+class JolokiaCustomRestrictorDomainsTest {
     @BeforeEach
     public void beforeEach() {
         RestAssured.port = 8778;
     }
 
     @Test
-    void defaultConfiguration() {
+    void customMBeanAllowDomains() {
+        // Verify org.apache.camel domain allowed
         RestAssured.given()
-                .get("/jolokia/")
+                
.get("/jolokia/read/org.apache.camel:context=camel-1,type=context,name=\"camel-1\"/CamelId")
                 .then()
                 .statusCode(200)
                 .body(
                         "status", equalTo(200),
-                        "value.config.discoveryEnabled", equalTo("true"),
-                        "value.config.restrictorClass", 
equalTo(CamelJolokiaRestrictor.class.getName()),
-                        "value.config.agentDescription", 
equalTo("camel-quarkus-integration-test-jolokia"),
-                        "value.details.url", 
equalTo("http://127.0.0.1:8778/jolokia/";));
-    }
+                        "value", equalTo("camel-1"));
 
-    @Test
-    void sendMessage() {
-        String jolokiaPayload = 
"{\"type\":\"exec\",\"mbean\":\"org.apache.camel:context=camel-1,type=context,name=\\\"camel-1\\\"\",\"operation\":\"sendStringBody(java.lang.String,
 java.lang.String)\",\"arguments\":[\"direct://start\",\"Hello World\"]}";
+        // Verify java.lang domain disallowed
         RestAssured.given()
-                .contentType(ContentType.JSON)
-                .body(jolokiaPayload)
-                .post("/jolokia/")
+                
.get("/jolokia/read/java.lang:type=ClassLoading/LoadedClassCount")
                 .then()
                 .statusCode(200)
-                .body("status", equalTo(200));
-
-        RestAssured.port = 
ConfigProvider.getConfig().getValue("quarkus.http.test-port", Integer.class);
+                .body(
+                        "status", equalTo(403));
 
-        RestAssured.get("/jolokia/message/get")
+        // Verify java.nio domain disallowed
+        RestAssured.given()
+                
.get("/jolokia/read/java.nio:type=BufferPool,name=direct/MemoryUsed")
                 .then()
                 .statusCode(200)
-                .body(equalTo("Hello World"));
+                .body(
+                        "status", equalTo(403));
+    }
+
+    public static final class JolokiaAdditionalPropertiesProfile implements 
QuarkusTestProfile {
+        @Override
+        public Map<String, String> getConfigOverrides() {
+            return 
Map.of("quarkus.camel.jolokia.camel-restrictor-allowed-mbean-domains", 
"org.apache.camel");
+        }
     }
 }
diff --git 
a/integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaTest.java
 
b/integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaTest.java
index fd90c66e21..6b3c686941 100644
--- 
a/integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaTest.java
+++ 
b/integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaTest.java
@@ -25,6 +25,7 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
 import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.greaterThanOrEqualTo;
 
 @QuarkusTest
 class JolokiaTest {
@@ -65,4 +66,33 @@ class JolokiaTest {
                 .statusCode(200)
                 .body(equalTo("Hello World"));
     }
+
+    @Test
+    void additionalAllowedDefaultMBeanDomains() {
+        // Verify java.lang domain
+        RestAssured.given()
+                
.get("/jolokia/read/java.lang:type=ClassLoading/LoadedClassCount")
+                .then()
+                .statusCode(200)
+                .body(
+                        "status", equalTo(200),
+                        "value", greaterThanOrEqualTo(0));
+
+        // Verify java.nio domain
+        RestAssured.given()
+                
.get("/jolokia/read/java.nio:type=BufferPool,name=direct/MemoryUsed")
+                .then()
+                .statusCode(200)
+                .body(
+                        "status", equalTo(200),
+                        "value", greaterThanOrEqualTo(0));
+
+        // Disallowed domain
+        RestAssured.given()
+                
.get("/jolokia/read/java.util.logging:type=Logging/LoggerNames")
+                .then()
+                .statusCode(200)
+                .body(
+                        "status", equalTo(403));
+    }
 }

Reply via email to