[ 
https://issues.apache.org/jira/browse/CAMEL-26322?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Work on CAMEL-26322 started by Andrea Cosentino.
------------------------------------------------
> 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
>            Priority: Major
>             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