diff --git a/main/commons/src/main/java/org/cryptomator/common/vaults/Vault.java b/main/commons/src/main/java/org/cryptomator/common/vaults/Vault.java index 56e889c44..8eafd14a2 100644 --- a/main/commons/src/main/java/org/cryptomator/common/vaults/Vault.java +++ b/main/commons/src/main/java/org/cryptomator/common/vaults/Vault.java @@ -54,7 +54,7 @@ public class Vault { @Deprecated(forRemoval = true, since = "1.5.0") public static final Predicate NOT_LOCKED = hasState(VaultState.LOCKED).negate(); private static final Logger LOG = LoggerFactory.getLogger(Vault.class); - private static final String MASTERKEY_FILENAME = "masterkey.cryptomator"; + private static final String MASTERKEY_FILENAME = "masterkey.cryptomator"; // TODO: deduplicate constant declared in multiple classes private static final Path HOME_DIR = Paths.get(SystemUtils.USER_HOME); private final VaultSettings vaultSettings; diff --git a/main/commons/src/main/java/org/cryptomator/common/vaults/VaultComponent.java b/main/commons/src/main/java/org/cryptomator/common/vaults/VaultComponent.java index 763d6bb43..58abd2d37 100644 --- a/main/commons/src/main/java/org/cryptomator/common/vaults/VaultComponent.java +++ b/main/commons/src/main/java/org/cryptomator/common/vaults/VaultComponent.java @@ -22,6 +22,9 @@ public interface VaultComponent { @BindsInstance Builder vaultSettings(VaultSettings vaultSettings); + @BindsInstance + Builder initialVaultState(VaultState vaultState); + VaultComponent build(); } diff --git a/main/commons/src/main/java/org/cryptomator/common/vaults/VaultFactory.java b/main/commons/src/main/java/org/cryptomator/common/vaults/VaultFactory.java index 584cdd8f8..da8361723 100644 --- a/main/commons/src/main/java/org/cryptomator/common/vaults/VaultFactory.java +++ b/main/commons/src/main/java/org/cryptomator/common/vaults/VaultFactory.java @@ -9,14 +9,20 @@ package org.cryptomator.common.vaults; import org.cryptomator.common.settings.VaultSettings; +import org.cryptomator.cryptofs.CryptoFileSystemProvider; +import org.cryptomator.cryptofs.migration.Migrators; import javax.inject.Inject; import javax.inject.Singleton; +import java.io.IOException; +import java.nio.file.Path; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @Singleton public class VaultFactory { + + private static final String MASTERKEY_FILENAME = "masterkey.cryptomator"; // TODO: deduplicate constant declared in multiple classes private final VaultComponent.Builder vaultComponentBuilder; private final ConcurrentMap vaults = new ConcurrentHashMap<>(); @@ -31,8 +37,23 @@ public class VaultFactory { } private Vault create(VaultSettings vaultSettings) { - VaultComponent comp = vaultComponentBuilder.vaultSettings(vaultSettings).build(); + VaultState vaultState = determineVaultState(vaultSettings.path().get()); + VaultComponent comp = vaultComponentBuilder.vaultSettings(vaultSettings).initialVaultState(vaultState).build(); return comp.vault(); } + private VaultState determineVaultState(Path pathToVault) { + try { + if (!CryptoFileSystemProvider.containsVault(pathToVault, MASTERKEY_FILENAME)) { + return VaultState.MISSING; + } else if (Migrators.get().needsMigration(pathToVault, MASTERKEY_FILENAME)) { + return VaultState.NEEDS_MIGRATION; + } else { + return VaultState.LOCKED; + } + } catch (IOException e) { + return VaultState.ERROR; + } + } + } diff --git a/main/commons/src/main/java/org/cryptomator/common/vaults/VaultModule.java b/main/commons/src/main/java/org/cryptomator/common/vaults/VaultModule.java index 24cc5cdf8..f9c6b9177 100644 --- a/main/commons/src/main/java/org/cryptomator/common/vaults/VaultModule.java +++ b/main/commons/src/main/java/org/cryptomator/common/vaults/VaultModule.java @@ -42,8 +42,8 @@ public class VaultModule { @Provides @PerVault - public ObjectProperty provideVaultState() { - return new SimpleObjectProperty<>(VaultState.LOCKED); + public ObjectProperty provideVaultState(VaultState initialState) { + return new SimpleObjectProperty<>(initialState); } @Provides diff --git a/main/commons/src/main/java/org/cryptomator/common/vaults/VaultState.java b/main/commons/src/main/java/org/cryptomator/common/vaults/VaultState.java index 85e7dc570..a25ce59fa 100644 --- a/main/commons/src/main/java/org/cryptomator/common/vaults/VaultState.java +++ b/main/commons/src/main/java/org/cryptomator/common/vaults/VaultState.java @@ -1,6 +1,34 @@ package org.cryptomator.common.vaults; public enum VaultState { - LOCKED, PROCESSING, UNLOCKED; + /** + * No vault found at the provided path + */ + MISSING, + + /** + * Vault requires migration to a newer vault format + */ + NEEDS_MIGRATION, + + /** + * Vault ready to be unlocked + */ + LOCKED, + + /** + * Vault in transition between two other states + */ + PROCESSING, + + /** + * Vault is unlocked + */ + UNLOCKED, + + /** + * Unknown state due to preceeding unrecoverable exceptions. + */ + ERROR; } diff --git a/main/ui/src/main/java/org/cryptomator/ui/addvaultwizard/CreateNewVaultPasswordController.java b/main/ui/src/main/java/org/cryptomator/ui/addvaultwizard/CreateNewVaultPasswordController.java index f53f0f2d6..e0bde4514 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/addvaultwizard/CreateNewVaultPasswordController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/addvaultwizard/CreateNewVaultPasswordController.java @@ -52,7 +52,7 @@ import static java.nio.charset.StandardCharsets.US_ASCII; public class CreateNewVaultPasswordController implements FxController { private static final Logger LOG = LoggerFactory.getLogger(CreateNewVaultPasswordController.class); - private static final String MASTERKEY_FILENAME = "masterkey.cryptomator"; + private static final String MASTERKEY_FILENAME = "masterkey.cryptomator"; // TODO: deduplicate constant declared in multiple classes private final Stage window; private final Lazy chooseLocationScene; diff --git a/main/ui/src/main/java/org/cryptomator/ui/controllers/ChangePasswordController.java b/main/ui/src/main/java/org/cryptomator/ui/controllers/ChangePasswordController.java index eb1ad1614..43e0e5547 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/controllers/ChangePasswordController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/controllers/ChangePasswordController.java @@ -43,7 +43,7 @@ import java.util.Optional; public class ChangePasswordController implements ViewController { private static final Logger LOG = LoggerFactory.getLogger(ChangePasswordController.class); - private static final String MASTERKEY_FILENAME = "masterkey.cryptomator"; + private static final String MASTERKEY_FILENAME = "masterkey.cryptomator"; // TODO: deduplicate constant declared in multiple classes private final Application app; private final PasswordStrengthUtil strengthRater; diff --git a/main/ui/src/main/java/org/cryptomator/ui/controls/DirectoryListCell.java b/main/ui/src/main/java/org/cryptomator/ui/controls/DirectoryListCell.java index 9be78013c..b2fe76d4b 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/controls/DirectoryListCell.java +++ b/main/ui/src/main/java/org/cryptomator/ui/controls/DirectoryListCell.java @@ -24,6 +24,7 @@ import javafx.scene.layout.VBox; import javafx.scene.paint.Color; import javafx.scene.paint.Paint; +@Deprecated(forRemoval = true, since = "1.5.0") public class DirectoryListCell extends DraggableListCell { private static final Color UNLOCKED_ICON_COLOR = new Color(0.901, 0.494, 0.133, 1.0);