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();

Reply via email to