This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push:
new 254b57a038f7 CAMEL-22879: Add HomeHelper to resolve user.home dir more
safely as linux can return ? in JVM system property. (#20920)
254b57a038f7 is described below
commit 254b57a038f706ed84cc990dc8ad72366b5bf263
Author: Claus Ibsen <[email protected]>
AuthorDate: Mon Jan 19 17:23:56 2026 +0100
CAMEL-22879: Add HomeHelper to resolve user.home dir more safely as linux
can return ? in JVM system property. (#20920)
---
.../maven/MavenArtifactProviderManualTest.java | 3 +-
.../component/file/remote/SftpOperations.java | 3 +-
.../apache/camel/component/scp/ScpOperations.java | 3 +-
.../platform/http/main/ManagementHttpServer.java | 3 +-
.../java/org/apache/camel/util/HomeHelper.java | 33 ++++++++++++++++++++++
.../camel/cli/connector/LocalCliConnector.java | 3 +-
.../camel/dsl/jbang/core/commands/Shell.java | 3 +-
.../dsl/jbang/core/common/CommandLineHelper.java | 3 +-
.../dsl/jbang/core/common/LauncherHelper.java | 3 +-
.../camel/tooling/maven/MavenDownloaderImpl.java | 7 +++--
10 files changed, 53 insertions(+), 11 deletions(-)
diff --git
a/catalog/camel-catalog-maven/src/test/java/org/apache/camel/catalog/maven/MavenArtifactProviderManualTest.java
b/catalog/camel-catalog-maven/src/test/java/org/apache/camel/catalog/maven/MavenArtifactProviderManualTest.java
index 27acf87afb3f..1b55c1d27f2e 100644
---
a/catalog/camel-catalog-maven/src/test/java/org/apache/camel/catalog/maven/MavenArtifactProviderManualTest.java
+++
b/catalog/camel-catalog-maven/src/test/java/org/apache/camel/catalog/maven/MavenArtifactProviderManualTest.java
@@ -22,6 +22,7 @@ import java.util.Set;
import org.apache.camel.catalog.CamelCatalog;
import org.apache.camel.catalog.DefaultCamelCatalog;
+import org.apache.camel.util.HomeHelper;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
@@ -43,7 +44,7 @@ public class MavenArtifactProviderManualTest {
// use ~/.m2/repository as one of the remote repos - I needed it to
test dummy-component SNAPSHOT
// fixed only locally (and also when Apache Snapshots repo was down)
provider.addMavenRepository("local",
- new File(System.getProperty("user.home"),
".m2/repository").toURI().toURL().toString());
+ new File(HomeHelper.resolveHomeDir(),
".m2/repository").toURI().toURL().toString());
Set<String> names = provider.addArtifactToCatalog(camelCatalog,
"org.apache.camel", "dummy-component",
camelCatalog.getCatalogVersion());
assertTrue(names.contains("dummy"));
diff --git
a/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpOperations.java
b/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpOperations.java
index 76b40e95de38..73a63f9f9e45 100644
---
a/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpOperations.java
+++
b/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpOperations.java
@@ -62,6 +62,7 @@ import org.apache.camel.support.task.BlockingTask;
import org.apache.camel.support.task.Tasks;
import org.apache.camel.support.task.budget.Budgets;
import org.apache.camel.util.FileUtil;
+import org.apache.camel.util.HomeHelper;
import org.apache.camel.util.IOHelper;
import org.apache.camel.util.ObjectHelper;
import org.apache.camel.util.StopWatch;
@@ -313,7 +314,7 @@ public class SftpOperations implements
RemoteFileOperations<SftpRemoteFile> {
String knownHostsFile = sftpConfig.getKnownHostsFile();
if (knownHostsFile == null && sftpConfig.isUseUserKnownHostsFile()) {
- knownHostsFile = System.getProperty("user.home") +
"/.ssh/known_hosts";
+ knownHostsFile = HomeHelper.resolveHomeDir() + "/.ssh/known_hosts";
LOG.info("Known host file not configured, using user known host
file: {}", knownHostsFile);
}
if (ObjectHelper.isNotEmpty(knownHostsFile)) {
diff --git
a/components/camel-jsch/src/main/java/org/apache/camel/component/scp/ScpOperations.java
b/components/camel-jsch/src/main/java/org/apache/camel/component/scp/ScpOperations.java
index 226552103edc..ea8b4a1309b1 100644
---
a/components/camel-jsch/src/main/java/org/apache/camel/component/scp/ScpOperations.java
+++
b/components/camel-jsch/src/main/java/org/apache/camel/component/scp/ScpOperations.java
@@ -40,6 +40,7 @@ import org.apache.camel.component.file.remote.RemoteFile;
import org.apache.camel.component.file.remote.RemoteFileConfiguration;
import org.apache.camel.component.file.remote.RemoteFileOperations;
import org.apache.camel.support.ResourceHelper;
+import org.apache.camel.util.HomeHelper;
import org.apache.camel.util.IOHelper;
import org.apache.camel.util.ObjectHelper;
import org.slf4j.Logger;
@@ -281,7 +282,7 @@ public class ScpOperations implements
RemoteFileOperations<ScpFile> {
String knownHostsFile = config.getKnownHostsFile();
if (knownHostsFile == null && config.isUseUserKnownHostsFile()) {
if (userKnownHostFile == null) {
- userKnownHostFile = System.getProperty("user.home") +
"/.ssh/known_hosts";
+ userKnownHostFile = HomeHelper.resolveHomeDir() +
"/.ssh/known_hosts";
LOG.info("Known host file not configured, using user known
host file: {}", userKnownHostFile);
}
knownHostsFile = userKnownHostFile;
diff --git
a/components/camel-platform-http-main/src/main/java/org/apache/camel/component/platform/http/main/ManagementHttpServer.java
b/components/camel-platform-http-main/src/main/java/org/apache/camel/component/platform/http/main/ManagementHttpServer.java
index 6be0825328f7..74f96865ba68 100644
---
a/components/camel-platform-http-main/src/main/java/org/apache/camel/component/platform/http/main/ManagementHttpServer.java
+++
b/components/camel-platform-http-main/src/main/java/org/apache/camel/component/platform/http/main/ManagementHttpServer.java
@@ -85,6 +85,7 @@ import org.apache.camel.support.service.ServiceHelper;
import org.apache.camel.support.service.ServiceSupport;
import org.apache.camel.util.AntPathMatcher;
import org.apache.camel.util.FileUtil;
+import org.apache.camel.util.HomeHelper;
import org.apache.camel.util.IOHelper;
import org.apache.camel.util.ObjectHelper;
import org.apache.camel.util.StopWatch;
@@ -506,7 +507,7 @@ public class ManagementHttpServer extends ServiceSupport
implements CamelContext
jo.put("version", String.format("%s",
System.getProperty("java.version")));
jo.put("user", System.getProperty("user.name"));
jo.put("dir", System.getProperty("user.dir"));
- jo.put("home", System.getProperty("user.home"));
+ jo.put("home", HomeHelper.resolveHomeDir());
}
jo = new JsonObject();
diff --git
a/core/camel-util/src/main/java/org/apache/camel/util/HomeHelper.java
b/core/camel-util/src/main/java/org/apache/camel/util/HomeHelper.java
new file mode 100644
index 000000000000..e33bacca0bf4
--- /dev/null
+++ b/core/camel-util/src/main/java/org/apache/camel/util/HomeHelper.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.util;
+
+public final class HomeHelper {
+
+ /**
+ * Resolves the user.home directory
+ */
+ public static String resolveHomeDir() {
+ String dir = System.getProperty("user.home");
+ if (dir == null || dir.isBlank() || dir.startsWith("?")) {
+ // fallback to use ENV as ? can be returned on linux in some weird
situations
+ dir = System.getenv("HOME");
+ }
+ return dir;
+ }
+
+}
diff --git
a/dsl/camel-cli-connector/src/main/java/org/apache/camel/cli/connector/LocalCliConnector.java
b/dsl/camel-cli-connector/src/main/java/org/apache/camel/cli/connector/LocalCliConnector.java
index 6019e7d817f0..b12e69a6f7c7 100644
---
a/dsl/camel-cli-connector/src/main/java/org/apache/camel/cli/connector/LocalCliConnector.java
+++
b/dsl/camel-cli-connector/src/main/java/org/apache/camel/cli/connector/LocalCliConnector.java
@@ -83,6 +83,7 @@ import org.apache.camel.support.PropertyBindingSupport;
import org.apache.camel.support.service.ServiceHelper;
import org.apache.camel.support.service.ServiceSupport;
import org.apache.camel.util.FileUtil;
+import org.apache.camel.util.HomeHelper;
import org.apache.camel.util.IOHelper;
import org.apache.camel.util.StopWatch;
import org.apache.camel.util.URISupport;
@@ -1532,7 +1533,7 @@ public class LocalCliConnector extends ServiceSupport
implements CliConnector, C
private static File createLockFile(String name) {
File answer = null;
if (name != null) {
- File dir = new File(System.getProperty("user.home"), ".camel");
+ File dir = new File(HomeHelper.resolveHomeDir(), ".camel");
try {
dir.mkdirs();
answer = new File(dir, name);
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Shell.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Shell.java
index 9ed49413dd90..4eb84de7e2b5 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Shell.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Shell.java
@@ -20,6 +20,7 @@ import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.function.Supplier;
+import org.apache.camel.util.HomeHelper;
import org.jline.builtins.ClasspathResourceUtil;
import org.jline.builtins.ConfigurationPath;
import org.jline.console.SystemRegistry;
@@ -76,7 +77,7 @@ public class Shell extends CamelCommand {
systemRegistry.setCommandRegistries(builtins, commands);
systemRegistry.register("help", commands);
- String history = Paths.get(System.getProperty("user.home"),
".camel-jbang-history").toString();
+ String history = Paths.get(HomeHelper.resolveHomeDir(),
".camel-jbang-history").toString();
LineReader reader = LineReaderBuilder.builder()
.terminal(terminal)
.completer(systemRegistry.completer())
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/CommandLineHelper.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/CommandLineHelper.java
index 368b140967c0..39274c6d9d30 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/CommandLineHelper.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/CommandLineHelper.java
@@ -27,6 +27,7 @@ import java.nio.file.Paths;
import java.util.Properties;
import java.util.function.Consumer;
+import org.apache.camel.util.HomeHelper;
import org.apache.camel.util.OrderedProperties;
import picocli.CommandLine;
@@ -35,7 +36,7 @@ import picocli.CommandLine;
*/
public final class CommandLineHelper {
- private static volatile Path homeDir =
Paths.get(System.getProperty("user.home"));
+ private static volatile Path homeDir =
Paths.get(HomeHelper.resolveHomeDir());
public static final String USER_CONFIG = ".camel-jbang-user.properties";
public static final String LOCAL_USER_CONFIG =
"camel-jbang-user.properties";
public static final String CAMEL_DIR = ".camel";
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/LauncherHelper.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/LauncherHelper.java
index 8c7f5fc4bd44..a59b49ed6fc0 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/LauncherHelper.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/LauncherHelper.java
@@ -24,6 +24,7 @@ import java.util.ArrayList;
import java.util.List;
import org.apache.camel.util.FileUtil;
+import org.apache.camel.util.HomeHelper;
/**
* Helper class for detecting and working with the camel-launcher runtime.
@@ -106,7 +107,7 @@ public final class LauncherHelper {
// Fall back to JBang-style command
if (FileUtil.isWindows()) {
String jbangDir = System.getenv().getOrDefault("JBANG_DIR",
- System.getProperty("user.home") + "\\.jbang");
+ HomeHelper.resolveHomeDir() + "\\.jbang");
cmds.add(jbangDir + "\\bin\\camel.cmd");
} else {
cmds.add("camel");
diff --git
a/tooling/camel-tooling-maven/src/main/java/org/apache/camel/tooling/maven/MavenDownloaderImpl.java
b/tooling/camel-tooling-maven/src/main/java/org/apache/camel/tooling/maven/MavenDownloaderImpl.java
index 8a28df263222..00605de3c90a 100644
---
a/tooling/camel-tooling-maven/src/main/java/org/apache/camel/tooling/maven/MavenDownloaderImpl.java
+++
b/tooling/camel-tooling-maven/src/main/java/org/apache/camel/tooling/maven/MavenDownloaderImpl.java
@@ -41,6 +41,7 @@ import java.util.stream.Collectors;
import org.apache.camel.support.service.ServiceSupport;
import org.apache.camel.tooling.maven.support.DIRegistry;
+import org.apache.camel.util.HomeHelper;
import org.apache.camel.util.StopWatch;
import
org.apache.maven.artifact.repository.metadata.io.xpp3.MetadataXpp3Reader;
import org.apache.maven.model.building.DefaultModelBuilderFactory;
@@ -610,7 +611,7 @@ public class MavenDownloaderImpl extends ServiceSupport
implements MavenDownload
skip = true;
} else if (mavenSettings == null) {
// implicit settings
- String m2settings = System.getProperty("user.home") +
File.separator + ".m2"
+ String m2settings = HomeHelper.resolveHomeDir() + File.separator +
".m2"
+ File.separator + "settings.xml";
if (new File(m2settings).isFile()) {
mavenSettings = m2settings;
@@ -625,7 +626,7 @@ public class MavenDownloaderImpl extends ServiceSupport
implements MavenDownload
if (!skip) {
if (mavenSettingsSecurity == null) {
// implicit security settings
- String m2settingsSecurity = System.getProperty("user.home") +
File.separator + ".m2"
+ String m2settingsSecurity = HomeHelper.resolveHomeDir() +
File.separator + ".m2"
+ File.separator +
"settings-security.xml";
if (new File(m2settingsSecurity).isFile()) {
mavenSettingsSecurity = m2settingsSecurity;
@@ -858,7 +859,7 @@ public class MavenDownloaderImpl extends ServiceSupport
implements MavenDownload
localRepository = settings.getLocalRepository();
}
if (localRepository == null || localRepository.isBlank()) {
- Path m2Repository = Paths.get(System.getProperty("user.home"),
".m2/repository");
+ Path m2Repository = Paths.get(HomeHelper.resolveHomeDir(),
".m2/repository");
if (!m2Repository.toFile().isDirectory()) {
m2Repository = Paths.get(System.getProperty("java.io.tmpdir"),
UUID.randomUUID().toString());
m2Repository.toFile().mkdirs();