From 2ed00ed02d28ac49675917077baaf714a08c5793 Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Wed, 19 Apr 2017 14:02:37 +0200 Subject: [PATCH] fixes #435 --- .../ui/model/UpgradeVersion3to4.java | 34 +++++++++++-------- .../ui/model/UpgradeVersion4to5.java | 25 ++++++++++++-- 2 files changed, 43 insertions(+), 16 deletions(-) diff --git a/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeVersion3to4.java b/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeVersion3to4.java index 005392390..8e12c8fd7 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeVersion3to4.java +++ b/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeVersion3to4.java @@ -8,12 +8,14 @@ package org.cryptomator.ui.model; import static java.nio.charset.StandardCharsets.UTF_8; import java.io.IOException; +import java.nio.file.FileVisitOption; import java.nio.file.FileVisitResult; -import java.nio.file.FileVisitor; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; import java.security.MessageDigest; +import java.util.EnumSet; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -38,6 +40,8 @@ import org.slf4j.LoggerFactory; class UpgradeVersion3to4 extends UpgradeStrategy { private static final Logger LOG = LoggerFactory.getLogger(UpgradeVersion3to4.class); + private static final Pattern LVL1_DIR_PATTERN = Pattern.compile("[A-Z2-7]{2}"); + private static final Pattern LVL2_DIR_PATTERN = Pattern.compile("[A-Z2-7]{30}"); private static final Pattern BASE32_FOLLOWED_BY_UNDERSCORE_PATTERN = Pattern.compile("^(([A-Z2-7]{8})*[A-Z2-7=]{8})_"); private static final int FILE_MIN_SIZE = 88; // vault version 3 files have a header of 88 bytes (assuming no chunks at all) private static final String LONG_FILENAME_SUFFIX = ".lng"; @@ -70,11 +74,23 @@ class UpgradeVersion3to4 extends UpgradeStrategy { return; // empty vault. no migration needed. } try { - Files.walkFileTree(dataDir, new FileVisitor() { + Files.walkFileTree(dataDir, EnumSet.noneOf(FileVisitOption.class), 3, new SimpleFileVisitor() { @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { - return FileVisitResult.CONTINUE; + if (dir.equals(dataDir)) { + // path/to/vault/d + return FileVisitResult.CONTINUE; + } else if (dir.getParent().equals(dataDir) && LVL1_DIR_PATTERN.matcher(dir.getFileName().toString()).matches()) { + // path/to/vault/d/AB + return FileVisitResult.CONTINUE; + } else if (dir.getParent().getParent().equals(dataDir) && LVL2_DIR_PATTERN.matcher(dir.getFileName().toString()).matches()) { + // path/to/vault/d/AB/CDEFGHIJKLMNOPQRSTUVWXYZ234567 + return FileVisitResult.CONTINUE; + } else { + LOG.info("Skipping irrelevant directory {}", dir); + return FileVisitResult.SKIP_SUBTREE; + } } @Override @@ -88,16 +104,6 @@ class UpgradeVersion3to4 extends UpgradeStrategy { return FileVisitResult.CONTINUE; } - @Override - public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException { - throw exc; - } - - @Override - public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { - return FileVisitResult.CONTINUE; - } - }); } catch (IOException e) { LOG.error("Migration failed.", e); @@ -110,7 +116,7 @@ class UpgradeVersion3to4 extends UpgradeStrategy { String name = file.getFileName().toString(); long size = attrs.size(); Matcher m = BASE32_FOLLOWED_BY_UNDERSCORE_PATTERN.matcher(name); - if (m.find(0) && size < FILE_MIN_SIZE) { + if (attrs.isRegularFile() && m.find(0) && size < FILE_MIN_SIZE) { String base32 = m.group(1); String suffix = name.substring(m.end()); String renamed = NEW_FOLDER_PREFIX + base32 + (suffix.isEmpty() ? "" : " " + suffix); diff --git a/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeVersion4to5.java b/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeVersion4to5.java index 25d89c3e2..ba2207ebc 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeVersion4to5.java +++ b/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeVersion4to5.java @@ -8,12 +8,14 @@ package org.cryptomator.ui.model; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; +import java.nio.file.FileVisitOption; import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.SimpleFileVisitor; import java.nio.file.StandardOpenOption; import java.nio.file.attribute.BasicFileAttributes; +import java.util.EnumSet; import java.util.regex.Pattern; import javax.inject.Inject; @@ -34,6 +36,8 @@ import org.slf4j.LoggerFactory; class UpgradeVersion4to5 extends UpgradeStrategy { private static final Logger LOG = LoggerFactory.getLogger(UpgradeVersion4to5.class); + private static final Pattern LVL1_DIR_PATTERN = Pattern.compile("[A-Z2-7]{2}"); + private static final Pattern LVL2_DIR_PATTERN = Pattern.compile("[A-Z2-7]{30}"); private static final Pattern BASE32_PATTERN = Pattern.compile("^([A-Z2-7]{8})*[A-Z2-7=]{8}"); @Inject @@ -58,11 +62,28 @@ class UpgradeVersion4to5 extends UpgradeStrategy { return; // empty vault. no migration needed. } try { - Files.walkFileTree(dataDir, new SimpleFileVisitor() { + Files.walkFileTree(dataDir, EnumSet.noneOf(FileVisitOption.class), 3, new SimpleFileVisitor() { + + @Override + public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { + if (dir.equals(dataDir)) { + // path/to/vault/d + return FileVisitResult.CONTINUE; + } else if (dir.getParent().equals(dataDir) && LVL1_DIR_PATTERN.matcher(dir.getFileName().toString()).matches()) { + // path/to/vault/d/AB + return FileVisitResult.CONTINUE; + } else if (dir.getParent().getParent().equals(dataDir) && LVL2_DIR_PATTERN.matcher(dir.getFileName().toString()).matches()) { + // path/to/vault/d/AB/CDEFGHIJKLMNOPQRSTUVWXYZ234567 + return FileVisitResult.CONTINUE; + } else { + LOG.info("Skipping irrelevant directory {}", dir); + return FileVisitResult.SKIP_SUBTREE; + } + } @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { - if (BASE32_PATTERN.matcher(file.getFileName().toString()).find() && attrs.size() > cryptor.fileHeaderCryptor().headerSize()) { + if (attrs.isRegularFile() && BASE32_PATTERN.matcher(file.getFileName().toString()).find() && attrs.size() > cryptor.fileHeaderCryptor().headerSize()) { migrate(file, attrs, cryptor); } else { LOG.info("Skipping irrelevant file {}.", file);