From 8e25dcd396b303160bbf6523cb63f117f9af9987 Mon Sep 17 00:00:00 2001 From: Jan-Peter Klein Date: Tue, 22 Oct 2024 14:56:56 +0200 Subject: [PATCH 001/109] implement CustomDialogBuilder --- .../org/cryptomator/ui/common/FxmlFile.java | 1 + .../ui/controls/CustomDialogBuilder.java | 49 +++++++++++++++ .../ui/controls/CustomDialogController.java | 61 +++++++++++++++++++ .../ui/mainwindow/VaultListController.java | 13 +++- .../SupporterCertificateController.java | 18 ++++-- src/main/resources/fxml/custom_dialog.fxml | 51 ++++++++++++++++ 6 files changed, 187 insertions(+), 6 deletions(-) create mode 100644 src/main/java/org/cryptomator/ui/controls/CustomDialogBuilder.java create mode 100644 src/main/java/org/cryptomator/ui/controls/CustomDialogController.java create mode 100644 src/main/resources/fxml/custom_dialog.fxml diff --git a/src/main/java/org/cryptomator/ui/common/FxmlFile.java b/src/main/java/org/cryptomator/ui/common/FxmlFile.java index 6c5068684..2ad072992 100644 --- a/src/main/java/org/cryptomator/ui/common/FxmlFile.java +++ b/src/main/java/org/cryptomator/ui/common/FxmlFile.java @@ -12,6 +12,7 @@ public enum FxmlFile { CONVERTVAULT_HUBTOPASSWORD_START("/fxml/convertvault_hubtopassword_start.fxml"), // CONVERTVAULT_HUBTOPASSWORD_CONVERT("/fxml/convertvault_hubtopassword_convert.fxml"), // CONVERTVAULT_HUBTOPASSWORD_SUCCESS("/fxml/convertvault_hubtopassword_success.fxml"), // + CUSTOM_DIALOG("/fxml/custom_dialog.fxml"), // DOKANY_SUPPORT_END("/fxml/dokany_support_end.fxml"), // ERROR("/fxml/error.fxml"), // FORGET_PASSWORD("/fxml/forget_password.fxml"), // diff --git a/src/main/java/org/cryptomator/ui/controls/CustomDialogBuilder.java b/src/main/java/org/cryptomator/ui/controls/CustomDialogBuilder.java new file mode 100644 index 000000000..3dbb9f68d --- /dev/null +++ b/src/main/java/org/cryptomator/ui/controls/CustomDialogBuilder.java @@ -0,0 +1,49 @@ +package org.cryptomator.ui.controls; + +import org.cryptomator.ui.common.FxmlFile; +import org.cryptomator.ui.quit.QuitComponent; + +import javafx.fxml.FXMLLoader; +import javafx.scene.Scene; +import javafx.scene.layout.Pane; +import javafx.stage.Modality; +import javafx.stage.Stage; +import java.net.URL; +import java.util.ResourceBundle; + +public class CustomDialogBuilder { + + public CustomDialogBuilder() { + } + + public void showDialog(ResourceBundle resourceBundle, Stage owner, FontAwesome5Icon icon, String title, String message, String description, Runnable okAction, String okText) { + try { + FXMLLoader loader = new FXMLLoader(getResource(FxmlFile.CUSTOM_DIALOG), resourceBundle); + Pane pane = loader.load(); + + CustomDialogController controller = loader.getController(); + controller.setIcon(icon); + controller.setMessage(message); + controller.setDescription(description); + controller.setOkButtonText(okText); + controller.setOkAction(okAction); + + Stage dialogStage = new Stage(); + dialogStage.setTitle(title); + dialogStage.initModality(Modality.WINDOW_MODAL); + dialogStage.initOwner(owner); + dialogStage.setScene(new Scene(pane)); + dialogStage.setResizable(false); + controller.setDialogStage(dialogStage); + + dialogStage.showAndWait(); + } catch (Exception e) { + e.printStackTrace(); // Handle loading errors + } + } + + private URL getResource(FxmlFile fxmlFile) { + return getClass().getResource(fxmlFile.getRessourcePathString()); + } + +} diff --git a/src/main/java/org/cryptomator/ui/controls/CustomDialogController.java b/src/main/java/org/cryptomator/ui/controls/CustomDialogController.java new file mode 100644 index 000000000..fb1536fa6 --- /dev/null +++ b/src/main/java/org/cryptomator/ui/controls/CustomDialogController.java @@ -0,0 +1,61 @@ +package org.cryptomator.ui.controls; + +import org.cryptomator.ui.common.FxController; + +import javafx.fxml.FXML; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.stage.Stage; + +public class CustomDialogController implements FxController { + + @FXML + private Label message; + @FXML + private Label description; + @FXML + private FontAwesome5IconView icon; + @FXML + private Button okButton; + + private Stage dialogStage; + private Runnable okAction; + + public void setDialogStage(Stage stage) { + this.dialogStage = stage; + } + + public void setIcon(FontAwesome5Icon glyph) { + icon.setGlyph(glyph); + } + + public void setMessage(String message) { + this.message.setText(message); + } + + public void setDescription(String desc) { + this.description.setText(desc); + } + + public void setOkAction(Runnable action) { + this.okAction = action; + } + + public void setOkButtonText(String text) { + okButton.setText(text); + } + + @FXML + private void handleOk() { + if (okAction != null) { + okAction.run(); + } + dialogStage.close(); + } + + @FXML + private void handleCancel() { + dialogStage.close(); + } + +} diff --git a/src/main/java/org/cryptomator/ui/mainwindow/VaultListController.java b/src/main/java/org/cryptomator/ui/mainwindow/VaultListController.java index 37b9841d0..5ed607c4d 100644 --- a/src/main/java/org/cryptomator/ui/mainwindow/VaultListController.java +++ b/src/main/java/org/cryptomator/ui/mainwindow/VaultListController.java @@ -9,6 +9,8 @@ import org.cryptomator.cryptofs.DirStructure; import org.cryptomator.ui.addvaultwizard.AddVaultWizardComponent; import org.cryptomator.ui.common.FxController; import org.cryptomator.ui.common.VaultService; +import org.cryptomator.ui.controls.CustomDialogBuilder; +import org.cryptomator.ui.controls.FontAwesome5Icon; import org.cryptomator.ui.fxapp.FxApplicationWindows; import org.cryptomator.ui.preferences.SelectedPreferencesTab; import org.cryptomator.ui.removevault.RemoveVaultComponent; @@ -208,7 +210,16 @@ public class VaultListController implements FxController { private void pressedShortcutToRemoveVault() { final var vault = selectedVault.get(); if (vault != null && EnumSet.of(LOCKED, MISSING, ERROR, NEEDS_MIGRATION).contains(vault.getState())) { - removeVaultDialogue.vault(vault).build().showRemoveVault(); + new CustomDialogBuilder().showDialog(resourceBundle, mainWindow, // + FontAwesome5Icon.CROWN, // + String.format(resourceBundle.getString("removeVault.title"), vault.getDisplayName()), // + resourceBundle.getString("removeVault.message"), // + resourceBundle.getString("removeVault.description"), // + () -> { + vaults.remove(vault); + LOG.debug("Removing vault {}.", vault.getDisplayName()); + }, // + resourceBundle.getString("removeVault.confirmBtn")); } } diff --git a/src/main/java/org/cryptomator/ui/preferences/SupporterCertificateController.java b/src/main/java/org/cryptomator/ui/preferences/SupporterCertificateController.java index e587e5f27..6ed5d045f 100644 --- a/src/main/java/org/cryptomator/ui/preferences/SupporterCertificateController.java +++ b/src/main/java/org/cryptomator/ui/preferences/SupporterCertificateController.java @@ -5,7 +5,8 @@ import org.cryptomator.common.LicenseHolder; import org.cryptomator.common.settings.Settings; import org.cryptomator.common.settings.UiTheme; import org.cryptomator.ui.common.FxController; -import org.cryptomator.ui.removecert.RemoveCertComponent; +import org.cryptomator.ui.controls.CustomDialogBuilder; +import org.cryptomator.ui.controls.FontAwesome5Icon; import javax.inject.Inject; import javafx.application.Application; @@ -14,6 +15,7 @@ import javafx.fxml.FXML; import javafx.scene.control.TextArea; import javafx.scene.control.TextFormatter; import javafx.stage.Stage; +import java.util.ResourceBundle; @PreferencesScoped public class SupporterCertificateController implements FxController { @@ -26,18 +28,18 @@ public class SupporterCertificateController implements FxController { private final Stage window; private final LicenseHolder licenseHolder; private final Settings settings; - private final RemoveCertComponent.Builder removeCert; + private final ResourceBundle resourceBundle; @FXML private TextArea supporterCertificateField; @Inject - SupporterCertificateController(Application application, @PreferencesWindow Stage window, LicenseHolder licenseHolder, Settings settings, RemoveCertComponent.Builder removeCert) { + SupporterCertificateController(Application application, @PreferencesWindow Stage window, LicenseHolder licenseHolder, Settings settings, ResourceBundle resourceBundle) { this.application = application; this.window = window; this.licenseHolder = licenseHolder; this.settings = settings; - this.removeCert = removeCert; + this.resourceBundle = resourceBundle; } @FXML @@ -84,7 +86,13 @@ public class SupporterCertificateController implements FxController { @FXML void didClickRemoveCert() { - removeCert.build().showRemoveCert(window); + new CustomDialogBuilder().showDialog(resourceBundle, window, // + FontAwesome5Icon.QUESTION, // + resourceBundle.getString("removeCert.title"), // + resourceBundle.getString("removeCert.message"), // + resourceBundle.getString("removeCert.description"), // + () -> settings.licenseKey.set(null), // + resourceBundle.getString("removeCert.confirmBtn")); } public LicenseHolder getLicenseHolder() { diff --git a/src/main/resources/fxml/custom_dialog.fxml b/src/main/resources/fxml/custom_dialog.fxml new file mode 100644 index 000000000..1a3b0c464 --- /dev/null +++ b/src/main/resources/fxml/custom_dialog.fxml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 5ef666154e56e07312595cac744b67c1edd459ac Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Tue, 11 Feb 2025 10:16:15 +0100 Subject: [PATCH 093/109] use correct height in css [skip ci] --- src/main/resources/css/dark_theme.css | 12 ++++++------ src/main/resources/css/light_theme.css | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main/resources/css/dark_theme.css b/src/main/resources/css/dark_theme.css index 72e732f36..abb6efe57 100644 --- a/src/main/resources/css/dark_theme.css +++ b/src/main/resources/css/dark_theme.css @@ -183,8 +183,8 @@ } .main-window .button-bar { - -fx-min-height:44px; - -fx-max-height:44px; + -fx-min-height:42px; + -fx-max-height:42px; -fx-background-color: MAIN_BG; -fx-border-color: CONTROL_BORDER_NORMAL transparent transparent transparent; -fx-border-width: 1px 0 0 0; @@ -195,8 +195,8 @@ -fx-border-width: 0 1px 0 0; -fx-background-color: MAIN_BG; -fx-background-radius: 0px; - -fx-min-height: 44px; - -fx-max-height: 44px; + -fx-min-height: 42px; + -fx-max-height: 42px; } .main-window .button-bar .button-right { @@ -204,8 +204,8 @@ -fx-border-width: 0 0 0 1px; -fx-background-color: MAIN_BG; -fx-background-radius: 0px; - -fx-min-height: 44px; - -fx-max-height: 44px; + -fx-min-height: 42px; + -fx-max-height: 42px; } .main-window .button-bar .button-left:armed { diff --git a/src/main/resources/css/light_theme.css b/src/main/resources/css/light_theme.css index 76d14c239..516dd0b26 100644 --- a/src/main/resources/css/light_theme.css +++ b/src/main/resources/css/light_theme.css @@ -182,8 +182,8 @@ } .main-window .button-bar { - -fx-min-height:44px; - -fx-max-height:44px; + -fx-min-height:42px; + -fx-max-height:42px; -fx-background-color: MAIN_BG; -fx-border-color: CONTROL_BORDER_NORMAL transparent transparent transparent; -fx-border-width: 1px 0 0 0; @@ -194,8 +194,8 @@ -fx-border-width: 0 1px 0 0; -fx-background-color: MAIN_BG; -fx-background-radius: 0px; - -fx-min-height: 44px; - -fx-max-height: 44px; + -fx-min-height: 42px; + -fx-max-height: 42px; } .main-window .button-bar .button-right { @@ -203,8 +203,8 @@ -fx-border-width: 0 0 0 1px; -fx-background-color: MAIN_BG; -fx-background-radius: 0px; - -fx-min-height: 44px; - -fx-max-height: 44px; + -fx-min-height: 42px; + -fx-max-height: 42px; } .main-window .button-bar .button-left:armed { From 31482d7d18e8e8f7143614e541f6fad94a5161f4 Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Tue, 11 Feb 2025 12:37:30 +0100 Subject: [PATCH 094/109] [skip ci] update ide files --- .idea/compiler.xml | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/.idea/compiler.xml b/.idea/compiler.xml index be1033a0e..1256745d3 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -39,31 +39,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - From dcd7077b085ac54c7887d0b2e79e80fd60725306 Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Tue, 11 Feb 2025 15:24:36 +0100 Subject: [PATCH 095/109] Feature: readd out of bounds check (#3729) references #3091 --- .../ui/mainwindow/MainWindowController.java | 68 ++++++++++++------- 1 file changed, 44 insertions(+), 24 deletions(-) diff --git a/src/main/java/org/cryptomator/ui/mainwindow/MainWindowController.java b/src/main/java/org/cryptomator/ui/mainwindow/MainWindowController.java index 999ff7882..13412dd27 100644 --- a/src/main/java/org/cryptomator/ui/mainwindow/MainWindowController.java +++ b/src/main/java/org/cryptomator/ui/mainwindow/MainWindowController.java @@ -1,13 +1,5 @@ package org.cryptomator.ui.mainwindow; -import javafx.beans.Observable; -import javafx.beans.binding.BooleanBinding; -import javafx.beans.property.ObjectProperty; -import javafx.beans.property.ReadOnlyBooleanProperty; -import javafx.beans.property.ReadOnlyObjectProperty; -import javafx.fxml.FXML; -import javafx.scene.layout.StackPane; -import javafx.stage.Stage; import org.apache.commons.lang3.SystemUtils; import org.cryptomator.common.LicenseHolder; import org.cryptomator.common.settings.Settings; @@ -21,6 +13,15 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.inject.Inject; +import javafx.beans.Observable; +import javafx.beans.binding.BooleanBinding; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.ReadOnlyBooleanProperty; +import javafx.beans.property.ReadOnlyObjectProperty; +import javafx.fxml.FXML; +import javafx.scene.layout.StackPane; +import javafx.stage.Screen; +import javafx.stage.Stage; @MainWindowScoped public class MainWindowController implements FxController { @@ -63,27 +64,46 @@ public class MainWindowController implements FxController { } window.focusedProperty().addListener(this::mainWindowFocusChanged); - if (!neverTouched()) { - window.setHeight(settings.windowHeight.get() > window.getMinHeight() ? settings.windowHeight.get() : window.getMinHeight()); - window.setWidth(settings.windowWidth.get() > window.getMinWidth() ? settings.windowWidth.get() : window.getMinWidth()); - window.setX(settings.windowXPosition.get()); - window.setY(settings.windowYPosition.get()); + int x = settings.windowXPosition.get(); + int y = settings.windowYPosition.get(); + int width = settings.windowWidth.get(); + int height = settings.windowHeight.get(); + if (windowPositionSaved(x, y, width, height) ) { + if(isWithinDisplayBounds(x, y, width, height)) { //use stored window position + window.setX(x); + window.setY(y); + window.setWidth(Math.clamp(width, window.getMinWidth(), window.getMaxWidth())); + window.setHeight(Math.clamp(height, window.getMinHeight(), window.getMaxHeight())); + } else if(isWithinDisplayBounds((int) window.getX(), (int) window.getY(), width, height)) { //just reset position of upper left corner, keep window size + window.setWidth(Math.clamp(width, window.getMinWidth(), window.getMaxWidth())); + window.setHeight(Math.clamp(height, window.getMinHeight(), window.getMaxHeight())); + } //else reset window completely } - window.widthProperty().addListener((_, _, _) -> savePositionalSettings()); - window.heightProperty().addListener((_, _, _) -> savePositionalSettings()); - window.xProperty().addListener((_, _, _) -> savePositionalSettings()); - window.yProperty().addListener((_, _, _) -> savePositionalSettings()); + + settings.windowXPosition.bind(window.xProperty()); + settings.windowYPosition.bind(window.yProperty()); + settings.windowWidth.bind(window.widthProperty()); + settings.windowHeight.bind(window.heightProperty()); } - private boolean neverTouched() { - return (settings.windowHeight.get() == 0) && (settings.windowWidth.get() == 0) && (settings.windowXPosition.get() == 0) && (settings.windowYPosition.get() == 0); + private boolean windowPositionSaved(int x, int y, int width, int height) { + return x != 0 || y != 0 || width != 0 || height != 0; } - public void savePositionalSettings() { - settings.windowWidth.setValue(window.getWidth()); - settings.windowHeight.setValue(window.getHeight()); - settings.windowXPosition.setValue(window.getX()); - settings.windowYPosition.setValue(window.getY()); + private boolean isWithinDisplayBounds(int x, int y, int width, int height) { + // define a rect which is inset on all sides from the window's rect: + final int shrinkedX = x + 20; // 20px left + final int shrinkedY = y + 5; // 5px top + final int shrinkedWidth = width - 40; // 20px left + 20px right + final int shrinkedHeigth = height - 25; // 5px top + 20px bottom + return isRectangleWithinBounds(shrinkedX, shrinkedY, 0, shrinkedHeigth) // Left pixel column + && isRectangleWithinBounds(shrinkedX + shrinkedWidth, shrinkedY, 0, shrinkedHeigth) // Right pixel column + && isRectangleWithinBounds(shrinkedX, shrinkedY, shrinkedWidth, 0) // Top pixel row + && isRectangleWithinBounds(shrinkedX, shrinkedY + shrinkedHeigth, shrinkedWidth, 0); // Bottom pixel row + } + + private boolean isRectangleWithinBounds(int x, int y, int width, int height) { + return !Screen.getScreensForRectangle(x, y, width, height).isEmpty(); } private void mainWindowFocusChanged(Observable observable) { From 76a4ef50cb593ef9fed8dc981e6804ed3e58dda1 Mon Sep 17 00:00:00 2001 From: Jan-Peter Klein Date: Tue, 11 Feb 2025 16:21:53 +0100 Subject: [PATCH 096/109] 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 097/109] 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 098/109] 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 099/109] 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 100/109] 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 101/109] 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 aaa37e2c7af3ee1ea7e7c6f971bf9566faf8e621 Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Fri, 14 Feb 2025 11:55:22 +0100 Subject: [PATCH 102/109] Feature: Add UTM parameters to download uri (#3735) Co-authored-by: Tobias Hagemann --- .../preferences/UpdatesPreferencesController.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/cryptomator/ui/preferences/UpdatesPreferencesController.java b/src/main/java/org/cryptomator/ui/preferences/UpdatesPreferencesController.java index afa05cc8c..f5a72290f 100644 --- a/src/main/java/org/cryptomator/ui/preferences/UpdatesPreferencesController.java +++ b/src/main/java/org/cryptomator/ui/preferences/UpdatesPreferencesController.java @@ -19,6 +19,8 @@ import javafx.beans.value.ObservableValue; import javafx.fxml.FXML; import javafx.scene.control.CheckBox; import javafx.scene.control.ContentDisplay; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.time.Duration; import java.time.Instant; import java.time.LocalDateTime; @@ -32,7 +34,10 @@ import java.util.ResourceBundle; @PreferencesScoped public class UpdatesPreferencesController implements FxController { - private static final String DOWNLOADS_URI = "https://cryptomator.org/downloads"; + private static final String DOWNLOADS_URI_TEMPLATE = "https://cryptomator.org/downloads/" // + + "?utm_source=cryptomator-desktop" // + + "&utm_medium=update-notification&" // + + "utm_campaign=app-update-%s"; private final Application application; private final Environment environment; @@ -50,6 +55,7 @@ public class UpdatesPreferencesController implements FxController { private final BooleanProperty upToDateLabelVisible = new SimpleBooleanProperty(false); private final DateTimeFormatter formatter; private final BooleanBinding upToDate; + private final String downloadsUri; /* FXML */ public CheckBox checkForUpdatesCheckbox; @@ -65,12 +71,13 @@ public class UpdatesPreferencesController implements FxController { this.latestVersion = updateChecker.latestVersionProperty(); this.lastSuccessfulUpdateCheck = updateChecker.lastSuccessfulUpdateCheckProperty(); this.timeDifferenceMessage = Bindings.createStringBinding(this::getTimeDifferenceMessage, lastSuccessfulUpdateCheck); - this.currentVersion = updateChecker.getCurrentVersion(); + this.currentVersion = environment.getAppVersion(); this.updateAvailable = updateChecker.updateAvailableProperty(); this.formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM).withLocale(Locale.getDefault()); this.upToDate = updateChecker.updateCheckStateProperty().isEqualTo(UpdateChecker.UpdateCheckState.CHECK_SUCCESSFUL).and(latestVersion.isEqualTo(currentVersion)); this.checkFailed = updateChecker.checkFailedProperty(); this.lastUpdateCheckMessage = Bindings.createStringBinding(this::getLastUpdateCheckMessage, lastSuccessfulUpdateCheck); + this.downloadsUri = DOWNLOADS_URI_TEMPLATE.formatted(URLEncoder.encode(currentVersion, StandardCharsets.US_ASCII)); } public void initialize() { @@ -93,7 +100,7 @@ public class UpdatesPreferencesController implements FxController { @FXML public void visitDownloadsPage() { - application.getHostServices().showDocument(DOWNLOADS_URI); + application.getHostServices().showDocument(downloadsUri); } @FXML From c10fc0ee5b10446470900fc588957bdeeedaaabf Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Fri, 14 Feb 2025 11:56:55 +0100 Subject: [PATCH 103/109] Update README.md For build badge use develop branch. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9f0a0e0a1..d2bf39f29 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ [![cryptomator](cryptomator.png)](https://cryptomator.org/) -[![Build](https://github.com/cryptomator/cryptomator/workflows/Build/badge.svg)](https://github.com/cryptomator/cryptomator/actions?query=workflow%3ABuild) +[![Build](https://github.com/cryptomator/cryptomator/workflows/Build/badge.svg)](https://github.com/cryptomator/cryptomator/actions/workflows/build.yml?query=branch%3Adevelop) [![Known Vulnerabilities](https://snyk.io/test/github/cryptomator/cryptomator/badge.svg)](https://snyk.io/test/github/cryptomator/cryptomator) [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=cryptomator_cryptomator&metric=alert_status)](https://sonarcloud.io/dashboard?id=cryptomator_cryptomator) [![Mastodon](https://img.shields.io/mastodon/follow/176112?domain=mastodon.online&style=flat)](https://mastodon.online/@cryptomator) From 9a08dcc46d9aee480b442177be9cb98807b8756b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Feb 2025 10:04:30 +0000 Subject: [PATCH 104/109] Bump org.owasp:dependency-check-maven (#3748) --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index cea4bc575..5aef0b15b 100644 --- a/pom.xml +++ b/pom.xml @@ -61,7 +61,7 @@ 26.0.1 - 12.0.1 + 12.1.0 0.8.12 2.5.0 1.4.0 From 738fa4da121e36d9a9014516b901f601914e01a7 Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Mon, 17 Feb 2025 16:08:09 +0100 Subject: [PATCH 105/109] cleanup --- .../cryptomator/ui/fxapp/AutoUnlocker.java | 4 +-- .../ui/fxapp/FxApplicationWindows.java | 30 ++++++++++--------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/main/java/org/cryptomator/ui/fxapp/AutoUnlocker.java b/src/main/java/org/cryptomator/ui/fxapp/AutoUnlocker.java index 719071ed2..65bc080ca 100644 --- a/src/main/java/org/cryptomator/ui/fxapp/AutoUnlocker.java +++ b/src/main/java/org/cryptomator/ui/fxapp/AutoUnlocker.java @@ -43,8 +43,8 @@ public class AutoUnlocker { private CompletionStage unlockSequentially(Stream vaultStream) { // this is an attempt to run all the unlock workflows sequentially, i.e. start the next workflow only after completing/failing the previous workflow. return vaultStream.filter(Vault::isLocked).reduce(CompletableFuture.completedFuture(null), - (prevUnlock, nextVault) -> prevUnlock.thenCompose(unused -> appWindows.startUnlockWorkflow(nextVault, null)), - (prevUnlock, nextUnlock) -> nextUnlock.exceptionally(e -> null) // we don't care here about the exception, logged elsewhere + (prevUnlock, nextVault) -> prevUnlock.thenCompose(_ -> appWindows.startUnlockWorkflow(nextVault, null)), + (_, nextUnlock) -> nextUnlock.exceptionally(_ -> null) // we don't care here about the exception, logged elsewhere ); } diff --git a/src/main/java/org/cryptomator/ui/fxapp/FxApplicationWindows.java b/src/main/java/org/cryptomator/ui/fxapp/FxApplicationWindows.java index 54acf62a3..4ea0ace1b 100644 --- a/src/main/java/org/cryptomator/ui/fxapp/FxApplicationWindows.java +++ b/src/main/java/org/cryptomator/ui/fxapp/FxApplicationWindows.java @@ -6,6 +6,7 @@ import org.cryptomator.common.vaults.Vault; import org.cryptomator.common.vaults.VaultState; import org.cryptomator.integrations.tray.TrayIntegrationProvider; import org.cryptomator.ui.dialogs.Dialogs; +import org.cryptomator.ui.dialogs.SimpleDialog; import org.cryptomator.ui.error.ErrorComponent; import org.cryptomator.ui.lock.LockComponent; import org.cryptomator.ui.mainwindow.MainWindowComponent; @@ -93,17 +94,17 @@ public class FxApplicationWindows { // register preferences shortcut if (desktop.isSupported(Desktop.Action.APP_PREFERENCES)) { - desktop.setPreferencesHandler(evt -> showPreferencesWindow(SelectedPreferencesTab.ANY)); + desktop.setPreferencesHandler(_ -> showPreferencesWindow(SelectedPreferencesTab.ANY)); } // register preferences shortcut if (desktop.isSupported(Desktop.Action.APP_ABOUT)) { - desktop.setAboutHandler(evt -> showPreferencesWindow(SelectedPreferencesTab.ABOUT)); + desktop.setAboutHandler(_ -> showPreferencesWindow(SelectedPreferencesTab.ABOUT)); } // register app reopen listener if (desktop.isSupported(Desktop.Action.APP_EVENT_REOPENED)) { - desktop.addAppEventListener((AppReopenedListener) e -> showMainWindow()); + desktop.addAppEventListener((AppReopenedListener) _ -> showMainWindow()); } // observe visible windows @@ -135,11 +136,12 @@ public class FxApplicationWindows { } public CompletionStage showVaultOptionsWindow(Vault vault, SelectedVaultOptionsTab tab) { - return showMainWindow().thenApplyAsync((window) -> vaultOptionsWindow.create(vault).showVaultOptionsWindow(tab), Platform::runLater).whenComplete(this::reportErrors); + return showMainWindow().thenApplyAsync(_ -> vaultOptionsWindow.create(vault).showVaultOptionsWindow(tab), Platform::runLater) // + .whenComplete(this::reportErrors); } public void showQuitWindow(QuitResponse response, boolean forced) { - CompletableFuture.runAsync(() -> quitWindowBuilder.build().showQuitWindow(response,forced), Platform::runLater); + CompletableFuture.runAsync(() -> quitWindowBuilder.build().showQuitWindow(response, forced), Platform::runLater); } public void showUpdateReminderWindow() { @@ -147,13 +149,14 @@ public class FxApplicationWindows { } public void showDokanySupportEndWindow() { - CompletableFuture.runAsync(() -> dialogs.prepareDokanySupportEndDialog( - mainWindow.get().window(), - stage -> { - showPreferencesWindow(SelectedPreferencesTab.VOLUME); - stage.close(); - } - ).build().showAndWait(), Platform::runLater); + CompletableFuture.runAsync(() -> createDokanySupportEndDialog().showAndWait(), Platform::runLater); + } + + private SimpleDialog createDokanySupportEndDialog() { + return dialogs.prepareDokanySupportEndDialog(mainWindow.get().window(), stage -> { + showPreferencesWindow(SelectedPreferencesTab.VOLUME); + stage.close(); + }).build(); } public CompletionStage startUnlockWorkflow(Vault vault, @Nullable Stage owner) { @@ -162,8 +165,7 @@ public class FxApplicationWindows { LOG.debug("Start unlock workflow for {}", vault.getDisplayName()); return unlockWorkflowFactory.create(vault, owner).unlockWorkflow(); }, Platform::runLater) // - .thenAcceptAsync(UnlockWorkflow::run, executor) - .exceptionally(e -> { + .thenAcceptAsync(UnlockWorkflow::run, executor).exceptionally(e -> { showErrorWindow(e, owner == null ? primaryStage : owner, null); return null; }); From e81bbe197bef9667161d1fe54ef209f0ef014c75 Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Mon, 17 Feb 2025 16:46:25 +0100 Subject: [PATCH 106/109] if mainWindow is closed without tray menu, terminate app --- .../cryptomator/ui/mainwindow/MainWindowModule.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java b/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java index b80804f2e..fa1b441d9 100644 --- a/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java +++ b/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java @@ -1,6 +1,7 @@ package org.cryptomator.ui.mainwindow; import dagger.Binds; +import dagger.Lazy; import dagger.Module; import dagger.Provides; import dagger.multibindings.IntoMap; @@ -14,9 +15,11 @@ import org.cryptomator.ui.common.FxmlScene; import org.cryptomator.ui.common.StageFactory; import org.cryptomator.ui.common.StageInitializer; import org.cryptomator.ui.error.ErrorComponent; +import org.cryptomator.ui.fxapp.FxApplicationTerminator; import org.cryptomator.ui.fxapp.PrimaryStage; import org.cryptomator.ui.migration.MigrationComponent; import org.cryptomator.ui.stats.VaultStatisticsComponent; +import org.cryptomator.ui.traymenu.TrayMenuComponent; import org.cryptomator.ui.wrongfilealert.WrongFileAlertComponent; import javax.inject.Named; @@ -35,11 +38,19 @@ abstract class MainWindowModule { @Provides @MainWindow @MainWindowScoped - static Stage provideMainWindow(@PrimaryStage Stage stage, StageInitializer initializer) { + static Stage provideMainWindow(@PrimaryStage Stage stage, StageInitializer initializer, FxApplicationTerminator terminator, Lazy trayMenu) { initializer.accept(stage); stage.setTitle("Cryptomator"); stage.setMinWidth(650); stage.setMinHeight(498); + stage.setOnCloseRequest(e -> { + if (!trayMenu.get().isInitialized()) { + terminator.terminate(); + e.consume(); + } else { + stage.close(); + } + }); return stage; } From cc0b6aed15dd97f69b69835467bd30c956b7bf71 Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Tue, 18 Feb 2025 16:52:31 +0100 Subject: [PATCH 107/109] 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 108/109] 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 109/109] 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();