Federico Mariani created CAMEL-24161:
----------------------------------------
Summary: camel-salesforce - Umbrella: medium-severity findings
from July 2026 review
Key: CAMEL-24161
URL: https://issues.apache.org/jira/browse/CAMEL-24161
Project: Camel
Issue Type: Bug
Components: camel-salesforce
Reporter: Federico Mariani
Attachments: camel-salesforce-review-2026-07.md
Umbrella for the medium-severity findings of the July 2026 review of
camel-salesforce-component on main (4.22.0-SNAPSHOT). Full findings document
attached to the high-severity umbrella; low-severity findings are listed in the
document only.
*Auth / session / HTTP client*
# {{SalesforceLoginConfig:271-275}} — refresh token printed in clear text by
toString() (other secrets are masked) and logged at DEBUG by
SalesforceComponent.doStart.
# {{SalesforceSecurityHandler:256-260}} — multipart create/update cannot be
replayed after 401 re-login: {{body.rewind()}} result ignored and Jetty's
MultiPartFormData.ContentSource does not support rewind -> retry sends an empty
multipart POST.
# {{AbstractClientBase:190-199}} — replay-buffering loop treats Jetty *failure*
chunks (isLast()==true) as normal EOF; a body InputStream failing mid-read
results in a silently truncated request with no local exception.
# {{DefaultRawClient:49-53}} — auth retry produces duplicate X-SFDC-Session
headers (add instead of put; Jetty copyRequest keeps custom headers), stale
token first.
# {{SalesforceSecurityHandler:239-246}} — handler-driven re-logins are
uncoordinated: N concurrent 401'd conversations fire N token requests (no
single-flight like SalesforceSession.login(oldToken)).
*Streaming / Pub/Sub*
# {{SubscriptionHelper:203-209}} — connect-listener NPE when a channel was
unsubscribed concurrently (unsubscribe never removes from channelsToSubscribe);
remaining channels silently never resubscribed after the snapshot was cleared
(same class as CAMEL-20834).
# {{PubSubApiClient:314-321}} — per-event decode failures are swallowed (log
only, exception handler never invoked) while the stored replayId advances past
the lost events; reconnects permanently skip them.
# {{PubSubApiClient:353-369,388-397}} — corrupted replay id with
fallbackToLatestReplayId=false retries the same corrupt id forever; the user's
original replay preset is overwritten on every resubscribe.
# {{PubSubApiClient:382-384}} — reconnect delay grows unboundedly; the
configured maxBackoff is only applied to the login loop.
*REST / Bulk / Composite*
# {{JsonRestProcessor:221-224}} — RESPONSE_CLASS_DEFERRED/RESPONSE_CLASS_PREFIX
exchange properties are not cleaned up (unlike processStreamResultResponse) and
leak into subsequent producers on the same exchange.
# {{CompositeApiProcessor:125-144}} — composite rawPayload mode discards the
exception whenever Salesforce returned an error body (virtually always); HTTP
failures reported as success.
# {{AbstractRestProcessor:545-552}} — deleteSObjectWithId restores DTO fields
*after* completing the exchange (all sibling operations restore before);
related: {{AbstractRestProcessor:480-539}} NPEs (instead of falling back to the
sObjectIdValue header) when the DTO's external-id field is unset.
_This issue was researched and filed by Claude Code (AI) on behalf of Federico
Mariani (fmariani). Full findings document from the review is attached to the
umbrella issues._
--
This message was sent by Atlassian Jira
(v8.20.10#820010)