瀏覽代碼

Merge pull request #1685 from cryptomator/feature/provider-agnostic-keychains

Remove all references to specific keychain access providers
Sebastian Stenzel 3 年之前
父節點
當前提交
58376bddef

+ 1 - 1
pom.xml

@@ -25,7 +25,7 @@
 
 		<!-- cryptomator dependencies -->
 		<cryptomator.cryptofs.version>2.1.0-beta5</cryptomator.cryptofs.version>
-		<cryptomator.integrations.version>1.0.0-beta2</cryptomator.integrations.version>
+		<cryptomator.integrations.version>1.0.0-rc1</cryptomator.integrations.version>
 		<cryptomator.integrations.win.version>1.0.0-beta2</cryptomator.integrations.win.version>
 		<cryptomator.integrations.mac.version>1.0.0-beta2</cryptomator.integrations.mac.version>
 		<cryptomator.integrations.linux.version>1.0.0-beta1</cryptomator.integrations.linux.version>

+ 2 - 2
src/main/java/org/cryptomator/common/keychain/KeychainModule.java

@@ -34,11 +34,11 @@ public class KeychainModule {
 	@Singleton
 	static ObjectExpression<KeychainAccessProvider> provideKeychainAccessProvider(Settings settings, Set<KeychainAccessProvider> 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());
 	}
 
 }

+ 0 - 19
src/main/java/org/cryptomator/common/settings/KeychainBackend.java

@@ -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;
-	}
-
-}

+ 5 - 4
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<VolumeImpl> preferredVolumeImpl = new SimpleObjectProperty<>(DEFAULT_PREFERRED_VOLUME_IMPL);
 	private final ObjectProperty<UiTheme> theme = new SimpleObjectProperty<>(DEFAULT_THEME);
-	private final ObjectProperty<KeychainBackend> keychainBackend = new SimpleObjectProperty<>(DEFAULT_KEYCHAIN_BACKEND);
+	private final ObjectProperty<String> keychainProvider = new SimpleObjectProperty<>(DEFAULT_KEYCHAIN_PROVIDER);
 	private final ObjectProperty<NodeOrientation> 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> keychainBackend() { return keychainBackend; }
+	public ObjectProperty<String> keychainProvider() { return keychainProvider; }
 
 	public ObjectProperty<NodeOrientation> userInterfaceOrientation() {
 		return userInterfaceOrientation;

+ 2 - 11
src/main/java/org/cryptomator/common/settings/SettingsJsonAdapter.java

@@ -48,7 +48,7 @@ public class SettingsJsonAdapter extends TypeAdapter<Settings> {
 		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<Settings> {
 				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<Settings> {
 		}
 	}
 
-	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());

+ 41 - 20
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<KeychainAccessProvider> keychainAccessProviders;
 	private final ErrorComponent.Builder errorComponent;
 	public ChoiceBox<UiTheme> themeChoiceBox;
-	public ChoiceBox<KeychainBackend> keychainBackendChoiceBox;
+	public ChoiceBox<KeychainAccessProvider> 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<KeychainBackend> {
-
-		private final ResourceBundle resourceBundle;
+	private class KeychainProviderDisplayNameConverter extends StringConverter<KeychainAccessProvider> {
 
-		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());
+		public KeychainAccessProvider fromString(String string) {
+			throw new UnsupportedOperationException();
+		}
+
+	}
+
+	private static class KeychainProviderClassNameConverter extends StringConverter<KeychainAccessProvider> {
+
+		private final Set<KeychainAccessProvider> keychainAccessProviders;
+
+		public KeychainProviderClassNameConverter(Set<KeychainAccessProvider> keychainAccessProviders) {
+			this.keychainAccessProviders = keychainAccessProviders;
 		}
 
 		@Override
-		public KeychainBackend fromString(String string) {
-			throw new UnsupportedOperationException();
+		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();
+			}
+		}
 	}
 }

+ 0 - 4
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