diff --git a/src/main/java/org/cryptomator/common/recovery/MasterkeyService.java b/src/main/java/org/cryptomator/common/recovery/MasterkeyService.java index e5d808654..3402e82b1 100644 --- a/src/main/java/org/cryptomator/common/recovery/MasterkeyService.java +++ b/src/main/java/org/cryptomator/common/recovery/MasterkeyService.java @@ -19,7 +19,6 @@ import java.nio.file.StandardOpenOption; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.Arrays; -import java.util.List; import java.util.Optional; import java.util.UUID; import java.util.stream.Stream; @@ -41,9 +40,9 @@ public final class MasterkeyService { return masterkeyFileAccess.load(masterkeyFilePath, password); } - public static Optional validateRecoveryKeyAndDetectCombo(RecoveryKeyFactory recoveryKeyFactory, // - Vault vault, String recoveryKey, // - MasterkeyFileAccess masterkeyFileAccess) throws IllegalArgumentException { + public static CryptorProvider.Scheme validateRecoveryKeyAndDetectCombo(RecoveryKeyFactory recoveryKeyFactory, // + Vault vault, String recoveryKey, // + MasterkeyFileAccess masterkeyFileAccess) throws IOException, CryptoException { String tmpPass = UUID.randomUUID().toString(); try (RecoveryDirectory recoveryDirectory = RecoveryDirectory.create(vault.getPath())) { Path tempRecoveryPath = recoveryDirectory.getRecoveryPath(); @@ -51,11 +50,8 @@ public final class MasterkeyService { Path masterkeyFilePath = tempRecoveryPath.resolve(MASTERKEY_FILENAME); try (Masterkey mk = load(masterkeyFileAccess, masterkeyFilePath, tmpPass)) { - return detect(mk, vault.getPath()); + return detect(mk, vault.getPath()).orElseThrow(); } - } catch (IOException | CryptoException e) { - LOG.info("Recovery key validation failed"); - return Optional.empty(); } } diff --git a/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyValidateController.java b/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyValidateController.java index 6f9748fd4..23e99ee9e 100644 --- a/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyValidateController.java +++ b/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyValidateController.java @@ -10,6 +10,7 @@ import org.cryptomator.common.vaults.Vault; import org.cryptomator.cryptofs.VaultConfig; import org.cryptomator.cryptofs.VaultConfigLoadException; import org.cryptomator.cryptofs.VaultKeyInvalidException; +import org.cryptomator.cryptolib.api.CryptoException; import org.cryptomator.cryptolib.api.CryptorProvider; import org.cryptomator.cryptolib.common.MasterkeyFileAccess; import org.cryptomator.ui.common.FxController; @@ -26,6 +27,7 @@ import javafx.scene.control.TextArea; import javafx.scene.control.TextFormatter; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; +import java.io.IOException; public class RecoveryKeyValidateController implements FxController { @@ -137,14 +139,17 @@ public class RecoveryKeyValidateController implements FxController { switch (recoverType.get()) { case RESTORE_ALL, RESTORE_VAULT_CONFIG -> { try { - var combo = MasterkeyService.validateRecoveryKeyAndDetectCombo(recoveryKeyFactory, vault, recoveryKey.get(), masterkeyFileAccess); - combo.ifPresent(cipherCombo::set); - if (combo.isPresent()) { - recoveryKeyState.set(RecoveryKeyState.CORRECT); - } else { - recoveryKeyState.set(RecoveryKeyState.WRONG); - } + var scheme = MasterkeyService.validateRecoveryKeyAndDetectCombo(recoveryKeyFactory, vault, recoveryKey.get(), masterkeyFileAccess); + cipherCombo.set(scheme); + recoveryKeyState.set(RecoveryKeyState.CORRECT); + } catch (CryptoException e) { + LOG.info("Recovery key is valid but crypto scheme couldn't be determined", e); + recoveryKeyState.set(RecoveryKeyState.WRONG); } catch (IllegalArgumentException e) { + LOG.info("Recovery key is syntactically invalid", e); + recoveryKeyState.set(RecoveryKeyState.INVALID); + } catch (IOException e) { + LOG.warn("IO error while validating recovery key", e); recoveryKeyState.set(RecoveryKeyState.INVALID); } }