From bbeeb79812c77706bf44eeb2c8fd5ec331afe2db Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Tue, 5 May 2015 06:50:16 +0200 Subject: [PATCH] reduced max file name size, locking metadata files before read/write. --- .../jackrabbit/CryptoLocatorFactory.java | 24 +++++++++++++------ .../crypto/aes256/FileNamingConventions.java | 2 +- .../crypto/aes256/Aes256CryptorTest.java | 8 +++---- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/main/core/src/main/java/org/cryptomator/webdav/jackrabbit/CryptoLocatorFactory.java b/main/core/src/main/java/org/cryptomator/webdav/jackrabbit/CryptoLocatorFactory.java index 7b6e68c06..7e910de80 100644 --- a/main/core/src/main/java/org/cryptomator/webdav/jackrabbit/CryptoLocatorFactory.java +++ b/main/core/src/main/java/org/cryptomator/webdav/jackrabbit/CryptoLocatorFactory.java @@ -1,6 +1,9 @@ package org.cryptomator.webdav.jackrabbit; import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.channels.FileChannel; +import java.nio.channels.FileLock; import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; @@ -75,18 +78,25 @@ class CryptoLocatorFactory implements DavLocatorFactory, CryptorMetadataSupport @Override public void writeMetadata(String metadataGroup, byte[] encryptedMetadata) throws IOException { - final Path metaDataFile = metadataRoot.resolve(metadataGroup); - Files.write(metaDataFile, encryptedMetadata, StandardOpenOption.WRITE, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.DSYNC); - + final Path metadataDir = metadataRoot.resolve(metadataGroup.substring(0, 2)); + Files.createDirectories(metadataDir); + final Path metadataFile = metadataDir.resolve(metadataGroup.substring(2)); + try (final FileChannel c = FileChannel.open(metadataFile, StandardOpenOption.WRITE, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.DSYNC); final FileLock lock = c.lock()) { + c.write(ByteBuffer.wrap(encryptedMetadata)); + } } @Override public byte[] readMetadata(String metadataGroup) throws IOException { - final Path metaDataFile = metadataRoot.resolve(metadataGroup); - if (!Files.isReadable(metaDataFile)) { + final Path metadataDir = metadataRoot.resolve(metadataGroup.substring(0, 2)); + final Path metadataFile = metadataDir.resolve(metadataGroup.substring(2)); + if (!Files.isReadable(metadataFile)) { return null; - } else { - return Files.readAllBytes(metaDataFile); + } + try (final FileChannel c = FileChannel.open(metadataFile, StandardOpenOption.READ, StandardOpenOption.DSYNC); final FileLock lock = c.lock(0L, Long.MAX_VALUE, true)) { + final ByteBuffer buffer = ByteBuffer.allocate((int) c.size()); + c.read(buffer); + return buffer.array(); } } } diff --git a/main/crypto-aes/src/main/java/org/cryptomator/crypto/aes256/FileNamingConventions.java b/main/crypto-aes/src/main/java/org/cryptomator/crypto/aes256/FileNamingConventions.java index 36ee0ccfe..deb00f70a 100644 --- a/main/crypto-aes/src/main/java/org/cryptomator/crypto/aes256/FileNamingConventions.java +++ b/main/crypto-aes/src/main/java/org/cryptomator/crypto/aes256/FileNamingConventions.java @@ -25,7 +25,7 @@ interface FileNamingConventions { * Maximum length possible on file systems with a filename limit of 255 chars.
* Also we would need a few chars for our file extension, so lets use {@value #ENCRYPTED_FILENAME_LENGTH_LIMIT}. */ - int ENCRYPTED_FILENAME_LENGTH_LIMIT = 250; + int ENCRYPTED_FILENAME_LENGTH_LIMIT = 128; /** * For plaintext file names <= {@value #ENCRYPTED_FILENAME_LENGTH_LIMIT} chars. diff --git a/main/crypto-aes/src/test/java/org/cryptomator/crypto/aes256/Aes256CryptorTest.java b/main/crypto-aes/src/test/java/org/cryptomator/crypto/aes256/Aes256CryptorTest.java index a32e4868c..39fc568f8 100644 --- a/main/crypto-aes/src/test/java/org/cryptomator/crypto/aes256/Aes256CryptorTest.java +++ b/main/crypto-aes/src/test/java/org/cryptomator/crypto/aes256/Aes256CryptorTest.java @@ -241,13 +241,13 @@ public class Aes256CryptorTest { private final Map map = new HashMap<>(); @Override - public void writeMetadata(String encryptedPath, byte[] encryptedMetadata) { - map.put(encryptedPath, encryptedMetadata); + public void writeMetadata(String metadataGroup, byte[] encryptedMetadata) { + map.put(metadataGroup, encryptedMetadata); } @Override - public byte[] readMetadata(String encryptedPath) { - return map.get(encryptedPath); + public byte[] readMetadata(String metadataGroup) { + return map.get(metadataGroup); } }