diff --git a/main/filesystem-api/src/test/resources/log4j2.xml b/main/filesystem-api/src/test/resources/log4j2.xml new file mode 100644 index 000000000..9b4889392 --- /dev/null +++ b/main/filesystem-api/src/test/resources/log4j2.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/main/filesystem-crypto-integration-tests/.gitignore b/main/filesystem-crypto-integration-tests/.gitignore new file mode 100644 index 000000000..b83d22266 --- /dev/null +++ b/main/filesystem-crypto-integration-tests/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/main/filesystem-crypto-integration-tests/pom.xml b/main/filesystem-crypto-integration-tests/pom.xml new file mode 100644 index 000000000..bceda5537 --- /dev/null +++ b/main/filesystem-crypto-integration-tests/pom.xml @@ -0,0 +1,64 @@ + + + + 4.0.0 + + org.cryptomator + main + 0.11.0-SNAPSHOT + + filesystem-crypto-integration-tests + Cryptomator filesystem: Encryption layer tests + + + + org.cryptomator + filesystem-api + + + org.cryptomator + filesystem-crypto + + + org.cryptomator + filesystem-nameshortening + + + + + com.google.dagger + dagger + + + com.google.dagger + dagger-compiler + provided + + + + + org.cryptomator + commons-test + + + org.cryptomator + filesystem-inmemory + + + + + + + org.jacoco + jacoco-maven-plugin + + + + \ No newline at end of file diff --git a/main/filesystem-crypto/src/test/java/org/cryptomator/crypto/engine/impl/CryptoEngineTestModule.java b/main/filesystem-crypto-integration-tests/src/main/java/org/cryptomator/filesystem/crypto/CryptoEngineTestModule.java similarity index 88% rename from main/filesystem-crypto/src/test/java/org/cryptomator/crypto/engine/impl/CryptoEngineTestModule.java rename to main/filesystem-crypto-integration-tests/src/main/java/org/cryptomator/filesystem/crypto/CryptoEngineTestModule.java index 8bfdb86ee..161666ce8 100644 --- a/main/filesystem-crypto/src/test/java/org/cryptomator/crypto/engine/impl/CryptoEngineTestModule.java +++ b/main/filesystem-crypto-integration-tests/src/main/java/org/cryptomator/filesystem/crypto/CryptoEngineTestModule.java @@ -6,11 +6,13 @@ * Contributors: * Sebastian Stenzel - initial API and implementation *******************************************************************************/ -package org.cryptomator.crypto.engine.impl; +package org.cryptomator.filesystem.crypto; import java.security.SecureRandom; import java.util.Arrays; +import org.cryptomator.crypto.engine.impl.CryptoEngineModule; + /** * Used as drop-in-replacement for {@link CryptoEngineModule} during unit tests. */ diff --git a/main/filesystem-crypto-integration-tests/src/main/java/org/cryptomator/filesystem/crypto/CryptoFileSystemTestComponent.java b/main/filesystem-crypto-integration-tests/src/main/java/org/cryptomator/filesystem/crypto/CryptoFileSystemTestComponent.java new file mode 100644 index 000000000..98b11e925 --- /dev/null +++ b/main/filesystem-crypto-integration-tests/src/main/java/org/cryptomator/filesystem/crypto/CryptoFileSystemTestComponent.java @@ -0,0 +1,32 @@ +/******************************************************************************* + * Copyright (c) 2016 Sebastian Stenzel and others. + * This file is licensed under the terms of the MIT license. + * See the LICENSE.txt file for more info. + * + * Contributors: + * Sebastian Stenzel - initial API and implementation + *******************************************************************************/ +package org.cryptomator.filesystem.crypto; + +import javax.inject.Singleton; + +import org.cryptomator.crypto.engine.impl.CryptoEngineModule; +import org.cryptomator.filesystem.shortening.ShorteningFileSystemFactory; + +import dagger.Component; + +/** + * To be used in integration tests, where a {@link CryptoFileSystem} is needed in conjunction with {@link CryptoEngineTestModule} (which mocks the CSPRNG) as follows: + * + * DaggerCryptoFileSystemTestComponent.builder().cryptoEngineModule(new CryptoEngineTestModule()).build() + * + */ +@Singleton +@Component(modules = CryptoEngineModule.class) +public interface CryptoFileSystemTestComponent { + + CryptoFileSystemFactory cryptoFileSystemFactory(); + + ShorteningFileSystemFactory shorteningFileSystemFactory(); + +} diff --git a/main/filesystem-crypto/src/test/java/org/cryptomator/filesystem/crypto/CryptoFileSystemComponentIntegrationTest.java b/main/filesystem-crypto-integration-tests/src/test/java/org/cryptomator/filesystem/crypto/CryptoFileSystemIntegrationTest.java similarity index 94% rename from main/filesystem-crypto/src/test/java/org/cryptomator/filesystem/crypto/CryptoFileSystemComponentIntegrationTest.java rename to main/filesystem-crypto-integration-tests/src/test/java/org/cryptomator/filesystem/crypto/CryptoFileSystemIntegrationTest.java index 826187e31..577e98a32 100644 --- a/main/filesystem-crypto/src/test/java/org/cryptomator/filesystem/crypto/CryptoFileSystemComponentIntegrationTest.java +++ b/main/filesystem-crypto-integration-tests/src/test/java/org/cryptomator/filesystem/crypto/CryptoFileSystemIntegrationTest.java @@ -13,7 +13,6 @@ import java.io.UncheckedIOException; import java.nio.ByteBuffer; import java.util.Arrays; -import org.cryptomator.crypto.engine.impl.CryptoEngineTestModule; import org.cryptomator.filesystem.File; import org.cryptomator.filesystem.FileSystem; import org.cryptomator.filesystem.Folder; @@ -28,11 +27,11 @@ import org.mockito.Mockito; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class CryptoFileSystemComponentIntegrationTest { +public class CryptoFileSystemIntegrationTest { - private static final CryptoFileSystemComponent cryptoFsComp = DaggerCryptoFileSystemComponent.builder().cryptoEngineModule(new CryptoEngineTestModule()).build(); + private static final Logger LOG = LoggerFactory.getLogger(CryptoFileSystemIntegrationTest.class); - private static final Logger LOG = LoggerFactory.getLogger(CryptoFileSystemComponentIntegrationTest.class); + private final CryptoFileSystemTestComponent cryptoFsComp = DaggerCryptoFileSystemTestComponent.builder().cryptoEngineModule(new CryptoEngineTestModule()).build(); private CryptoFileSystemDelegate cryptoDelegate; private FileSystem ciphertextFs; @@ -42,9 +41,9 @@ public class CryptoFileSystemComponentIntegrationTest { public void setupFileSystems() { cryptoDelegate = Mockito.mock(CryptoFileSystemDelegate.class); ciphertextFs = new InMemoryFileSystem(); - cryptoFsComp.cryptoFileSystemFactory().initializeNew(ciphertextFs, "TopSecret"); - cleartextFs = cryptoFsComp.cryptoFileSystemFactory().unlockExisting(ciphertextFs, "TopSecret", cryptoDelegate); - cleartextFs.create(); + FileSystem shorteningFs = cryptoFsComp.shorteningFileSystemFactory().get(ciphertextFs); + cryptoFsComp.cryptoFileSystemFactory().initializeNew(shorteningFs, "TopSecret"); + cleartextFs = cryptoFsComp.cryptoFileSystemFactory().unlockExisting(shorteningFs, "TopSecret", cryptoDelegate); } @Test(timeout = 1000) diff --git a/main/filesystem-crypto-integration-tests/src/test/resources/log4j2.xml b/main/filesystem-crypto-integration-tests/src/test/resources/log4j2.xml new file mode 100644 index 000000000..9b4889392 --- /dev/null +++ b/main/filesystem-crypto-integration-tests/src/test/resources/log4j2.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/main/filesystem-crypto/pom.xml b/main/filesystem-crypto/pom.xml index 8c21359b3..53da97c04 100644 --- a/main/filesystem-crypto/pom.xml +++ b/main/filesystem-crypto/pom.xml @@ -27,10 +27,6 @@ org.cryptomator filesystem-api - - org.cryptomator - filesystem-nameshortening - org.cryptomator commons diff --git a/main/filesystem-crypto/src/main/java/org/cryptomator/crypto/engine/impl/CryptorImpl.java b/main/filesystem-crypto/src/main/java/org/cryptomator/crypto/engine/impl/CryptorImpl.java index fdbd8c362..790d40794 100644 --- a/main/filesystem-crypto/src/main/java/org/cryptomator/crypto/engine/impl/CryptorImpl.java +++ b/main/filesystem-crypto/src/main/java/org/cryptomator/crypto/engine/impl/CryptorImpl.java @@ -29,7 +29,7 @@ import org.cryptomator.crypto.engine.InvalidPassphraseException; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -public class CryptorImpl implements Cryptor { +class CryptorImpl implements Cryptor { private static final int SCRYPT_SALT_LENGTH = 8; private static final int SCRYPT_COST_PARAM = 1 << 14; diff --git a/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoFileSystem.java b/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoFileSystem.java index 242f07071..514414c44 100644 --- a/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoFileSystem.java +++ b/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoFileSystem.java @@ -18,7 +18,7 @@ import org.cryptomator.filesystem.File; import org.cryptomator.filesystem.FileSystem; import org.cryptomator.filesystem.Folder; -public class CryptoFileSystem extends CryptoFolder implements FileSystem { +class CryptoFileSystem extends CryptoFolder implements FileSystem { private static final String DATA_ROOT_DIR = "d"; private static final String ROOT_DIRECOTRY_ID = ""; diff --git a/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoFileSystemComponent.java b/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoFileSystemComponent.java deleted file mode 100644 index 73e0745a0..000000000 --- a/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoFileSystemComponent.java +++ /dev/null @@ -1,21 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2016 Sebastian Stenzel and others. - * This file is licensed under the terms of the MIT license. - * See the LICENSE.txt file for more info. - * - * Contributors: - * Sebastian Stenzel - initial API and implementation - *******************************************************************************/ -package org.cryptomator.filesystem.crypto; - -import javax.inject.Singleton; - -import dagger.Component; - -@Singleton -@Component(modules = CryptoFileSystemModule.class) -interface CryptoFileSystemComponent { - - CryptoFileSystemFactory cryptoFileSystemFactory(); - -} diff --git a/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoFileSystemFactory.java b/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoFileSystemFactory.java index 72a0a6e10..ffaa7025a 100644 --- a/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoFileSystemFactory.java +++ b/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoFileSystemFactory.java @@ -18,19 +18,16 @@ import org.cryptomator.crypto.engine.InvalidPassphraseException; import org.cryptomator.filesystem.FileSystem; import org.cryptomator.filesystem.Folder; import org.cryptomator.filesystem.blockaligned.BlockAlignedFileSystemFactory; -import org.cryptomator.filesystem.shortening.ShorteningFileSystemFactory; @Singleton public class CryptoFileSystemFactory { private final Masterkeys masterkeys; - private final ShorteningFileSystemFactory shorteningFileSystemFactory; private final BlockAlignedFileSystemFactory blockAlignedFileSystemFactory; @Inject - public CryptoFileSystemFactory(Masterkeys masterkeys, ShorteningFileSystemFactory shorteningFileSystemFactory, BlockAlignedFileSystemFactory blockAlignedFileSystemFactory) { + public CryptoFileSystemFactory(Masterkeys masterkeys, BlockAlignedFileSystemFactory blockAlignedFileSystemFactory) { this.masterkeys = masterkeys; - this.shorteningFileSystemFactory = shorteningFileSystemFactory; this.blockAlignedFileSystemFactory = blockAlignedFileSystemFactory; } @@ -41,8 +38,7 @@ public class CryptoFileSystemFactory { public FileSystem unlockExisting(Folder vaultLocation, CharSequence passphrase, CryptoFileSystemDelegate delegate) throws InvalidPassphraseException { final Cryptor cryptor = masterkeys.decrypt(vaultLocation, passphrase); masterkeys.backup(vaultLocation); - final FileSystem nameShorteningFs = shorteningFileSystemFactory.get(vaultLocation); - final FileSystem cryptoFs = new CryptoFileSystem(nameShorteningFs, cryptor, delegate, passphrase); + final FileSystem cryptoFs = new CryptoFileSystem(vaultLocation, cryptor, delegate, passphrase); return blockAlignedFileSystemFactory.get(cryptoFs); } diff --git a/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoFileSystemModule.java b/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoFileSystemModule.java deleted file mode 100644 index 92e971a0a..000000000 --- a/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoFileSystemModule.java +++ /dev/null @@ -1,18 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2016 Sebastian Stenzel and others. - * This file is licensed under the terms of the MIT license. - * See the LICENSE.txt file for more info. - * - * Contributors: - * Sebastian Stenzel - initial API and implementation - *******************************************************************************/ -package org.cryptomator.filesystem.crypto; - -import org.cryptomator.crypto.engine.impl.CryptoEngineModule; - -import dagger.Module; - -@Module(includes = CryptoEngineModule.class) -public class CryptoFileSystemModule { - -} diff --git a/main/filesystem-crypto/src/test/java/org/cryptomator/crypto/engine/impl/TestCryptorImplFactory.java b/main/filesystem-crypto/src/test/java/org/cryptomator/crypto/engine/impl/TestCryptorImplFactory.java index f66a53f04..8a4c1a56d 100644 --- a/main/filesystem-crypto/src/test/java/org/cryptomator/crypto/engine/impl/TestCryptorImplFactory.java +++ b/main/filesystem-crypto/src/test/java/org/cryptomator/crypto/engine/impl/TestCryptorImplFactory.java @@ -11,6 +11,8 @@ package org.cryptomator.crypto.engine.impl; import java.security.SecureRandom; import java.util.Arrays; +import org.cryptomator.crypto.engine.Cryptor; + public class TestCryptorImplFactory { private static final SecureRandom RANDOM_MOCK = new SecureRandom() { @@ -27,7 +29,7 @@ public class TestCryptorImplFactory { /** * @return A CryptorImpl with a mocked PRNG, that can be used during tests without the need of "real" random numbers. */ - public static CryptorImpl insecureCryptorImpl() { + public static Cryptor insecureCryptorImpl() { return new CryptorImpl(RANDOM_MOCK); } diff --git a/main/filesystem-invariants-tests/pom.xml b/main/filesystem-invariants-tests/pom.xml index 95d6fb829..b29e57662 100644 --- a/main/filesystem-invariants-tests/pom.xml +++ b/main/filesystem-invariants-tests/pom.xml @@ -12,7 +12,7 @@ 0.11.0-SNAPSHOT filesystem-invariants-tests - Cryptomator filesystem invariants tests + Cryptomator filesystem: Invariants tests Test only project which checks invariants of FileSystem implementations @@ -24,6 +24,10 @@ org.cryptomator filesystem-crypto + + org.cryptomator + filesystem-crypto-integration-tests + org.cryptomator filesystem-inmemory diff --git a/main/filesystem-invariants-tests/src/test/java/org/cryptomator/filesystem/invariants/FileSystemFactories.java b/main/filesystem-invariants-tests/src/test/java/org/cryptomator/filesystem/invariants/FileSystemFactories.java index a8f409ce2..2dee6a620 100644 --- a/main/filesystem-invariants-tests/src/test/java/org/cryptomator/filesystem/invariants/FileSystemFactories.java +++ b/main/filesystem-invariants-tests/src/test/java/org/cryptomator/filesystem/invariants/FileSystemFactories.java @@ -4,17 +4,15 @@ import static org.cryptomator.common.test.TempFilesRemovedOnShutdown.createTempD import java.io.IOException; import java.io.UncheckedIOException; -import java.security.SecureRandom; import java.util.ArrayList; -import java.util.Arrays; import java.util.Iterator; import java.util.List; -import org.cryptomator.crypto.engine.Cryptor; -import org.cryptomator.crypto.engine.impl.CryptorImpl; import org.cryptomator.filesystem.FileSystem; -import org.cryptomator.filesystem.crypto.CryptoFileSystem; +import org.cryptomator.filesystem.crypto.CryptoEngineTestModule; import org.cryptomator.filesystem.crypto.CryptoFileSystemDelegate; +import org.cryptomator.filesystem.crypto.CryptoFileSystemTestComponent; +import org.cryptomator.filesystem.crypto.DaggerCryptoFileSystemTestComponent; import org.cryptomator.filesystem.inmem.InMemoryFileSystem; import org.cryptomator.filesystem.invariants.FileSystemFactories.FileSystemFactory; import org.cryptomator.filesystem.nio.NioFileSystem; @@ -23,12 +21,7 @@ import org.mockito.Mockito; class FileSystemFactories implements Iterable { - private static final SecureRandom RANDOM_MOCK = new SecureRandom() { - @Override - public void nextBytes(byte[] bytes) { - Arrays.fill(bytes, (byte) 0x00); - } - }; + private static final CryptoFileSystemTestComponent CRYPTO_FS_COMP = DaggerCryptoFileSystemTestComponent.builder().cryptoEngineModule(new CryptoEngineTestModule()).build(); private final List factories = new ArrayList<>(); @@ -54,11 +47,15 @@ class FileSystemFactories implements Iterable { } private FileSystem createCryptoFileSystemInMemory() { - return new CryptoFileSystem(createInMemoryFileSystem(), createCryptor(), Mockito.mock(CryptoFileSystemDelegate.class), "aPassphrase"); + FileSystem delegate = createInMemoryFileSystem(); + CRYPTO_FS_COMP.cryptoFileSystemFactory().initializeNew(delegate, "aPassphrase"); + return CRYPTO_FS_COMP.cryptoFileSystemFactory().unlockExisting(delegate, "aPassphrase", Mockito.mock(CryptoFileSystemDelegate.class)); } private FileSystem createCryptoFileSystemNio() { - return new CryptoFileSystem(createNioFileSystem(), createCryptor(), Mockito.mock(CryptoFileSystemDelegate.class), "aPassphrase"); + FileSystem delegate = createNioFileSystem(); + CRYPTO_FS_COMP.cryptoFileSystemFactory().initializeNew(delegate, "aPassphrase"); + return CRYPTO_FS_COMP.cryptoFileSystemFactory().unlockExisting(delegate, "aPassphrase", Mockito.mock(CryptoFileSystemDelegate.class)); } private FileSystem createShorteningFileSystemNio() { @@ -71,12 +68,6 @@ class FileSystemFactories implements Iterable { return new ShorteningFileSystem(delegate.folder("d"), delegate.folder("m"), 3); } - private Cryptor createCryptor() { - Cryptor cryptor = new CryptorImpl(RANDOM_MOCK); - cryptor.randomizeMasterkey(); - return cryptor; - } - private void add(String name, FileSystemFactory factory) { factories.add(new FileSystemFactory() { @Override diff --git a/main/filesystem-nio/src/test/resources/log4j2.xml b/main/filesystem-nio/src/test/resources/log4j2.xml new file mode 100644 index 000000000..9b4889392 --- /dev/null +++ b/main/filesystem-nio/src/test/resources/log4j2.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/main/frontend-webdav/pom.xml b/main/frontend-webdav/pom.xml index 14f8a8fcd..48e5ee182 100644 --- a/main/frontend-webdav/pom.xml +++ b/main/frontend-webdav/pom.xml @@ -94,13 +94,26 @@ commons-test - commons-httpclient - commons-httpclient + org.cryptomator + filesystem-inmemory + + + org.cryptomator + filesystem-crypto-integration-tests + + + org.cryptomator + filesystem-nameshortening test org.cryptomator - filesystem-inmemory + filesystem-crypto + test + + + commons-httpclient + commons-httpclient test diff --git a/main/frontend-webdav/src/main/java/org/cryptomator/filesystem/jackrabbit/InternalFileSystemResourceLocator.java b/main/frontend-webdav/src/main/java/org/cryptomator/filesystem/jackrabbit/InternalFileSystemResourceLocator.java index d2be89cc2..bcf67bbd0 100644 --- a/main/frontend-webdav/src/main/java/org/cryptomator/filesystem/jackrabbit/InternalFileSystemResourceLocator.java +++ b/main/frontend-webdav/src/main/java/org/cryptomator/filesystem/jackrabbit/InternalFileSystemResourceLocator.java @@ -1,3 +1,11 @@ +/******************************************************************************* + * Copyright (c) 2016 Sebastian Stenzel and others. + * This file is licensed under the terms of the MIT license. + * See the LICENSE.txt file for more info. + * + * Contributors: + * Sebastian Stenzel - initial API and implementation + *******************************************************************************/ package org.cryptomator.filesystem.jackrabbit; import java.util.concurrent.atomic.AtomicReference; diff --git a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/ExclusiveSharedLock.java b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/ExclusiveSharedLock.java index 5f52a67e5..d6dba5720 100644 --- a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/ExclusiveSharedLock.java +++ b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/ExclusiveSharedLock.java @@ -1,3 +1,11 @@ +/******************************************************************************* + * Copyright (c) 2016 Sebastian Stenzel and others. + * This file is licensed under the terms of the MIT license. + * See the LICENSE.txt file for more info. + * + * Contributors: + * Sebastian Stenzel - initial API and implementation + *******************************************************************************/ package org.cryptomator.frontend.webdav.jackrabbitservlet; import org.apache.jackrabbit.webdav.DavConstants; diff --git a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/ExclusiveSharedLockManager.java b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/ExclusiveSharedLockManager.java index 07cd42e54..fb7edc2fd 100644 --- a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/ExclusiveSharedLockManager.java +++ b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/ExclusiveSharedLockManager.java @@ -1,3 +1,11 @@ +/******************************************************************************* + * Copyright (c) 2016 Sebastian Stenzel and others. + * This file is licensed under the terms of the MIT license. + * See the LICENSE.txt file for more info. + * + * Contributors: + * Sebastian Stenzel - initial API and implementation + *******************************************************************************/ package org.cryptomator.frontend.webdav.jackrabbitservlet; import java.util.Collection; diff --git a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/UncheckedDavException.java b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/UncheckedDavException.java index 6eb814362..9a8145ca0 100644 --- a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/UncheckedDavException.java +++ b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/UncheckedDavException.java @@ -1,3 +1,11 @@ +/******************************************************************************* + * Copyright (c) 2016 Sebastian Stenzel and others. + * This file is licensed under the terms of the MIT license. + * See the LICENSE.txt file for more info. + * + * Contributors: + * Sebastian Stenzel - initial API and implementation + *******************************************************************************/ package org.cryptomator.frontend.webdav.jackrabbitservlet; import org.apache.jackrabbit.webdav.DavException; diff --git a/main/frontend-webdav/src/test/java/org/cryptomator/frontend/webdav/InMemoryWebDavServer.java b/main/frontend-webdav/src/test/java/org/cryptomator/frontend/webdav/InMemoryWebDavServer.java index fb1524dad..35f12fd24 100644 --- a/main/frontend-webdav/src/test/java/org/cryptomator/frontend/webdav/InMemoryWebDavServer.java +++ b/main/frontend-webdav/src/test/java/org/cryptomator/frontend/webdav/InMemoryWebDavServer.java @@ -9,25 +9,31 @@ package org.cryptomator.frontend.webdav; import java.net.URI; -import java.nio.ByteBuffer; import java.util.EnumSet; import javax.servlet.DispatcherType; import org.cryptomator.filesystem.FileSystem; -import org.cryptomator.filesystem.WritableFile; +import org.cryptomator.filesystem.crypto.CryptoEngineTestModule; +import org.cryptomator.filesystem.crypto.CryptoFileSystemDelegate; +import org.cryptomator.filesystem.crypto.CryptoFileSystemTestComponent; +import org.cryptomator.filesystem.crypto.DaggerCryptoFileSystemTestComponent; import org.cryptomator.filesystem.inmem.InMemoryFileSystem; import org.cryptomator.frontend.webdav.filters.LoggingHttpFilter; import org.eclipse.jetty.servlet.ServletContextHandler; +import org.mockito.Mockito; public class InMemoryWebDavServer { + private static final CryptoFileSystemTestComponent CRYPTO_FS_COMP = DaggerCryptoFileSystemTestComponent.builder().cryptoEngineModule(new CryptoEngineTestModule()).build(); + private static final WebDavComponent WEVDAV_COMP = DaggerWebDavComponent.create(); + public static void main(String[] args) throws Exception { - WebDavServer server = DaggerWebDavComponent.create().server(); + WebDavServer server = WEVDAV_COMP.server(); server.setPort(8080); server.start(); - FileSystem fileSystem = setupFilesystem(); + FileSystem fileSystem = cryptoFileSystem(); ServletContextHandler servlet = server.addServlet(fileSystem, URI.create("http://localhost:8080/foo")); servlet.addFilter(LoggingHttpFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST)); servlet.start(); @@ -37,14 +43,18 @@ public class InMemoryWebDavServer { server.stop(); } - private static FileSystem setupFilesystem() { - FileSystem fileSystem = new InMemoryFileSystem(); - fileSystem.folder("mamals").folder("cats").create(); - fileSystem.folder("mamals").folder("dogs").create(); - try (WritableFile writable = fileSystem.folder("mamals").folder("cats").file("Garfield.txt").openWritable()) { - writable.write(ByteBuffer.wrap("meow".getBytes())); - } - return fileSystem; + private static FileSystem cryptoFileSystem() { + FileSystem shorteningFileSystem = shorteningFileSystem(); + CRYPTO_FS_COMP.cryptoFileSystemFactory().initializeNew(shorteningFileSystem, "asd"); + return CRYPTO_FS_COMP.cryptoFileSystemFactory().unlockExisting(shorteningFileSystem, "asd", Mockito.mock(CryptoFileSystemDelegate.class)); + } + + private static FileSystem shorteningFileSystem() { + return CRYPTO_FS_COMP.shorteningFileSystemFactory().get(inMemoryFileSystem()); + } + + private static FileSystem inMemoryFileSystem() { + return new InMemoryFileSystem(); } } diff --git a/main/frontend-webdav/src/test/java/org/cryptomator/frontend/webdav/NioWebDavServer.java b/main/frontend-webdav/src/test/java/org/cryptomator/frontend/webdav/NioWebDavServer.java index 6c45b22fd..681eec05d 100644 --- a/main/frontend-webdav/src/test/java/org/cryptomator/frontend/webdav/NioWebDavServer.java +++ b/main/frontend-webdav/src/test/java/org/cryptomator/frontend/webdav/NioWebDavServer.java @@ -30,9 +30,10 @@ import org.eclipse.jetty.servlet.ServletContextHandler; public class NioWebDavServer { private static final String PATH_TO_SERVE_PROPERTY = "pathToServe"; + private static final WebDavComponent WEVDAV_COMP = DaggerWebDavComponent.create(); public static void main(String[] args) throws Exception { - WebDavServer server = DaggerWebDavComponent.create().server(); + WebDavServer server = WEVDAV_COMP.server(); server.setPort(8080); server.start(); diff --git a/main/frontend-webdav/src/test/java/org/cryptomator/frontend/webdav/jackrabbitservlet/ExclusiveSharedLockManagerTest.java b/main/frontend-webdav/src/test/java/org/cryptomator/frontend/webdav/jackrabbitservlet/ExclusiveSharedLockManagerTest.java index f4ccfa06b..09d302937 100644 --- a/main/frontend-webdav/src/test/java/org/cryptomator/frontend/webdav/jackrabbitservlet/ExclusiveSharedLockManagerTest.java +++ b/main/frontend-webdav/src/test/java/org/cryptomator/frontend/webdav/jackrabbitservlet/ExclusiveSharedLockManagerTest.java @@ -1,3 +1,11 @@ +/******************************************************************************* + * Copyright (c) 2016 Sebastian Stenzel and others. + * This file is licensed under the terms of the MIT license. + * See the LICENSE.txt file for more info. + * + * Contributors: + * Sebastian Stenzel - initial API and implementation + *******************************************************************************/ package org.cryptomator.frontend.webdav.jackrabbitservlet; import java.util.Optional; diff --git a/main/pom.xml b/main/pom.xml index 5b8fc0b41..58d9d5e27 100644 --- a/main/pom.xml +++ b/main/pom.xml @@ -90,6 +90,12 @@ filesystem-crypto ${project.version} + + org.cryptomator + filesystem-crypto-integration-tests + ${project.version} + test + org.cryptomator filesystem-stats @@ -258,6 +264,7 @@ filesystem-nio filesystem-nameshortening filesystem-crypto + filesystem-crypto-integration-tests filesystem-stats filesystem-invariants-tests frontend-api diff --git a/main/ui/pom.xml b/main/ui/pom.xml index faae1e994..b04a80729 100644 --- a/main/ui/pom.xml +++ b/main/ui/pom.xml @@ -30,6 +30,10 @@ org.cryptomator filesystem-nio + + org.cryptomator + filesystem-nameshortening + org.cryptomator filesystem-crypto diff --git a/main/ui/src/main/java/org/cryptomator/ui/CryptomatorModule.java b/main/ui/src/main/java/org/cryptomator/ui/CryptomatorModule.java index a5cb957de..58629e841 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/CryptomatorModule.java +++ b/main/ui/src/main/java/org/cryptomator/ui/CryptomatorModule.java @@ -15,7 +15,7 @@ import java.util.concurrent.Executors; import javax.inject.Named; import javax.inject.Singleton; -import org.cryptomator.filesystem.crypto.CryptoFileSystemModule; +import org.cryptomator.crypto.engine.impl.CryptoEngineModule; import org.cryptomator.frontend.FrontendFactory; import org.cryptomator.frontend.webdav.WebDavServer; import org.cryptomator.frontend.webdav.mount.WebDavMounter; @@ -33,7 +33,7 @@ import dagger.Module; import dagger.Provides; import javafx.application.Application; -@Module(includes = CryptoFileSystemModule.class) +@Module(includes = CryptoEngineModule.class) class CryptomatorModule { private final Application application; diff --git a/main/ui/src/main/java/org/cryptomator/ui/model/Vault.java b/main/ui/src/main/java/org/cryptomator/ui/model/Vault.java index e9c7a6145..06e5f7a44 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/model/Vault.java +++ b/main/ui/src/main/java/org/cryptomator/ui/model/Vault.java @@ -29,6 +29,7 @@ import org.cryptomator.filesystem.FileSystem; import org.cryptomator.filesystem.crypto.CryptoFileSystemDelegate; import org.cryptomator.filesystem.crypto.CryptoFileSystemFactory; import org.cryptomator.filesystem.nio.NioFileSystem; +import org.cryptomator.filesystem.shortening.ShorteningFileSystemFactory; import org.cryptomator.filesystem.stats.StatsFileSystem; import org.cryptomator.frontend.CommandFailedException; import org.cryptomator.frontend.Frontend; @@ -59,6 +60,7 @@ public class Vault implements Serializable, CryptoFileSystemDelegate { private final Path path; private final Lazy frontendFactory; private final DeferredCloser closer; + private final ShorteningFileSystemFactory shorteningFileSystemFactory; private final CryptoFileSystemFactory cryptoFileSystemFactory; private final ObjectProperty unlocked = new SimpleObjectProperty(this, "unlocked", Boolean.FALSE); private final ObservableList namesOfResourcesWithInvalidMac = FXThreads.observableListOnMainThread(FXCollections.observableArrayList()); @@ -72,10 +74,11 @@ public class Vault implements Serializable, CryptoFileSystemDelegate { /** * Package private constructor, use {@link VaultFactory}. */ - Vault(Path vaultDirectoryPath, Lazy frontendFactory, CryptoFileSystemFactory cryptoFileSystemFactory, DeferredCloser closer) { + Vault(Path vaultDirectoryPath, Lazy frontendFactory, ShorteningFileSystemFactory shorteningFileSystemFactory, CryptoFileSystemFactory cryptoFileSystemFactory, DeferredCloser closer) { this.path = vaultDirectoryPath; this.frontendFactory = frontendFactory; this.closer = closer; + this.shorteningFileSystemFactory = shorteningFileSystemFactory; this.cryptoFileSystemFactory = cryptoFileSystemFactory; try { @@ -114,7 +117,8 @@ public class Vault implements Serializable, CryptoFileSystemDelegate { public synchronized void activateFrontend(CharSequence passphrase) throws FrontendCreationFailedException { try { FileSystem fs = NioFileSystem.rootedAt(path); - FileSystem cryptoFs = cryptoFileSystemFactory.unlockExisting(fs, passphrase, this); + FileSystem shorteningFs = shorteningFileSystemFactory.get(fs); + FileSystem cryptoFs = cryptoFileSystemFactory.unlockExisting(shorteningFs, passphrase, this); StatsFileSystem statsFs = new StatsFileSystem(cryptoFs); statsFileSystem = Optional.of(statsFs); String contextPath = StringUtils.prependIfMissing(mountName, "/"); diff --git a/main/ui/src/main/java/org/cryptomator/ui/model/VaultFactory.java b/main/ui/src/main/java/org/cryptomator/ui/model/VaultFactory.java index b413aabac..702678b8a 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/model/VaultFactory.java +++ b/main/ui/src/main/java/org/cryptomator/ui/model/VaultFactory.java @@ -14,6 +14,7 @@ import javax.inject.Inject; import javax.inject.Singleton; import org.cryptomator.filesystem.crypto.CryptoFileSystemFactory; +import org.cryptomator.filesystem.shortening.ShorteningFileSystemFactory; import org.cryptomator.frontend.FrontendFactory; import org.cryptomator.frontend.webdav.mount.WebDavMounter; import org.cryptomator.ui.util.DeferredCloser; @@ -24,18 +25,20 @@ import dagger.Lazy; public class VaultFactory { private final Lazy frontendFactory; + private final ShorteningFileSystemFactory shorteningFileSystemFactory; private final CryptoFileSystemFactory cryptoFileSystemFactory; private final DeferredCloser closer; @Inject - public VaultFactory(Lazy frontendFactory, CryptoFileSystemFactory cryptoFileSystemFactory, WebDavMounter mounter, DeferredCloser closer) { + public VaultFactory(Lazy frontendFactory, ShorteningFileSystemFactory shorteningFileSystemFactory, CryptoFileSystemFactory cryptoFileSystemFactory, WebDavMounter mounter, DeferredCloser closer) { this.frontendFactory = frontendFactory; + this.shorteningFileSystemFactory = shorteningFileSystemFactory; this.cryptoFileSystemFactory = cryptoFileSystemFactory; this.closer = closer; } public Vault createVault(Path path) { - return new Vault(path, frontendFactory, cryptoFileSystemFactory, closer); + return new Vault(path, frontendFactory, shorteningFileSystemFactory, cryptoFileSystemFactory, closer); } }