You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2026/08/06 12:40:01 UTC
(camel) 02/04: CAMEL-24298: Address review feedback
This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch fix/CAMEL-24298-siblings
in repository https://gitbox.apache.org/repos/asf/camel.git
commit c50de5b75b7c6aebcb5bcf55ceeb386a29be2523
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Thu Aug 6 14:00:55 2026 +0200
CAMEL-24298: Address review feedback
- Fix copy constructors in RecipientListDefinition and RoutingSlipDefinition
to copy the allowedSchemes field (would be lost during AdviceWith / route
template instantiation).
- Add positive test verifying an allowed scheme passes through.
- Make allowedSchemes a hard boundary: move the check before the
ignoreInvalidEndpoints catch in RecipientListProcessor and PollEnricher
so a disallowed scheme always fails regardless of ignoreInvalidEndpoints.
Co-Authored-By: Claude Opus 4.6 <no...@anthropic.com>
Signed-off-by: Claus Ibsen <cl...@gmail.com>
---
.../java/org/apache/camel/model/RecipientListDefinition.java | 1 +
.../java/org/apache/camel/model/RoutingSlipDefinition.java | 1 +
.../main/java/org/apache/camel/processor/PollEnricher.java | 11 +++++++++--
.../org/apache/camel/processor/RecipientListProcessor.java | 6 +++---
.../camel/processor/DynamicUriEipAllowedSchemesTest.java | 12 ++++++++++++
5 files changed, 26 insertions(+), 5 deletions(-)
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/RecipientListDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/RecipientListDefinition.java
index 02b3201f83cc..e1a4e72d94ff 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/RecipientListDefinition.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/RecipientListDefinition.java
@@ -140,6 +140,7 @@ public class RecipientListDefinition<Type extends ProcessorDefinition<Type>> ext
this.onPrepare = source.onPrepare;
this.cacheSize = source.cacheSize;
this.shareUnitOfWork = source.shareUnitOfWork;
+ this.allowedSchemes = source.allowedSchemes;
}
public RecipientListDefinition(ExpressionDefinition expression) {
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/RoutingSlipDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/RoutingSlipDefinition.java
index 7f9b41b17031..d0676b567f01 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/RoutingSlipDefinition.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/RoutingSlipDefinition.java
@@ -75,6 +75,7 @@ public class RoutingSlipDefinition<Type extends ProcessorDefinition<Type>> exten
this.uriDelimiter = source.uriDelimiter;
this.ignoreInvalidEndpoints = source.ignoreInvalidEndpoints;
this.cacheSize = source.cacheSize;
+ this.allowedSchemes = source.allowedSchemes;
}
public RoutingSlipDefinition(String headerName) {
diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/PollEnricher.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/PollEnricher.java
index 3b007c702ab6..debcbcfb9742 100644
--- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/PollEnricher.java
+++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/PollEnricher.java
@@ -303,8 +303,15 @@ public class PollEnricher extends BaseProcessorSupport implements IdAware, Route
}
Object targetRecipient = staticUri != null ? staticUri : recipient;
targetRecipient = prepareRecipient(exchange, targetRecipient);
- // enforce the optional allowed-schemes allow-list on the resolved dynamic recipient (CAMEL-24298)
- ProcessorHelper.checkAllowedSchemes(allowedSchemes, targetRecipient);
+ // enforce the optional allowed-schemes allow-list; must throw before the ignoreInvalidEndpoint
+ // catch so that a disallowed scheme is always a hard boundary (CAMEL-24298)
+ try {
+ ProcessorHelper.checkAllowedSchemes(allowedSchemes, targetRecipient);
+ } catch (ResolveEndpointFailedException e) {
+ exchange.setException(e);
+ callback.done(true);
+ return true;
+ }
if (targetRecipient == null) {
if (LOG.isDebugEnabled()) {
LOG.debug("Poll dynamic evaluated as null so cannot poll from any endpoint");
diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/RecipientListProcessor.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/RecipientListProcessor.java
index 4c4f1b253562..52afcf27ca18 100644
--- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/RecipientListProcessor.java
+++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/RecipientListProcessor.java
@@ -257,10 +257,10 @@ public class RecipientListProcessor extends MulticastProcessor {
Endpoint endpoint;
Producer producer;
ExchangePattern pattern;
+ recipient = prepareRecipient(exchange, recipient);
+ // enforce the optional allowed-schemes allow-list before the ignoreInvalidEndpoints catch (CAMEL-24298)
+ ProcessorHelper.checkAllowedSchemes(allowedSchemes, recipient);
try {
- recipient = prepareRecipient(exchange, recipient);
- // enforce the optional allowed-schemes allow-list on the resolved dynamic recipient (CAMEL-24298)
- ProcessorHelper.checkAllowedSchemes(allowedSchemes, recipient);
Endpoint existing = getExistingEndpoint(exchange, recipient);
if (existing == null) {
endpoint = resolveEndpoint(exchange, recipient, prototype);
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/DynamicUriEipAllowedSchemesTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/DynamicUriEipAllowedSchemesTest.java
index e366377204bd..f9906ad016fa 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/DynamicUriEipAllowedSchemesTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/DynamicUriEipAllowedSchemesTest.java
@@ -22,6 +22,7 @@ import org.apache.camel.Exchange;
import org.apache.camel.Header;
import org.apache.camel.ResolveEndpointFailedException;
import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
@@ -33,6 +34,16 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
*/
class DynamicUriEipAllowedSchemesTest extends ContextTestSupport {
+ @Test
+ void recipientListAllowsMatchingScheme() throws Exception {
+ MockEndpoint mock = getMockEndpoint("mock:result");
+ mock.expectedBodiesReceived("Hello");
+
+ template.sendBodyAndHeader("direct:rl-ok", "Hello", "target", "mock:result");
+
+ mock.assertIsSatisfied();
+ }
+
@Test
void recipientListRejectsDisallowedScheme() {
assertRejected("direct:rl");
@@ -78,6 +89,7 @@ class DynamicUriEipAllowedSchemesTest extends ContextTestSupport {
return new RouteBuilder() {
@Override
public void configure() {
+ from("direct:rl-ok").recipientList(header("target")).allowedSchemes("mock");
from("direct:rl").recipientList(header("target")).allowedSchemes("mock");
from("direct:rs").routingSlip(header("target")).allowedSchemes("mock");
from("direct:dr").dynamicRouter(method(DynamicUriEipAllowedSchemesTest.this, "slip")).allowedSchemes("mock");