diff --git a/main/filesystem-crypto/src/main/java/org/cryptomator/crypto/engine/impl/FilenameCryptorImpl.java b/main/filesystem-crypto/src/main/java/org/cryptomator/crypto/engine/impl/FilenameCryptorImpl.java index 6833d1b9a..75408f609 100644 --- a/main/filesystem-crypto/src/main/java/org/cryptomator/crypto/engine/impl/FilenameCryptorImpl.java +++ b/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 SHA1 = new ThreadLocalSha1(); private static final ThreadLocal AES_SIV = new ThreadLocal() { @Override diff --git a/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoFolder.java b/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoFolder.java index b66721ca2..af9698d12 100644 --- a/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoFolder.java +++ b/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 nonConflictingFiles() { if (exists()) { final Stream 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 containsEncryptedName() { + private Predicate 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 decryptChildName(String ciphertextFileName) { diff --git a/main/filesystem-nameshortening/src/main/java/org/cryptomator/filesystem/shortening/ConflictResolver.java b/main/filesystem-nameshortening/src/main/java/org/cryptomator/filesystem/shortening/ConflictResolver.java index ac8b056fe..ef5532767 100644 --- a/main/filesystem-nameshortening/src/main/java/org/cryptomator/filesystem/shortening/ConflictResolver.java +++ b/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() {