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