From 6365c222971dc291a8f2a75c8d0c26546df43241 Mon Sep 17 00:00:00 2001 From: Jan-Peter Klein Date: Wed, 22 Jan 2025 16:46:18 +0100 Subject: [PATCH 01/11] add keyLoader entry to VaultSettings --- .../common/settings/VaultSettings.java | 3 +++ .../common/settings/VaultSettingsJson.java | 3 +++ .../org/cryptomator/common/vaults/Vault.java | 10 ++++++++++ .../common/vaults/VaultListManager.java | 18 ++++++++++++++++++ .../HubToPasswordConvertController.java | 2 ++ .../ui/sharevault/ShareVaultController.java | 4 ++-- .../vaultoptions/VaultOptionsController.java | 6 +++--- 7 files changed, 41 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/cryptomator/common/settings/VaultSettings.java b/src/main/java/org/cryptomator/common/settings/VaultSettings.java index fd21fc197..efc06ff18 100644 --- a/src/main/java/org/cryptomator/common/settings/VaultSettings.java +++ b/src/main/java/org/cryptomator/common/settings/VaultSettings.java @@ -58,6 +58,7 @@ public class VaultSettings { public final StringExpression mountName; public final StringProperty mountService; public final IntegerProperty port; + public final StringProperty keyLoader; VaultSettings(VaultSettingsJson json) { this.id = json.id; @@ -74,6 +75,7 @@ public class VaultSettings { this.mountPoint = new SimpleObjectProperty<>(this, "mountPoint", json.mountPoint == null ? null : Path.of(json.mountPoint)); this.mountService = new SimpleStringProperty(this, "mountService", json.mountService); this.port = new SimpleIntegerProperty(this, "port", json.port); + this.keyLoader = new SimpleStringProperty(this, "keyLoader", json.keyLoader); // mount name is no longer an explicit setting, see https://github.com/cryptomator/cryptomator/pull/1318 this.mountName = StringExpression.stringExpression(Bindings.createStringBinding(() -> { final String name; @@ -130,6 +132,7 @@ public class VaultSettings { json.mountPoint = mountPoint.map(Path::toString).getValue(); json.mountService = mountService.get(); json.port = port.get(); + json.keyLoader = keyLoader.get(); return json; } diff --git a/src/main/java/org/cryptomator/common/settings/VaultSettingsJson.java b/src/main/java/org/cryptomator/common/settings/VaultSettingsJson.java index 43aa204e8..61de7ae7b 100644 --- a/src/main/java/org/cryptomator/common/settings/VaultSettingsJson.java +++ b/src/main/java/org/cryptomator/common/settings/VaultSettingsJson.java @@ -48,6 +48,9 @@ class VaultSettingsJson { @JsonProperty("mountService") String mountService; + @JsonProperty("keyLoader") + String keyLoader; + @JsonProperty("port") int port = VaultSettings.DEFAULT_PORT; diff --git a/src/main/java/org/cryptomator/common/vaults/Vault.java b/src/main/java/org/cryptomator/common/vaults/Vault.java index f857d6ba1..182372a56 100644 --- a/src/main/java/org/cryptomator/common/vaults/Vault.java +++ b/src/main/java/org/cryptomator/common/vaults/Vault.java @@ -75,6 +75,7 @@ public class Vault { private final Mounter mounter; private final Settings settings; private final BooleanProperty showingStats; + private final StringBinding keyLoader; private final AtomicReference mountHandle = new AtomicReference<>(null); @@ -104,6 +105,7 @@ public class Vault { this.settings = settings; this.showingStats = new SimpleBooleanProperty(false); this.quickAccessEntry = new AtomicReference<>(null); + this.keyLoader = Bindings.createStringBinding(this::getKeyLoader, vaultSettings.keyLoader); } // ****************************************************************************** @@ -340,6 +342,14 @@ public class Vault { return handle == null ? null : handle.mountObj().getMountpoint(); } + public StringBinding keyLoaderProperty() { + return keyLoader; + } + + public String getKeyLoader() { + return vaultSettings.keyLoader.get(); + } + public StringBinding displayablePathProperty() { return displayablePath; } diff --git a/src/main/java/org/cryptomator/common/vaults/VaultListManager.java b/src/main/java/org/cryptomator/common/vaults/VaultListManager.java index 87faff77a..b14c8457d 100644 --- a/src/main/java/org/cryptomator/common/vaults/VaultListManager.java +++ b/src/main/java/org/cryptomator/common/vaults/VaultListManager.java @@ -27,6 +27,7 @@ import java.nio.file.NoSuchFileException; import java.nio.file.Path; import java.util.Collection; import java.util.List; +import java.util.Objects; import java.util.Optional; import java.util.ResourceBundle; @@ -73,11 +74,27 @@ public class VaultListManager { return get(normalizedPathToVault) // .orElseGet(() -> { Vault newVault = create(newVaultSettings(normalizedPathToVault)); + setVaultScheme(newVault); vaultList.add(newVault); return newVault; }); } + private void setVaultScheme(Vault vault) { + try { + var keyLoader = vault.getVaultSettings().keyLoader; + if (Objects.isNull(keyLoader.get())) { + var vaultConfig = vault.getVaultConfigCache().get(); + var keyIdScheme = vaultConfig.getKeyId().getScheme(); + keyLoader.set(keyIdScheme); + } + } catch (NoSuchFileException e) { + LOG.error("NoSuchFileException", e); + } catch (IOException e) { + throw new RuntimeException("Unexpected Exception", e); + } + } + private VaultSettings newVaultSettings(Path path) { VaultSettings vaultSettings = VaultSettings.withRandomId(); vaultSettings.path.set(path); @@ -101,6 +118,7 @@ public class VaultListManager { private void addAll(Collection vaultSettings) { Collection vaults = vaultSettings.stream().map(this::create).toList(); vaultList.addAll(vaults); + vaults.forEach(this::setVaultScheme); } private Optional get(Path vaultPath) { diff --git a/src/main/java/org/cryptomator/ui/convertvault/HubToPasswordConvertController.java b/src/main/java/org/cryptomator/ui/convertvault/HubToPasswordConvertController.java index fd6d49b89..a02c7a0b9 100644 --- a/src/main/java/org/cryptomator/ui/convertvault/HubToPasswordConvertController.java +++ b/src/main/java/org/cryptomator/ui/convertvault/HubToPasswordConvertController.java @@ -15,6 +15,7 @@ import org.cryptomator.ui.common.FxController; import org.cryptomator.ui.common.FxmlFile; import org.cryptomator.ui.common.FxmlScene; import org.cryptomator.ui.fxapp.FxApplicationWindows; +import org.cryptomator.ui.keyloading.masterkeyfile.MasterkeyFileLoadingStrategy; import org.cryptomator.ui.recoverykey.RecoveryKeyFactory; import org.jetbrains.annotations.VisibleForTesting; import org.slf4j.Logger; @@ -108,6 +109,7 @@ public class HubToPasswordConvertController implements FxController { .thenRunAsync(this::convertInternal, backgroundExecutorService) // .whenCompleteAsync((result, exception) -> { if (exception == null) { + vault.getVaultSettings().keyLoader.set(MasterkeyFileLoadingStrategy.SCHEME); LOG.info("Conversion of vault {} succeeded.", vault.getPath()); window.setScene(successScene.get()); } else { diff --git a/src/main/java/org/cryptomator/ui/sharevault/ShareVaultController.java b/src/main/java/org/cryptomator/ui/sharevault/ShareVaultController.java index 63230cbbf..37202d2de 100644 --- a/src/main/java/org/cryptomator/ui/sharevault/ShareVaultController.java +++ b/src/main/java/org/cryptomator/ui/sharevault/ShareVaultController.java @@ -33,8 +33,8 @@ public class ShareVaultController implements FxController { this.window = window; this.application = application; this.vault = vault; - var vaultScheme = vault.getVaultConfigCache().getUnchecked().getKeyId().getScheme(); - this.hubVault = (vaultScheme.equals(HubKeyLoadingStrategy.SCHEME_HUB_HTTP) || vaultScheme.equals(HubKeyLoadingStrategy.SCHEME_HUB_HTTPS)); + var vaultKeyLoader = vault.getVaultSettings().keyLoader.get(); + this.hubVault = (vaultKeyLoader.equals(HubKeyLoadingStrategy.SCHEME_HUB_HTTP) || vaultKeyLoader.equals(HubKeyLoadingStrategy.SCHEME_HUB_HTTPS)); } @FXML diff --git a/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsController.java b/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsController.java index 78d228995..aa8bfcd9b 100644 --- a/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsController.java +++ b/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsController.java @@ -42,11 +42,11 @@ public class VaultOptionsController implements FxController { window.setOnShowing(this::windowWillAppear); selectedTabProperty.addListener(observable -> this.selectChosenTab()); tabPane.getSelectionModel().selectedItemProperty().addListener(observable -> this.selectedTabChanged()); - var vaultScheme = vault.getVaultConfigCache().getUnchecked().getKeyId().getScheme(); - if(!vaultScheme.equals(MasterkeyFileLoadingStrategy.SCHEME)){ + var vaultKeyLoader = vault.getVaultSettings().keyLoader.get(); + if(!vaultKeyLoader.equals(MasterkeyFileLoadingStrategy.SCHEME)){ tabPane.getTabs().remove(keyTab); } - if(!(vaultScheme.equals(HubKeyLoadingStrategy.SCHEME_HUB_HTTP) || vaultScheme.equals(HubKeyLoadingStrategy.SCHEME_HUB_HTTPS))){ + if(!(vaultKeyLoader.equals(HubKeyLoadingStrategy.SCHEME_HUB_HTTP) || vaultKeyLoader.equals(HubKeyLoadingStrategy.SCHEME_HUB_HTTPS))){ tabPane.getTabs().remove(hubTab); } From b25b5bd5a3dee00b40349ac9eff55c4cb1bd71be Mon Sep 17 00:00:00 2001 From: Jan-Peter Klein Date: Wed, 22 Jan 2025 16:59:52 +0100 Subject: [PATCH 02/11] add keyLoader to observables --- .../java/org/cryptomator/common/settings/VaultSettings.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/cryptomator/common/settings/VaultSettings.java b/src/main/java/org/cryptomator/common/settings/VaultSettings.java index efc06ff18..b211b356b 100644 --- a/src/main/java/org/cryptomator/common/settings/VaultSettings.java +++ b/src/main/java/org/cryptomator/common/settings/VaultSettings.java @@ -101,7 +101,7 @@ public class VaultSettings { } Observable[] observables() { - return new Observable[]{actionAfterUnlock, autoLockIdleSeconds, autoLockWhenIdle, displayName, maxCleartextFilenameLength, mountFlags, mountPoint, path, revealAfterMount, unlockAfterStartup, usesReadOnlyMode, port, mountService}; + return new Observable[]{actionAfterUnlock, autoLockIdleSeconds, autoLockWhenIdle, displayName, maxCleartextFilenameLength, mountFlags, mountPoint, path, revealAfterMount, unlockAfterStartup, usesReadOnlyMode, port, mountService, keyLoader}; } public static VaultSettings withRandomId() { From ba34cfa9d59a05c3562297fc1270c7a4066882fc Mon Sep 17 00:00:00 2001 From: Jan-Peter Klein Date: Mon, 10 Feb 2025 12:07:25 +0100 Subject: [PATCH 03/11] renamed to lastKnownKeyLoader --- .../cryptomator/common/settings/VaultSettings.java | 8 ++++---- .../common/settings/VaultSettingsJson.java | 4 ++-- .../java/org/cryptomator/common/vaults/Vault.java | 12 ++++++------ .../cryptomator/common/vaults/VaultListManager.java | 6 +++--- .../convertvault/HubToPasswordConvertController.java | 2 +- .../ui/sharevault/ShareVaultController.java | 2 +- .../ui/vaultoptions/VaultOptionsController.java | 2 +- 7 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/main/java/org/cryptomator/common/settings/VaultSettings.java b/src/main/java/org/cryptomator/common/settings/VaultSettings.java index b211b356b..5112415b4 100644 --- a/src/main/java/org/cryptomator/common/settings/VaultSettings.java +++ b/src/main/java/org/cryptomator/common/settings/VaultSettings.java @@ -58,7 +58,7 @@ public class VaultSettings { public final StringExpression mountName; public final StringProperty mountService; public final IntegerProperty port; - public final StringProperty keyLoader; + public final StringProperty lastKnownKeyLoader; VaultSettings(VaultSettingsJson json) { this.id = json.id; @@ -75,7 +75,7 @@ public class VaultSettings { this.mountPoint = new SimpleObjectProperty<>(this, "mountPoint", json.mountPoint == null ? null : Path.of(json.mountPoint)); this.mountService = new SimpleStringProperty(this, "mountService", json.mountService); this.port = new SimpleIntegerProperty(this, "port", json.port); - this.keyLoader = new SimpleStringProperty(this, "keyLoader", json.keyLoader); + this.lastKnownKeyLoader = new SimpleStringProperty(this, "lastKnownKeyLoader", json.lastKnownKeyLoader); // mount name is no longer an explicit setting, see https://github.com/cryptomator/cryptomator/pull/1318 this.mountName = StringExpression.stringExpression(Bindings.createStringBinding(() -> { final String name; @@ -101,7 +101,7 @@ public class VaultSettings { } Observable[] observables() { - return new Observable[]{actionAfterUnlock, autoLockIdleSeconds, autoLockWhenIdle, displayName, maxCleartextFilenameLength, mountFlags, mountPoint, path, revealAfterMount, unlockAfterStartup, usesReadOnlyMode, port, mountService, keyLoader}; + return new Observable[]{actionAfterUnlock, autoLockIdleSeconds, autoLockWhenIdle, displayName, maxCleartextFilenameLength, mountFlags, mountPoint, path, revealAfterMount, unlockAfterStartup, usesReadOnlyMode, port, mountService, lastKnownKeyLoader}; } public static VaultSettings withRandomId() { @@ -132,7 +132,7 @@ public class VaultSettings { json.mountPoint = mountPoint.map(Path::toString).getValue(); json.mountService = mountService.get(); json.port = port.get(); - json.keyLoader = keyLoader.get(); + json.lastKnownKeyLoader = lastKnownKeyLoader.get(); return json; } diff --git a/src/main/java/org/cryptomator/common/settings/VaultSettingsJson.java b/src/main/java/org/cryptomator/common/settings/VaultSettingsJson.java index 61de7ae7b..870b74e07 100644 --- a/src/main/java/org/cryptomator/common/settings/VaultSettingsJson.java +++ b/src/main/java/org/cryptomator/common/settings/VaultSettingsJson.java @@ -48,8 +48,8 @@ class VaultSettingsJson { @JsonProperty("mountService") String mountService; - @JsonProperty("keyLoader") - String keyLoader; + @JsonProperty("lastKnownKeyLoader") + String lastKnownKeyLoader; @JsonProperty("port") int port = VaultSettings.DEFAULT_PORT; diff --git a/src/main/java/org/cryptomator/common/vaults/Vault.java b/src/main/java/org/cryptomator/common/vaults/Vault.java index 182372a56..7605b9f34 100644 --- a/src/main/java/org/cryptomator/common/vaults/Vault.java +++ b/src/main/java/org/cryptomator/common/vaults/Vault.java @@ -75,7 +75,7 @@ public class Vault { private final Mounter mounter; private final Settings settings; private final BooleanProperty showingStats; - private final StringBinding keyLoader; + private final StringBinding lastKnownKeyLoader; private final AtomicReference mountHandle = new AtomicReference<>(null); @@ -105,7 +105,7 @@ public class Vault { this.settings = settings; this.showingStats = new SimpleBooleanProperty(false); this.quickAccessEntry = new AtomicReference<>(null); - this.keyLoader = Bindings.createStringBinding(this::getKeyLoader, vaultSettings.keyLoader); + this.lastKnownKeyLoader = Bindings.createStringBinding(this::getLastKnownKeyLoader, vaultSettings.lastKnownKeyLoader); } // ****************************************************************************** @@ -342,12 +342,12 @@ public class Vault { return handle == null ? null : handle.mountObj().getMountpoint(); } - public StringBinding keyLoaderProperty() { - return keyLoader; + public StringBinding lastKnownKeyLoaderProperty() { + return lastKnownKeyLoader; } - public String getKeyLoader() { - return vaultSettings.keyLoader.get(); + public String getLastKnownKeyLoader() { + return vaultSettings.lastKnownKeyLoader.get(); } public StringBinding displayablePathProperty() { diff --git a/src/main/java/org/cryptomator/common/vaults/VaultListManager.java b/src/main/java/org/cryptomator/common/vaults/VaultListManager.java index b14c8457d..944c7573d 100644 --- a/src/main/java/org/cryptomator/common/vaults/VaultListManager.java +++ b/src/main/java/org/cryptomator/common/vaults/VaultListManager.java @@ -82,11 +82,11 @@ public class VaultListManager { private void setVaultScheme(Vault vault) { try { - var keyLoader = vault.getVaultSettings().keyLoader; - if (Objects.isNull(keyLoader.get())) { + var lastKnownKeyLoader = vault.getVaultSettings().lastKnownKeyLoader; + if (Objects.isNull(lastKnownKeyLoader.get())) { var vaultConfig = vault.getVaultConfigCache().get(); var keyIdScheme = vaultConfig.getKeyId().getScheme(); - keyLoader.set(keyIdScheme); + lastKnownKeyLoader.set(keyIdScheme); } } catch (NoSuchFileException e) { LOG.error("NoSuchFileException", e); diff --git a/src/main/java/org/cryptomator/ui/convertvault/HubToPasswordConvertController.java b/src/main/java/org/cryptomator/ui/convertvault/HubToPasswordConvertController.java index a02c7a0b9..dc95f7051 100644 --- a/src/main/java/org/cryptomator/ui/convertvault/HubToPasswordConvertController.java +++ b/src/main/java/org/cryptomator/ui/convertvault/HubToPasswordConvertController.java @@ -109,7 +109,7 @@ public class HubToPasswordConvertController implements FxController { .thenRunAsync(this::convertInternal, backgroundExecutorService) // .whenCompleteAsync((result, exception) -> { if (exception == null) { - vault.getVaultSettings().keyLoader.set(MasterkeyFileLoadingStrategy.SCHEME); + vault.getVaultSettings().lastKnownKeyLoader.set(MasterkeyFileLoadingStrategy.SCHEME); LOG.info("Conversion of vault {} succeeded.", vault.getPath()); window.setScene(successScene.get()); } else { diff --git a/src/main/java/org/cryptomator/ui/sharevault/ShareVaultController.java b/src/main/java/org/cryptomator/ui/sharevault/ShareVaultController.java index 37202d2de..6e386fd77 100644 --- a/src/main/java/org/cryptomator/ui/sharevault/ShareVaultController.java +++ b/src/main/java/org/cryptomator/ui/sharevault/ShareVaultController.java @@ -33,7 +33,7 @@ public class ShareVaultController implements FxController { this.window = window; this.application = application; this.vault = vault; - var vaultKeyLoader = vault.getVaultSettings().keyLoader.get(); + var vaultKeyLoader = vault.getVaultSettings().lastKnownKeyLoader.get(); this.hubVault = (vaultKeyLoader.equals(HubKeyLoadingStrategy.SCHEME_HUB_HTTP) || vaultKeyLoader.equals(HubKeyLoadingStrategy.SCHEME_HUB_HTTPS)); } diff --git a/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsController.java b/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsController.java index aa8bfcd9b..26d28a972 100644 --- a/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsController.java +++ b/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsController.java @@ -42,7 +42,7 @@ public class VaultOptionsController implements FxController { window.setOnShowing(this::windowWillAppear); selectedTabProperty.addListener(observable -> this.selectChosenTab()); tabPane.getSelectionModel().selectedItemProperty().addListener(observable -> this.selectedTabChanged()); - var vaultKeyLoader = vault.getVaultSettings().keyLoader.get(); + var vaultKeyLoader = vault.getVaultSettings().lastKnownKeyLoader.get(); if(!vaultKeyLoader.equals(MasterkeyFileLoadingStrategy.SCHEME)){ tabPane.getTabs().remove(keyTab); } From 126004b1f81e1a7d28a1d6ec604ec8bae90106fa Mon Sep 17 00:00:00 2001 From: Jan-Peter Klein Date: Mon, 10 Feb 2025 12:58:54 +0100 Subject: [PATCH 04/11] improve error handling --- .../common/vaults/VaultListManager.java | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/cryptomator/common/vaults/VaultListManager.java b/src/main/java/org/cryptomator/common/vaults/VaultListManager.java index 944c7573d..2e9173a22 100644 --- a/src/main/java/org/cryptomator/common/vaults/VaultListManager.java +++ b/src/main/java/org/cryptomator/common/vaults/VaultListManager.java @@ -74,13 +74,17 @@ public class VaultListManager { return get(normalizedPathToVault) // .orElseGet(() -> { Vault newVault = create(newVaultSettings(normalizedPathToVault)); - setVaultScheme(newVault); + try { + setVaultScheme(newVault); + } catch (IOException e) { + throw new RuntimeException(e); + } vaultList.add(newVault); return newVault; }); } - private void setVaultScheme(Vault vault) { + private void setVaultScheme(Vault vault) throws IOException { try { var lastKnownKeyLoader = vault.getVaultSettings().lastKnownKeyLoader; if (Objects.isNull(lastKnownKeyLoader.get())) { @@ -89,9 +93,12 @@ public class VaultListManager { lastKnownKeyLoader.set(keyIdScheme); } } catch (NoSuchFileException e) { - LOG.error("NoSuchFileException", e); + vault.stateProperty().set(VaultState.Value.ERROR); + LOG.error("Configuration file missing or corrupted.", e); } catch (IOException e) { - throw new RuntimeException("Unexpected Exception", e); + vault.stateProperty().set(VaultState.Value.ERROR); + LOG.error("Unexpected IO exception while setting vault scheme.", e); + throw new IOException("Configuration file missing or corrupted.", e); } } @@ -118,7 +125,13 @@ public class VaultListManager { private void addAll(Collection vaultSettings) { Collection vaults = vaultSettings.stream().map(this::create).toList(); vaultList.addAll(vaults); - vaults.forEach(this::setVaultScheme); + for (Vault vault : vaults) { + try { + setVaultScheme(vault); + } catch (IOException e) { + throw new RuntimeException(e); + } + } } private Optional get(Path vaultPath) { From 664158eb84d27f68f7f9c128a763c1492fbb36d9 Mon Sep 17 00:00:00 2001 From: Jan-Peter Klein Date: Mon, 10 Feb 2025 18:09:03 +0100 Subject: [PATCH 05/11] add isHubVault method to KeyLoadingStrategy --- .../ui/keyloading/KeyLoadingStrategy.java | 15 +++++++++++++++ .../ui/sharevault/ShareVaultController.java | 5 ++--- .../ui/vaultoptions/VaultOptionsController.java | 3 ++- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/cryptomator/ui/keyloading/KeyLoadingStrategy.java b/src/main/java/org/cryptomator/ui/keyloading/KeyLoadingStrategy.java index f3f0aff8e..9835724ea 100644 --- a/src/main/java/org/cryptomator/ui/keyloading/KeyLoadingStrategy.java +++ b/src/main/java/org/cryptomator/ui/keyloading/KeyLoadingStrategy.java @@ -3,6 +3,7 @@ package org.cryptomator.ui.keyloading; import org.cryptomator.cryptolib.api.Masterkey; import org.cryptomator.cryptolib.api.MasterkeyLoader; import org.cryptomator.cryptolib.api.MasterkeyLoadingFailedException; +import org.cryptomator.ui.keyloading.hub.HubKeyLoadingStrategy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -28,6 +29,20 @@ public interface KeyLoadingStrategy extends MasterkeyLoader { @Override Masterkey loadKey(URI keyId) throws MasterkeyLoadingFailedException; + /** + * Determines whether the provided key loader scheme corresponds to a Hub Vault. + *

+ * This method compares the {@code keyLoader} parameter with the known Hub Vault schemes + * {@link HubKeyLoadingStrategy#SCHEME_HUB_HTTP} and {@link HubKeyLoadingStrategy#SCHEME_HUB_HTTPS}. + * + * @param keyLoader A string representing the key loader scheme to be checked. + * @return {@code true} if the given key loader scheme represents a Hub Vault; {@code false} otherwise. + */ + static boolean isHubVault(String keyLoader) { + return keyLoader.equals(HubKeyLoadingStrategy.SCHEME_HUB_HTTP) || + keyLoader.equals(HubKeyLoadingStrategy.SCHEME_HUB_HTTPS); + } + /** * Allows the loader to try and recover from an exception thrown during the last attempt. * diff --git a/src/main/java/org/cryptomator/ui/sharevault/ShareVaultController.java b/src/main/java/org/cryptomator/ui/sharevault/ShareVaultController.java index 6e386fd77..859c9e38d 100644 --- a/src/main/java/org/cryptomator/ui/sharevault/ShareVaultController.java +++ b/src/main/java/org/cryptomator/ui/sharevault/ShareVaultController.java @@ -3,7 +3,7 @@ package org.cryptomator.ui.sharevault; import dagger.Lazy; import org.cryptomator.common.vaults.Vault; import org.cryptomator.ui.common.FxController; -import org.cryptomator.ui.keyloading.hub.HubKeyLoadingStrategy; +import org.cryptomator.ui.keyloading.KeyLoadingStrategy; import javax.inject.Inject; import javafx.application.Application; @@ -33,8 +33,7 @@ public class ShareVaultController implements FxController { this.window = window; this.application = application; this.vault = vault; - var vaultKeyLoader = vault.getVaultSettings().lastKnownKeyLoader.get(); - this.hubVault = (vaultKeyLoader.equals(HubKeyLoadingStrategy.SCHEME_HUB_HTTP) || vaultKeyLoader.equals(HubKeyLoadingStrategy.SCHEME_HUB_HTTPS)); + this.hubVault = KeyLoadingStrategy.isHubVault(vault.getVaultSettings().lastKnownKeyLoader.get()); } @FXML diff --git a/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsController.java b/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsController.java index 26d28a972..cf803f915 100644 --- a/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsController.java +++ b/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsController.java @@ -3,6 +3,7 @@ package org.cryptomator.ui.vaultoptions; import org.cryptomator.common.vaults.Vault; import org.cryptomator.common.vaults.VaultState; import org.cryptomator.ui.common.FxController; +import org.cryptomator.ui.keyloading.KeyLoadingStrategy; import org.cryptomator.ui.keyloading.hub.HubKeyLoadingStrategy; import org.cryptomator.ui.keyloading.masterkeyfile.MasterkeyFileLoadingStrategy; import org.slf4j.Logger; @@ -46,7 +47,7 @@ public class VaultOptionsController implements FxController { if(!vaultKeyLoader.equals(MasterkeyFileLoadingStrategy.SCHEME)){ tabPane.getTabs().remove(keyTab); } - if(!(vaultKeyLoader.equals(HubKeyLoadingStrategy.SCHEME_HUB_HTTP) || vaultKeyLoader.equals(HubKeyLoadingStrategy.SCHEME_HUB_HTTPS))){ + if(!KeyLoadingStrategy.isHubVault(vaultKeyLoader)){ tabPane.getTabs().remove(hubTab); } From 76a4ef50cb593ef9fed8dc981e6804ed3e58dda1 Mon Sep 17 00:00:00 2001 From: Jan-Peter Klein Date: Tue, 11 Feb 2025 16:21:53 +0100 Subject: [PATCH 06/11] improve exception handling --- .../common/vaults/VaultListManager.java | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/main/java/org/cryptomator/common/vaults/VaultListManager.java b/src/main/java/org/cryptomator/common/vaults/VaultListManager.java index 2e9173a22..c8c37893e 100644 --- a/src/main/java/org/cryptomator/common/vaults/VaultListManager.java +++ b/src/main/java/org/cryptomator/common/vaults/VaultListManager.java @@ -50,9 +50,9 @@ public class VaultListManager { @Inject public VaultListManager(ObservableList vaultList, // AutoLocker autoLocker, // - List mountServices, - VaultComponent.Factory vaultComponentFactory, - ResourceBundle resourceBundle, + List mountServices, // + VaultComponent.Factory vaultComponentFactory, // + ResourceBundle resourceBundle, // Settings settings) { this.vaultList = vaultList; this.autoLocker = autoLocker; @@ -71,17 +71,15 @@ public class VaultListManager { throw new NoSuchFileException(normalizedPathToVault.toString(), null, "Not a vault directory"); } - return get(normalizedPathToVault) // - .orElseGet(() -> { - Vault newVault = create(newVaultSettings(normalizedPathToVault)); - try { - setVaultScheme(newVault); - } catch (IOException e) { - throw new RuntimeException(e); - } - vaultList.add(newVault); - return newVault; - }); + var maybeVault = get(normalizedPathToVault); + if (maybeVault.isEmpty()) { + Vault newVault = create(newVaultSettings(normalizedPathToVault)); + setVaultScheme(newVault); + vaultList.add(newVault); + return newVault; + } else { + return maybeVault.get(); + } } private void setVaultScheme(Vault vault) throws IOException { @@ -94,11 +92,11 @@ public class VaultListManager { } } catch (NoSuchFileException e) { vault.stateProperty().set(VaultState.Value.ERROR); - LOG.error("Configuration file missing or corrupted.", e); + LOG.error("Configuration file missing.", e); } catch (IOException e) { vault.stateProperty().set(VaultState.Value.ERROR); LOG.error("Unexpected IO exception while setting vault scheme.", e); - throw new IOException("Configuration file missing or corrupted.", e); + throw e; } } From 7ecc10bc790219237ce8e4006a583beb8b4d8ae2 Mon Sep 17 00:00:00 2001 From: Jan-Peter Klein Date: Wed, 12 Feb 2025 10:35:21 +0100 Subject: [PATCH 07/11] removed setVaultScheme method; lastKnownKeyLoader is now set within the create method --- .../common/vaults/VaultListManager.java | 49 ++++++------------- 1 file changed, 15 insertions(+), 34 deletions(-) diff --git a/src/main/java/org/cryptomator/common/vaults/VaultListManager.java b/src/main/java/org/cryptomator/common/vaults/VaultListManager.java index c8c37893e..fcbf6cf6c 100644 --- a/src/main/java/org/cryptomator/common/vaults/VaultListManager.java +++ b/src/main/java/org/cryptomator/common/vaults/VaultListManager.java @@ -71,33 +71,12 @@ public class VaultListManager { throw new NoSuchFileException(normalizedPathToVault.toString(), null, "Not a vault directory"); } - var maybeVault = get(normalizedPathToVault); - if (maybeVault.isEmpty()) { - Vault newVault = create(newVaultSettings(normalizedPathToVault)); - setVaultScheme(newVault); - vaultList.add(newVault); - return newVault; - } else { - return maybeVault.get(); - } - } - - private void setVaultScheme(Vault vault) throws IOException { - try { - var lastKnownKeyLoader = vault.getVaultSettings().lastKnownKeyLoader; - if (Objects.isNull(lastKnownKeyLoader.get())) { - var vaultConfig = vault.getVaultConfigCache().get(); - var keyIdScheme = vaultConfig.getKeyId().getScheme(); - lastKnownKeyLoader.set(keyIdScheme); - } - } catch (NoSuchFileException e) { - vault.stateProperty().set(VaultState.Value.ERROR); - LOG.error("Configuration file missing.", e); - } catch (IOException e) { - vault.stateProperty().set(VaultState.Value.ERROR); - LOG.error("Unexpected IO exception while setting vault scheme.", e); - throw e; - } + return get(normalizedPathToVault) // + .orElseGet(() -> { + Vault newVault = create(newVaultSettings(normalizedPathToVault)); + vaultList.add(newVault); + return newVault; + }); } private VaultSettings newVaultSettings(Path path) { @@ -123,13 +102,6 @@ public class VaultListManager { private void addAll(Collection vaultSettings) { Collection vaults = vaultSettings.stream().map(this::create).toList(); vaultList.addAll(vaults); - for (Vault vault : vaults) { - try { - setVaultScheme(vault); - } catch (IOException e) { - throw new RuntimeException(e); - } - } } private Optional get(Path vaultPath) { @@ -143,6 +115,15 @@ public class VaultListManager { private Vault create(VaultSettings vaultSettings) { var wrapper = new VaultConfigCache(vaultSettings); try { + if (Objects.isNull(vaultSettings.lastKnownKeyLoader.get())) { + try { + var keyIdScheme = wrapper.get().getKeyId().getScheme(); + vaultSettings.lastKnownKeyLoader.set(keyIdScheme); + } catch (NoSuchFileException e) { + LOG.error("Configuration file missing.", e); + return vaultComponentFactory.create(vaultSettings, wrapper, ERROR, e).vault(); + } + } var vaultState = determineVaultState(vaultSettings.path.get()); if (vaultState == LOCKED) { //for legacy reasons: pre v8 vault do not have a config, but they are in the NEEDS_MIGRATION state wrapper.reloadConfig(); From 4adc4a9175bf5735742654acc18df58d9346c6a6 Mon Sep 17 00:00:00 2001 From: Jan-Peter Klein Date: Thu, 13 Feb 2025 15:03:14 +0100 Subject: [PATCH 08/11] removed unused StringBinding --- src/main/java/org/cryptomator/common/vaults/Vault.java | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/main/java/org/cryptomator/common/vaults/Vault.java b/src/main/java/org/cryptomator/common/vaults/Vault.java index 7605b9f34..f857d6ba1 100644 --- a/src/main/java/org/cryptomator/common/vaults/Vault.java +++ b/src/main/java/org/cryptomator/common/vaults/Vault.java @@ -75,7 +75,6 @@ public class Vault { private final Mounter mounter; private final Settings settings; private final BooleanProperty showingStats; - private final StringBinding lastKnownKeyLoader; private final AtomicReference mountHandle = new AtomicReference<>(null); @@ -105,7 +104,6 @@ public class Vault { this.settings = settings; this.showingStats = new SimpleBooleanProperty(false); this.quickAccessEntry = new AtomicReference<>(null); - this.lastKnownKeyLoader = Bindings.createStringBinding(this::getLastKnownKeyLoader, vaultSettings.lastKnownKeyLoader); } // ****************************************************************************** @@ -342,14 +340,6 @@ public class Vault { return handle == null ? null : handle.mountObj().getMountpoint(); } - public StringBinding lastKnownKeyLoaderProperty() { - return lastKnownKeyLoader; - } - - public String getLastKnownKeyLoader() { - return vaultSettings.lastKnownKeyLoader.get(); - } - public StringBinding displayablePathProperty() { return displayablePath; } From f0aaec2058467ea88dab95cf52b4b50f51942411 Mon Sep 17 00:00:00 2001 From: Jan-Peter Klein Date: Thu, 13 Feb 2025 15:15:29 +0100 Subject: [PATCH 09/11] comparison reversed --- .../java/org/cryptomator/ui/keyloading/KeyLoadingStrategy.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/org/cryptomator/ui/keyloading/KeyLoadingStrategy.java b/src/main/java/org/cryptomator/ui/keyloading/KeyLoadingStrategy.java index 9835724ea..ed843ff35 100644 --- a/src/main/java/org/cryptomator/ui/keyloading/KeyLoadingStrategy.java +++ b/src/main/java/org/cryptomator/ui/keyloading/KeyLoadingStrategy.java @@ -39,8 +39,7 @@ public interface KeyLoadingStrategy extends MasterkeyLoader { * @return {@code true} if the given key loader scheme represents a Hub Vault; {@code false} otherwise. */ static boolean isHubVault(String keyLoader) { - return keyLoader.equals(HubKeyLoadingStrategy.SCHEME_HUB_HTTP) || - keyLoader.equals(HubKeyLoadingStrategy.SCHEME_HUB_HTTPS); + return HubKeyLoadingStrategy.SCHEME_HUB_HTTP.equals(keyLoader) || HubKeyLoadingStrategy.SCHEME_HUB_HTTPS.equals(keyLoader); } /** From 5b9d9150c56d4fa93c5f1514dd525a18dfb41018 Mon Sep 17 00:00:00 2001 From: Jan-Peter Klein Date: Thu, 13 Feb 2025 15:39:06 +0100 Subject: [PATCH 10/11] remove extra try catch block --- .../org/cryptomator/common/vaults/VaultListManager.java | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/cryptomator/common/vaults/VaultListManager.java b/src/main/java/org/cryptomator/common/vaults/VaultListManager.java index fcbf6cf6c..c362ca0c0 100644 --- a/src/main/java/org/cryptomator/common/vaults/VaultListManager.java +++ b/src/main/java/org/cryptomator/common/vaults/VaultListManager.java @@ -116,13 +116,8 @@ public class VaultListManager { var wrapper = new VaultConfigCache(vaultSettings); try { if (Objects.isNull(vaultSettings.lastKnownKeyLoader.get())) { - try { - var keyIdScheme = wrapper.get().getKeyId().getScheme(); - vaultSettings.lastKnownKeyLoader.set(keyIdScheme); - } catch (NoSuchFileException e) { - LOG.error("Configuration file missing.", e); - return vaultComponentFactory.create(vaultSettings, wrapper, ERROR, e).vault(); - } + var keyIdScheme = wrapper.get().getKeyId().getScheme(); + vaultSettings.lastKnownKeyLoader.set(keyIdScheme); } var vaultState = determineVaultState(vaultSettings.path.get()); if (vaultState == LOCKED) { //for legacy reasons: pre v8 vault do not have a config, but they are in the NEEDS_MIGRATION state From 2df779f7aba6c4a3a03bbcb759677906d51b685b Mon Sep 17 00:00:00 2001 From: Jan-Peter Klein Date: Thu, 13 Feb 2025 15:44:10 +0100 Subject: [PATCH 11/11] introduce isMasterkeyFileVault() --- .../ui/keyloading/KeyLoadingStrategy.java | 15 +++++++++++++++ .../ui/vaultoptions/VaultOptionsController.java | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/cryptomator/ui/keyloading/KeyLoadingStrategy.java b/src/main/java/org/cryptomator/ui/keyloading/KeyLoadingStrategy.java index ed843ff35..b9af0f4a3 100644 --- a/src/main/java/org/cryptomator/ui/keyloading/KeyLoadingStrategy.java +++ b/src/main/java/org/cryptomator/ui/keyloading/KeyLoadingStrategy.java @@ -4,6 +4,7 @@ import org.cryptomator.cryptolib.api.Masterkey; import org.cryptomator.cryptolib.api.MasterkeyLoader; import org.cryptomator.cryptolib.api.MasterkeyLoadingFailedException; import org.cryptomator.ui.keyloading.hub.HubKeyLoadingStrategy; +import org.cryptomator.ui.keyloading.masterkeyfile.MasterkeyFileLoadingStrategy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -42,6 +43,20 @@ public interface KeyLoadingStrategy extends MasterkeyLoader { return HubKeyLoadingStrategy.SCHEME_HUB_HTTP.equals(keyLoader) || HubKeyLoadingStrategy.SCHEME_HUB_HTTPS.equals(keyLoader); } + /** + * Determines whether the provided key loader scheme corresponds to a Masterkey File Vault. + *

+ * This method checks if the {@code keyLoader} parameter matches the known Masterkey File Vault scheme + * {@link MasterkeyFileLoadingStrategy#SCHEME}. + *

+ * + * @param keyLoader A string representing the key loader scheme to be checked. + * @return {@code true} if the given key loader scheme represents a Masterkey File Vault; {@code false} otherwise. + */ + static boolean isMasterkeyFileVault(String keyLoader) { + return MasterkeyFileLoadingStrategy.SCHEME.equals(keyLoader); + } + /** * Allows the loader to try and recover from an exception thrown during the last attempt. * diff --git a/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsController.java b/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsController.java index cf803f915..154eb30dd 100644 --- a/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsController.java +++ b/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsController.java @@ -44,7 +44,7 @@ public class VaultOptionsController implements FxController { selectedTabProperty.addListener(observable -> this.selectChosenTab()); tabPane.getSelectionModel().selectedItemProperty().addListener(observable -> this.selectedTabChanged()); var vaultKeyLoader = vault.getVaultSettings().lastKnownKeyLoader.get(); - if(!vaultKeyLoader.equals(MasterkeyFileLoadingStrategy.SCHEME)){ + if(!KeyLoadingStrategy.isMasterkeyFileVault(vaultKeyLoader)){ tabPane.getTabs().remove(keyTab); } if(!KeyLoadingStrategy.isHubVault(vaultKeyLoader)){