From 11c86f728730d995cb964079d48be8cdaeb3ac46 Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Mon, 12 Jan 2026 11:59:17 +0100 Subject: [PATCH] impl idea --- .../launcher/AdminPropertiesSetter.java | 56 +++++++++++++++++++ .../org/cryptomator/launcher/Cryptomator.java | 4 +- 2 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/cryptomator/launcher/AdminPropertiesSetter.java diff --git a/src/main/java/org/cryptomator/launcher/AdminPropertiesSetter.java b/src/main/java/org/cryptomator/launcher/AdminPropertiesSetter.java new file mode 100644 index 000000000..147514290 --- /dev/null +++ b/src/main/java/org/cryptomator/launcher/AdminPropertiesSetter.java @@ -0,0 +1,56 @@ +package org.cryptomator.launcher; + +import org.apache.commons.lang3.SystemUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.NoSuchFileException; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; +import java.util.Properties; + +class AdminPropertiesSetter { + + private static final Logger LOG = LoggerFactory.getLogger(AdminPropertiesSetter.class); + + static { + final Path adminDir; + if (SystemUtils.IS_OS_WINDOWS) { + adminDir = Path.of(System.getenv().getOrDefault("ProgramData", "C:\\ProgramData"), "Cryptomator"); + } else if (SystemUtils.IS_OS_MAC) { + adminDir = Path.of("/Library/Application Support/Cryptomator"); + } else { //LINUX + adminDir = Path.of("/etc/cryptmator"); + } + ADMIN_PROPERTIES_DIR = adminDir; + } + + private static final Path ADMIN_PROPERTIES_DIR; + private static final Path ADMIN_PROPERTIES_FILE = ADMIN_PROPERTIES_DIR.resolve("config.properties"); + + static Properties adjustSystemProperties() { + var systemProps = System.getProperties(); + var adminProps = loadAdminProperties(ADMIN_PROPERTIES_FILE); + for (var key : adminProps.stringPropertyNames()) { + var value = adminProps.getProperty(key); + LOG.info("Overwriting {} with value {} from admin properties.", key, value); + systemProps.setProperty(key, value); + } + return systemProps; + } + + private static Properties loadAdminProperties(Path adminPropertiesPath) { + var adminProps = new Properties(); + try { + adminProps.load(Files.newInputStream(adminPropertiesPath, StandardOpenOption.READ)); + } catch (NoSuchFileException _) { + //NO-OP + } catch (IOException | IllegalArgumentException e) { + LOG.warn("Failed to read administrative properties from {}. Returning empty properties.", adminPropertiesPath, e); + } + return adminProps; + } + +} diff --git a/src/main/java/org/cryptomator/launcher/Cryptomator.java b/src/main/java/org/cryptomator/launcher/Cryptomator.java index 3e0a613ca..281a316db 100644 --- a/src/main/java/org/cryptomator/launcher/Cryptomator.java +++ b/src/main/java/org/cryptomator/launcher/Cryptomator.java @@ -27,6 +27,7 @@ import java.security.SecureRandom; import java.util.Arrays; import java.util.List; import java.util.Optional; +import java.util.Properties; import java.util.concurrent.Executors; @Singleton @@ -35,7 +36,8 @@ public class Cryptomator { private static final long STARTUP_TIME = System.currentTimeMillis(); static { - var lazyProcessedProps = new SubstitutingProperties(System.getProperties(), System.getenv()); + var adjustedSystemProps = AdminPropertiesSetter.adjustSystemProperties(); + var lazyProcessedProps = new SubstitutingProperties(adjustedSystemProps, System.getenv()); System.setProperties(lazyProcessedProps); CRYPTOMATOR_COMPONENT = DaggerCryptomatorComponent.factory().create(STARTUP_TIME); LOG = LoggerFactory.getLogger(Cryptomator.class);