From 9cc863ae79b4bf2d26ba58aa122e0d43060b204d Mon Sep 17 00:00:00 2001 From: Ralph Plawetzki Date: Sun, 4 Aug 2024 10:29:53 +0200 Subject: [PATCH] Change existing keychain entry --- .../MasterkeyOptionsController.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/main/java/org/cryptomator/ui/vaultoptions/MasterkeyOptionsController.java b/src/main/java/org/cryptomator/ui/vaultoptions/MasterkeyOptionsController.java index bc0aae23a..977af96b8 100644 --- a/src/main/java/org/cryptomator/ui/vaultoptions/MasterkeyOptionsController.java +++ b/src/main/java/org/cryptomator/ui/vaultoptions/MasterkeyOptionsController.java @@ -1,7 +1,9 @@ package org.cryptomator.ui.vaultoptions; +import org.cryptomator.common.Passphrase; import org.cryptomator.common.keychain.KeychainManager; import org.cryptomator.common.vaults.Vault; +import org.cryptomator.integrations.keychain.KeychainAccessException; import org.cryptomator.ui.changepassword.ChangePasswordComponent; import org.cryptomator.ui.common.FxController; import org.cryptomator.ui.forgetpassword.ForgetPasswordComponent; @@ -10,6 +12,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.inject.Inject; +import javafx.beans.Observable; import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.value.ObservableValue; import javafx.fxml.FXML; @@ -49,6 +52,32 @@ public class MasterkeyOptionsController implements FxController { @FXML public void initialize() { useTouchIDheckbox.selectedProperty().bindBidirectional(vault.getVaultSettings().useTouchID); + useTouchIDheckbox.selectedProperty().addListener(this::useTouchIDheckboxToggled); + } + + /** + * Existing keychain items get changed, depending on an additional user authentication is required or not. + * This is needed as the user authentication is tied to the keychain itself. + * + * @param observable + * @param wasSet + * @param isSet true, when the checkbox is ticked, false otherwise + */ + private void useTouchIDheckboxToggled(Observable observable, Boolean wasSet, Boolean isSet) { + try { + var vautID = vault.getId(); + if (keychain.isPassphraseStored(vautID)) { + var passphrase = keychain.loadPassphrase(vautID); + keychain.deletePassphrase(vautID); + if (isSet) { + keychain.storePassphraseForAuthenticatedUser(vautID, vault.getId(), new Passphrase(passphrase)); + } else { + keychain.storePassphrase(vautID, vault.getId(), new Passphrase(passphrase)); + } + } + } catch (KeychainAccessException e) { + LOG.error("Failed to migrate item in system keychain due to access control change.", e); + } } @FXML