diff --git a/src/main/java/org/cryptomator/common/PropertiesPreprocessor.java b/src/main/java/org/cryptomator/common/PropertiesPreprocessor.java new file mode 100644 index 000000000..d28fdd2ed --- /dev/null +++ b/src/main/java/org/cryptomator/common/PropertiesPreprocessor.java @@ -0,0 +1,66 @@ +package org.cryptomator.common; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Map; +import java.util.regex.Pattern; + +public class PropertiesPreprocessor { + + private static final Logger LOG = LoggerFactory.getLogger(PropertiesPreprocessor.class); + private static final Pattern TEMPLATE = Pattern.compile("@\\((.+)\\)"); + private static final LoggingEnvironment ENV = new LoggingEnvironment(System.getenv(), LOG); + + public static void run() { + var properties = System.getProperties(); + properties.stringPropertyNames().stream() // + .filter(s -> s.startsWith("cryptomator.")) // + .forEach(key -> { + var value = properties.getProperty(key); + var newValue = process(value); + if(! value.equals(newValue)) { + LOG.info("Changed property {} from {} to {}.", key, value, newValue); + } + properties.setProperty(key, newValue); + }); + LOG.info("Preprocessed cryptomator properties."); + } + + private static String process(String value) { + return TEMPLATE.matcher(value).replaceAll(match -> // + switch (match.group().substring(2, match.group().length() - 1)) { + case "appdir" -> ENV.get("APPDIR"); + case "appdata" -> ENV.get("APPDATA"); + case "userhome" -> System.getProperty("user.home"); + default -> { + LOG.warn("Found unknown keyword {} in property value {}. Keyword is not replaced.", match.group(), value); + yield match.group(); + } + }); + } + + private static class LoggingEnvironment { + + private final Map env; + private final Logger logger; + + LoggingEnvironment(Map env, Logger logger) { + this.env = env; + this.logger = logger; + } + + String get(String key) { + var val = env.get(key); + if (val == null) { + logger.warn("Variable {} used for substitution not found in environment", key); + return ""; + } else { + return val; + } + } + + } + + +} diff --git a/src/main/java/org/cryptomator/launcher/Cryptomator.java b/src/main/java/org/cryptomator/launcher/Cryptomator.java index 2b066c730..f08d70c37 100644 --- a/src/main/java/org/cryptomator/launcher/Cryptomator.java +++ b/src/main/java/org/cryptomator/launcher/Cryptomator.java @@ -9,6 +9,7 @@ import com.google.common.util.concurrent.ThreadFactoryBuilder; import dagger.Lazy; import org.apache.commons.lang3.SystemUtils; import org.cryptomator.common.Environment; +import org.cryptomator.common.PropertiesPreprocessor; import org.cryptomator.common.ShutdownHook; import org.cryptomator.ipc.IpcCommunicator; import org.cryptomator.logging.DebugMode; @@ -63,7 +64,7 @@ public class Cryptomator { System.out.printf("Cryptomator version %s (build %s)%n", appVer, buildNumber); return; } - + PropertiesPreprocessor.run(); int exitCode = CRYPTOMATOR_COMPONENT.application().run(args); LOG.info("Exit {}", exitCode); System.exit(exitCode); // end remaining non-daemon threads.