From c654951dc145c63e897101a3577b8f2238398030 Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Tue, 20 Apr 2021 18:15:25 +0200 Subject: [PATCH] removed ambiguous filenameLengthLimit from settings, added maxCleartextFilenameLength, shortening is now a 100% independent setting stored in the vault rather than the device settings --- .../common/settings/VaultSettings.java | 12 ++++------ .../settings/VaultSettingsJsonAdapter.java | 8 +++---- .../org/cryptomator/common/vaults/Vault.java | 24 ++++++++++++------- main/pom.xml | 2 +- 4 files changed, 25 insertions(+), 21 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 b273bb642..03aef5629 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 @@ -24,8 +24,6 @@ import java.nio.file.Path; import java.util.Objects; import java.util.Optional; import java.util.Random; -import java.util.Set; -import java.util.stream.Collectors; /** * The settings specific to a single vault. @@ -37,7 +35,7 @@ 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 = ""; - public static final int DEFAULT_FILENAME_LENGTH_LIMIT = -1; + public static final int DEFAULT_MAX_CLEARTEXT_FILENAME_LENGTH = -1; public static final WhenUnlocked DEFAULT_ACTION_AFTER_UNLOCK = WhenUnlocked.ASK; private static final Random RNG = new Random(); @@ -52,7 +50,7 @@ public class VaultSettings { private final StringProperty customMountPath = new SimpleStringProperty(); private final BooleanProperty usesReadOnlyMode = new SimpleBooleanProperty(DEFAULT_USES_READONLY_MODE); private final StringProperty mountFlags = new SimpleStringProperty(DEFAULT_MOUNT_FLAGS); - private final IntegerProperty filenameLengthLimit = new SimpleIntegerProperty(DEFAULT_FILENAME_LENGTH_LIMIT); + private final IntegerProperty maxCleartextFilenameLength = new SimpleIntegerProperty(DEFAULT_MAX_CLEARTEXT_FILENAME_LENGTH); private final ObjectProperty actionAfterUnlock = new SimpleObjectProperty<>(DEFAULT_ACTION_AFTER_UNLOCK); private final StringBinding mountName; @@ -63,7 +61,7 @@ public class VaultSettings { } Observable[] observables() { - return new Observable[]{path, displayName, winDriveLetter, unlockAfterStartup, revealAfterMount, useCustomMountPath, customMountPath, usesReadOnlyMode, mountFlags, filenameLengthLimit, actionAfterUnlock}; + return new Observable[]{path, displayName, winDriveLetter, unlockAfterStartup, revealAfterMount, useCustomMountPath, customMountPath, usesReadOnlyMode, mountFlags, maxCleartextFilenameLength, actionAfterUnlock}; } public static VaultSettings withRandomId() { @@ -152,8 +150,8 @@ public class VaultSettings { return mountFlags; } - public IntegerProperty filenameLengthLimit() { - return filenameLengthLimit; + public IntegerProperty maxCleartextFilenameLength() { + return maxCleartextFilenameLength; } public ObjectProperty actionAfterUnlock() { diff --git a/main/commons/src/main/java/org/cryptomator/common/settings/VaultSettingsJsonAdapter.java b/main/commons/src/main/java/org/cryptomator/common/settings/VaultSettingsJsonAdapter.java index 04a352a49..d68a67e0b 100644 --- a/main/commons/src/main/java/org/cryptomator/common/settings/VaultSettingsJsonAdapter.java +++ b/main/commons/src/main/java/org/cryptomator/common/settings/VaultSettingsJsonAdapter.java @@ -29,7 +29,7 @@ class VaultSettingsJsonAdapter { out.name("customMountPath").value(value.customMountPath().get()); out.name("usesReadOnlyMode").value(value.usesReadOnlyMode().get()); out.name("mountFlags").value(value.mountFlags().get()); - out.name("filenameLengthLimit").value(value.filenameLengthLimit().get()); + out.name("maxCleartextFilenameLength").value(value.maxCleartextFilenameLength().get()); out.name("actionAfterUnlock").value(value.actionAfterUnlock().get().name()); out.endObject(); } @@ -46,7 +46,7 @@ class VaultSettingsJsonAdapter { boolean useCustomMountPath = VaultSettings.DEFAULT_USES_INDIVIDUAL_MOUNTPATH; boolean usesReadOnlyMode = VaultSettings.DEFAULT_USES_READONLY_MODE; String mountFlags = VaultSettings.DEFAULT_MOUNT_FLAGS; - int filenameLengthLimit = VaultSettings.DEFAULT_FILENAME_LENGTH_LIMIT; + int maxCleartextFilenameLength = VaultSettings.DEFAULT_MAX_CLEARTEXT_FILENAME_LENGTH; WhenUnlocked actionAfterUnlock = VaultSettings.DEFAULT_ACTION_AFTER_UNLOCK; in.beginObject(); @@ -64,7 +64,7 @@ class VaultSettingsJsonAdapter { case "individualMountPath", "customMountPath" -> customMountPath = in.nextString(); case "usesReadOnlyMode" -> usesReadOnlyMode = in.nextBoolean(); case "mountFlags" -> mountFlags = in.nextString(); - case "filenameLengthLimit" -> filenameLengthLimit = in.nextInt(); + case "maxCleartextFilenameLength" -> maxCleartextFilenameLength = in.nextInt(); case "actionAfterUnlock" -> actionAfterUnlock = parseActionAfterUnlock(in.nextString()); default -> { LOG.warn("Unsupported vault setting found in JSON: " + name); @@ -88,7 +88,7 @@ class VaultSettingsJsonAdapter { vaultSettings.customMountPath().set(customMountPath); vaultSettings.usesReadOnlyMode().set(usesReadOnlyMode); vaultSettings.mountFlags().set(mountFlags); - vaultSettings.filenameLengthLimit().set(filenameLengthLimit); + vaultSettings.maxCleartextFilenameLength().set(maxCleartextFilenameLength); vaultSettings.actionAfterUnlock().set(actionAfterUnlock); return vaultSettings; } 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 a461d05cb..5f921d140 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 @@ -19,7 +19,6 @@ import org.cryptomator.cryptofs.CryptoFileSystemProperties.FileSystemFlags; import org.cryptomator.cryptofs.CryptoFileSystemProvider; import org.cryptomator.cryptofs.VaultConfig; import org.cryptomator.cryptofs.VaultConfig.UnverifiedVaultConfig; -import org.cryptomator.cryptofs.common.Constants; import org.cryptomator.cryptofs.common.FileSystemCapabilityChecker; import org.cryptomator.cryptolib.api.CryptoException; import org.cryptomator.cryptolib.api.MasterkeyLoader; @@ -105,20 +104,27 @@ public class Vault { Set flags = EnumSet.noneOf(FileSystemFlags.class); if (vaultSettings.usesReadOnlyMode().get()) { flags.add(FileSystemFlags.READONLY); + } else if(vaultSettings.maxCleartextFilenameLength().get() == -1) { + LOG.debug("Determining cleartext filename length limitations..."); + var checker = new FileSystemCapabilityChecker(); + int shorteningThreshold = getUnverifiedVaultConfig().orElseThrow().allegedShorteningThreshold(); + int ciphertextLimit = checker.determineSupportedCiphertextFileNameLength(getPath()); + if (ciphertextLimit < shorteningThreshold) { + int cleartextLimit = checker.determineSupportedCleartextFileNameLength(getPath()); + vaultSettings.maxCleartextFilenameLength().set(cleartextLimit); + } else { + vaultSettings.maxCleartextFilenameLength().setValue(Integer.MAX_VALUE); + } } - if (!flags.contains(FileSystemFlags.READONLY) && vaultSettings.filenameLengthLimit().get() == -1) { - LOG.debug("Determining file name length limitations..."); - int limit = new FileSystemCapabilityChecker().determineSupportedFileNameLength(getPath()); - vaultSettings.filenameLengthLimit().set(limit); - LOG.info("Storing file name length limit of {}", limit); + + if (vaultSettings.maxCleartextFilenameLength().get() < Integer.MAX_VALUE) { + LOG.warn("Limiting cleartext filename length on this device to {}.", vaultSettings.maxCleartextFilenameLength().get()); } - assert vaultSettings.filenameLengthLimit().get() > 0; CryptoFileSystemProperties fsProps = CryptoFileSystemProperties.cryptoFileSystemProperties() // .withKeyLoaders(keyLoader) // .withFlags(flags) // - .withMaxPathLength(vaultSettings.filenameLengthLimit().get() + Constants.MAX_ADDITIONAL_PATH_LENGTH) // - .withMaxNameLength(vaultSettings.filenameLengthLimit().get()) // + .withMaxCleartextNameLength(vaultSettings.maxCleartextFilenameLength().get()) // .build(); return CryptoFileSystemProvider.newFileSystem(getPath(), fsProps); } diff --git a/main/pom.xml b/main/pom.xml index ddd4262ec..aee4d4bb5 100644 --- a/main/pom.xml +++ b/main/pom.xml @@ -25,7 +25,7 @@ 16 - 2.0.0-beta5 + 2.0.0-beta7 1.0.0-beta2 1.0.0-beta2 1.0.0-beta2