diff --git a/main/ant-kit/pom.xml b/main/ant-kit/pom.xml index 7292a21ef..791664bee 100644 --- a/main/ant-kit/pom.xml +++ b/main/ant-kit/pom.xml @@ -8,7 +8,7 @@ org.cryptomator main - 1.2.3 + 1.2.4 ant-kit pom diff --git a/main/ant-kit/src/main/resources/build.xml b/main/ant-kit/src/main/resources/build.xml index 89dd5c4bb..6dce44b1e 100644 --- a/main/ant-kit/src/main/resources/build.xml +++ b/main/ant-kit/src/main/resources/build.xml @@ -60,6 +60,7 @@ + diff --git a/main/commons-test/pom.xml b/main/commons-test/pom.xml index a9bb921f9..1850d442e 100644 --- a/main/commons-test/pom.xml +++ b/main/commons-test/pom.xml @@ -10,7 +10,7 @@ org.cryptomator main - 1.2.3 + 1.2.4 commons-test Cryptomator common test dependencies diff --git a/main/commons/pom.xml b/main/commons/pom.xml index 8e3f3101f..afe1d2acc 100644 --- a/main/commons/pom.xml +++ b/main/commons/pom.xml @@ -10,7 +10,7 @@ org.cryptomator main - 1.2.3 + 1.2.4 commons Cryptomator common diff --git a/main/filesystem-api/pom.xml b/main/filesystem-api/pom.xml index 84d3ba083..c8ed44aac 100644 --- a/main/filesystem-api/pom.xml +++ b/main/filesystem-api/pom.xml @@ -9,7 +9,7 @@ org.cryptomator main - 1.2.3 + 1.2.4 filesystem-api Cryptomator filesystem: API diff --git a/main/filesystem-charsets/pom.xml b/main/filesystem-charsets/pom.xml index 127ab648a..455114bad 100644 --- a/main/filesystem-charsets/pom.xml +++ b/main/filesystem-charsets/pom.xml @@ -12,7 +12,7 @@ org.cryptomator main - 1.2.3 + 1.2.4 filesystem-charsets Cryptomator filesystem: Charset compatibility layer diff --git a/main/filesystem-crypto-integration-tests/pom.xml b/main/filesystem-crypto-integration-tests/pom.xml index c9fbd1d92..e93d8b941 100644 --- a/main/filesystem-crypto-integration-tests/pom.xml +++ b/main/filesystem-crypto-integration-tests/pom.xml @@ -12,7 +12,7 @@ org.cryptomator main - 1.2.3 + 1.2.4 filesystem-crypto-integration-tests Cryptomator filesystem: Encryption layer tests diff --git a/main/filesystem-crypto/pom.xml b/main/filesystem-crypto/pom.xml index 9cd80702a..c6ba9f594 100644 --- a/main/filesystem-crypto/pom.xml +++ b/main/filesystem-crypto/pom.xml @@ -12,7 +12,7 @@ org.cryptomator main - 1.2.3 + 1.2.4 filesystem-crypto Cryptomator filesystem: Encryption layer diff --git a/main/filesystem-inmemory/pom.xml b/main/filesystem-inmemory/pom.xml index c52333cc9..c7da5eaae 100644 --- a/main/filesystem-inmemory/pom.xml +++ b/main/filesystem-inmemory/pom.xml @@ -12,7 +12,7 @@ org.cryptomator main - 1.2.3 + 1.2.4 filesystem-inmemory Cryptomator filesystem: In-memory mock diff --git a/main/filesystem-invariants-tests/pom.xml b/main/filesystem-invariants-tests/pom.xml index 765eb2595..d1e4bafe7 100644 --- a/main/filesystem-invariants-tests/pom.xml +++ b/main/filesystem-invariants-tests/pom.xml @@ -9,7 +9,7 @@ org.cryptomator main - 1.2.3 + 1.2.4 filesystem-invariants-tests Cryptomator filesystem: Invariants tests diff --git a/main/filesystem-nameshortening/pom.xml b/main/filesystem-nameshortening/pom.xml index 95f58e244..e10828e96 100644 --- a/main/filesystem-nameshortening/pom.xml +++ b/main/filesystem-nameshortening/pom.xml @@ -12,7 +12,7 @@ org.cryptomator main - 1.2.3 + 1.2.4 filesystem-nameshortening Cryptomator filesystem: Name shortening layer diff --git a/main/filesystem-nio/pom.xml b/main/filesystem-nio/pom.xml index 7b31518c4..7611668be 100644 --- a/main/filesystem-nio/pom.xml +++ b/main/filesystem-nio/pom.xml @@ -7,7 +7,7 @@ org.cryptomator main - 1.2.3 + 1.2.4 filesystem-nio Cryptomator filesystem: NIO-based physical layer diff --git a/main/filesystem-stats/pom.xml b/main/filesystem-stats/pom.xml index dd93fccdb..3ca32df9f 100644 --- a/main/filesystem-stats/pom.xml +++ b/main/filesystem-stats/pom.xml @@ -12,7 +12,7 @@ org.cryptomator main - 1.2.3 + 1.2.4 filesystem-stats Cryptomator filesystem: Throughput statistics diff --git a/main/frontend-api/pom.xml b/main/frontend-api/pom.xml index da7ec0d45..3b0ca81c7 100644 --- a/main/frontend-api/pom.xml +++ b/main/frontend-api/pom.xml @@ -12,7 +12,7 @@ org.cryptomator main - 1.2.3 + 1.2.4 frontend-api Cryptomator frontend: API diff --git a/main/frontend-webdav/pom.xml b/main/frontend-webdav/pom.xml index c788b15e9..588eea667 100644 --- a/main/frontend-webdav/pom.xml +++ b/main/frontend-webdav/pom.xml @@ -12,7 +12,7 @@ org.cryptomator main - 1.2.3 + 1.2.4 frontend-webdav Cryptomator frontend: WebDAV frontend diff --git a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/DavFileWithRange.java b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/DavFileWithRange.java index 8151b96c3..402d39270 100644 --- a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/DavFileWithRange.java +++ b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/DavFileWithRange.java @@ -16,7 +16,6 @@ import java.util.Objects; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; -import org.apache.jackrabbit.webdav.DavException; import org.apache.jackrabbit.webdav.DavServletResponse; import org.apache.jackrabbit.webdav.DavSession; import org.apache.jackrabbit.webdav.io.OutputContext; @@ -36,7 +35,7 @@ class DavFileWithRange extends DavFile { private final Pair requestRange; - public DavFileWithRange(FilesystemResourceFactory factory, LockManager lockManager, DavSession session, FileLocator node, Pair requestRange) throws DavException { + public DavFileWithRange(FilesystemResourceFactory factory, LockManager lockManager, DavSession session, FileLocator node, Pair requestRange) { super(factory, lockManager, session, node); this.requestRange = Objects.requireNonNull(requestRange); } @@ -48,18 +47,18 @@ class DavFileWithRange extends DavFile { return; } final long contentLength = node.size(); + final Pair range = getEffectiveRange(contentLength); + if (range.getLeft() < 0 || range.getLeft() > range.getRight() || range.getRight() > contentLength) { + outputContext.setProperty(HttpHeader.CONTENT_RANGE.asString(), "bytes */" + contentLength); + throw new UncheckedDavException(DavServletResponse.SC_REQUESTED_RANGE_NOT_SATISFIABLE, "Valid Range would be in [0, " + contentLength + "]"); + } + final Long rangeLength = range.getRight() - range.getLeft() + 1; + outputContext.setContentLength(rangeLength); + outputContext.setProperty(HttpHeader.CONTENT_RANGE.asString(), contentRangeResponseHeader(range.getLeft(), range.getRight(), contentLength)); + outputContext.setContentType(CONTENT_TYPE_VALUE); + outputContext.setProperty(CONTENT_DISPOSITION_HEADER, CONTENT_DISPOSITION_VALUE); + outputContext.setProperty(X_CONTENT_TYPE_OPTIONS_HEADER, X_CONTENT_TYPE_OPTIONS_VALUE); try (ReadableFile src = node.openReadable(); OutputStream out = outputContext.getOutputStream()) { - final Pair range = getEffectiveRange(contentLength); - if (range.getLeft() < 0 || range.getLeft() > range.getRight() || range.getRight() > contentLength) { - outputContext.setProperty(HttpHeader.CONTENT_RANGE.asString(), "bytes */" + contentLength); - throw new UncheckedDavException(DavServletResponse.SC_REQUESTED_RANGE_NOT_SATISFIABLE, "Valid Range would be in [0, " + contentLength + "]"); - } - final Long rangeLength = range.getRight() - range.getLeft() + 1; - outputContext.setContentLength(rangeLength); - outputContext.setProperty(HttpHeader.CONTENT_RANGE.asString(), contentRangeResponseHeader(range.getLeft(), range.getRight(), contentLength)); - outputContext.setContentType(CONTENT_TYPE_VALUE); - outputContext.setProperty(CONTENT_DISPOSITION_HEADER, CONTENT_DISPOSITION_VALUE); - outputContext.setProperty(X_CONTENT_TYPE_OPTIONS_HEADER, X_CONTENT_TYPE_OPTIONS_VALUE); src.position(range.getLeft()); InputStream limitedIn = ByteStreams.limit(Channels.newInputStream(src), rangeLength); ByteStreams.copy(limitedIn, out); diff --git a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/DavFileWithUnsatisfiableRange.java b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/DavFileWithUnsatisfiableRange.java deleted file mode 100644 index 1b820f90e..000000000 --- a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/DavFileWithUnsatisfiableRange.java +++ /dev/null @@ -1,50 +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.frontend.webdav.jackrabbitservlet; - -import java.io.IOException; -import java.io.OutputStream; -import java.nio.channels.Channels; - -import org.apache.jackrabbit.webdav.DavException; -import org.apache.jackrabbit.webdav.DavSession; -import org.apache.jackrabbit.webdav.io.OutputContext; -import org.apache.jackrabbit.webdav.lock.LockManager; -import org.cryptomator.filesystem.ReadableFile; -import org.cryptomator.filesystem.jackrabbit.FileLocator; -import org.eclipse.jetty.http.HttpHeader; - -import com.google.common.io.ByteStreams; - -/** - * Sends the full file in reaction to an unsatisfiable range. - * - * @see {@link https://tools.ietf.org/html/rfc7233#section-4.2} - */ -class DavFileWithUnsatisfiableRange extends DavFile { - - public DavFileWithUnsatisfiableRange(FilesystemResourceFactory factory, LockManager lockManager, DavSession session, FileLocator node) throws DavException { - super(factory, lockManager, session, node); - } - - @Override - public void spool(OutputContext outputContext) throws IOException { - outputContext.setModificationTime(node.lastModified().toEpochMilli()); - if (!outputContext.hasStream()) { - return; - } - final long contentLength = node.size(); - outputContext.setContentLength(contentLength); - outputContext.setProperty(HttpHeader.CONTENT_RANGE.asString(), "bytes */" + contentLength); - try (ReadableFile src = node.openReadable(); OutputStream out = outputContext.getOutputStream()) { - ByteStreams.copy(src, Channels.newChannel(out)); - } - } - -} diff --git a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/FilesystemResourceFactory.java b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/FilesystemResourceFactory.java index 43bce9663..bc92793fe 100644 --- a/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/FilesystemResourceFactory.java +++ b/main/frontend-webdav/src/main/java/org/cryptomator/frontend/webdav/jackrabbitservlet/FilesystemResourceFactory.java @@ -85,17 +85,11 @@ class FilesystemResourceFactory implements DavResourceFactory { final String rangeHeader = request.getHeader(HttpHeader.RANGE.asString()); try { // 206 for ranged resources: - final Pair parsedRange = parseRangeRequestHeader(rangeHeader); + final Pair parsedRange = parseSingleByteRange(rangeHeader); response.setStatus(DavServletResponse.SC_PARTIAL_CONTENT); return new DavFileWithRange(this, lockManager, session, file, parsedRange); - } catch (DavException ex) { - if (ex.getErrorCode() == DavServletResponse.SC_REQUESTED_RANGE_NOT_SATISFIABLE) { - // 416 for unsatisfiable ranges: - response.setStatus(DavServletResponse.SC_REQUESTED_RANGE_NOT_SATISFIABLE); - return new DavFileWithUnsatisfiableRange(this, lockManager, session, file); - } else { - throw new DavException(ex.getErrorCode(), ex); - } + } catch (NotASingleByteRangeException ex) { + return createFile(file, session); } } @@ -108,17 +102,18 @@ class FilesystemResourceFactory implements DavResourceFactory { * * * @return Tuple of lower and upper range. - * @throws DavException HTTP statuscode 400 for malformed requests. 416 if requested range is not supported. + * @throws DavException HTTP statuscode 400 for malformed requests. + * @throws NotASingleByteRangeException Indicating a range that is not supported by this server, i.e. range header should be ignored. */ - private Pair parseRangeRequestHeader(String rangeHeader) throws DavException { + private Pair parseSingleByteRange(String rangeHeader) throws DavException, NotASingleByteRangeException { assert rangeHeader != null; if (!rangeHeader.startsWith(RANGE_BYTE_PREFIX)) { - throw new DavException(DavServletResponse.SC_REQUESTED_RANGE_NOT_SATISFIABLE); + throw new NotASingleByteRangeException(); } final String byteRangeSet = StringUtils.removeStartIgnoreCase(rangeHeader, RANGE_BYTE_PREFIX); final String[] byteRanges = StringUtils.split(byteRangeSet, RANGE_SET_SEP); if (byteRanges.length != 1) { - throw new DavException(DavServletResponse.SC_REQUESTED_RANGE_NOT_SATISFIABLE); + throw new NotASingleByteRangeException(); } final String byteRange = byteRanges[0]; final String[] bytePos = StringUtils.splitPreserveAllTokens(byteRange, RANGE_SEP); @@ -146,4 +141,7 @@ class FilesystemResourceFactory implements DavResourceFactory { } } + private static class NotASingleByteRangeException extends Exception { + } + } diff --git a/main/frontend-webdav/src/test/java/org/cryptomator/frontend/webdav/WebDavServerTest.java b/main/frontend-webdav/src/test/java/org/cryptomator/frontend/webdav/WebDavServerTest.java index 0255df9d5..70d2eef80 100644 --- a/main/frontend-webdav/src/test/java/org/cryptomator/frontend/webdav/WebDavServerTest.java +++ b/main/frontend-webdav/src/test/java/org/cryptomator/frontend/webdav/WebDavServerTest.java @@ -376,7 +376,7 @@ public class WebDavServerTest { final HttpMethod getMethod = new GetMethod(servletRoot + "/foo.txt"); getMethod.addRequestHeader("Range", "chunks=1-2"); final int statusCode = client.executeMethod(getMethod); - Assert.assertEquals(416, statusCode); + Assert.assertEquals(200, statusCode); Assert.assertArrayEquals(testContent, getMethod.getResponseBody()); getMethod.releaseConnection(); } diff --git a/main/jacoco-report/pom.xml b/main/jacoco-report/pom.xml index 6f4f898ae..b981c33a1 100644 --- a/main/jacoco-report/pom.xml +++ b/main/jacoco-report/pom.xml @@ -5,7 +5,7 @@ org.cryptomator main - 1.2.3 + 1.2.4 jacoco-report Cryptomator Code Coverage Report diff --git a/main/keychain/pom.xml b/main/keychain/pom.xml index 756e81eeb..53f8b371b 100644 --- a/main/keychain/pom.xml +++ b/main/keychain/pom.xml @@ -3,7 +3,7 @@ org.cryptomator main - 1.2.3 + 1.2.4 keychain System Keychain Access diff --git a/main/pom.xml b/main/pom.xml index f0f365e73..da95f678a 100644 --- a/main/pom.xml +++ b/main/pom.xml @@ -6,7 +6,7 @@ 4.0.0 org.cryptomator main - 1.2.3 + 1.2.4 pom Cryptomator diff --git a/main/uber-jar/pom.xml b/main/uber-jar/pom.xml index 4d715f850..02b00d3ba 100644 --- a/main/uber-jar/pom.xml +++ b/main/uber-jar/pom.xml @@ -12,7 +12,7 @@ org.cryptomator main - 1.2.3 + 1.2.4 uber-jar pom diff --git a/main/ui/pom.xml b/main/ui/pom.xml index 06a479090..2bbefaf66 100644 --- a/main/ui/pom.xml +++ b/main/ui/pom.xml @@ -12,7 +12,7 @@ org.cryptomator main - 1.2.3 + 1.2.4 ui Cryptomator GUI diff --git a/main/ui/src/main/java/org/cryptomator/ui/controllers/UpgradeController.java b/main/ui/src/main/java/org/cryptomator/ui/controllers/UpgradeController.java index 8e6a4e97f..48dc21fa5 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/controllers/UpgradeController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/controllers/UpgradeController.java @@ -41,7 +41,10 @@ public class UpgradeController extends LocalizedFXMLViewController { } @FXML - private Label upgradeLabel; + private Label upgradeTitleLabel; + + @FXML + private Label upgradeMsgLabel; @FXML private SecPasswordField passwordField; @@ -60,8 +63,11 @@ public class UpgradeController extends LocalizedFXMLViewController { @Override protected void initialize() { - upgradeLabel.textProperty().bind(EasyBind.monadic(strategy).map(instruction -> { - return instruction.map(this::upgradeNotification).orElse(""); + upgradeTitleLabel.textProperty().bind(EasyBind.monadic(strategy).map(instruction -> { + return instruction.map(this::upgradeTitle).orElse(""); + }).orElse("")); + upgradeMsgLabel.textProperty().bind(EasyBind.monadic(strategy).map(instruction -> { + return instruction.map(this::upgradeMessage).orElse(""); }).orElse("")); BooleanExpression passwordProvided = passwordField.textProperty().isNotEmpty().and(passwordField.disabledProperty().not()); @@ -87,8 +93,12 @@ public class UpgradeController extends LocalizedFXMLViewController { // Upgrade label // **************************************** - private String upgradeNotification(UpgradeStrategy instruction) { - return instruction.getNotification(vault); + private String upgradeTitle(UpgradeStrategy instruction) { + return instruction.getTitle(vault); + } + + private String upgradeMessage(UpgradeStrategy instruction) { + return instruction.getMessage(vault); } // **************************************** diff --git a/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeStrategy.java b/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeStrategy.java index 9dba19a37..2ef55dd77 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeStrategy.java +++ b/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeStrategy.java @@ -33,9 +33,14 @@ public abstract class UpgradeStrategy { } /** - * @return Localized string to display to the user when an upgrade is needed. + * @return Localized title string to display to the user when an upgrade is needed. */ - public abstract String getNotification(Vault vault); + public abstract String getTitle(Vault vault); + + /** + * @return Localized message string to display to the user when an upgrade is needed. + */ + public abstract String getMessage(Vault vault); /** * Upgrades a vault. Might take a moment, should be run in a background thread. diff --git a/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeVersion3DropBundleExtension.java b/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeVersion3DropBundleExtension.java index 873c69716..60087419f 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeVersion3DropBundleExtension.java +++ b/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeVersion3DropBundleExtension.java @@ -32,7 +32,12 @@ class UpgradeVersion3DropBundleExtension extends UpgradeStrategy { } @Override - public String getNotification(Vault vault) { + public String getTitle(Vault vault) { + return localization.getString("upgrade.version3dropBundleExtension.title"); + } + + @Override + public String getMessage(Vault vault) { String fmt = localization.getString("upgrade.version3dropBundleExtension.msg"); Path path = vault.path().getValue(); String oldVaultName = path.getFileName().toString(); 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 49b5c13a3..0ba05a58f 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 @@ -50,7 +50,12 @@ class UpgradeVersion3to4 extends UpgradeStrategy { } @Override - public String getNotification(Vault vault) { + public String getTitle(Vault vault) { + return localization.getString("upgrade.version3to4.title"); + } + + @Override + public String getMessage(Vault vault) { return localization.getString("upgrade.version3to4.msg"); } 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 0629083d6..936a2c8ba 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 @@ -40,8 +40,13 @@ class UpgradeVersion4to5 extends UpgradeStrategy { } @Override - public String getNotification(Vault vault) { - return localization.getString("upgrade.version3to4.msg"); + public String getTitle(Vault vault) { + return localization.getString("upgrade.version4to5.title"); + } + + @Override + public String getMessage(Vault vault) { + return localization.getString("upgrade.version4to5.msg"); } @Override @@ -66,7 +71,7 @@ class UpgradeVersion4to5 extends UpgradeStrategy { }); } catch (IOException e) { LOG.error("Migration failed.", e); - throw new UpgradeFailedException(localization.getString("upgrade.version3to4.err.io")); + throw new UpgradeFailedException(localization.getString("upgrade.version4to5.err.io")); } LOG.info("Migration finished."); } diff --git a/main/ui/src/main/resources/fxml/upgrade.fxml b/main/ui/src/main/resources/fxml/upgrade.fxml index 24fc99d0a..966f529c2 100644 --- a/main/ui/src/main/resources/fxml/upgrade.fxml +++ b/main/ui/src/main/resources/fxml/upgrade.fxml @@ -31,22 +31,24 @@ -