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)

Reply via email to