You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by "allthingssecurity (via GitHub)" <gi...@apache.org> on 2026/10/08 00:04:08 UTC
[PR] CAMEL-25412: camel-file - resolve symbolic links when enforcing jailStartingDirectory [camel]
allthingssecurity opened a new pull request, #27522:
URL: https://github.com/apache/camel/pull/27522
# Description
[CAMEL-25412](https://issues.apache.org/jira/browse/CAMEL-25412)
Consistency follow-up to CAMEL-24627 (and CAMEL-24487). Thanks @oscerd for filing the issue.
`jailStartingDirectory` (default `true`) is checked lexically for the file producer (`GenericFileProducer.createFileName`) and was a no-op for the local file consumer (`GenericFileConsumer.isWithinStartingDirectory` returns `true` and `FileConsumer` did not override it), while the file I/O follows symbolic links. CAMEL-24627 already made the same option resolve links for `localWorkDirectory` downloads, and CAMEL-24487 gave the remote consumers their own containment check. This change brings the local file producer target and the local consumer listing to the same level:
- `GenericFileHelper.isWithinDirectoryResolvingLinks(Path, Path)` (new, public) reuses the CAMEL-24627 helper `resolveExistingPathSegments` (now package-private) on both paths.
- `FileConsumer` overrides `isWithinStartingDirectory`: a listed file, or with `recursive=true` a listed directory, whose resolved path lies outside the resolved starting directory is skipped. A link that cannot be resolved (dangling) is skipped as well. The starting directory is resolved once per poll.
- `FileOperations.storeFile` and `storeFileDirectly` (the checksum file of `checksumFileAlgorithm`) reject a target that is lexically inside the starting directory but resolves outside of it, including a dangling link, with `GenericFileOperationFailedException`. Targets that are lexically outside the starting directory are not checked, so a `tempFileName` such as `../work/...` keeps working (CAMEL-15544, `FileProduceTempFileNameTest.testParentTempFileName`).
- `GenericFileConsumer.isValidFile` logs a file skipped by the containment check at WARN the first time and at DEBUG on later polls (a bounded LRU of 1000 paths, cleared on stop), as such a file usually stays in place and is listed again by every poll. This applies to the remote file consumers too.
Links that resolve inside the starting directory, and a starting directory that is itself reached through a link, work as before. As with CAMEL-24627 there is no new option; `jailStartingDirectory=false` keeps the previous behaviour (for the producer it also turns off the lexical `../` check). Upgrade-guide note under a new `=== camel-file - jailStartingDirectory resolves symbolic links` placed next to the CAMEL-24627 entry, and a short section in `file-component.adoc` (catalog copy updated).
Cost: with `jailStartingDirectory=true`, one `toRealPath` per listed entry for the local consumer (plus one per poll for the starting directory), and two per written file (and per checksum file) for the producer. Remote producers and consumers are unchanged apart from the log level of repeated skips.
Limits (not changed here):
- The check and the following read or write are not atomic; a complete solution would open with `NOFOLLOW_LINKS`, which is a larger change.
- With `autoCreate=true` the producer creates missing parent directories before `storeFile` runs, so for a name like `link/new/x.txt` the empty directory `new` can be created in the link target before the write is rejected (from reading the code, not tested).
- The rename of a `tempFileName` to the final name is not checked. With the default rename it replaces a link at the final name rather than following it. The temp file is checked when it is written, unless it is lexically outside the starting directory: the temp name is placed next to the target, so only a `tempFileName` that climbs out by more levels than the target is deep (for example `../../work/${file:onlyname}` for `link/x.txt`) would be written outside and then renamed through the linked directory.
- Consumer moves (`move`, `preMove`, `moveFailed`) are not checked.
Tests (camel-core, package-private JUnit 5, no sleeps; each test aborts through an assumption where symbolic links cannot be created, such as Windows without the privilege):
- `FileProducerJailStartingDirectorySymlinkTest` (8): a directory link, a file link, a dangling link, `link/../x.txt`, and a checksum file link to outside are rejected and nothing outside is written; links inside the starting directory are followed; `../` is still rejected by the lexical check; `jailStartingDirectory=false` follows a directory link.
- `FileConsumerJailStartingDirectorySymlinkTest` (5): a file link to outside is not part of the batch and is reported at WARN once over at least three polls (Awaitility on the captured log events); a directory link to outside is not entered with `recursive=true`; file and directory links inside are consumed; a starting directory reached through a link is consumed; `jailStartingDirectory=false` consumes a link to outside.
On main's production code (run twice, same result each time) 7 of the 13 tests fail; the other 6 are the controls above and pass on main by design:
```
FileConsumerJailStartingDirectorySymlinkTest.directoryLinkToOutsideIsNotEnteredWhenRecursive ... exchangeProperty(CamelBatchSize) == 1 evaluated as: 2 == 1
FileConsumerJailStartingDirectorySymlinkTest.fileLinkToOutsideIsSkippedAndReportedOnce mock://result Body of message: 0. Expected: <Hello World> but was: <Outside>
FileProducerJailStartingDirectorySymlinkTest.checksumFileLinkToOutsideIsRejected ... Expected org.apache.camel.CamelExecutionException to be thrown, but nothing was thrown.
FileProducerJailStartingDirectorySymlinkTest.danglingLinkToOutsideIsRejected ... (same)
FileProducerJailStartingDirectorySymlinkTest.directoryLinkToOutsideIsRejected ... (same)
FileProducerJailStartingDirectorySymlinkTest.fileLinkToOutsideIsRejected ... (same)
FileProducerJailStartingDirectorySymlinkTest.parentSegmentAfterDirectoryLinkIsRejected ... (same)
```
With the change: camel-core `org.apache.camel.component.file.**` 457 tests pass (12 skipped, none of them new), camel-file 24 pass. camel-ftp: 80 unit tests (9 skipped) and 374 integration tests against the embedded FTP/FTPS/SFTP servers (17 skipped) pass, including `RemoteFileConsumerStartingDirectoryJailTest` and `FtpProducerJailStartingDirectoryIT`. The camel-smb tests need a Samba container and were skipped here (no Docker). Run on macOS with JDK 21.
# Target
- [x] I checked that the commit is targeting the correct branch (Camel 4 uses the `main` branch)
# Tracking
- [x] If this is a large change, bug fix, or code improvement, I checked there is a [JIRA issue](https://issues.apache.org/jira/browse/CAMEL) filed for the change (usually before you start working on it).
# Apache Camel coding standards and style
- [x] I checked that each commit in the pull request has a meaningful subject line and body.
- [ ] I have run `mvn clean install -DskipTests` locally from root folder and I have committed all auto-generated changes.
(I built and tested the affected modules with `-am`, including the formatter and import-sort plugins, and copied the changed component doc to the catalog. I did not run the full root build.)
# AI-assisted contributions
- [x] If this PR includes AI-generated code, commits have proper co-authorship attribution (e.g., `Co-authored-by` trailers) and the PR description identifies the AI tool used.
This PR was prepared with Claude Code (Claude Opus 5.5). The commit carries a `Co-Authored-By` trailer.
_Claude Code on behalf of allthingssecurity_
π€ Generated with [Claude Code](https://claude.com/claude-code)
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] CAMEL-25412: camel-file - resolve symbolic links when enforcing jailStartingDirectory [camel]
Posted by "gnodet (via GitHub)" <gi...@apache.org>.
gnodet commented on PR #27522:
URL: https://github.com/apache/camel/pull/27522#issuecomment-6060756877
β
Backport to `camel-4.18.x` created: https://github.com/apache/camel/pull/27574
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] CAMEL-25412: camel-file - resolve symbolic links when enforcing jailStartingDirectory [camel]
Posted by "gnodet (via GitHub)" <gi...@apache.org>.
gnodet commented on PR #27522:
URL: https://github.com/apache/camel/pull/27522#issuecomment-6060709355
<!-- camel-backport-bot -->
### π Backport Bot
**Conflicts (π€ agent dispatched to resolve):**
- β οΈ `camel-4.22.x` β Cherry-pick conflict in: docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_23.adoc
- β οΈ `camel-4.18.x` β Cherry-pick conflict in: catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/file-component.adoc, docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_23.adoc
βΉοΈ If you push additional commits after `/port`, use `/port` again to update the port PRs.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] CAMEL-25412: camel-file - resolve symbolic links when enforcing jailStartingDirectory [camel]
Posted by "allthingssecurity (via GitHub)" <gi...@apache.org>.
allthingssecurity commented on code in PR #27522:
URL: https://github.com/apache/camel/pull/27522#discussion_r4215986454
##########
components/camel-file/src/main/java/org/apache/camel/component/file/FileOperations.java:
##########
@@ -256,11 +257,40 @@ public void releaseRetrievedFileResources(Exchange exchange) throws GenericFileO
// java.io.File
}
+ /**
+ * The jailStartingDirectory check of the producer is lexical (see {@code GenericFileProducer.createFileName}), so a
+ * symbolic link inside the starting directory (a link to a file, or a directory segment of the name) would redirect
+ * the write outside of it. Only paths that are lexically inside the starting directory are checked, so a
+ * tempFileName the route author placed outside of it (such as ../work) keeps working.
+ */
+ private void jailToStartingDirectory(File target) {
Review Comment:
Done in e7517e136a56. The producer now runs the starting-directory check on the target before it creates the missing parent directories (lexically outside paths are still skipped). I put the call in `GenericFileProducer.writeFile` rather than in `FileOperations.buildDirectory`, because the consumer moves (`move`, `preMove`, `moveFailed`) also go through `buildDirectory`, and a check there would start rejecting e.g. `move=archive/${date:now:yyyyMMdd}` when `archive` links to another disk. New test `missingDirectoryBelowDirectoryLinkToOutsideIsNotCreated` (`link/new/hello.txt` is rejected and `elsewhere/new` does not exist) fails with that change reverted; camel-core file tests 458 pass, camel-file 24 pass.
_Claude Code on behalf of allthingssecurity_
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] CAMEL-25412: camel-file - resolve symbolic links when enforcing jailStartingDirectory [camel]
Posted by "github-actions[bot] (via GitHub)" <gi...@apache.org>.
github-actions[bot] commented on PR #27522:
URL: https://github.com/apache/camel/pull/27522#issuecomment-6053484474
<!-- ci-tested-modules -->
:test_tube: **CI tested the following changed modules:**
- `catalog/camel-catalog`
- `components/camel-file`
- `core/camel-core`
- `docs`
> :information_source: Dependent modules were not tested because the total number of affected modules exceeded the threshold (50). Use the `test-dependents` label to force testing all dependents.
:repeat: **3 tests passed only after a retry on JDK 25** (3 retried attempts)
<details><summary>Recovered flaky tests on JDK 25 (3)</summary>
| Module | Test | Failed attempts | First failure |
| --- | --- | --- | --- |
| `core/camel-core` | `LimitedPollingConsumerPollStrategyTest.testTwoConsumersLimitedPollingConsumerPollStrategy` | 1 | Should still be started ==> expected: <true> but was: <false> |
| `core/camel-core` | `StopTimeoutRouteTest.testStopTimeout` | 1 | mock://foo Body of message: 0. Expected: <Hello Foo> but was: <Hello World> |
| `core/camel-core` | `SplitterParallelAsyncProcessorIssueTest.testSplitParallelProcessingMaxThreads` | 1 | Should not use more than 4 threads, was: 5 ==> expected: <true> but was: <false> |
> :information_source: These tests did **not** fail the build. Surefire retried them and they passed.
> Retries are enabled project-wide by `surefire.rerunFailingTestsCount` in `parent/pom.xml`.
</details>
---
<details><summary>:microscope: Scalpel shadow comparison β Scalpel: 483 of 700 tested, 26 compile-only β current: 487 all tested</summary>
[Maveniverse Scalpel](https://github.com/maveniverse/scalpel) detected **483 affected modules** (current approach: 487).
**Skip-tests mode would test 483 modules** (4 direct + 481 downstream), **skip tests for 26** (generated code, meta-modules)
<details><summary>Modules only in current approach (4)</summary>
- `camel-debug`
- `camel-google-common`
- `camel-jbang-console`
- `camel-test-infra-core`
</details>
<details><summary>Modules Scalpel would test (483)</summary>
- `archetypes` β downstream of org.apache.camel:camel-test-junit6
- `camel-a2a` β downstream of org.apache.camel:camel-test-junit6
- `camel-activemq` β downstream of org.apache.camel:camel-test-infra-artemis
- `camel-activemq6` β downstream of org.apache.camel:camel-test-infra-artemis
- `camel-ai-observability` β downstream of org.apache.camel:camel-test-junit6
- `camel-ai-observability-api` β downstream of org.apache.camel:camel-test-junit6
- `camel-ai-resource` β downstream of org.apache.camel:camel-test-junit6
- `camel-ai-tool` β downstream of org.apache.camel:camel-test-junit6
- `camel-alibaba-eventbridge` β downstream of org.apache.camel:camel-test-junit6
- `camel-alibaba-fc` β downstream of org.apache.camel:camel-test-junit6
- `camel-alibaba-kms` β downstream of org.apache.camel:camel-test-junit6
- `camel-alibaba-mns` β downstream of org.apache.camel:camel-test-junit6
- `camel-alibaba-oss` β downstream of org.apache.camel:camel-test-junit6
- `camel-alibaba-ots` β downstream of org.apache.camel:camel-test-junit6
- `camel-alibaba-sls` β downstream of org.apache.camel:camel-test-junit6
- `camel-alibaba-sms` β downstream of org.apache.camel:camel-test-junit6
- `camel-amqp` β downstream of org.apache.camel:camel-test-junit6
- `camel-api-component-maven-plugin` β downstream of org.apache.camel:camel-test-junit6
- `camel-arangodb` β downstream of org.apache.camel:camel-test-junit6
- `camel-archetype-api-component` β downstream of org.apache.camel:camel-test-junit6
- `camel-archetype-component` β downstream of org.apache.camel:camel-test-junit6
- `camel-archetype-dataformat` β downstream of org.apache.camel:camel-test-junit6
- `camel-archetype-java` β downstream of org.apache.camel:camel-test-junit6
- `camel-archetype-main` β downstream of org.apache.camel:camel-test-junit6
- `camel-as2` β downstream of org.apache.camel:camel-test-junit6
- `camel-as2-api` β downstream of org.apache.camel:camel-test-junit6
- `camel-asn1` β downstream of org.apache.camel:camel-test-junit6
- `camel-asterisk` β downstream of org.apache.camel:camel-test-junit6
- `camel-atmosphere-websocket` β downstream of org.apache.camel:camel-test-junit6
- `camel-atom` β downstream of org.apache.camel:camel-test-junit6
- `camel-attachments` β downstream of org.apache.camel:camel-test-junit6
- `camel-avro` β downstream of org.apache.camel:camel-test-junit6
- `camel-avro-rpc` β downstream of org.apache.camel:camel-test-junit6
- `camel-aws-bedrock` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-aws-cloudtrail` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-aws-config` β downstream of org.apache.camel:camel-test-junit6
- `camel-aws-parameter-store` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-aws-secrets-manager` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-aws-security-hub` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-aws2-athena` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-aws2-comprehend` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-aws2-cw` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-aws2-ddb` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-aws2-ec2` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-aws2-ecs` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-aws2-eks` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-aws2-eventbridge` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-aws2-iam` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-aws2-kinesis` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-aws2-kms` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-aws2-lambda` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-aws2-mq` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-aws2-msk` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-aws2-polly` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-aws2-redshift` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-aws2-rekognition` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-aws2-s3` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-aws2-s3-vectors` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-aws2-ses` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-aws2-sns` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-aws2-sqs` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-aws2-step-functions` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-aws2-sts` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-aws2-textract` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-aws2-timestream` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-aws2-transcribe` β downstream of org.apache.camel:camel-test-junit6
- `camel-aws2-translate` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-azure-cosmosdb` β downstream of org.apache.camel:camel-test-junit6
- `camel-azure-eventgrid` β downstream of org.apache.camel:camel-test-junit6
- `camel-azure-eventhubs` β downstream of org.apache.camel:camel-test-junit6
- `camel-azure-files` β downstream of org.apache.camel:camel-test-junit6
- `camel-azure-functions` β downstream of org.apache.camel:camel-test-junit6
- `camel-azure-key-vault` β downstream of org.apache.camel:camel-test-junit6
- `camel-azure-schema-registry` β downstream of org.apache.camel:camel-test-junit6
- `camel-azure-servicebus` β downstream of org.apache.camel:camel-test-junit6
- `camel-azure-storage-blob` β downstream of org.apache.camel:camel-test-junit6
- `camel-azure-storage-datalake` β downstream of org.apache.camel:camel-test-junit6
- `camel-azure-storage-queue` β downstream of org.apache.camel:camel-test-junit6
- `camel-barcode` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-base64` β downstream of org.apache.camel:camel-test-junit6
- `camel-bean-validator` β downstream of org.apache.camel:camel-test-junit6
- `camel-beanio` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-bindy` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-bonita` β downstream of org.apache.camel:camel-test-junit6
- `camel-box` β downstream of org.apache.camel:camel-test-junit6
- `camel-braintree` β downstream of org.apache.camel:camel-test-junit6
- `camel-caffeine` β downstream of org.apache.camel:camel-test-junit6
- `camel-camunda` β downstream of org.apache.camel:camel-test-junit6
- `camel-cassandraql` β downstream of org.apache.camel:camel-test-junit6
- `camel-cbor` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-chatscript` β downstream of org.apache.camel:camel-test-junit6
- `camel-chunk` β downstream of org.apache.camel:camel-test-junit6
- `camel-cli-connector` β downstream of org.apache.camel:camel-test-junit6
- `camel-cli-debug` β downstream of org.apache.camel:camel-cli-connector
- `camel-clickhouse` β downstream of org.apache.camel:camel-test-junit6
- `camel-clickup` β downstream of org.apache.camel:camel-test-junit6
- `camel-cloudevents` β downstream of org.apache.camel:camel-test-junit6
- `camel-cm-sms` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-coap` β downstream of org.apache.camel:camel-test-junit6
- `camel-cometd` β downstream of org.apache.camel:camel-test-junit6
- `camel-console` β downstream of org.apache.camel:camel-core
- `camel-consul` β downstream of org.apache.camel:camel-file
- `camel-core` β core/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerJailStartingDirectorySymlinkTest.java, core/camel-core/src/test/java/org/apache/camel/component/file/FileProducerJailStartingDirectorySymlinkTest.java
- `camel-core-all` β downstream of org.apache.camel:camel-main
- `camel-couchbase` β downstream of org.apache.camel:camel-test-junit6
- `camel-couchdb` β downstream of org.apache.camel:camel-test-junit6
- `camel-cron` β downstream of org.apache.camel:camel-test-junit6
- `camel-crypto` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-crypto-pgp` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-csv` β downstream of org.apache.camel:camel-main
- `camel-cxf-common` β downstream of org.apache.camel:camel-test-junit6
- `camel-cxf-rest` β downstream of org.apache.camel:camel-test-junit6
- `camel-cxf-soap` β downstream of org.apache.camel:camel-test-junit6
- `camel-cxf-spring-common` β downstream of org.apache.camel:camel-spring-xml
- `camel-cxf-spring-rest` β downstream of org.apache.camel:camel-http
- `camel-cxf-spring-soap` β downstream of org.apache.camel:camel-http
- `camel-cxf-spring-transport` β downstream of org.apache.camel:camel-test-junit6
- `camel-cxf-transport` β downstream of org.apache.camel:camel-test-junit6
- `camel-cyberark-vault` β downstream of org.apache.camel:camel-test-junit6
- `camel-dapr` β downstream of org.apache.camel:camel-test-junit6
- `camel-datasonnet` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-debezium-common` β downstream of org.apache.camel:camel-test-junit6
- `camel-debezium-db2` β downstream of org.apache.camel:camel-test-junit6
- `camel-debezium-maven-plugin` β downstream of org.apache.camel:camel-test-junit6
- `camel-debezium-mongodb` β downstream of org.apache.camel:camel-test-junit6
- `camel-debezium-mysql` β downstream of org.apache.camel:camel-test-junit6
- `camel-debezium-oracle` β downstream of org.apache.camel:camel-test-junit6
- `camel-debezium-postgres` β downstream of org.apache.camel:camel-test-junit6
- `camel-debezium-sqlserver` β downstream of org.apache.camel:camel-test-junit6
- `camel-dfdl` β downstream of org.apache.camel:camel-test-junit6
- `camel-dhis2` β downstream of org.apache.camel:camel-test-junit6
- `camel-dhis2-api` β downstream of org.apache.camel:camel-test-junit6
- `camel-dhis2-parent` β downstream of org.apache.camel:camel-test-junit6
- `camel-diagram` β downstream of org.apache.camel:camel-test-junit6
- `camel-disruptor` β downstream of org.apache.camel:camel-test-junit6
- `camel-djl` β downstream of org.apache.camel:camel-test-junit6
- `camel-dns` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-docker` β downstream of org.apache.camel:camel-test-junit6
- `camel-docling` β downstream of org.apache.camel:camel-test-junit6
- `camel-drill` β downstream of org.apache.camel:camel-test-junit6
- `camel-dropbox` β downstream of org.apache.camel:camel-test-junit6
- `camel-dsl-modeline` β downstream of org.apache.camel:camel-test-junit6
- `camel-duckdb` β downstream of org.apache.camel:camel-test-junit6
- `camel-dynamic-router` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-ehcache` β downstream of org.apache.camel:camel-test-junit6
- `camel-elasticsearch` β downstream of org.apache.camel:camel-test-junit6
- `camel-elasticsearch-rest-client` β downstream of org.apache.camel:camel-test-junit6
- `camel-event` β downstream of org.apache.camel:camel-test-junit6
- `camel-exec` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-fastjson` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-fhir` β downstream of org.apache.camel:camel-test-junit6
- `camel-file` β components/camel-file/src/main/docs/file-component.adoc, components/camel-file/src/main/java/org/apache/camel/component/file/FileConsumer.java, components/camel-file/src/main/java/org/apache/camel/component/file/FileOperations.java, components/camel-file/src/main/java/org/apache/camel/component/file/GenericFileConsumer.java, components/camel-file/src/main/java/org/apache/camel/component/file/GenericFileHelper.java
- `camel-file-watch` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-flatpack` β downstream of org.apache.camel:camel-file
- `camel-flink` β downstream of org.apache.camel:camel-test-junit6
- `camel-flowable` β downstream of org.apache.camel:camel-test-junit6
- `camel-fop` β downstream of org.apache.camel:camel-test-junit6
- `camel-fory` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-freemarker` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-ftp` β downstream of org.apache.camel:camel-test-junit6
- `camel-ftp-common` β downstream of org.apache.camel:camel-file
- `camel-geocoder` β downstream of org.apache.camel:camel-test-junit6
- `camel-git` β downstream of org.apache.camel:camel-test-junit6
- `camel-github2` β downstream of org.apache.camel:camel-test-junit6
- `camel-google-bigquery` β downstream of org.apache.camel:camel-test-junit6
- `camel-google-calendar` β downstream of org.apache.camel:camel-test-junit6
- `camel-google-drive` β downstream of org.apache.camel:camel-file
- `camel-google-firestore` β downstream of org.apache.camel:camel-test-junit6
- `camel-google-functions` β downstream of org.apache.camel:camel-test-junit6
- `camel-google-mail` β downstream of org.apache.camel:camel-test-junit6
- `camel-google-pubsub` β downstream of org.apache.camel:camel-test-junit6
- `camel-google-secret-manager` β downstream of org.apache.camel:camel-test-junit6
- `camel-google-sheets` β downstream of org.apache.camel:camel-test-junit6
- `camel-google-speech-to-text` β downstream of org.apache.camel:camel-test-junit6
- `camel-google-storage` β downstream of org.apache.camel:camel-test-junit6
- `camel-google-text-to-speech` β downstream of org.apache.camel:camel-test-junit6
- `camel-google-vertexai` β downstream of org.apache.camel:camel-test-junit6
- `camel-google-vision` β downstream of org.apache.camel:camel-test-junit6
- `camel-graphql` β downstream of org.apache.camel:camel-test-junit6
- `camel-grok` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-groovy` β downstream of org.apache.camel:camel-main
- `camel-grpc` β downstream of org.apache.camel:camel-test-junit6
- `camel-gson` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-hashicorp-vault` β downstream of org.apache.camel:camel-test-junit6
- `camel-hazelcast` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-hivemq` β downstream of org.apache.camel:camel-test-junit6
- `camel-hl7` β downstream of org.apache.camel:camel-test-junit6
- `camel-http` β downstream of org.apache.camel:camel-file
- `camel-http-base` β downstream of org.apache.camel:camel-test-junit6
- `camel-http-common` β downstream of org.apache.camel:camel-test-junit6
- `camel-huaweicloud-dms` β downstream of org.apache.camel:camel-test-junit6
- `camel-huaweicloud-frs` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-huaweicloud-functiongraph` β downstream of org.apache.camel:camel-test-junit6
- `camel-huaweicloud-iam` β downstream of org.apache.camel:camel-test-junit6
- `camel-huaweicloud-imagerecognition` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-huaweicloud-obs` β downstream of org.apache.camel:camel-test-junit6
- `camel-huaweicloud-smn` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-huggingface` β downstream of org.apache.camel:camel-test-junit6
- `camel-ibm-cos` β downstream of org.apache.camel:camel-test-junit6
- `camel-ibm-secrets-manager` β downstream of org.apache.camel:camel-test-junit6
- `camel-ibm-watson-discovery` β downstream of org.apache.camel:camel-test-junit6
- `camel-ibm-watson-language` β downstream of org.apache.camel:camel-test-junit6
- `camel-ibm-watson-speech-to-text` β downstream of org.apache.camel:camel-test-junit6
- `camel-ibm-watson-text-to-speech` β downstream of org.apache.camel:camel-test-junit6
- `camel-ibm-watsonx-ai` β downstream of org.apache.camel:camel-test-junit6
- `camel-ibm-watsonx-data` β downstream of org.apache.camel:camel-test-junit6
- `camel-ical` β downstream of org.apache.camel:camel-test-junit6
- `camel-iggy` β downstream of org.apache.camel:camel-test-junit6
- `camel-ignite` β downstream of org.apache.camel:camel-test-junit6
- `camel-infinispan` β downstream of org.apache.camel:camel-test-junit6
- `camel-infinispan-common` β downstream of org.apache.camel:camel-test-junit6
- `camel-infinispan-embedded` β downstream of org.apache.camel:camel-test-junit6
- `camel-influxdb` β downstream of org.apache.camel:camel-test-junit6
- `camel-influxdb2` β downstream of org.apache.camel:camel-test-junit6
- `camel-iso8583` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-jackson` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-jackson-avro` β downstream of org.apache.camel:camel-test-junit6
- `camel-jackson-protobuf` β downstream of org.apache.camel:camel-test-junit6
- `camel-jackson3` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-jackson3-avro` β downstream of org.apache.camel:camel-test-junit6
- `camel-jackson3-protobuf` β downstream of org.apache.camel:camel-test-junit6
- `camel-jackson3xml` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-jacksonxml` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-jactl` β downstream of org.apache.camel:camel-test-junit6
- `camel-jandex` β downstream of org.apache.camel:camel-test-junit6
- `camel-jasypt` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-java-joor-dsl` β downstream of org.apache.camel:camel-test-junit6
- `camel-javascript` β downstream of org.apache.camel:camel-test-junit6
- `camel-jaxb` β downstream of org.apache.camel:camel-test-junit6
- `camel-jbang-mcp` β downstream of org.apache.camel:camel-catalog
- `camel-jbang-plugin-mcp` β downstream of org.apache.camel:camel-jbang-core
- `camel-jbang-plugin-route-parser` β downstream of org.apache.camel:camel-route-parser
- `camel-jbang-plugin-tui` β downstream of org.apache.camel:camel-catalog
- `camel-jbang-plugin-validate` β downstream of org.apache.camel:camel-yaml-dsl-validator
- `camel-jcache` β downstream of org.apache.camel:camel-test-junit6
- `camel-jcr` β downstream of org.apache.camel:camel-test-junit6
- `camel-jdbc` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-jetty` β downstream of org.apache.camel:camel-http
- `camel-jetty-common` β downstream of org.apache.camel:camel-spring-xml
- `camel-jfr` β downstream of org.apache.camel:camel-test-junit6
- `camel-jgroups` β downstream of org.apache.camel:camel-test-junit6
- `camel-jgroups-raft` β downstream of org.apache.camel:camel-test-junit6
- `camel-jira` β downstream of org.apache.camel:camel-file
- `camel-jms` β downstream of org.apache.camel:camel-spring-xml
- `camel-jmx` β downstream of org.apache.camel:camel-test-junit6
- `camel-jolt` β downstream of org.apache.camel:camel-test-junit6
- `camel-jooq` β downstream of org.apache.camel:camel-test-junit6
- `camel-joor` β downstream of org.apache.camel:camel-test-junit6
- `camel-jpa` β downstream of org.apache.camel:camel-test-junit6
- `camel-jq` β downstream of org.apache.camel:camel-test-junit6
- `camel-jsch` β downstream of org.apache.camel:camel-test-junit6
- `camel-jslt` β downstream of org.apache.camel:camel-test-junit6
- `camel-json-validator` β downstream of org.apache.camel:camel-test-junit6
- `camel-jsonapi` β downstream of org.apache.camel:camel-test-junit6
- `camel-jsonata` β downstream of org.apache.camel:camel-test-junit6
- `camel-jsonb` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-jsonpath` β downstream of org.apache.camel:camel-file
- `camel-jsoup` β downstream of org.apache.camel:camel-test-junit6
- `camel-jt400` β downstream of org.apache.camel:camel-test-junit6
- `camel-jta` β downstream of org.apache.camel:camel-sql
- `camel-jte` β downstream of org.apache.camel:camel-test-junit6
- `camel-kafka` β downstream of org.apache.camel:camel-test-junit6
- `camel-kafka-common` β downstream of org.apache.camel:camel-test-junit6
- `camel-kamelet` β downstream of org.apache.camel:camel-test-junit6
- `camel-kamelet-main-support` β downstream of org.apache.camel:camel-main
- `camel-keycloak` β downstream of org.apache.camel:camel-test-junit6
- `camel-knative` β downstream of org.apache.camel:camel-test-junit6
- `camel-knative-api` β downstream of org.apache.camel:camel-test-junit6
- `camel-knative-http` β downstream of org.apache.camel:camel-test-junit6
- `camel-kserve` β downstream of org.apache.camel:camel-test-junit6
- `camel-kubernetes` β downstream of org.apache.camel:camel-http
- `camel-kudu` β downstream of org.apache.camel:camel-test-junit6
- `camel-langchain4j-agent` β downstream of org.apache.camel:camel-test-junit6
- `camel-langchain4j-chat` β downstream of org.apache.camel:camel-test-junit6
- `camel-langchain4j-core` β downstream of org.apache.camel:camel-test-junit6
- `camel-langchain4j-embeddings` β downstream of org.apache.camel:camel-test-junit6
- `camel-langchain4j-embeddingstore` β downstream of org.apache.camel:camel-test-junit6
- `camel-langchain4j-ingest` β downstream of org.apache.camel:camel-test-junit6
- `camel-langchain4j-tokenizer` β downstream of org.apache.camel:camel-test-junit6
- `camel-langchain4j-web-search` β downstream of org.apache.camel:camel-test-junit6
- `camel-launcher-container` β downstream of org.apache.camel:camel-launcher
- `camel-ldap` β downstream of org.apache.camel:camel-test-junit6
- `camel-ldif` β downstream of org.apache.camel:camel-test-junit6
- `camel-lra` β downstream of org.apache.camel:camel-test-junit6
- `camel-lucene` β downstream of org.apache.camel:camel-test-junit6
- `camel-lumberjack` β downstream of org.apache.camel:camel-test-junit6
- `camel-lzf` β downstream of org.apache.camel:camel-test-junit6
- `camel-mail` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-mail-microsoft-oauth` β downstream of org.apache.camel:camel-mail
- `camel-main` β downstream of org.apache.camel:camel-test-junit6
- `camel-management` β downstream of org.apache.camel:camel-core
- `camel-mapstruct` β downstream of org.apache.camel:camel-test-junit6
- `camel-master` β downstream of org.apache.camel:camel-test-junit6
- `camel-maven-plugin` β downstream of org.apache.camel:camel-spring-main
- `camel-mcp-server` β downstream of org.apache.camel:camel-test-junit6
- `camel-mcp-server-api` β downstream of org.apache.camel:camel-test-junit6
- `camel-mdc` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-metrics` β downstream of org.apache.camel:camel-test-junit6
- `camel-micrometer` β downstream of org.apache.camel:camel-test-junit6
- `camel-micrometer-observability` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-micrometer-prometheus` β downstream of org.apache.camel:camel-platform-http-main
- `camel-microprofile-config` β downstream of org.apache.camel:camel-test-junit6
- `camel-microprofile-fault-tolerance` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-microprofile-health` β downstream of org.apache.camel:camel-test-junit6
- `camel-milo` β downstream of org.apache.camel:camel-test-junit6
- `camel-milvus` β downstream of org.apache.camel:camel-test-junit6
- `camel-mina` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-mina-sftp` β downstream of org.apache.camel:camel-test-junit6
- `camel-minio` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-mllp` β downstream of org.apache.camel:camel-test-junit6
- `camel-mongodb` β downstream of org.apache.camel:camel-test-junit6
- `camel-mongodb-gridfs` β downstream of org.apache.camel:camel-test-junit6
- `camel-mustache` β downstream of org.apache.camel:camel-test-junit6
- `camel-mvel` β downstream of org.apache.camel:camel-test-junit6
- `camel-mybatis` β downstream of org.apache.camel:camel-test-junit6
- `camel-nats` β downstream of org.apache.camel:camel-test-junit6
- `camel-neo4j` β downstream of org.apache.camel:camel-test-junit6
- `camel-netty` β downstream of org.apache.camel:camel-main
- `camel-netty-http` β downstream of org.apache.camel:camel-http
- `camel-oaipmh` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-oauth` β downstream of org.apache.camel:camel-test-junit6
- `camel-observability-services` β downstream of org.apache.camel:camel-opentelemetry2
- `camel-observation` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-ocsf` β downstream of org.apache.camel:camel-test-junit6
- `camel-odata` β downstream of org.apache.camel:camel-test-junit6
- `camel-ognl` β downstream of org.apache.camel:camel-test-junit6
- `camel-olingo2` β downstream of org.apache.camel:camel-test-junit6
- `camel-olingo2-api` β downstream of org.apache.camel:camel-test-junit6
- `camel-olingo4` β downstream of org.apache.camel:camel-test-junit6
- `camel-olingo4-api` β downstream of org.apache.camel:camel-test-junit6
- `camel-once` β downstream of org.apache.camel:camel-test-junit6
- `camel-opa` β downstream of org.apache.camel:camel-test-junit6
- `camel-openai` β downstream of org.apache.camel:camel-file
- `camel-openapi-java` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-openapi-validator` β downstream of org.apache.camel:camel-test-junit6
- `camel-openfga` β downstream of org.apache.camel:camel-test-junit6
- `camel-opensearch` β downstream of org.apache.camel:camel-test-junit6
- `camel-openstack` β downstream of org.apache.camel:camel-test-junit6
- `camel-opentelemetry` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-opentelemetry-metrics` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-opentelemetry2` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-optaplanner` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-paho` β downstream of org.apache.camel:camel-test-junit6
- `camel-paho-mqtt5` β downstream of org.apache.camel:camel-test-junit6
- `camel-parquet-avro` β downstream of org.apache.camel:camel-test-junit6
- `camel-pdf` β downstream of org.apache.camel:camel-test-junit6
- `camel-pg-replication-slot` β downstream of org.apache.camel:camel-test-junit6
- `camel-pgevent` β downstream of org.apache.camel:camel-test-junit6
- `camel-pgvector` β downstream of org.apache.camel:camel-test-junit6
- `camel-pinecone` β downstream of org.apache.camel:camel-test-junit6
- `camel-platform-http` β downstream of org.apache.camel:camel-test-junit6
- `camel-platform-http-jolokia` β downstream of org.apache.camel:camel-platform-http
- `camel-platform-http-main` β downstream of org.apache.camel:camel-test-junit6
- `camel-platform-http-vertx` β downstream of org.apache.camel:camel-file
- `camel-plc4x` β downstream of org.apache.camel:camel-test-junit6
- `camel-pqc` β downstream of org.apache.camel:camel-test-junit6
- `camel-printer` β downstream of org.apache.camel:camel-test-junit6
- `camel-protobuf` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-pubnub` β downstream of org.apache.camel:camel-test-junit6
- `camel-pulsar` β downstream of org.apache.camel:camel-test-junit6
- `camel-python` β downstream of org.apache.camel:camel-test-junit6
- `camel-python3` β downstream of org.apache.camel:camel-test-junit6
- `camel-qdrant` β downstream of org.apache.camel:camel-test-junit6
- `camel-quartz` β downstream of org.apache.camel:camel-cron
- `camel-quickfix` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-quickjs` β downstream of org.apache.camel:camel-test-junit6
- `camel-reactive-streams` β downstream of org.apache.camel:camel-test-junit6
- `camel-reactor` β downstream of org.apache.camel:camel-test-junit6
- `camel-redis` β downstream of org.apache.camel:camel-test-junit6
- `camel-resilience4j` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-resilience4j-micrometer` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-resourceresolver-github` β downstream of org.apache.camel:camel-test-junit6
- `camel-rest-openapi` β downstream of org.apache.camel:camel-test-junit6
- `camel-rest-postman` β downstream of org.apache.camel:camel-test-junit6
- `camel-restdsl-openapi-plugin` β downstream of org.apache.camel:camel-servlet
- `camel-robotframework` β downstream of org.apache.camel:camel-test-junit6
- `camel-rocketmq` β downstream of org.apache.camel:camel-test-junit6
- `camel-rss` β downstream of org.apache.camel:camel-test-junit6
- `camel-rxjava` β downstream of org.apache.camel:camel-test-junit6
- `camel-salesforce` β downstream of org.apache.camel:camel-test-junit6
- `camel-salesforce-codegen` β downstream of org.apache.camel:camel-salesforce
- `camel-sap-netweaver` β downstream of org.apache.camel:camel-test-junit6
- `camel-saxon` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-schematron` β downstream of org.apache.camel:camel-test-junit6
- `camel-semantic` β downstream of org.apache.camel:camel-test-junit6
- `camel-servicenow` β downstream of org.apache.camel:camel-test-junit6
- `camel-servicenow-maven-plugin` β downstream of org.apache.camel:camel-test-junit6
- `camel-servlet` β downstream of org.apache.camel:camel-test-junit6
- `camel-shell` β downstream of org.apache.camel:camel-test-junit5
- `camel-shiro` β downstream of org.apache.camel:camel-test-junit6
- `camel-sjms` β downstream of org.apache.camel:camel-test-junit6
- `camel-sjms2` β downstream of org.apache.camel:camel-test-junit6
- `camel-slack` β downstream of org.apache.camel:camel-test-junit6
- `camel-smb` β downstream of org.apache.camel:camel-file
- `camel-smooks` β downstream of org.apache.camel:camel-test-junit6
- `camel-smpp` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-snakeyaml` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-snmp` β downstream of org.apache.camel:camel-test-junit6
- `camel-soap` β downstream of org.apache.camel:camel-test-junit6
- `camel-solr` β downstream of org.apache.camel:camel-test-junit6
- `camel-spiffe` β downstream of org.apache.camel:camel-test-junit6
- `camel-splunk-hec` β downstream of org.apache.camel:camel-test-junit6
- `camel-spring` β downstream of org.apache.camel:camel-cron
- `camel-spring-ai-chat` β downstream of org.apache.camel:camel-test-junit6
- `camel-spring-ai-embeddings` β downstream of org.apache.camel:camel-test-junit6
- `camel-spring-ai-image` β downstream of org.apache.camel:camel-test-junit6
- `camel-spring-ai-vector-store` β downstream of org.apache.camel:camel-test-junit6
- `camel-spring-batch` β downstream of org.apache.camel:camel-test-junit6
- `camel-spring-cloud-config` β downstream of org.apache.camel:camel-test-junit6
- `camel-spring-jdbc` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-spring-ldap` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-spring-main` β downstream of org.apache.camel:camel-main
- `camel-spring-rabbitmq` β downstream of org.apache.camel:camel-http
- `camel-spring-redis` β downstream of org.apache.camel:camel-test-junit6
- `camel-spring-security` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-spring-ws` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-spring-xml` β downstream of org.apache.camel:camel-test-junit6
- `camel-sql` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-ssh` β downstream of org.apache.camel:camel-test-junit6
- `camel-state-store` β downstream of org.apache.camel:camel-test-main-junit5
- `camel-stax` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-stitch` β downstream of org.apache.camel:camel-test-junit6
- `camel-stream` β downstream of org.apache.camel:camel-test-junit6
- `camel-streamcaching-test` β downstream of org.apache.camel:camel-test-junit6
- `camel-stringtemplate` β downstream of org.apache.camel:camel-test-junit6
- `camel-stripe` β downstream of org.apache.camel:camel-test-junit6
- `camel-swift` β downstream of org.apache.camel:camel-test-junit6
- `camel-syslog` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-tahu` β downstream of org.apache.camel:camel-test-junit6
- `camel-tarfile` β downstream of org.apache.camel:camel-file
- `camel-telegram` β downstream of org.apache.camel:camel-test-junit6
- `camel-telemetry` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-telemetry-dev` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-tensorflow-serving` β downstream of org.apache.camel:camel-test-junit6
- `camel-test-infra-all` β downstream of org.apache.camel:camel-test-infra-artemis
- `camel-test-infra-artemis` β downstream of org.apache.camel:camel-test-junit6
- `camel-test-infra-smb` β downstream of org.apache.camel:camel-test-junit6
- `camel-test-junit5` β downstream of org.apache.camel:camel-file
- `camel-test-junit6` β downstream of org.apache.camel:camel-file
- `camel-test-main-junit5` β downstream of org.apache.camel:camel-test-junit5
- `camel-test-main-junit6` β downstream of org.apache.camel:camel-test-junit6
- `camel-test-spring-junit5` β downstream of org.apache.camel:camel-test-junit5
- `camel-test-spring-junit6` β downstream of org.apache.camel:camel-test-junit6
- `camel-thrift` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-thymeleaf` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-tika` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-toon` β downstream of org.apache.camel:camel-test-junit5
- `camel-tracing` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-twilio` β downstream of org.apache.camel:camel-test-junit6
- `camel-twitter` β downstream of org.apache.camel:camel-test-junit6
- `camel-typesafe-ai` β downstream of org.apache.camel:camel-test-junit6
- `camel-ubl` β downstream of org.apache.camel:camel-test-junit5
- `camel-undertow` β downstream of org.apache.camel:camel-test-junit6
- `camel-undertow-spring-security` β downstream of org.apache.camel:camel-test-junit6
- `camel-univocity-parsers` β downstream of org.apache.camel:camel-spring-xml
- `camel-velocity` β downstream of org.apache.camel:camel-test-spring-junit6
- `camel-vertx` β downstream of org.apache.camel:camel-test-junit6
- `camel-vertx-http` β downstream of org.apache.camel:camel-test-junit6
- `camel-vertx-websocket` β downstream of org.apache.camel:camel-test-junit6
- `camel-wasm` β downstream of org.apache.camel:camel-test-junit6
- `camel-weather` β downstream of org.apache.camel:camel-test-junit6
- `camel-weaviate` β downstream of org.apache.camel:camel-test-junit6
- `camel-web3j` β downstream of org.apache.camel:camel-test-junit6
- `camel-webhook` β downstream of org.apache.camel:camel-test-junit6
- `camel-whatsapp` β downstream of org.apache.camel:camel-test-junit6
- `camel-wordpress` β downstream of org.apache.camel:camel-test-junit6
- `camel-workday` β downstream of org.apache.camel:camel-test-junit6
- `camel-xchange` β downstream of org.apache.camel:camel-test-junit6
- `camel-xj` β downstream of org.apache.camel:camel-test-junit6
- `camel-xml-io-dsl` β downstream of org.apache.camel:camel-test-junit6
- `camel-xml-jaxb-dsl` β downstream of org.apache.camel:camel-test-junit6
- `camel-xml-jaxb-dsl-test-definition` β downstream of org.apache.camel:camel-test-junit6
- `camel-xml-jaxb-dsl-test-spring` β downstream of org.apache.camel:camel-test-junit6
- `camel-xmlsecurity` β downstream of org.apache.camel:camel-test-junit6
- `camel-xmpp` β downstream of org.apache.camel:camel-test-junit6
- `camel-xslt-saxon` β downstream of org.apache.camel:camel-spring-xml
- `camel-yaml-dsl-validator` β downstream of org.apache.camel:camel-catalog
- `camel-yaml-dsl-validator-maven-plugin` β downstream of org.apache.camel:camel-yaml-dsl-validator
- `camel-zendesk` β downstream of org.apache.camel:camel-test-junit6
- `camel-zip-deflater` β downstream of org.apache.camel:camel-test-junit6
- `camel-zipfile` β downstream of org.apache.camel:camel-file
- `camel-zookeeper` β downstream of org.apache.camel:camel-file
- `camel-zookeeper-master` β downstream of org.apache.camel:camel-test-junit6
</details>
<details><summary>Modules with tests skipped (26)</summary>
- `apache-camel`
- `camel-allcomponents`
- `camel-catalog-console`
- `camel-catalog-maven`
- `camel-catalog-suggest`
- `camel-componentdsl`
- `camel-endpointdsl`
- `camel-endpointdsl-support`
- `camel-itest`
- `camel-jbang-core`
- `camel-jbang-it`
- `camel-jbang-main`
- `camel-jbang-plugin-edit`
- `camel-jbang-plugin-generate`
- `camel-jbang-plugin-kubernetes`
- `camel-jbang-plugin-test`
- `camel-kamelet-main`
- `camel-launcher`
- `camel-report-maven-plugin`
- `camel-route-parser`
- `camel-salesforce-maven-plugin`
- `camel-yaml-dsl`
- `camel-yaml-dsl-deserializers`
- `camel-yaml-dsl-maven-plugin`
- `coverage`
- `dummy-component`
</details>
> :information_source: Shadow mode β Scalpel observes but does not affect test execution. [Learn more](https://github.com/maveniverse/scalpel)
</details>
:warning: **Some tests are disabled on GitHub Actions** (`@DisabledIfSystemProperty(named = "ci.env.name")`) and require manual verification:
- `core/camel-core`: 4 test(s) disabled on GitHub Actions
<details><summary>Build reactor β dependencies compiled but only changed modules were tested (4 modules, 1m 6s total)</summary>
**Total reactor time:** 1m 6s
| Module | Duration | Status |
| --- | --- | --- |
| Camel :: Catalog :: Camel Catalog | 31.7s | SUCCESS |
| Camel :: Docs | 23.6s | SUCCESS |
| Camel :: File | 10.9s | SUCCESS |
| Camel :: Core | n/a | |
**Top 20 slowest modules:**
- `Camel :: Catalog :: Camel Catalog` (31.7s)
- `Camel :: Docs` (23.6s)
- `Camel :: File` (10.9s)
</details>
---
:gear: [View full build and test results](https://github.com/apache/camel/actions/runs/37708038898)
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] CAMEL-25412: camel-file - resolve symbolic links when enforcing jailStartingDirectory [camel]
Posted by "github-actions[bot] (via GitHub)" <gi...@apache.org>.
github-actions[bot] commented on PR #27522:
URL: https://github.com/apache/camel/pull/27522#issuecomment-6053213908
:star2: Thank you for your contribution to the Apache Camel project! :star2:
:robot: CI automation will test this PR automatically.
:camel: Apache Camel Committers, please review the following items:
* First-time contributors **require MANUAL approval** for the GitHub Actions to run
* You can use the command `/component-test (camel-)component-name1 (camel-)component-name2..` to request a test from the test bot although they are normally detected and executed by CI.
* You can label PRs using `skip-tests` and `test-dependents` to fine-tune the checks executed by this PR.
* Build and test logs are available in the summary page. **Only** [Apache Camel committers](https://camel.apache.org/community/team/#committers) have access to the summary.
:warning: Be careful when sharing logs. Review their contents before sharing them publicly.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] CAMEL-25412: camel-file - resolve symbolic links when enforcing jailStartingDirectory [camel]
Posted by "allthingssecurity (via GitHub)" <gi...@apache.org>.
allthingssecurity commented on code in PR #27522:
URL: https://github.com/apache/camel/pull/27522#discussion_r4213410591
##########
components/camel-file/src/main/java/org/apache/camel/component/file/FileConsumer.java:
##########
@@ -75,6 +77,25 @@ protected Exchange createExchange(GenericFile<File> file) {
return exchange;
}
+ @Override
+ protected boolean isWithinStartingDirectory(String absoluteFilePath) {
+ // a local listing entry is a single path segment, but it can be a symbolic link to a file or to a directory
+ // (entered with recursive) whose target lies outside the starting directory, so compare the resolved paths
+ try {
+ Path startingDirectory = resolvedStartingDirectory;
+ if (startingDirectory == null) {
+ startingDirectory = GenericFileHelper.resolveExistingPathSegments(getEndpoint().getFile().toPath());
Review Comment:
Added a comment in `isWithinStartingDirectory` (6d13bcaa8576): the starting directory is resolved once per poll, each listed file on every poll (one `toRealPath` per file).
_Claude Code on behalf of allthingssecurity_
##########
docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_23.adoc:
##########
@@ -3490,6 +3490,15 @@ Downloads to a configured `localWorkDirectory` now resolve existing filesystem p
checking that the destination remains inside that directory. Downloads through a symbolic link that
resolves outside the `localWorkDirectory` are rejected. Valid nested download paths continue to work.
+=== camel-file - jailStartingDirectory resolves symbolic links
+
+With `jailStartingDirectory` enabled (the default), the file consumer and producer now resolve symbolic links when
+checking that a file stays within the starting directory. The consumer skips a file or (with `recursive=true`) a
+directory that is a link resolving outside of it, and the producer fails to write through such a link or a dangling
+link. Links resolving inside the starting directory work as before. Set `jailStartingDirectory=false` to keep following
+links to other directories (this also turns off the check of `../` in producer file names). A skipped file is logged
Review Comment:
Agreed, reworded in 6d13bcaa8576: the log-level change applies to the remote consumers, which keep their lexical check.
_Claude Code on behalf of allthingssecurity_
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] CAMEL-25412: camel-file - resolve symbolic links when enforcing jailStartingDirectory [camel]
Posted by "davsclaus (via GitHub)" <gi...@apache.org>.
davsclaus commented on code in PR #27522:
URL: https://github.com/apache/camel/pull/27522#discussion_r4215824113
##########
components/camel-file/src/main/java/org/apache/camel/component/file/FileOperations.java:
##########
@@ -256,11 +257,40 @@ public void releaseRetrievedFileResources(Exchange exchange) throws GenericFileO
// java.io.File
}
+ /**
+ * The jailStartingDirectory check of the producer is lexical (see {@code GenericFileProducer.createFileName}), so a
+ * symbolic link inside the starting directory (a link to a file, or a directory segment of the name) would redirect
+ * the write outside of it. Only paths that are lexically inside the starting directory are checked, so a
+ * tempFileName the route author placed outside of it (such as ../work) keeps working.
+ */
+ private void jailToStartingDirectory(File target) {
Review Comment:
Optional, building on the limit you describe in the PR: with `autoCreate=true` the producer calls `buildDirectory` before `storeFile`, so for `link/new/x.txt` the directory `new` is created inside the link target before this check rejects the write. Calling `jailToStartingDirectory(path)` in `buildDirectory` before the directories are created (it already skips paths that are lexically outside, so a `../work` temp directory keeps working) would stop that, and a test asserting that `elsewhere/new` does not exist after the rejected write would cover it.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] CAMEL-25412: camel-file - resolve symbolic links when enforcing jailStartingDirectory [camel]
Posted by "gnodet-bot (via GitHub)" <gi...@apache.org>.
gnodet-bot commented on code in PR #27522:
URL: https://github.com/apache/camel/pull/27522#discussion_r4213345246
##########
components/camel-file/src/main/java/org/apache/camel/component/file/FileConsumer.java:
##########
@@ -75,6 +77,25 @@ protected Exchange createExchange(GenericFile<File> file) {
return exchange;
}
+ @Override
+ protected boolean isWithinStartingDirectory(String absoluteFilePath) {
+ // a local listing entry is a single path segment, but it can be a symbolic link to a file or to a directory
+ // (entered with recursive) whose target lies outside the starting directory, so compare the resolved paths
+ try {
+ Path startingDirectory = resolvedStartingDirectory;
+ if (startingDirectory == null) {
+ startingDirectory = GenericFileHelper.resolveExistingPathSegments(getEndpoint().getFile().toPath());
Review Comment:
βΉοΈ **Performance note:** `resolveExistingPathSegments` is called on every listed file, on every poll. For directories with thousands of files, this means one `toRealPath` traversal per file per poll. The starting directory is cached (once per poll), but the per-file side is not. Likely acceptable for typical workloads β just worth documenting in a comment or in the Javadoc of `isWithinStartingDirectory` so maintainers are aware of the cost model.
##########
docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_23.adoc:
##########
@@ -3490,6 +3490,15 @@ Downloads to a configured `localWorkDirectory` now resolve existing filesystem p
checking that the destination remains inside that directory. Downloads through a symbolic link that
resolves outside the `localWorkDirectory` are rejected. Valid nested download paths continue to work.
+=== camel-file - jailStartingDirectory resolves symbolic links
+
+With `jailStartingDirectory` enabled (the default), the file consumer and producer now resolve symbolic links when
+checking that a file stays within the starting directory. The consumer skips a file or (with `recursive=true`) a
+directory that is a link resolving outside of it, and the producer fails to write through such a link or a dangling
+link. Links resolving inside the starting directory work as before. Set `jailStartingDirectory=false` to keep following
+links to other directories (this also turns off the check of `../` in producer file names). A skipped file is logged
Review Comment:
The phrase "also by the remote file consumers" is technically correct (the WARNβDEBUG deduplication logic lives in `GenericFileConsumer.isValidFile` which remote consumers inherit), but it may mislead readers into thinking remote consumers also gained symlink resolution β they haven't, they keep the existing lexical check. Consider a small clarification:
```suggestion
at WARN the first time and at DEBUG on later polls; this log-level change also applies to the remote file consumers.
```
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] CAMEL-25412: camel-file - resolve symbolic links when enforcing jailStartingDirectory [camel]
Posted by "gnodet (via GitHub)" <gi...@apache.org>.
gnodet commented on PR #27522:
URL: https://github.com/apache/camel/pull/27522#issuecomment-6060762597
β
Backport to `camel-4.22.x` created: https://github.com/apache/camel/pull/27575
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] CAMEL-25412: camel-file - resolve symbolic links when enforcing jailStartingDirectory [camel]
Posted by "davsclaus (via GitHub)" <gi...@apache.org>.
davsclaus merged PR #27522:
URL: https://github.com/apache/camel/pull/27522
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org