Andrea Cosentino created CAMEL-26322:
----------------------------------------
Summary: camel-as2 - match the async MDN delivery allow-list on
host and port
Key: CAMEL-26322
URL: https://issues.apache.org/jira/browse/CAMEL-26322
Project: Camel
Issue Type: Improvement
Components: camel-as2
Reporter: Andrea Cosentino
Assignee: Andrea Cosentino
Fix For: 4.24.0
h3. Background
camel-as2 can request an asynchronous MDN (Message Disposition Notification).
When one is requested, {{AS2AsynchronousMDNManager.send()}} resolves the
delivery address from the sender-supplied {{Receipt-Delivery-Option}} URI and
opens a connection to it.
The {{asyncMdnAllowedHosts}} option on {{AS2Configuration}} (documented today
as "Comma separated list of host names an asynchronous MDN may be delivered
to") governs whether the asynchronous MDN is delivered to the resolved address
and whether the configured MDN credentials ({{mdnUserName}} / {{mdnPassword}} /
{{mdnAccessToken}}) are attached to it.
h3. Current behaviour
{{send()}} resolves both the host and the port of the delivery address (the
port via {{uri.getPort()}}, defaulted to 80 or 443 by scheme). The allow-list
match {{isAllowedHost(String host)}} then compares only the *host*: it splits
{{asyncMdnAllowedHosts}} on commas and does a case-insensitive equals against
the host. The resolved port is used to open the socket but is never compared
against the allow-list. An operator can therefore list a host, but every port
on that listed host is treated the same, both for delivery and for attaching
the credentials.
h3. Behaviour after the change
The allow-list match considers the full authority - host *and* port - of the
resolved delivery address, so the port is checked before the connection is
opened and before the credentials are attached. Each {{asyncMdnAllowedHosts}}
entry may carry an optional port in {{host:port}} form. A bare-host entry (for
example {{partner.example}}) matches only the default port for its scheme (80
or 443); an operator that receives asynchronous MDNs on a non-default port
lists it explicitly (for example {{partner.example:8443}}).
h3. Classes involved
*
{{components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2AsynchronousMDNManager.java}}
- the allow-list match {{isAllowedHost(...)}} (host-only today), the resolved
{{port}}, and the points where the connection is opened ({{createSocket}}) and
the credentials are attached ({{addAuthorizationHeader}}).
*
{{components/camel-as2/camel-as2-component/src/main/java/org/apache/camel/component/as2/AS2Configuration.java}}
- the {{asyncMdnAllowedHosts}} option and its description.
h3. Code-level change
* Replace {{isAllowedHost(String host)}} with an authority match that also
takes the resolved port (for example {{isAllowedAuthority(String host, int
port)}}): parse each {{asyncMdnAllowedHosts}} entry as {{host[:port]}} and
compare both the host (case-insensitive) and the port (default-port aware).
* Pass the already-resolved {{port}} into the match, so the single
{{hostIsAllowed}} decision that gates the connection and the attachment of
credentials now accounts for the port.
* Update the {{asyncMdnAllowedHosts}} description on {{AS2Configuration}} to
document the {{host[:port]}} form and the default-port rule, then regenerate
the catalog/component metadata.
h3. Tests
New JUnit methods in {{AS2AsynchronousMDNManagerDeliveryAddressTest}} (that
class uses JUnit assertions, so new methods there stay JUnit to match the file):
* a delivery address whose port is outside every allow-list entry is refused;
* a delivery address whose host and port both match an entry is accepted;
* a bare-host entry matches only the default port for its scheme.
Each new test is shown failing against the current code and passing after the
change.
h3. Documentation
The default-port behaviour above is a change for an operator that today lists a
bare host and delivers to a non-default port, so add a note to
{{docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_24.adoc}} on
{{main}} describing the {{host[:port]}} matching and the default-port rule.
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)