From 6a4edbf73d81994363bdd36c020a636e08efc871 Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Tue, 10 Sep 2019 17:08:00 +0200 Subject: [PATCH] drop multipe vaults at once --- .../common/settings/VaultSettings.java | 21 ++++-------- .../ui/mainwindow/MainWindowController.java | 34 +++++++++++++------ 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/main/commons/src/main/java/org/cryptomator/common/settings/VaultSettings.java b/main/commons/src/main/java/org/cryptomator/common/settings/VaultSettings.java index 0a0301266..3d91b38f7 100644 --- a/main/commons/src/main/java/org/cryptomator/common/settings/VaultSettings.java +++ b/main/commons/src/main/java/org/cryptomator/common/settings/VaultSettings.java @@ -6,6 +6,7 @@ package org.cryptomator.common.settings; import com.google.common.base.Strings; +import com.google.common.io.BaseEncoding; import javafx.beans.Observable; import javafx.beans.property.BooleanProperty; import javafx.beans.property.ObjectProperty; @@ -23,6 +24,7 @@ import java.util.Base64; import java.util.List; import java.util.Objects; import java.util.Optional; +import java.util.Random; import java.util.UUID; /** @@ -36,6 +38,8 @@ public class VaultSettings { public static final boolean DEFAULT_USES_INDIVIDUAL_MOUNTPATH = false; public static final boolean DEFAULT_USES_READONLY_MODE = false; public static final String DEFAULT_MOUNT_FLAGS = ""; + + private static final Random RNG = new Random(); private final String id; private final ObjectProperty path = new SimpleObjectProperty(); @@ -69,20 +73,9 @@ public class VaultSettings { } private static String generateId() { - return asBase64String(nineBytesFrom(UUID.randomUUID())); - } - - private static String asBase64String(byte[] bytes) { - byte[] base64Bytes = Base64.getUrlEncoder().encode(bytes); - return new String(base64Bytes, StandardCharsets.US_ASCII); - } - - private static byte[] nineBytesFrom(UUID uuid) { - ByteBuffer uuidBuffer = ByteBuffer.allocate(9); - uuidBuffer.putLong(uuid.getMostSignificantBits()); - uuidBuffer.put((byte) (uuid.getLeastSignificantBits() & 0xFF)); - uuidBuffer.flip(); - return uuidBuffer.array(); + byte[] randomBytes = new byte[9]; + RNG.nextBytes(randomBytes); + return BaseEncoding.base64Url().encode(randomBytes); } public static String normalizeMountName(String mountName) { diff --git a/main/ui/src/main/java/org/cryptomator/ui/mainwindow/MainWindowController.java b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/MainWindowController.java index 62dbcde07..622b933ea 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/mainwindow/MainWindowController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/MainWindowController.java @@ -23,6 +23,10 @@ import org.slf4j.LoggerFactory; import javax.inject.Inject; import javax.inject.Named; import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Collection; +import java.util.stream.Collectors; @MainWindowScoped public class MainWindowController implements FxController { @@ -89,27 +93,35 @@ public class MainWindowController implements FxController { if (event.getGestureSource() != root && event.getDragboard().hasFiles()) { /* allow for both copying and moving, whatever user chooses */ event.acceptTransferModes(TransferMode.COPY_OR_MOVE); - File dropped = event.getDragboard().getFiles().get(0); - if (dropped.getName().endsWith(".cryptomator")) { - addVault(dropped); - } else { + Collection vaultPaths = event.getDragboard().getFiles().stream().map(File::toPath).filter(this::isVaultPath).collect(Collectors.toSet()); + if (vaultPaths.isEmpty()) { wrongFileAlert.build().showWrongFileAlertWindow(); + } else { + vaultPaths.forEach(this::addVault); } } event.consume(); }); } - private void addVault(final File dropped) { - if (dropped != null) { - VaultSettings vaultSettings = VaultSettings.withRandomId(); - vaultSettings.path().setValue(dropped.toPath().toAbsolutePath().getParent()); - Vault newVault = vaultFactory.get(vaultSettings); - vaults.add(newVault); - //TODO: error handling? + private boolean isVaultPath(Path path) { + if (path.getFileName().toString().endsWith(".cryptomator")) { + return true; + } else if (Files.exists(path.resolve("masterkey.cryptomator"))) { + return true; + } else { + return false; } } + private void addVault(Path pathToVault) { + VaultSettings vaultSettings = VaultSettings.withRandomId(); + vaultSettings.path().setValue(pathToVault); + Vault newVault = vaultFactory.get(vaultSettings); + vaults.add(newVault); + //TODO: error handling? + } + private void loadFont(String resourcePath) { try { FontLoader.load(resourcePath);