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/26] 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/26] 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/26] 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/26] 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/26] 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/26] 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/26] 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/26] 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/26] 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/26] 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/26] 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)){ From cc0b6aed15dd97f69b69835467bd30c956b7bf71 Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Tue, 18 Feb 2025 16:52:31 +0100 Subject: [PATCH 12/26] Update org.cryptomator.Cryptomator.metainfo.xml * adjust screenshot captions * reorder screenshots * add keywords --- .../org.cryptomator.Cryptomator.metainfo.xml | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/dist/linux/common/org.cryptomator.Cryptomator.metainfo.xml b/dist/linux/common/org.cryptomator.Cryptomator.metainfo.xml index c91a3db6e..d69716e06 100644 --- a/dist/linux/common/org.cryptomator.Cryptomator.metainfo.xml +++ b/dist/linux/common/org.cryptomator.Cryptomator.metainfo.xml @@ -6,6 +6,12 @@ Cryptomator Encryption for your cloud made easy + + encryption + security + privacy + +

Cryptomator provides easy-to-use, transparent, client-side encryption for your cloud. @@ -43,16 +49,16 @@ - Encrypt your data, protect your privacy - https://static.cryptomator.org/desktop/flathubScreenshots/MainWindowUnlocked_light.png + Encrypts your data, protects your privacy + https://static.cryptomator.org/desktop/flathubScreenshots/MainWindowUnlockDialog_light.png Dark theme available https://static.cryptomator.org/desktop/flathubScreenshots/MainWindowUnlocked_dark.png - Uses AES-GCM 256 - an industry standardized, quantum resistant encryption - https://static.cryptomator.org/desktop/flathubScreenshots/MainWindowUnlockDialog_light.png + Easy to use - work on encrypted files as if they were not + https://static.cryptomator.org/desktop/flathubScreenshots/MainWindowUnlocked_light.png From fc7169f2a03e67291b55d3c3f7d9386caf8da7d2 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Wed, 19 Feb 2025 09:05:13 +0100 Subject: [PATCH 13/26] Send DeviceId to Hub during vault key retrieval See https://github.com/cryptomator/hub/pull/320 --- .../org/cryptomator/ui/keyloading/hub/ReceiveKeyController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/cryptomator/ui/keyloading/hub/ReceiveKeyController.java b/src/main/java/org/cryptomator/ui/keyloading/hub/ReceiveKeyController.java index aa56a22e7..71e7592f6 100644 --- a/src/main/java/org/cryptomator/ui/keyloading/hub/ReceiveKeyController.java +++ b/src/main/java/org/cryptomator/ui/keyloading/hub/ReceiveKeyController.java @@ -165,6 +165,7 @@ public class ReceiveKeyController implements FxController { var vaultKeyUri = hubConfig.URIs.API.resolve("vaults/" + vaultId + "/access-token"); var request = HttpRequest.newBuilder(vaultKeyUri) // .header("Authorization", "Bearer " + bearerToken) // + .header("deviceId", deviceId) // .GET() // .timeout(REQ_TIMEOUT) // .build(); From 12ec6fbec85cf4a20a93a6ddb54fdd3c33dbf08c Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Wed, 19 Feb 2025 14:25:34 +0100 Subject: [PATCH 14/26] Change /access-token deviceId header name to Hub-Device-ID --- .../org/cryptomator/ui/keyloading/hub/ReceiveKeyController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/cryptomator/ui/keyloading/hub/ReceiveKeyController.java b/src/main/java/org/cryptomator/ui/keyloading/hub/ReceiveKeyController.java index 71e7592f6..f94d882fa 100644 --- a/src/main/java/org/cryptomator/ui/keyloading/hub/ReceiveKeyController.java +++ b/src/main/java/org/cryptomator/ui/keyloading/hub/ReceiveKeyController.java @@ -165,7 +165,7 @@ public class ReceiveKeyController implements FxController { var vaultKeyUri = hubConfig.URIs.API.resolve("vaults/" + vaultId + "/access-token"); var request = HttpRequest.newBuilder(vaultKeyUri) // .header("Authorization", "Bearer " + bearerToken) // - .header("deviceId", deviceId) // + .header("Hub-Device-ID", deviceId) // .GET() // .timeout(REQ_TIMEOUT) // .build(); From 3333dc7f22721a19eb325e053eb62a8b71231873 Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Tue, 25 Feb 2025 11:52:00 +0100 Subject: [PATCH 15/26] Fix not appearing removeCert dialog --- src/main/java/org/cryptomator/ui/dialogs/Dialogs.java | 4 ++-- src/main/resources/i18n/strings.properties | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/cryptomator/ui/dialogs/Dialogs.java b/src/main/java/org/cryptomator/ui/dialogs/Dialogs.java index 5107fe740..837bea012 100644 --- a/src/main/java/org/cryptomator/ui/dialogs/Dialogs.java +++ b/src/main/java/org/cryptomator/ui/dialogs/Dialogs.java @@ -38,7 +38,7 @@ public class Dialogs { .setMessageKey("removeVault.message") // .setDescriptionKey("removeVault.description") // .setIcon(FontAwesome5Icon.QUESTION) // - .setOkButtonKey("removeVault.confirmBtn") // + .setOkButtonKey("generic.button.remove") // .setCancelButtonKey("generic.button.cancel") // .setOkAction(stage -> { LOG.debug("Removing vault {}.", vault.getDisplayName()); @@ -54,7 +54,7 @@ public class Dialogs { .setMessageKey("removeCert.message") // .setDescriptionKey("removeCert.description") // .setIcon(FontAwesome5Icon.QUESTION) // - .setOkButtonKey("removeCert.confirmBtn") // + .setOkButtonKey("generic.button.remove") // .setCancelButtonKey("generic.button.cancel") // .setOkAction(stage -> { settings.licenseKey.set(null); diff --git a/src/main/resources/i18n/strings.properties b/src/main/resources/i18n/strings.properties index b03c202bf..a4829138a 100644 --- a/src/main/resources/i18n/strings.properties +++ b/src/main/resources/i18n/strings.properties @@ -107,7 +107,6 @@ addvaultwizard.success.unlockNow=Unlock Now removeVault.title=Remove "%s" removeVault.message=Remove vault? removeVault.description=This will only make Cryptomator forget about this vault. You can add it again. No encrypted files will be deleted from your hard drive. -removeVault.confirmBtn=Remove Vault # Change Password changepassword.title=Change Password From e3073a36134ae69bc122085bf1867c7bccbdfef2 Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Tue, 25 Feb 2025 15:38:32 +0100 Subject: [PATCH 16/26] adjust wording for autoLock feature [skip ci] --- src/main/resources/i18n/strings.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/i18n/strings.properties b/src/main/resources/i18n/strings.properties index a4829138a..ca3546586 100644 --- a/src/main/resources/i18n/strings.properties +++ b/src/main/resources/i18n/strings.properties @@ -283,7 +283,7 @@ preferences.title=Preferences ## General preferences.general=General preferences.general.startHidden=Hide window when starting Cryptomator -preferences.general.autoCloseVaults=Lock open vaults automatically when quitting application +preferences.general.autoCloseVaults=Lock vaults without asking when quitting application preferences.general.debugLogging=Enable debug logging preferences.general.debugDirectory=Reveal log files preferences.general.autoStart=Launch Cryptomator on system start From 478c69f82c990fe5b05917418d03fedfb1ff8946 Mon Sep 17 00:00:00 2001 From: Jan-Peter Klein Date: Tue, 25 Feb 2025 18:23:17 +0100 Subject: [PATCH 17/26] simple dialog without cancel button --- .../org/cryptomator/ui/dialogs/SimpleDialog.java | 7 +++---- .../ui/dialogs/SimpleDialogController.java | 12 ++++++++++++ src/main/resources/fxml/simple_dialog.fxml | 2 +- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/cryptomator/ui/dialogs/SimpleDialog.java b/src/main/java/org/cryptomator/ui/dialogs/SimpleDialog.java index 84d9e4f75..08f77849e 100644 --- a/src/main/java/org/cryptomator/ui/dialogs/SimpleDialog.java +++ b/src/main/java/org/cryptomator/ui/dialogs/SimpleDialog.java @@ -31,8 +31,9 @@ public class SimpleDialog { FxmlLoaderFactory loaderFactory = FxmlLoaderFactory.forController( // new SimpleDialogController(resolveText(builder.messageKey, null), // resolveText(builder.descriptionKey, null), // - builder.icon, resolveText(builder.okButtonKey, null), // - resolveText(builder.cancelButtonKey, null), // + builder.icon, // + resolveText(builder.okButtonKey, null), // + builder.cancelButtonKey != null ? resolveText(builder.cancelButtonKey, null) : null, // () -> builder.okAction.accept(dialogStage), // () -> builder.cancelAction.accept(dialogStage)), // Scene::new, builder.resourceBundle); @@ -67,7 +68,6 @@ public class SimpleDialog { private String descriptionKey; private String okButtonKey; private String cancelButtonKey; - private FontAwesome5Icon icon; private Consumer okAction = Stage::close; private Consumer cancelAction = Stage::close; @@ -128,7 +128,6 @@ public class SimpleDialog { Objects.requireNonNull(messageKey, "SimpleDialog messageKey must be set."); Objects.requireNonNull(descriptionKey, "SimpleDialog descriptionKey must be set."); Objects.requireNonNull(okButtonKey, "SimpleDialog okButtonKey must be set."); - Objects.requireNonNull(cancelButtonKey, "SimpleDialog cancelButtonKey must be set."); try { return new SimpleDialog(this); diff --git a/src/main/java/org/cryptomator/ui/dialogs/SimpleDialogController.java b/src/main/java/org/cryptomator/ui/dialogs/SimpleDialogController.java index 0eee1b308..9465bf642 100644 --- a/src/main/java/org/cryptomator/ui/dialogs/SimpleDialogController.java +++ b/src/main/java/org/cryptomator/ui/dialogs/SimpleDialogController.java @@ -3,6 +3,8 @@ package org.cryptomator.ui.dialogs; import org.cryptomator.ui.common.FxController; import org.cryptomator.ui.controls.FontAwesome5Icon; +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.SimpleBooleanProperty; import javafx.fxml.FXML; public class SimpleDialogController implements FxController { @@ -14,6 +16,7 @@ public class SimpleDialogController implements FxController { private final String cancelButtonText; private final Runnable okAction; private final Runnable cancelAction; + private final BooleanProperty dismissed = new SimpleBooleanProperty(); public SimpleDialogController(String message, String description, FontAwesome5Icon icon, String okButtonText, String cancelButtonText, Runnable okAction, Runnable cancelAction) { this.message = message; @@ -24,6 +27,10 @@ public class SimpleDialogController implements FxController { this.okAction = okAction; this.cancelAction = cancelAction; } + + public void initialize() { + dismissed.set(cancelButtonText == null || cancelButtonText.isEmpty()); + } public String getMessage() { return message; @@ -45,6 +52,11 @@ public class SimpleDialogController implements FxController { return cancelButtonText; } + @FXML + public boolean getDismissed() { + return dismissed.get(); + } + @FXML private void handleOk() { if (okAction != null) { diff --git a/src/main/resources/fxml/simple_dialog.fxml b/src/main/resources/fxml/simple_dialog.fxml index 32ad63abf..f076ec267 100644 --- a/src/main/resources/fxml/simple_dialog.fxml +++ b/src/main/resources/fxml/simple_dialog.fxml @@ -41,7 +41,7 @@ -