[
https://issues.apache.org/jira/browse/CAMEL-25918?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Work on CAMEL-25918 started by Andrea Cosentino.
------------------------------------------------
> camel-as2 - consumers sharing a port use their own asynchronous MDN settings
> ----------------------------------------------------------------------------
>
> Key: CAMEL-25918
> URL: https://issues.apache.org/jira/browse/CAMEL-25918
> Project: Camel
> Issue Type: Bug
> Components: camel-as2
> Reporter: Andrea Cosentino
> Assignee: Andrea Cosentino
> Priority: Major
> Fix For: 4.18.6, 4.22.3, 4.24.0
>
>
> h3. Current behaviour
> {{AS2ConnectionHelper.createAS2ServerConnection}} (camel-as2-component) keeps
> one {{AS2ServerConnection}} per {{serverPortNumber}} and builds it from the
> first endpoint created on that port. CAMEL-22557 made the signing and
> decrypting material per request path
> ({{AS2ServerConnection.AS2ConsumerConfiguration}}, registered by
> {{AS2Consumer.doStart}} for the consumer's {{requestUriPattern}}), but the
> asynchronous MDN settings added by CAMEL-21875, {{mdnUserName}},
> {{mdnPassword}} and {{mdnAccessToken}}, and the later
> {{asyncMdnAllowedHosts}} option are still fields of the shared connection,
> taken from the first endpoint only.
> When several {{as2://server/listen}} consumers share a {{serverPortNumber}}
> with different {{requestUriPattern}} values:
> * {{AS2ServerConnection.handleAsynchronousMDN}} builds the
> {{AS2AsynchronousMDNManager}} with the matched path's signing certificate
> chain and key, but with the first endpoint's {{mdnUserName}},
> {{mdnPassword}}, {{mdnAccessToken}} and {{asyncMdnAllowedHosts}}. An
> asynchronous MDN for a message received on a second consumer's path is
> therefore sent with the first consumer's MDN settings, and the second
> consumer's own values are not used. Nothing is logged about the ignored
> values.
> * A consumer whose {{requestUriPattern}} is the default {{/}} never registers
> its own {{AS2ConsumerConfiguration}} when another endpoint created the
> connection: {{AS2Consumer.doStart}} only registers when
> {{getConfigurationForPath(uri)}} is empty, and the constructor already
> registered a {{/}} fallback built from the creating endpoint.
> * {{AS2ServerConnection.unlisten}} removes only the path's request handler
> and its {{AS2ConsumerConfiguration}}, so the first consumer's MDN settings
> stay in use for the other consumers on the port after the first consumer's
> route is stopped.
> A single consumer per port is not affected. The four options are documented
> as endpoint options, so each consumer is expected to apply its own values.
> h3. Expected behaviour
> Consumers sharing a {{serverPortNumber}} deliver asynchronous MDNs with their
> own {{mdnUserName}}, {{mdnPassword}}, {{mdnAccessToken}} and
> {{asyncMdnAllowedHosts}}, selected by the matched request path in the same
> way as the signing material already is. A consumer that relied on inheriting
> the first consumer's values has to set them itself; this is documented in the
> upgrade guide.
> h3. Change
> * camel-as2-api, {{AS2ServerConnection}}: {{AS2ConsumerConfiguration}}
> carries {{mdnUserName}}, {{mdnPassword}}, {{mdnAccessToken}} and
> {{asyncMdnAllowedHosts}} through a new constructor; the existing
> five-argument constructor stays and delegates with null values.
> {{handleAsynchronousMDN}} builds the {{AS2AsynchronousMDNManager}} from the
> matched {{AS2ConsumerConfiguration}} instead of the connection-level fields.
> The {{/}} fallback configuration registered by the constructor carries the
> constructor's MDN values, so single-consumer and default-path deployments
> behave as before. The javadoc of {{registerConsumerConfiguration}} states
> that each consumer registers its own material for its own pattern.
> * camel-as2-component, {{AS2Consumer.doStart}}: registers the configuration
> with the endpoint's {{getMdnUserName()}}, {{getMdnPassword()}},
> {{getMdnAccessToken()}} and {{getAsyncMdnAllowedHosts()}}, and registers
> (overwrites) the consumer's own configuration for its own
> {{requestUriPattern}} even when the {{/}} fallback already matches it.
> * {{AS2Configuration}}: the javadoc of the four options states that they
> apply per consumer endpoint and that consumers sharing a port each use their
> own; {{as2.json}}, the catalog mirror and {{AS2EndpointBuilderFactory}} are
> regenerated.
> * {{as2-component.adoc}}: a note under Usage that the MDN settings apply per
> consumer path when several consumers share {{serverPortNumber}}.
> * Upgrade guide ({{camel-4x-upgrade-guide-4_24.adoc}}, new camel-as2
> section): consumers that share a {{serverPortNumber}} now deliver
> asynchronous MDNs with their own settings; previously the values of the first
> consumer configured on the port were used for every consumer on it. The
> backports add the same note to the 4.22 and 4.18 guides on main.
> h3. Tests
> * camel-as2-component, {{AS2ServerTwoConsumerAsyncMdnSettingsTest}} (modelled
> on {{AS2AsyncMdnBasicAuthHeaderTest}} and {{AS2ServerTwoConsumerBase}}: two
> consumers on one port with different {{requestUriPattern}} values and a local
> receipt endpoint): the MDN for a message to the second consumer's path
> carries the second consumer's own settings; a second consumer without MDN
> settings sends none although the first consumer has them; the second
> consumer's {{asyncMdnAllowedHosts}} is the one applied to its MDNs; the first
> consumer behaves as before; after the first consumer stops, the remaining
> consumer's settings are used.
> * camel-as2-api, {{AS2ConsumerConfigurationMdnSettingsTest}}: the per-path
> configuration carries the MDN settings and the {{/}} fallback carries the
> constructor's values.
> * Existing tests kept green: {{AS2AsyncMdnBasicAuthHeaderTest}},
> {{AS2AsyncMdnTokenAuthHeaderTest}}, {{AS2AsyncMdnContextReuseTest}},
> {{AS2AsynchronousMDNManagerDeliveryAddressTest}},
> {{AS2ServerTwoConsumerSecEncryptedIT}}.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)