diff --git a/pom.xml b/pom.xml index c53ca818b..a052540bc 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ 2.1.0-beta5 - 1.0.0-beta2 + 1.0.0-rc1 1.0.0-beta2 1.0.0-beta2 1.0.0-beta1 diff --git a/src/main/java/org/cryptomator/common/keychain/KeychainModule.java b/src/main/java/org/cryptomator/common/keychain/KeychainModule.java index 9ac343d36..01a221ed7 100644 --- a/src/main/java/org/cryptomator/common/keychain/KeychainModule.java +++ b/src/main/java/org/cryptomator/common/keychain/KeychainModule.java @@ -34,11 +34,11 @@ public class KeychainModule { @Singleton static ObjectExpression provideKeychainAccessProvider(Settings settings, Set providers) { return Bindings.createObjectBinding(() -> { - var selectedProviderClass = settings.keychainBackend().get().getProviderClass(); + var selectedProviderClass = settings.keychainProvider().get(); var selectedProvider = providers.stream().filter(provider -> provider.getClass().getName().equals(selectedProviderClass)).findAny(); var fallbackProvider = providers.stream().findAny().orElse(null); return selectedProvider.orElse(fallbackProvider); - }, settings.keychainBackend()); + }, settings.keychainProvider()); } } diff --git a/src/main/java/org/cryptomator/common/settings/KeychainBackend.java b/src/main/java/org/cryptomator/common/settings/KeychainBackend.java deleted file mode 100644 index 65f869a12..000000000 --- a/src/main/java/org/cryptomator/common/settings/KeychainBackend.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.cryptomator.common.settings; - -public enum KeychainBackend { - GNOME("org.cryptomator.linux.keychain.SecretServiceKeychainAccess"), - KDE("org.cryptomator.linux.keychain.KDEWalletKeychainAccess"), - MAC_SYSTEM_KEYCHAIN("org.cryptomator.macos.keychain.MacSystemKeychainAccess"), - WIN_SYSTEM_KEYCHAIN("org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess"); - - private final String providerClass; - - KeychainBackend(String providerClass) { - this.providerClass = providerClass; - } - - public String getProviderClass() { - return providerClass; - } - -} diff --git a/src/main/java/org/cryptomator/common/settings/Settings.java b/src/main/java/org/cryptomator/common/settings/Settings.java index a419d206a..ee654db49 100644 --- a/src/main/java/org/cryptomator/common/settings/Settings.java +++ b/src/main/java/org/cryptomator/common/settings/Settings.java @@ -38,7 +38,8 @@ public class Settings { public static final boolean DEFAULT_DEBUG_MODE = false; public static final VolumeImpl DEFAULT_PREFERRED_VOLUME_IMPL = SystemUtils.IS_OS_WINDOWS ? VolumeImpl.DOKANY : VolumeImpl.FUSE; public static final UiTheme DEFAULT_THEME = UiTheme.LIGHT; - public static final KeychainBackend DEFAULT_KEYCHAIN_BACKEND = SystemUtils.IS_OS_WINDOWS ? KeychainBackend.WIN_SYSTEM_KEYCHAIN : SystemUtils.IS_OS_MAC ? KeychainBackend.MAC_SYSTEM_KEYCHAIN : KeychainBackend.GNOME; + @Deprecated // to be changed to "whatever is available" eventually + public static final String DEFAULT_KEYCHAIN_PROVIDER = SystemUtils.IS_OS_WINDOWS ? "org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess" : SystemUtils.IS_OS_MAC ? "org.cryptomator.macos.keychain.MacSystemKeychainAccess" : "org.cryptomator.linux.keychain.SecretServiceKeychainAccess"; public static final NodeOrientation DEFAULT_USER_INTERFACE_ORIENTATION = NodeOrientation.LEFT_TO_RIGHT; public static final String DEFAULT_LICENSE_KEY = ""; public static final boolean DEFAULT_SHOW_MINIMIZE_BUTTON = false; @@ -53,7 +54,7 @@ public class Settings { private final BooleanProperty debugMode = new SimpleBooleanProperty(DEFAULT_DEBUG_MODE); private final ObjectProperty preferredVolumeImpl = new SimpleObjectProperty<>(DEFAULT_PREFERRED_VOLUME_IMPL); private final ObjectProperty theme = new SimpleObjectProperty<>(DEFAULT_THEME); - private final ObjectProperty keychainBackend = new SimpleObjectProperty<>(DEFAULT_KEYCHAIN_BACKEND); + private final ObjectProperty keychainProvider = new SimpleObjectProperty<>(DEFAULT_KEYCHAIN_PROVIDER); private final ObjectProperty userInterfaceOrientation = new SimpleObjectProperty<>(DEFAULT_USER_INTERFACE_ORIENTATION); private final StringProperty licenseKey = new SimpleStringProperty(DEFAULT_LICENSE_KEY); private final BooleanProperty showMinimizeButton = new SimpleBooleanProperty(DEFAULT_SHOW_MINIMIZE_BUTTON); @@ -77,7 +78,7 @@ public class Settings { debugMode.addListener(this::somethingChanged); preferredVolumeImpl.addListener(this::somethingChanged); theme.addListener(this::somethingChanged); - keychainBackend.addListener(this::somethingChanged); + keychainProvider.addListener(this::somethingChanged); userInterfaceOrientation.addListener(this::somethingChanged); licenseKey.addListener(this::somethingChanged); showMinimizeButton.addListener(this::somethingChanged); @@ -140,7 +141,7 @@ public class Settings { return theme; } - public ObjectProperty keychainBackend() { return keychainBackend; } + public ObjectProperty keychainProvider() { return keychainProvider; } public ObjectProperty userInterfaceOrientation() { return userInterfaceOrientation; diff --git a/src/main/java/org/cryptomator/common/settings/SettingsJsonAdapter.java b/src/main/java/org/cryptomator/common/settings/SettingsJsonAdapter.java index d22e0867f..5bcb5f3d7 100644 --- a/src/main/java/org/cryptomator/common/settings/SettingsJsonAdapter.java +++ b/src/main/java/org/cryptomator/common/settings/SettingsJsonAdapter.java @@ -48,7 +48,7 @@ public class SettingsJsonAdapter extends TypeAdapter { out.name("preferredVolumeImpl").value(value.preferredVolumeImpl().get().name()); out.name("theme").value(value.theme().get().name()); out.name("uiOrientation").value(value.userInterfaceOrientation().get().name()); - out.name("keychainBackend").value(value.keychainBackend().get().name()); + out.name("keychainProvider").value(value.keychainProvider().get()); out.name("licenseKey").value(value.licenseKey().get()); out.name("showMinimizeButton").value(value.showMinimizeButton().get()); out.name("showTrayIcon").value(value.showTrayIcon().get()); @@ -82,7 +82,7 @@ public class SettingsJsonAdapter extends TypeAdapter { case "preferredVolumeImpl" -> settings.preferredVolumeImpl().set(parsePreferredVolumeImplName(in.nextString())); case "theme" -> settings.theme().set(parseUiTheme(in.nextString())); case "uiOrientation" -> settings.userInterfaceOrientation().set(parseUiOrientation(in.nextString())); - case "keychainBackend" -> settings.keychainBackend().set(parseKeychainBackend(in.nextString())); + case "keychainProvider" -> settings.keychainProvider().set(in.nextString()); case "licenseKey" -> settings.licenseKey().set(in.nextString()); case "showMinimizeButton" -> settings.showMinimizeButton().set(in.nextBoolean()); case "showTrayIcon" -> settings.showTrayIcon().set(in.nextBoolean()); @@ -124,15 +124,6 @@ public class SettingsJsonAdapter extends TypeAdapter { } } - private KeychainBackend parseKeychainBackend(String backendName) { - try { - return KeychainBackend.valueOf(backendName.toUpperCase()); - } catch (IllegalArgumentException e) { - LOG.warn("Invalid keychain backend {}. Defaulting to {}.", backendName, Settings.DEFAULT_KEYCHAIN_BACKEND); - return Settings.DEFAULT_KEYCHAIN_BACKEND; - } - } - private NodeOrientation parseUiOrientation(String uiOrientationName) { try { return NodeOrientation.valueOf(uiOrientationName.toUpperCase()); diff --git a/src/main/java/org/cryptomator/ui/preferences/GeneralPreferencesController.java b/src/main/java/org/cryptomator/ui/preferences/GeneralPreferencesController.java index 64d71a8b7..9b22b2c97 100644 --- a/src/main/java/org/cryptomator/ui/preferences/GeneralPreferencesController.java +++ b/src/main/java/org/cryptomator/ui/preferences/GeneralPreferencesController.java @@ -2,7 +2,6 @@ package org.cryptomator.ui.preferences; import org.cryptomator.common.Environment; import org.cryptomator.common.LicenseHolder; -import org.cryptomator.common.settings.KeychainBackend; import org.cryptomator.common.settings.Settings; import org.cryptomator.common.settings.UiTheme; import org.cryptomator.integrations.autostart.AutoStartProvider; @@ -16,6 +15,7 @@ import org.slf4j.LoggerFactory; import javax.inject.Inject; import javafx.application.Application; +import javafx.beans.binding.Bindings; import javafx.beans.property.ObjectProperty; import javafx.beans.value.ObservableValue; import javafx.fxml.FXML; @@ -27,11 +27,9 @@ import javafx.scene.control.Toggle; import javafx.scene.control.ToggleGroup; import javafx.stage.Stage; import javafx.util.StringConverter; -import java.util.Arrays; import java.util.Optional; import java.util.ResourceBundle; import java.util.Set; -import java.util.stream.Collectors; @PreferencesScoped public class GeneralPreferencesController implements FxController { @@ -51,7 +49,7 @@ public class GeneralPreferencesController implements FxController { private final Set keychainAccessProviders; private final ErrorComponent.Builder errorComponent; public ChoiceBox themeChoiceBox; - public ChoiceBox keychainBackendChoiceBox; + public ChoiceBox keychainBackendChoiceBox; public CheckBox showMinimizeButtonCheckbox; public CheckBox showTrayIconCheckbox; public CheckBox startHiddenCheckbox; @@ -101,15 +99,13 @@ public class GeneralPreferencesController implements FxController { nodeOrientationRtl.setSelected(settings.userInterfaceOrientation().get() == NodeOrientation.RIGHT_TO_LEFT); nodeOrientation.selectedToggleProperty().addListener(this::toggleNodeOrientation); - keychainBackendChoiceBox.getItems().addAll(getAvailableBackends()); - keychainBackendChoiceBox.setConverter(new KeychainBackendConverter(resourceBundle)); - keychainBackendChoiceBox.valueProperty().bindBidirectional(settings.keychainBackend()); + var keychainSettingsConverter = new KeychainProviderClassNameConverter(keychainAccessProviders); + keychainBackendChoiceBox.getItems().addAll(keychainAccessProviders); + keychainBackendChoiceBox.setValue(keychainSettingsConverter.fromString(settings.keychainProvider().get())); + keychainBackendChoiceBox.setConverter(new KeychainProviderDisplayNameConverter()); + Bindings.bindBidirectional(settings.keychainProvider(), keychainBackendChoiceBox.valueProperty(), keychainSettingsConverter); } - private KeychainBackend[] getAvailableBackends() { - var namesOfAvailableProviders = keychainAccessProviders.stream().map(KeychainAccessProvider::getClass).map(Class::getName).collect(Collectors.toUnmodifiableSet()); - return Arrays.stream(KeychainBackend.values()).filter(value -> namesOfAvailableProviders.contains(value.getProviderClass())).toArray(KeychainBackend[]::new); - } public boolean isTrayMenuInitialized() { return trayMenuInitialized; @@ -188,23 +184,48 @@ public class GeneralPreferencesController implements FxController { } - private static class KeychainBackendConverter extends StringConverter { + private class KeychainProviderDisplayNameConverter extends StringConverter { - private final ResourceBundle resourceBundle; - - KeychainBackendConverter(ResourceBundle resourceBundle) { - this.resourceBundle = resourceBundle; + @Override + public String toString(KeychainAccessProvider provider) { + if (provider == null) { + return null; + } else { + return provider.displayName(); + } } @Override - public String toString(KeychainBackend impl) { - return resourceBundle.getString("preferences.general.keychainBackend." + impl.getProviderClass()); - } - - @Override - public KeychainBackend fromString(String string) { + public KeychainAccessProvider fromString(String string) { throw new UnsupportedOperationException(); } } + + private static class KeychainProviderClassNameConverter extends StringConverter { + + private final Set keychainAccessProviders; + + public KeychainProviderClassNameConverter(Set keychainAccessProviders) { + this.keychainAccessProviders = keychainAccessProviders; + } + + @Override + public String toString(KeychainAccessProvider provider) { + if (provider == null) { + return null; + } else { + return provider.getClass().getName(); + } + } + + @Override + public KeychainAccessProvider fromString(String string) { + if (string == null) { + return null; + } else { + return keychainAccessProviders.stream().filter(provider -> provider.getClass().getName().equals(string)).findAny().orElseThrow(); + } + } + } } diff --git a/src/main/resources/i18n/strings.properties b/src/main/resources/i18n/strings.properties index 8ffc15c4c..f0f550769 100644 --- a/src/main/resources/i18n/strings.properties +++ b/src/main/resources/i18n/strings.properties @@ -185,10 +185,6 @@ preferences.general.debugLogging=Enable debug logging preferences.general.debugDirectory=Reveal log files preferences.general.autoStart=Launch Cryptomator on system start preferences.general.keychainBackend=Store passwords with -preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Gnome Keyring -preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=KDE Wallet -preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=macOS Keychain Access -preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=Windows Data Protection preferences.general.interfaceOrientation=Interface Orientation preferences.general.interfaceOrientation.ltr=Left to Right preferences.general.interfaceOrientation.rtl=Right to Left