This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch uh in repository https://gitbox.apache.org/repos/asf/camel.git
commit 844350c6906366040ee31f086ff2362f2f7fbb3c Author: Claus Ibsen <[email protected]> AuthorDate: Mon Jan 19 16:54:43 2026 +0100 CAMEL-22879: Add HomeHelper to resolve user.home dir more safely as linux can return ? in JVM system property. --- .../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();
