Browse Source

Fixed problem with sync conflict resolver. Issue #311

Markus Kreusch 8 years ago
parent
commit
034a667e07

+ 1 - 1
main/filesystem-crypto/src/main/java/org/cryptomator/crypto/engine/impl/FilenameCryptorImpl.java

@@ -27,7 +27,7 @@ class FilenameCryptorImpl implements FilenameCryptor {
 
 	private static final BaseNCodec BASE32 = new Base32();
 	// https://tools.ietf.org/html/rfc4648#section-6
-	private static final Pattern BASE32_PATTERN = Pattern.compile("([A-Z2-7]{8})*[A-Z2-7=]{8}");
+	private static final Pattern BASE32_PATTERN = Pattern.compile("^([A-Z2-7]{8})*[A-Z2-7=]{8}");
 	private static final ThreadLocal<MessageDigest> SHA1 = new ThreadLocalSha1();
 	private static final ThreadLocal<SivMode> AES_SIV = new ThreadLocal<SivMode>() {
 		@Override

+ 4 - 3
main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoFolder.java

@@ -10,6 +10,7 @@ package org.cryptomator.filesystem.crypto;
 
 import static java.lang.String.format;
 import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.apache.commons.lang3.StringUtils.removeStart;
 import static org.cryptomator.filesystem.crypto.Constants.DIR_PREFIX;
 
 import java.io.FileNotFoundException;
@@ -91,15 +92,15 @@ class CryptoFolder extends CryptoNode implements Folder {
 	private Stream<File> nonConflictingFiles() {
 		if (exists()) {
 			final Stream<? extends File> files = physicalFolder().filter(Folder::exists).map(Folder::files).orElse(Stream.empty());
-			return files.filter(containsEncryptedName()).map(conflictResolver::resolveIfNecessary).distinct();
+			return files.filter(startsWithEncryptedName()).map(conflictResolver::resolveIfNecessary).distinct();
 		} else {
 			throw new UncheckedIOException(new FileNotFoundException(format("Folder %s does not exist", this)));
 		}
 	}
 
-	private Predicate<File> containsEncryptedName() {
+	private Predicate<File> startsWithEncryptedName() {
 		final Pattern encryptedNamePattern = cryptor.getFilenameCryptor().encryptedNamePattern();
-		return (File file) -> encryptedNamePattern.matcher(file.name()).find();
+		return (File file) -> encryptedNamePattern.matcher(removeStart(file.name(),DIR_PREFIX)).find();
 	}
 
 	Optional<String> decryptChildName(String ciphertextFileName) {

+ 1 - 1
main/filesystem-nameshortening/src/main/java/org/cryptomator/filesystem/shortening/ConflictResolver.java

@@ -14,7 +14,7 @@ final class ConflictResolver {
 
 	private static final Logger LOG = LoggerFactory.getLogger(ConflictResolver.class);
 	private static final String LONG_NAME_FILE_EXT = ".lng";
-	private static final Pattern BASE32_PATTERN = Pattern.compile("([A-Z0-9]{8})*[A-Z0-9=]{8}");
+	private static final Pattern BASE32_PATTERN = Pattern.compile("^0?([A-Z2-7]{8})*[A-Z2-7=]{8}");
 	private static final int UUID_FIRST_GROUP_STRLEN = 8;
 
 	private ConflictResolver() {