|
@@ -1,10 +1,14 @@
|
|
|
package org.cryptomator.ui.mainwindow;
|
|
|
|
|
|
import org.apache.commons.lang3.SystemUtils;
|
|
|
+import org.cryptomator.common.recovery.RecoveryActionType;
|
|
|
import org.cryptomator.common.settings.Settings;
|
|
|
+import org.cryptomator.common.settings.VaultSettings;
|
|
|
import org.cryptomator.common.vaults.Vault;
|
|
|
import org.cryptomator.common.vaults.VaultComponent;
|
|
|
+import org.cryptomator.common.vaults.VaultConfigCache;
|
|
|
import org.cryptomator.common.vaults.VaultListManager;
|
|
|
+import org.cryptomator.common.vaults.VaultState;
|
|
|
import org.cryptomator.cryptofs.CryptoFileSystemProvider;
|
|
|
import org.cryptomator.cryptofs.DirStructure;
|
|
|
import org.cryptomator.integrations.mount.MountService;
|
|
@@ -25,6 +29,7 @@ import javafx.beans.binding.BooleanBinding;
|
|
|
import javafx.beans.property.BooleanProperty;
|
|
|
import javafx.beans.property.ObjectProperty;
|
|
|
import javafx.beans.property.SimpleBooleanProperty;
|
|
|
+import javafx.beans.property.SimpleObjectProperty;
|
|
|
import javafx.beans.value.ObservableValue;
|
|
|
import javafx.collections.ListChangeListener;
|
|
|
import javafx.collections.ObservableList;
|
|
@@ -40,6 +45,7 @@ import javafx.scene.input.KeyEvent;
|
|
|
import javafx.scene.input.MouseEvent;
|
|
|
import javafx.scene.input.TransferMode;
|
|
|
import javafx.scene.layout.StackPane;
|
|
|
+import javafx.stage.DirectoryChooser;
|
|
|
import javafx.stage.Stage;
|
|
|
import java.io.File;
|
|
|
import java.io.IOException;
|
|
@@ -230,7 +236,71 @@ public class VaultListController implements FxController {
|
|
|
|
|
|
@FXML
|
|
|
public void didClickRecoverExistingVault() {
|
|
|
- addVaultWizard.build().showRecoverExistingVaultWizard(mainWindow, dialogs, vaultComponentFactory,mountServices,vaultListManager,recoveryKeyWindow);
|
|
|
+ DirectoryChooser directoryChooser = new DirectoryChooser();
|
|
|
+
|
|
|
+ while (true) {
|
|
|
+ File selectedDirectory = directoryChooser.showDialog(mainWindow);
|
|
|
+ if (selectedDirectory == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ boolean hasSubfolderD = new File(selectedDirectory, "d").isDirectory();
|
|
|
+ if (!hasSubfolderD) {
|
|
|
+ dialogs.prepareNoDDirectorySelectedDialog(mainWindow).build().showAndWait();
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ Vault preparedVault = prepareVault(selectedDirectory, vaultComponentFactory, mountServices);
|
|
|
+
|
|
|
+ if (vaultListManager.get(preparedVault.getPath()).isPresent()) {
|
|
|
+ dialogs.prepareRecoveryVaultAlreadyExists(mainWindow, vaultListManager.get(preparedVault.getPath()).get().getDisplayName()) //
|
|
|
+ .setOkAction(Stage::close) //
|
|
|
+ .build().showAndWait();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ VaultListManager.redetermineVaultState(preparedVault);
|
|
|
+ VaultState.Value state = preparedVault.getState();
|
|
|
+
|
|
|
+ switch (state) {
|
|
|
+ case VAULT_CONFIG_MISSING ->
|
|
|
+ recoveryKeyWindow.create(preparedVault, mainWindow, new SimpleObjectProperty<>(RecoveryActionType.RESTORE_VAULT_CONFIG)).showOnboardingDialogWindow();
|
|
|
+ case ALL_MISSING ->
|
|
|
+ recoveryKeyWindow.create(preparedVault, mainWindow, new SimpleObjectProperty<>(RecoveryActionType.RESTORE_ALL)).showOnboardingDialogWindow();
|
|
|
+ case LOCKED -> {
|
|
|
+ vaultListManager.addVault(preparedVault);
|
|
|
+ dialogs.prepareRecoveryVaultAdded(mainWindow, preparedVault.getDisplayName()).setOkAction(Stage::close).build().showAndWait();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static Vault prepareVault(File selectedDirectory, VaultComponent.Factory vaultComponentFactory, List<MountService> mountServices) {
|
|
|
+ Path selectedPath = selectedDirectory.toPath();
|
|
|
+ VaultSettings vaultSettings = VaultSettings.withRandomId();
|
|
|
+ vaultSettings.path.set(selectedPath);
|
|
|
+ if (selectedPath.getFileName() != null) {
|
|
|
+ vaultSettings.displayName.set(selectedPath.getFileName().toString());
|
|
|
+ } else {
|
|
|
+ vaultSettings.displayName.set("defaultVaultName");
|
|
|
+ }
|
|
|
+
|
|
|
+ var wrapper = new VaultConfigCache(vaultSettings);
|
|
|
+ Vault vault = vaultComponentFactory.create(vaultSettings, wrapper, LOCKED, null).vault();
|
|
|
+ try {
|
|
|
+ VaultListManager.determineVaultState(vault.getPath(), vaultSettings);
|
|
|
+ } catch (IOException e) {
|
|
|
+ LOG.warn("Failed to determine vault state for {}", vaultSettings.path.get(), e);
|
|
|
+ }
|
|
|
+
|
|
|
+ //due to https://github.com/cryptomator/cryptomator/issues/2880#issuecomment-1680313498
|
|
|
+ var nameOfWinfspLocalMounter = "org.cryptomator.frontend.fuse.mount.WinFspMountProvider";
|
|
|
+ if (SystemUtils.IS_OS_WINDOWS && vaultSettings.path.get().toString().contains("Dropbox") && mountServices.stream().anyMatch(s -> s.getClass().getName().equals(nameOfWinfspLocalMounter))) {
|
|
|
+ vaultSettings.mountService.setValue(nameOfWinfspLocalMounter);
|
|
|
+ }
|
|
|
+
|
|
|
+ return vault;
|
|
|
}
|
|
|
|
|
|
private void pressedShortcutToRemoveVault() {
|