Environment.java 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. package org.cryptomator.common;
  2. import com.google.common.base.Splitter;
  3. import com.google.common.base.Strings;
  4. import org.slf4j.Logger;
  5. import org.slf4j.LoggerFactory;
  6. import java.nio.file.Files;
  7. import java.nio.file.Path;
  8. import java.nio.file.Paths;
  9. import java.util.Optional;
  10. import java.util.Spliterator;
  11. import java.util.Spliterators;
  12. import java.util.function.Predicate;
  13. import java.util.stream.Stream;
  14. import java.util.stream.StreamSupport;
  15. public class Environment {
  16. private static final Logger LOG = LoggerFactory.getLogger(Environment.class);
  17. private static final Path RELATIVE_HOME_DIR = Paths.get("~");
  18. private static final char PATH_LIST_SEP = ':';
  19. private static final int DEFAULT_MIN_PW_LENGTH = 8;
  20. private static final String SETTINGS_PATH_PROP_NAME = "cryptomator.settingsPath";
  21. private static final String IPC_SOCKET_PATH_PROP_NAME = "cryptomator.ipcSocketPath";
  22. private static final String KEYCHAIN_PATHS_PROP_NAME = "cryptomator.integrationsWin.keychainPaths";
  23. private static final String P12_PATH_PROP_NAME = "cryptomator.p12Path";
  24. private static final String LOG_DIR_PROP_NAME = "cryptomator.logDir";
  25. private static final String MOUNTPOINT_DIR_PROP_NAME = "cryptomator.mountPointsDir";
  26. private static final String MIN_PW_LENGTH_PROP_NAME = "cryptomator.minPwLength";
  27. private static final String APP_VERSION_PROP_NAME = "cryptomator.appVersion";
  28. private static final String BUILD_NUMBER_PROP_NAME = "cryptomator.buildNumber";
  29. private static final String PLUGIN_DIR_PROP_NAME = "cryptomator.pluginDir";
  30. private static final String TRAY_ICON_PROP_NAME = "cryptomator.showTrayIcon";
  31. public Environment() {
  32. LOG.debug("user.home: {}", System.getProperty("user.home"));
  33. LOG.debug("java.library.path: {}", System.getProperty("java.library.path"));
  34. LOG.debug("user.language: {}", System.getProperty("user.language"));
  35. LOG.debug("user.region: {}", System.getProperty("user.region"));
  36. LOG.debug("logback.configurationFile: {}", System.getProperty("logback.configurationFile"));
  37. logCryptomatorSystemProperty(SETTINGS_PATH_PROP_NAME);
  38. logCryptomatorSystemProperty(IPC_SOCKET_PATH_PROP_NAME);
  39. logCryptomatorSystemProperty(KEYCHAIN_PATHS_PROP_NAME);
  40. logCryptomatorSystemProperty(LOG_DIR_PROP_NAME);
  41. logCryptomatorSystemProperty(PLUGIN_DIR_PROP_NAME);
  42. logCryptomatorSystemProperty(MOUNTPOINT_DIR_PROP_NAME);
  43. logCryptomatorSystemProperty(MIN_PW_LENGTH_PROP_NAME);
  44. logCryptomatorSystemProperty(APP_VERSION_PROP_NAME);
  45. logCryptomatorSystemProperty(BUILD_NUMBER_PROP_NAME);
  46. logCryptomatorSystemProperty(TRAY_ICON_PROP_NAME);
  47. logCryptomatorSystemProperty(P12_PATH_PROP_NAME);
  48. }
  49. public static Environment getInstance() {
  50. final class Holder {
  51. private static final Environment INSTANCE = new Environment();
  52. }
  53. return Holder.INSTANCE;
  54. }
  55. private void logCryptomatorSystemProperty(String propertyName) {
  56. LOG.debug("{}: {}", propertyName, System.getProperty(propertyName));
  57. }
  58. public boolean useCustomLogbackConfig() {
  59. return getPath("logback.configurationFile").map(Files::exists).orElse(false);
  60. }
  61. public Stream<Path> getSettingsPath() {
  62. return getPaths(SETTINGS_PATH_PROP_NAME);
  63. }
  64. public Stream<Path> getP12Path() {
  65. return getPaths(P12_PATH_PROP_NAME);
  66. }
  67. public Stream<Path> ipcSocketPath() {
  68. return getPaths(IPC_SOCKET_PATH_PROP_NAME);
  69. }
  70. public Stream<Path> getKeychainPath() {
  71. return getPaths(KEYCHAIN_PATHS_PROP_NAME);
  72. }
  73. public Optional<Path> getLogDir() {
  74. return getPath(LOG_DIR_PROP_NAME).map(this::replaceHomeDir);
  75. }
  76. public Optional<Path> getPluginDir() {
  77. return getPath(PLUGIN_DIR_PROP_NAME).map(this::replaceHomeDir);
  78. }
  79. public Optional<Path> getMountPointsDir() {
  80. return getPath(MOUNTPOINT_DIR_PROP_NAME).map(this::replaceHomeDir);
  81. }
  82. /**
  83. * Returns the app version defined in the {@value APP_VERSION_PROP_NAME} property or returns "SNAPSHOT".
  84. * @return App version or "SNAPSHOT", if undefined
  85. */
  86. public String getAppVersion() {
  87. return System.getProperty(APP_VERSION_PROP_NAME, "SNAPSHOT");
  88. }
  89. public Optional<String> getBuildNumber() {
  90. return Optional.ofNullable(System.getProperty(BUILD_NUMBER_PROP_NAME));
  91. }
  92. public int getMinPwLength() {
  93. return getInt(MIN_PW_LENGTH_PROP_NAME, DEFAULT_MIN_PW_LENGTH);
  94. }
  95. public boolean showTrayIcon() {
  96. return Boolean.getBoolean(TRAY_ICON_PROP_NAME);
  97. }
  98. private int getInt(String propertyName, int defaultValue) {
  99. String value = System.getProperty(propertyName);
  100. try {
  101. return Integer.parseInt(value);
  102. } catch (NumberFormatException e) { // includes "null" values
  103. return defaultValue;
  104. }
  105. }
  106. private Optional<Path> getPath(String propertyName) {
  107. String value = System.getProperty(propertyName);
  108. return Optional.ofNullable(value).map(Paths::get);
  109. }
  110. // visible for testing
  111. public Path getHomeDir() {
  112. return getPath("user.home").orElseThrow();
  113. }
  114. // visible for testing
  115. public Stream<Path> getPaths(String propertyName) {
  116. Stream<String> rawSettingsPaths = getRawList(propertyName, PATH_LIST_SEP);
  117. return rawSettingsPaths.filter(Predicate.not(Strings::isNullOrEmpty)).map(Paths::get).map(this::replaceHomeDir);
  118. }
  119. private Path replaceHomeDir(Path path) {
  120. if (path.startsWith(RELATIVE_HOME_DIR)) {
  121. return getHomeDir().resolve(RELATIVE_HOME_DIR.relativize(path));
  122. } else {
  123. return path;
  124. }
  125. }
  126. private Stream<String> getRawList(String propertyName, char separator) {
  127. String value = System.getProperty(propertyName);
  128. if (value == null) {
  129. return Stream.empty();
  130. } else {
  131. Iterable<String> iter = Splitter.on(separator).split(value);
  132. Spliterator<String> spliterator = Spliterators.spliteratorUnknownSize(iter.iterator(), Spliterator.ORDERED | Spliterator.IMMUTABLE);
  133. return StreamSupport.stream(spliterator, false);
  134. }
  135. }
  136. }