diff --git a/components/app/src/main/java/org/trellisldp/app/config/CORSConfiguration.java b/components/app/src/main/java/org/trellisldp/app/config/CORSConfiguration.java index b0ad8f96b..477829184 100644 --- a/components/app/src/main/java/org/trellisldp/app/config/CORSConfiguration.java +++ b/components/app/src/main/java/org/trellisldp/app/config/CORSConfiguration.java @@ -32,11 +32,11 @@ public class CORSConfiguration { "GET", "HEAD", "OPTIONS", "POST"); private List<String> allowHeaders = asList("Content-Type", "Link", "Accept", - "Accept-Datetime", "Prefer", "Want-Digest", "Slug", "Digest", "Origin"); + "Accept-Datetime", "Prefer", "Slug", "Origin"); private List<String> exposeHeaders = asList("Content-Type", "Link", "Memento-Datetime", "Preference-Applied", "Location", - "Accept-Patch", "Accept-Post", "Digest", "Accept-Ranges", "ETag", "Vary"); + "Accept-Patch", "Accept-Post", "Accept-Ranges", "ETag", "Vary"); private boolean allowCredentials = true; diff --git a/components/app/src/test/java/org/trellisldp/app/config/TrellisConfigurationTest.java b/components/app/src/test/java/org/trellisldp/app/config/TrellisConfigurationTest.java index 01495586b..5da8352f1 100644 --- a/components/app/src/test/java/org/trellisldp/app/config/TrellisConfigurationTest.java +++ b/components/app/src/test/java/org/trellisldp/app/config/TrellisConfigurationTest.java @@ -143,7 +143,7 @@ public void testConfigurationCORS1() throws Exception { assertTrue(config.getCors().getEnabled(), "CORS not enabled!"); assertTrue(config.getCors().getAllowOrigin().contains("*"), "'*' not in CORS allow-origin!"); - assertTrue(config.getCors().getAllowHeaders().contains("Want-Digest"), "want-digest not in CORS allow-headers"); + assertTrue(config.getCors().getAllowHeaders().contains("Link"), "Link not in CORS allow-headers"); assertTrue(config.getCors().getAllowMethods().contains("PUT"), "PUT not in CORS allow-methods!"); assertTrue(config.getCors().getExposeHeaders().contains("Memento-Datetime"), "memento-datetime missing from CORS expose-headers!"); diff --git a/components/app/src/test/resources/config1.yml b/components/app/src/test/resources/config1.yml index 5f8f0c036..7de857e57 100644 --- a/components/app/src/test/resources/config1.yml +++ b/components/app/src/test/resources/config1.yml @@ -77,7 +77,6 @@ cors: - "PATCH" allowHeaders: - "Content-Type" - - "Want-Digest" - "Link" exposeHeaders: - "Link" diff --git a/components/file/build.gradle b/components/file/build.gradle index f0689a53b..0fe565a9f 100644 --- a/components/file/build.gradle +++ b/components/file/build.gradle @@ -12,7 +12,6 @@ dependencies { api("org.glassfish.hk2.external:javax.inject:$javaxInjectVersion") api project(':trellis-api') - implementation("commons-codec:commons-codec:$commonsCodecVersion") implementation("commons-io:commons-io:$commonsIoVersion") implementation("org.apache.commons:commons-rdf-jena:$commonsRdfVersion") { exclude group: 'org.apache.jena', module: 'jena-osgi' diff --git a/components/file/src/main/java/module-info.java b/components/file/src/main/java/module-info.java index d9735ea7f..642b98d59 100644 --- a/components/file/src/main/java/module-info.java +++ b/components/file/src/main/java/module-info.java @@ -17,7 +17,6 @@ requires transitive org.trellisldp.api; requires transitive org.trellisldp.vocabulary; - requires org.apache.commons.codec; requires org.apache.commons.io; requires org.apache.commons.rdf.api; requires org.apache.commons.rdf.jena; diff --git a/components/file/src/main/java/org/trellisldp/file/FileBinaryService.java b/components/file/src/main/java/org/trellisldp/file/FileBinaryService.java index 4081ac5cc..796088c88 100644 --- a/components/file/src/main/java/org/trellisldp/file/FileBinaryService.java +++ b/components/file/src/main/java/org/trellisldp/file/FileBinaryService.java @@ -16,34 +16,19 @@ import static java.nio.file.Files.copy; import static java.nio.file.Files.delete; import static java.nio.file.StandardCopyOption.REPLACE_EXISTING; -import static java.util.Arrays.asList; import static java.util.Objects.requireNonNull; import static java.util.Optional.of; import static java.util.ServiceLoader.load; import static java.util.concurrent.CompletableFuture.supplyAsync; -import static java.util.stream.Collectors.toSet; -import static org.apache.commons.codec.digest.DigestUtils.updateDigest; -import static org.apache.commons.codec.digest.MessageDigestAlgorithms.MD2; -import static org.apache.commons.codec.digest.MessageDigestAlgorithms.MD5; -import static org.apache.commons.codec.digest.MessageDigestAlgorithms.SHA3_256; -import static org.apache.commons.codec.digest.MessageDigestAlgorithms.SHA3_384; -import static org.apache.commons.codec.digest.MessageDigestAlgorithms.SHA3_512; -import static org.apache.commons.codec.digest.MessageDigestAlgorithms.SHA_1; -import static org.apache.commons.codec.digest.MessageDigestAlgorithms.SHA_256; -import static org.apache.commons.codec.digest.MessageDigestAlgorithms.SHA_384; -import static org.apache.commons.codec.digest.MessageDigestAlgorithms.SHA_512; import static org.slf4j.LoggerFactory.getLogger; import java.io.File; -import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.UncheckedIOException; import java.net.URI; -import java.security.MessageDigest; import java.util.Iterator; import java.util.ServiceLoader; -import java.util.Set; import java.util.concurrent.CompletionStage; import java.util.function.Supplier; @@ -61,24 +46,6 @@ /** * A {@link BinaryService} implementation that stores LDP-NR resources as files on a local filesystem. - * - * <p>This service supports the following digest algorithms: - * <ul> - * <li>MD5</li> - * <li>MD2</li> - * <li>SHA</li> - * <li>SHA-1</li> - * <li>SHA-256</li> - * <li>SHA-384</li> - * <li>SHA-512</li> - * </ul> - * - * <p>When running under JDK 9+, the following additional digest algorithms are supported: - * <ul> - * <li>SHA3-256</li> - * <li>SHA3-384</li> - * <li>SHA3-512</li> - * </ul> */ public class FileBinaryService implements BinaryService { @@ -92,14 +59,9 @@ public class FileBinaryService implements BinaryService { public static final String CONFIG_FILE_BINARY_LENGTH = "trellis.file.binary.length"; private static final Logger LOGGER = getLogger(FileBinaryService.class); - private static final String SHA = "SHA"; private static final int DEFAULT_HIERARCHY = 3; private static final int DEFAULT_LENGTH = 2; - private static final Set<String> algorithms = asList(MD5, MD2, SHA, SHA_1, SHA_256, SHA_384, SHA_512, - SHA3_256, SHA3_384, SHA3_512).stream() - .collect(toSet()); - private final String basePath; private final Supplier<String> idSupplier; @@ -176,16 +138,6 @@ public CompletionStage<Void> setContent(final BinaryMetadata metadata, final Inp }); } - @Override - public CompletionStage<MessageDigest> calculateDigest(final IRI identifier, final MessageDigest algorithm) { - return supplyAsync(() -> computeDigest(identifier, algorithm)); - } - - @Override - public Set<String> supportedAlgorithms() { - return algorithms; - } - @Override public String generateIdentifier() { return idSupplier.get(); @@ -198,14 +150,6 @@ private File getFileFromIdentifier(final IRI identifier) { .orElseThrow(() -> new IllegalArgumentException("Could not create File object from IRI: " + identifier)); } - private MessageDigest computeDigest(final IRI identifier, final MessageDigest algorithm) { - try (final InputStream input = new FileInputStream(getFileFromIdentifier(identifier))) { - return updateDigest(algorithm, input); - } catch (final IOException ex) { - throw new UncheckedIOException("Error computing digest", ex); - } - } - private static String trimStart(final String str, final String trim) { if (str.startsWith(trim)) { return trimStart(str.substring(trim.length()), trim); diff --git a/components/file/src/test/java/org/trellisldp/file/FileBinaryServiceTest.java b/components/file/src/test/java/org/trellisldp/file/FileBinaryServiceTest.java index 3d215042a..57385969c 100644 --- a/components/file/src/test/java/org/trellisldp/file/FileBinaryServiceTest.java +++ b/components/file/src/test/java/org/trellisldp/file/FileBinaryServiceTest.java @@ -14,10 +14,7 @@ package org.trellisldp.file; import static java.nio.charset.StandardCharsets.UTF_8; -import static java.util.Base64.getEncoder; -import static org.apache.commons.codec.digest.DigestUtils.getDigest; import static org.junit.jupiter.api.Assertions.*; -import static org.junit.jupiter.api.condition.JRE.JAVA_8; import static org.mockito.Mockito.mock; import java.io.ByteArrayInputStream; @@ -25,7 +22,6 @@ import java.io.IOException; import java.io.InputStream; import java.math.BigInteger; -import java.security.MessageDigest; import java.security.SecureRandom; import java.util.concurrent.CompletionException; @@ -36,7 +32,6 @@ import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.condition.DisabledOnJre; import org.trellisldp.api.Binary; import org.trellisldp.api.BinaryMetadata; import org.trellisldp.api.BinaryService; @@ -65,15 +60,6 @@ public static void cleanUp() { System.clearProperty(FileBinaryService.CONFIG_FILE_BINARY_BASE_PATH); } - @Test - public void testSupportedAlgorithms() { - final BinaryService service = new FileBinaryService(); - assertTrue(service.supportedAlgorithms().contains("SHA")); - assertTrue(service.supportedAlgorithms().contains("SHA-1")); - assertTrue(service.supportedAlgorithms().contains("SHA-256")); - assertTrue(service.supportedAlgorithms().contains("MD5")); - } - @Test public void testFilePurge() { final BinaryService service = new FileBinaryService(); @@ -171,38 +157,6 @@ public void testGetFileSkipContentError() throws Exception { }).toCompletableFuture().join()); } - @Test - public void testBase64Digest() throws IOException { - final BinaryService service = new FileBinaryService(); - assertEquals("oZ1Y1O/8vs39RH31fh9lrA==", service.calculateDigest(file, getDigest("MD5")) - .thenApply(MessageDigest::digest).thenApply(getEncoder()::encodeToString) - .toCompletableFuture().join(), "Bad MD5 digest!"); - assertEquals("QJuYLse9SK/As177lt+rSfixyH0=", service.calculateDigest(file, getDigest("SHA-1")) - .thenApply(MessageDigest::digest).thenApply(getEncoder()::encodeToString) - .toCompletableFuture().join(), "Bad SHA digest!"); - assertThrows(CompletionException.class, () -> - service.calculateDigest(rdf.createIRI("file:///" + randomFilename()), getDigest("MD5")) - .toCompletableFuture().join(), "Computing digest on invalid file should throw an exception!"); - } - - @Test - @DisabledOnJre(JAVA_8) - public void testJdk9Digests() throws IOException { - final BinaryService service = new FileBinaryService(); - assertEquals("FQgyH2yU2NhyMTZ7YDDKwV5vcWUBM1zq0uoIYUiHH+4=", - service.calculateDigest(file, getDigest("SHA3-256")).thenApply(MessageDigest::digest) - .thenApply(getEncoder()::encodeToString).toCompletableFuture().join(), - "Bad SHA3-256 digest!"); - assertEquals("746UDLrFXM61gzI0FnoVT2S0Z7EmQUfhHnoSYwkR2MHzbBe6j9rMigQBfR8ApZUA", - service.calculateDigest(file, getDigest("SHA3-384")).thenApply(MessageDigest::digest) - .thenApply(getEncoder()::encodeToString).toCompletableFuture().join(), - "Bad SHA3-384 digest!"); - assertEquals("Ecu/R0kV4eL0J/VOpyVA2Lz0T6qsJj9ioQ+QorJDztJeMj6uhf6zqyhZnu9zMYiwrkX8U4oWiZMDT/0fWjOyYg==", - service.calculateDigest(file, getDigest("SHA3-512")).thenApply(MessageDigest::digest) - .thenApply(getEncoder()::encodeToString).toCompletableFuture().join(), - "Bad SHA3-512 digest!"); - } - @Test public void testBadIdentifier() { final BinaryService service = new FileBinaryService(); diff --git a/components/test/src/main/java/org/trellisldp/test/LdpBinaryTests.java b/components/test/src/main/java/org/trellisldp/test/LdpBinaryTests.java index 2e231883d..2164854ae 100644 --- a/components/test/src/main/java/org/trellisldp/test/LdpBinaryTests.java +++ b/components/test/src/main/java/org/trellisldp/test/LdpBinaryTests.java @@ -23,9 +23,7 @@ import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.TestInstance.Lifecycle.PER_CLASS; import static org.trellisldp.api.TrellisUtils.getInstance; -import static org.trellisldp.http.core.HttpConstants.DIGEST; import static org.trellisldp.http.core.HttpConstants.SLUG; -import static org.trellisldp.http.core.HttpConstants.WANT_DIGEST; import static org.trellisldp.http.core.RdfMediaType.APPLICATION_SPARQL_UPDATE; import static org.trellisldp.http.core.RdfMediaType.TEXT_TURTLE_TYPE; import static org.trellisldp.test.TestUtils.readEntityAsGraph; @@ -127,23 +125,6 @@ default void testPostBinary() { } } - /** - * Test creating a new binary via POST with a digest header. - */ - @Test - @DisplayName("Test creating a new binary via POST with a digest header") - default void testPostBinaryWithDigest() { - // POST an LDP-NR - try (final Response res = target().request().header(DIGEST, "md5=bUMuG430lSc5B2PWyoNIgA==") - .header(SLUG, generateRandomValue(getClass().getSimpleName())) - .post(entity(CONTENT, TEXT_PLAIN))) { - assertAll("Check POSTing LDP-NR with digest", checkNonRdfResponse(res, null)); - final String resource = res.getLocation().toString(); - assertTrue(resource.startsWith(getBaseURL()), "Check the response location"); - assertTrue(resource.length() > getBaseURL().length(), "Check for a nested response location"); - } - } - /** * Test modifying a binary's description via PATCH. */ @@ -211,44 +192,4 @@ default void testBinaryIsInContainer() { rdf.createIRI(getResourceLocation())), "Check for an ldp:contains triple"); } } - - /** - * Test that the SHA digest is generated. - */ - @Test - @DisplayName("Test that the SHA digest is generated") - default void testBinaryWantDigestSha() { - // Test the SHA-1 algorithm - try (final Response res = target(getResourceLocation()).request().header(WANT_DIGEST, "SHA,MD5").get()) { - assertAll("Check binary with SHA-1 digest", checkNonRdfResponse(res, TEXT_PLAIN_TYPE)); - assertEquals("sha=Z5pg2cWB1IqkKKMjh57cQKAeKp0=", res.getHeaderString(DIGEST), "Check the SHA digest value"); - } - } - - /** - * Test that the SHA-256 digest is generated. - */ - @Test - @DisplayName("Test that the SHA-256 digest is generated") - default void testBinaryWantDigestSha256() { - // Test the SHA-256 algorithm - try (final Response res = target(getResourceLocation()).request().header(WANT_DIGEST, "SHA-256").get()) { - assertAll("Check binary with SHA-256 digest", checkNonRdfResponse(res, TEXT_PLAIN_TYPE)); - assertEquals("sha-256=wZXqBpAjgZLSoADF419CRpJCurDcagOwnb/8VAiiQXA=", res.getHeaderString(DIGEST), - "Check the SHA-256 digest value"); - } - } - - /** - * Test that an unknown digest is ignored. - */ - @Test - @DisplayName("Test that an unknown digest is ignored") - default void testBinaryWantDigestUnknown() { - // Test an unknown digest algorithm - try (final Response res = target(getResourceLocation()).request().header(WANT_DIGEST, "FOO").get()) { - assertAll("Check binary with unknown digest", checkNonRdfResponse(res, TEXT_PLAIN_TYPE)); - assertNull(res.getHeaderString(DIGEST), "Check that no Digest header is present"); - } - } } diff --git a/core/api/src/main/java/org/trellisldp/api/BinaryService.java b/core/api/src/main/java/org/trellisldp/api/BinaryService.java index f11ac457c..6e0fb666b 100644 --- a/core/api/src/main/java/org/trellisldp/api/BinaryService.java +++ b/core/api/src/main/java/org/trellisldp/api/BinaryService.java @@ -14,9 +14,6 @@ package org.trellisldp.api; import java.io.InputStream; -import java.security.DigestInputStream; -import java.security.MessageDigest; -import java.util.Set; import java.util.concurrent.CompletionStage; import org.apache.commons.rdf.api.IRI; @@ -39,21 +36,6 @@ public interface BinaryService extends RetrievalService<Binary> { */ CompletionStage<Void> setContent(BinaryMetadata metadata, InputStream stream); - /** - * Set the content for a binary object using a digest algorithm. - * - * @implSpec The default implementation will compute a digest while processing the {@code InputStream}. - * @param metadata the binary metadata - * @param stream the context - * @param algorithm the digest algorithm - * @return the new completion stage containing the server-computed digest. - */ - default CompletionStage<MessageDigest> setContent(final BinaryMetadata metadata, final InputStream stream, - final MessageDigest algorithm) { - final DigestInputStream input = new DigestInputStream(stream, algorithm); - return setContent(metadata, input).thenApply(future -> input.getMessageDigest()); - } - /** * Purge the content from its corresponding datastore. * @@ -65,24 +47,6 @@ default CompletionStage<MessageDigest> setContent(final BinaryMetadata metadata, */ CompletionStage<Void> purgeContent(IRI identifier); - /** - * Calculate the digest for a binary object. - * - * @apiNote As per RFC 3230, the digest value is calculated over the entire resource, - * not just the HTTP payload. - * @param identifier the identifier - * @param algorithm the algorithm - * @return the new completion stage containing a computed digest for the binary resource - */ - CompletionStage<MessageDigest> calculateDigest(IRI identifier, MessageDigest algorithm); - - /** - * Get a list of supported algorithms. - * - * @return the supported digest algorithms - */ - Set<String> supportedAlgorithms(); - /** * Get a new identifier. * diff --git a/core/api/src/test/java/org/trellisldp/api/BinaryServiceTest.java b/core/api/src/test/java/org/trellisldp/api/BinaryServiceTest.java index 2fd473936..b0fe59d03 100644 --- a/core/api/src/test/java/org/trellisldp/api/BinaryServiceTest.java +++ b/core/api/src/test/java/org/trellisldp/api/BinaryServiceTest.java @@ -14,9 +14,7 @@ package org.trellisldp.api; import static java.nio.charset.StandardCharsets.UTF_8; -import static java.util.Base64.getEncoder; import static java.util.concurrent.CompletableFuture.completedFuture; -import static org.apache.commons.io.IOUtils.readLines; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; @@ -25,7 +23,6 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; -import java.security.MessageDigest; import org.apache.commons.io.IOUtils; import org.apache.commons.rdf.api.IRI; @@ -53,8 +50,6 @@ public class BinaryServiceTest { @BeforeEach public void setUp() { initMocks(this); - doCallRealMethod().when(mockBinaryService).setContent(any(BinaryMetadata.class), - any(InputStream.class), any(MessageDigest.class)); } @Test @@ -67,20 +62,4 @@ public void testGetContent() throws IOException { assertEquals("FooBar", IOUtils.toString(content, UTF_8), "Binary content did not match"); } } - - @Test - public void testSetContent() throws Exception { - final ByteArrayInputStream inputStream = new ByteArrayInputStream("FooBar".getBytes(UTF_8)); - when(mockBinaryService.setContent(any(BinaryMetadata.class), any(InputStream.class))) - .thenAnswer(inv -> { - readLines((InputStream) inv.getArguments()[1], UTF_8); - return completedFuture(null); - }); - assertDoesNotThrow(mockBinaryService - .setContent(BinaryMetadata.builder(identifier).build(), inputStream, - MessageDigest.getInstance("MD5")) - .thenApply(MessageDigest::digest).thenApply(getEncoder()::encodeToString) - .thenAccept(digest -> assertEquals("8yom4qOoqjOM13tuEmPFNQ==", digest)) - .toCompletableFuture()::join); - } } diff --git a/core/http/src/main/java/org/trellisldp/http/CrossOriginResourceSharingFilter.java b/core/http/src/main/java/org/trellisldp/http/CrossOriginResourceSharingFilter.java index 1f2416da5..930ffbfa0 100644 --- a/core/http/src/main/java/org/trellisldp/http/CrossOriginResourceSharingFilter.java +++ b/core/http/src/main/java/org/trellisldp/http/CrossOriginResourceSharingFilter.java @@ -90,10 +90,10 @@ private CrossOriginResourceSharingFilter(final Configuration config) { populateFieldNames(config.getOrDefault(CONFIG_HTTP_CORS_ALLOW_METHODS, "GET,HEAD,OPTIONS,POST,PUT,PATCH,DELETE")), populateFieldNames(config.getOrDefault(CONFIG_HTTP_CORS_ALLOW_HEADERS, - "Content-Type,Link,Accept,Accept-DateTIme,Prefer,Want-Digest,Slug,Digest,Origin")), + "Content-Type,Link,Accept,Accept-DateTime,Prefer,Slug,Origin")), populateFieldNames(config.getOrDefault(CONFIG_HTTP_CORS_EXPOSE_HEADERS, "Content-Type,Link,Memento-Datetime,Preference-Applied,Location,Accept-Patch,Accept-Post," + - "Digest,Accept-Ranges,ETag,Vary")), + "Accept-Ranges,ETag,Vary")), config.getOrDefault(CONFIG_HTTP_CORS_ALLOW_CREDENTIALS, Boolean.class, Boolean.TRUE), config.getOrDefault(CONFIG_HTTP_CORS_MAX_AGE, Integer.class, 180)); } diff --git a/core/http/src/main/java/org/trellisldp/http/TrellisHttpFilter.java b/core/http/src/main/java/org/trellisldp/http/TrellisHttpFilter.java index 1915e4409..7fccf307d 100644 --- a/core/http/src/main/java/org/trellisldp/http/TrellisHttpFilter.java +++ b/core/http/src/main/java/org/trellisldp/http/TrellisHttpFilter.java @@ -27,7 +27,6 @@ import static javax.ws.rs.core.Response.status; import static javax.ws.rs.core.UriBuilder.fromUri; import static org.trellisldp.http.core.HttpConstants.ACCEPT_DATETIME; -import static org.trellisldp.http.core.HttpConstants.DIGEST; import static org.trellisldp.http.core.HttpConstants.EXT; import static org.trellisldp.http.core.HttpConstants.PATCH; import static org.trellisldp.http.core.HttpConstants.RANGE; @@ -45,7 +44,6 @@ import javax.ws.rs.ext.Provider; import org.trellisldp.http.core.AcceptDatetime; -import org.trellisldp.http.core.Digest; import org.trellisldp.http.core.Range; import org.trellisldp.http.core.Version; @@ -83,9 +81,6 @@ public void filter(final ContainerRequestContext ctx) throws IOException { } }); - ofNullable(ctx.getHeaderString(DIGEST)).filter(x -> isNull(Digest.valueOf(x))).ifPresent(x -> - ctx.abortWith(status(BAD_REQUEST).build())); - ofNullable(ctx.getUriInfo().getQueryParameters().getFirst("version")).ifPresent(x -> { // Check well-formedness if (isNull(Version.valueOf(x))) { diff --git a/core/http/src/main/java/org/trellisldp/http/TrellisHttpResource.java b/core/http/src/main/java/org/trellisldp/http/TrellisHttpResource.java index c3f787ffb..c619fa838 100644 --- a/core/http/src/main/java/org/trellisldp/http/TrellisHttpResource.java +++ b/core/http/src/main/java/org/trellisldp/http/TrellisHttpResource.java @@ -379,7 +379,7 @@ private CompletionStage<ResponseBuilder> fetchResource(final TrellisRequest req) return trellis.getMementoService().get(identifier, req.getVersion().getInstant()) .thenApply(getHandler::initialize).thenApply(getHandler::standardHeaders) .thenCombine(trellis.getMementoService().mementos(identifier), getHandler::addMementoHeaders) - .thenCompose(getHandler::getRepresentation); + .thenApply(getHandler::getRepresentation); // Fetch a timemap } else if (TIMEMAP.equals(req.getExt())) { @@ -409,7 +409,7 @@ private CompletionStage<ResponseBuilder> fetchResource(final TrellisRequest req) return trellis.getResourceService().get(identifier).thenApply(getHandler::initialize) .thenApply(getHandler::standardHeaders) .thenCombine(trellis.getMementoService().mementos(identifier), getHandler::addMementoHeaders) - .thenCompose(getHandler::getRepresentation); + .thenApply(getHandler::getRepresentation); } private CompletionStage<? extends Resource> fetchTrellisResource(final IRI identifier, final Version version) { diff --git a/core/http/src/main/java/org/trellisldp/http/core/Digest.java b/core/http/src/main/java/org/trellisldp/http/core/Digest.java deleted file mode 100644 index 8ec171d87..000000000 --- a/core/http/src/main/java/org/trellisldp/http/core/Digest.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.trellisldp.http.core; - -/** - * A class representing an HTTP Digest header. - * - * @author acoburn - * - * @see <a href="https://tools.ietf.org/html/rfc3230">RFC 3230</a> - */ -public class Digest { - - private final String algorithm; - - private final String digestValue; - - /** - * Create a Digest header representation. - * - * @param algorithm the algorithm - * @param digestValue the digest - */ - public Digest(final String algorithm, final String digestValue) { - this.algorithm = algorithm; - this.digestValue = digestValue; - } - - /** - * Get the algorithm. - * - * @return the algorithms - */ - public String getAlgorithm() { - return algorithm; - } - - /** - * Get the digest value. - * - * @return the digest - */ - public String getDigest() { - return digestValue; - } - - /** - * Get a Digest object from a string-based header value. - * - * @param value the header value - * @return a Digest object or null if the value is invalid - */ - public static Digest valueOf(final String value) { - final String[] parts = value.split("=", 2); - if (parts.length == 2) { - return new Digest(parts[0], parts[1]); - } - return null; - } -} diff --git a/core/http/src/main/java/org/trellisldp/http/core/HttpConstants.java b/core/http/src/main/java/org/trellisldp/http/core/HttpConstants.java index a0e6ffb24..0c5f2cfae 100644 --- a/core/http/src/main/java/org/trellisldp/http/core/HttpConstants.java +++ b/core/http/src/main/java/org/trellisldp/http/core/HttpConstants.java @@ -73,9 +73,6 @@ public final class HttpConstants { /** The Trellis ext parameter value used for accessing the description of an LDP-NR. **/ public static final String DESCRIPTION = "description"; - /** The name of the HTTP response header used to communicate instance digest values. **/ - public static final String DIGEST = "Digest"; - /** The Memento link parameter indicating the beginning range of a TimeMap. **/ public static final String FROM = "from"; @@ -118,9 +115,6 @@ public final class HttpConstants { /** The Memento link relation for TimeMap resources. **/ public static final String TIMEMAP = "timemap"; - /** The name of the HTTP request header used to request an instance digest. **/ - public static final String WANT_DIGEST = "Want-Digest"; - /** The Memento link parameter indicating the ending range of a TimeMap. **/ public static final String UNTIL = "until"; diff --git a/core/http/src/main/java/org/trellisldp/http/core/TrellisRequest.java b/core/http/src/main/java/org/trellisldp/http/core/TrellisRequest.java index 6da6a288b..8d84191d4 100644 --- a/core/http/src/main/java/org/trellisldp/http/core/TrellisRequest.java +++ b/core/http/src/main/java/org/trellisldp/http/core/TrellisRequest.java @@ -17,11 +17,9 @@ import static javax.ws.rs.core.HttpHeaders.CONTENT_TYPE; import static javax.ws.rs.core.HttpHeaders.LINK; import static org.trellisldp.http.core.HttpConstants.ACCEPT_DATETIME; -import static org.trellisldp.http.core.HttpConstants.DIGEST; import static org.trellisldp.http.core.HttpConstants.PREFER; import static org.trellisldp.http.core.HttpConstants.RANGE; import static org.trellisldp.http.core.HttpConstants.SLUG; -import static org.trellisldp.http.core.HttpConstants.WANT_DIGEST; import java.security.Principal; import java.util.List; @@ -132,24 +130,6 @@ public Prefer getPrefer() { return ofNullable(headers.getFirst(PREFER)).map(Prefer::valueOf).orElse(null); } - /** - * Get the Want-Digest header. - * - * @return the Want-Digest header - */ - public WantDigest getWantDigest() { - return ofNullable(headers.getFirst(WANT_DIGEST)).map(WantDigest::new).orElse(null); - } - - /** - * Get the Digest header. - * - * @return the Digest header - */ - public Digest getDigest() { - return ofNullable(headers.getFirst(DIGEST)).map(Digest::valueOf).orElse(null); - } - /** * Get the range header. * diff --git a/core/http/src/main/java/org/trellisldp/http/core/WantDigest.java b/core/http/src/main/java/org/trellisldp/http/core/WantDigest.java deleted file mode 100644 index a1cba1807..000000000 --- a/core/http/src/main/java/org/trellisldp/http/core/WantDigest.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.trellisldp.http.core; - -import static java.lang.Float.compare; -import static java.lang.Float.parseFloat; -import static java.util.Arrays.stream; -import static java.util.Collections.emptyList; -import static java.util.Objects.nonNull; -import static java.util.stream.Collectors.toList; -import static org.slf4j.LoggerFactory.getLogger; - -import java.util.AbstractMap.SimpleImmutableEntry; -import java.util.List; -import java.util.Map; - -import org.slf4j.Logger; - -/** - * A class representing an HTTP Want-Digest header. - * - * @author acoburn - * - * @see <a href="https://tools.ietf.org/html/rfc3230">RFC 3230</a> - */ -public class WantDigest { - - private static final Logger LOGGER = getLogger(WantDigest.class); - - private final List<String> algorithms; - - /** - * Create a Want-Digest header representation. - * - * @param wantDigest the value of the Want-Digest header - */ - public WantDigest(final String wantDigest) { - if (nonNull(wantDigest)) { - this.algorithms = stream(wantDigest.split(",")).map(String::trim).map(alg -> { - final String[] parts = alg.split(";", 2); - if (parts.length == 2) { - return new SimpleImmutableEntry<>(parts[0], getValue(parts[1])); - } - return new SimpleImmutableEntry<>(parts[0], 1.0f); - }).sorted((e1, e2) -> compare(e2.getValue(), e1.getValue())).map(Map.Entry::getKey) - .map(String::toUpperCase).collect(toList()); - } else { - this.algorithms = emptyList(); - } - } - - /** - * Fetch the list of specified algorithms in preference order. - * - * @return the algorithms - */ - public List<String> getAlgorithms() { - return algorithms; - } - - private float getValue(final String val) { - if (val.startsWith("q=")) { - try { - return parseFloat(val.substring(2)); - } catch (final NumberFormatException ex) { - LOGGER.warn("Invalid q value for Want-Digest request header ({}), setting to 0.0", val); - } - } else { - LOGGER.warn("Invalid parameter value for Want-Digest request header ({}), setting to 0.0", val); - } - return 0.0f; - } -} diff --git a/core/http/src/main/java/org/trellisldp/http/impl/GetHandler.java b/core/http/src/main/java/org/trellisldp/http/impl/GetHandler.java index e87919210..c2ba3040c 100644 --- a/core/http/src/main/java/org/trellisldp/http/impl/GetHandler.java +++ b/core/http/src/main/java/org/trellisldp/http/impl/GetHandler.java @@ -14,15 +14,11 @@ package org.trellisldp.http.impl; import static java.lang.String.join; -import static java.util.Base64.getEncoder; import static java.util.Collections.singletonList; import static java.util.Date.from; import static java.util.Objects.isNull; import static java.util.Objects.nonNull; -import static java.util.Optional.empty; import static java.util.Optional.ofNullable; -import static java.util.concurrent.CompletableFuture.completedFuture; -import static java.util.function.Predicate.isEqual; import static java.util.stream.Collectors.joining; import static java.util.stream.Collectors.toList; import static java.util.stream.Collectors.toMap; @@ -40,7 +36,6 @@ import static javax.ws.rs.core.Response.Status.GONE; import static javax.ws.rs.core.Response.Status.NO_CONTENT; import static javax.ws.rs.core.Response.ok; -import static org.apache.commons.codec.digest.DigestUtils.getDigest; import static org.apache.commons.rdf.api.RDFSyntax.TURTLE; import static org.slf4j.LoggerFactory.getLogger; import static org.trellisldp.api.Resource.SpecialResources.DELETED_RESOURCE; @@ -51,14 +46,12 @@ import static org.trellisldp.http.core.HttpConstants.ACCEPT_RANGES; import static org.trellisldp.http.core.HttpConstants.ACL; import static org.trellisldp.http.core.HttpConstants.DESCRIPTION; -import static org.trellisldp.http.core.HttpConstants.DIGEST; import static org.trellisldp.http.core.HttpConstants.LINK_TEMPLATE; import static org.trellisldp.http.core.HttpConstants.MEMENTO_DATETIME; import static org.trellisldp.http.core.HttpConstants.PATCH; import static org.trellisldp.http.core.HttpConstants.PREFER; import static org.trellisldp.http.core.HttpConstants.PREFERENCE_APPLIED; import static org.trellisldp.http.core.HttpConstants.RANGE; -import static org.trellisldp.http.core.HttpConstants.WANT_DIGEST; import static org.trellisldp.http.core.Prefer.PREFER_MINIMAL; import static org.trellisldp.http.core.Prefer.PREFER_REPRESENTATION; import static org.trellisldp.http.core.Prefer.PREFER_RETURN; @@ -76,12 +69,10 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.security.MessageDigest; import java.time.Instant; import java.util.ArrayList; import java.util.List; import java.util.Map.Entry; -import java.util.Optional; import java.util.SortedSet; import java.util.concurrent.CompletionStage; import java.util.stream.Stream; @@ -215,7 +206,7 @@ public ResponseBuilder standardHeaders(final ResponseBuilder builder) { * @param builder the response builder * @return the response builder */ - public CompletionStage<ResponseBuilder> getRepresentation(final ResponseBuilder builder) { + public ResponseBuilder getRepresentation(final ResponseBuilder builder) { // Add NonRDFSource-related "describe*" link headers, provided this isn't an ACL resource getResource().getBinaryMetadata().filter(ds -> !ACL.equals(getRequest().getExt())).ifPresent(ds -> { final String base = getBaseBinaryIdentifier(); @@ -300,7 +291,7 @@ private void addAllowHeaders(final ResponseBuilder builder) { } } - private CompletionStage<ResponseBuilder> getLdpRs(final ResponseBuilder builder, final RDFSyntax syntax, + private ResponseBuilder getLdpRs(final ResponseBuilder builder, final RDFSyntax syntax, final IRI profile) { final Prefer prefer = ACL.equals(getRequest().getExt()) ? new Prefer(PREFER_REPRESENTATION, singletonList(PreferAccessControl.getIRIString()), @@ -323,12 +314,12 @@ private CompletionStage<ResponseBuilder> getLdpRs(final ResponseBuilder builder, .orElse(PREFER_REPRESENTATION))); if (ofNullable(prefer).flatMap(Prefer::getPreference).filter(PREFER_MINIMAL::equals).isPresent()) { - return completedFuture(builder.status(NO_CONTENT)); + return builder.status(NO_CONTENT); } // Short circuit HEAD requests if (HEAD.equals(getRequest().getMethod())) { - return completedFuture(builder); + return builder; } // Stream the rdf content @@ -345,26 +336,10 @@ public void write(final OutputStream out) throws IOException { } } }; - return completedFuture(builder.entity(stream)); + return builder.entity(stream); } - private CompletionStage<Optional<String>> computeInstanceDigest(final IRI dsid) { - // Add instance digests, if Requested and supported - if (nonNull(getRequest().getWantDigest())) { - final Optional<String> algorithm = getRequest().getWantDigest().getAlgorithms().stream() - .filter(getServices().getBinaryService().supportedAlgorithms()::contains).findFirst(); - if (algorithm.isPresent()) { - final String alg = algorithm.filter(isEqual("SHA").negate()).orElse("SHA-1"); - return getServices().getBinaryService().calculateDigest(dsid, getDigest(alg)) - .thenApply(MessageDigest::digest) - .thenApply(getEncoder()::encodeToString) - .thenApply(digest -> Optional.of(algorithm.get().toLowerCase() + "=" + digest)); - } - } - return completedFuture(empty()); - } - - private CompletionStage<ResponseBuilder> getLdpNr(final ResponseBuilder builder) { + private ResponseBuilder getLdpNr(final ResponseBuilder builder) { final Instant mod = getResource().getModified(); final EntityTag etag = new EntityTag(buildEtagHash(getIdentifier() + "BINARY", mod, null)); @@ -373,7 +348,7 @@ private CompletionStage<ResponseBuilder> getLdpNr(final ResponseBuilder builder) final IRI dsid = getResource().getBinaryMetadata().map(BinaryMetadata::getIdentifier).orElse(null); // Add standard headers - builder.header(VARY, RANGE).header(VARY, WANT_DIGEST).header(ACCEPT_RANGES, "bytes").tag(etag) + builder.header(VARY, RANGE).header(ACCEPT_RANGES, "bytes").tag(etag) .header(ALLOW, isMemento ? join(",", GET, HEAD, OPTIONS) : join(",", GET, HEAD, OPTIONS, PUT, DELETE)); // Stream the binary content @@ -387,8 +362,7 @@ public void write(final OutputStream out) throws IOException { } }; - return computeInstanceDigest(dsid).thenAccept(digest -> digest.ifPresent(d -> builder.header(DIGEST, d))) - .thenApply(future -> builder.entity(stream)); + return builder.entity(stream); } private CompletionStage<InputStream> getBinaryStream(final IRI dsid, final TrellisRequest req) { diff --git a/core/http/src/main/java/org/trellisldp/http/impl/MutatingLdpHandler.java b/core/http/src/main/java/org/trellisldp/http/impl/MutatingLdpHandler.java index fb34a4136..ec17a8de8 100644 --- a/core/http/src/main/java/org/trellisldp/http/impl/MutatingLdpHandler.java +++ b/core/http/src/main/java/org/trellisldp/http/impl/MutatingLdpHandler.java @@ -14,14 +14,10 @@ package org.trellisldp.http.impl; import static java.util.Arrays.asList; -import static java.util.Base64.getEncoder; -import static java.util.Objects.isNull; import static java.util.Objects.nonNull; -import static java.util.Optional.of; import static java.util.Optional.ofNullable; import static java.util.concurrent.CompletableFuture.allOf; import static java.util.concurrent.CompletableFuture.completedFuture; -import static java.util.function.Predicate.isEqual; import static java.util.stream.Collectors.toList; import static javax.ws.rs.core.Response.Status.CONFLICT; import static javax.ws.rs.core.Response.status; @@ -33,8 +29,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; import java.util.Objects; import java.util.concurrent.CompletionStage; import java.util.stream.Stream; @@ -57,7 +51,6 @@ import org.trellisldp.api.RuntimeTrellisException; import org.trellisldp.api.ServiceBundler; import org.trellisldp.api.Session; -import org.trellisldp.http.core.Digest; import org.trellisldp.http.core.TrellisRequest; import org.trellisldp.vocabulary.AS; import org.trellisldp.vocabulary.LDP; @@ -243,32 +236,6 @@ protected CompletionStage<Void> persistContent(final BinaryMetadata metadata) { .whenComplete(HttpUtils.closeInputStreamAsync(entity)); } - protected CompletionStage<Void> persistContent(final BinaryMetadata metadata, final Digest digest) { - if (isNull(digest)) { - return persistContent(metadata); - } - try { - final String alg = of(digest).map(Digest::getAlgorithm).map(String::toUpperCase) - .filter(isEqual("SHA").negate()).orElse("SHA-1"); - return getServices().getBinaryService().setContent(metadata, entity, MessageDigest.getInstance(alg)) - .thenApply(MessageDigest::digest) - .thenApply(getEncoder()::encodeToString).thenCompose(serverComputed -> { - if (digest.getDigest().equals(serverComputed)) { - LOGGER.debug("Successfully persisted digest-verified bitstream: {}", metadata.getIdentifier()); - return completedFuture(null); - } - return getServices().getBinaryService().purgeContent(metadata.getIdentifier()) - .thenAccept(future -> { - throw new BadRequestException( - "Supplied digest value does not match the server-computed digest: " - + serverComputed); - }); - }); - } catch (final NoSuchAlgorithmException ex) { - throw new BadRequestException("Invalid digest algorithm: " + ex.getMessage()); - } - } - protected Metadata.Builder metadataBuilder(final IRI identifier, final IRI ixnModel, final TrellisDataset mutable) { final Metadata.Builder builder = Metadata.builder(identifier).interactionModel(ixnModel); mutable.asDataset().getGraph(Trellis.PreferUserManaged).ifPresent(graph -> { diff --git a/core/http/src/main/java/org/trellisldp/http/impl/PostHandler.java b/core/http/src/main/java/org/trellisldp/http/impl/PostHandler.java index 8eb072953..057fcd9f1 100644 --- a/core/http/src/main/java/org/trellisldp/http/impl/PostHandler.java +++ b/core/http/src/main/java/org/trellisldp/http/impl/PostHandler.java @@ -176,7 +176,7 @@ private CompletionStage<ResponseBuilder> handleResourceCreation(final TrellisDat // Persist the content final BinaryMetadata binary = BinaryMetadata.builder(binaryLocation).mimeType(mimeType) .hints(getRequest().getHeaders()).build(); - persistPromise = persistContent(binary, getRequest().getDigest()); + persistPromise = persistContent(binary); metadata = metadataBuilder(internalId, ldpType, mutable).container(parentIdentifier).binary(binary); builder.link(getIdentifier() + "?ext=description", "describedby"); diff --git a/core/http/src/main/java/org/trellisldp/http/impl/PutHandler.java b/core/http/src/main/java/org/trellisldp/http/impl/PutHandler.java index e2bac2bfb..2824acc8d 100644 --- a/core/http/src/main/java/org/trellisldp/http/impl/PutHandler.java +++ b/core/http/src/main/java/org/trellisldp/http/impl/PutHandler.java @@ -208,7 +208,7 @@ private CompletionStage<ResponseBuilder> handleResourceUpdate(final TrellisDatas // Persist the content final BinaryMetadata binary = BinaryMetadata.builder(binaryLocation).mimeType(mimeType) .hints(getRequest().getHeaders()).build(); - persistPromise = persistContent(binary, getRequest().getDigest()); + persistPromise = persistContent(binary); metadata = metadataBuilder(internalId, ldpType, mutable).binary(binary); builder.link(getIdentifier() + "?ext=description", "describedby"); diff --git a/core/http/src/test/java/org/trellisldp/http/AbstractTrellisHttpResourceTest.java b/core/http/src/test/java/org/trellisldp/http/AbstractTrellisHttpResourceTest.java index 9fd9f0bd1..4bbcc028a 100644 --- a/core/http/src/test/java/org/trellisldp/http/AbstractTrellisHttpResourceTest.java +++ b/core/http/src/test/java/org/trellisldp/http/AbstractTrellisHttpResourceTest.java @@ -21,6 +21,7 @@ import static java.time.format.DateTimeFormatter.RFC_1123_DATE_TIME; import static java.util.Arrays.asList; import static java.util.Arrays.stream; +import static java.util.Collections.singletonList; import static java.util.Date.from; import static java.util.Objects.nonNull; import static java.util.Optional.empty; @@ -68,14 +69,12 @@ import static org.trellisldp.http.core.HttpConstants.ACCEPT_POST; import static org.trellisldp.http.core.HttpConstants.ACCEPT_RANGES; import static org.trellisldp.http.core.HttpConstants.APPLICATION_LINK_FORMAT; -import static org.trellisldp.http.core.HttpConstants.DIGEST; import static org.trellisldp.http.core.HttpConstants.LINK_TEMPLATE; import static org.trellisldp.http.core.HttpConstants.MEMENTO_DATETIME; import static org.trellisldp.http.core.HttpConstants.PATCH; import static org.trellisldp.http.core.HttpConstants.PREFER; import static org.trellisldp.http.core.HttpConstants.RANGE; import static org.trellisldp.http.core.HttpConstants.SLUG; -import static org.trellisldp.http.core.HttpConstants.WANT_DIGEST; import static org.trellisldp.http.core.RdfMediaType.APPLICATION_LD_JSON; import static org.trellisldp.http.core.RdfMediaType.APPLICATION_LD_JSON_TYPE; import static org.trellisldp.http.core.RdfMediaType.APPLICATION_N_TRIPLES; @@ -92,7 +91,6 @@ import java.io.IOException; import java.io.InputStream; -import java.security.MessageDigest; import java.time.Instant; import java.util.Collections; import java.util.List; @@ -379,42 +377,6 @@ public void testGetBinary() throws IOException { assertEquals("Some input stream", entity, "Incorrect entity value!"); } - @Test - public void testGetBinaryDigestInvalid() throws IOException { - final Response res = target(BINARY_PATH).request().header(WANT_DIGEST, "FOO").get(); - - assertEquals(SC_OK, res.getStatus(), "Unexpected response code!"); - assertNull(res.getHeaderString(DIGEST), "Unexpected Digest header!"); - assertAll("Check Binary response", checkBinaryResponse(res)); - - final String entity = IOUtils.toString((InputStream) res.getEntity(), UTF_8); - assertEquals("Some input stream", entity, "Incorrect entity value!"); - } - - @Test - public void testGetBinaryDigestMd5() throws IOException { - final Response res = target(BINARY_PATH).request().header(WANT_DIGEST, "MD5").get(); - - assertEquals(SC_OK, res.getStatus(), "Unexpected response code!"); - assertEquals("md5=Q29tcHV0ZWREaWdlc3Q=", res.getHeaderString(DIGEST), "Incorrect Digest header value!"); - assertAll("Check Binary response", checkBinaryResponse(res)); - - final String entity = IOUtils.toString((InputStream) res.getEntity(), UTF_8); - assertEquals("Some input stream", entity, "Incorrect entity value!"); - } - - @Test - public void testGetBinaryDigestSha1() throws IOException { - final Response res = target(BINARY_PATH).request().header(WANT_DIGEST, "SHA").get(); - - assertEquals(SC_OK, res.getStatus(), "Unexpected response code!"); - assertEquals("sha=Q29tcHV0ZWREaWdlc3Q=", res.getHeaderString(DIGEST), "Incorrect Digest header value!"); - assertAll("Check Binary response", checkBinaryResponse(res)); - - final String entity = IOUtils.toString((InputStream) res.getEntity(), UTF_8); - assertEquals("Some input stream", entity, "Incorrect entity value!"); - } - @Test public void testGetBinaryRange() throws IOException { final Response res = target(BINARY_PATH).request().header(RANGE, "bytes=3-10").get(); @@ -435,17 +397,6 @@ public void testGetBinaryErrorSkip() throws IOException { assertEquals(SC_INTERNAL_SERVER_ERROR, res.getStatus(), "Unexpected response code!"); } - @Test - public void testGetBinaryDigestError() throws Exception { - when(mockBinaryService.calculateDigest(eq(binaryInternalIdentifier), any(MessageDigest.class))) - .thenAnswer(inv -> - supplyAsync(() -> { - throw new RuntimeTrellisException("Expected exception"); - })); - final Response res = target(BINARY_PATH).request().header(WANT_DIGEST, "MD5").get(); - assertEquals(SC_INTERNAL_SERVER_ERROR, res.getStatus(), "Unexpected response code!"); - } - @Test public void testGetVersionError() { final Response res = target(BINARY_PATH).queryParam("version", "looking at my history").request().get(); @@ -485,7 +436,7 @@ public void testGetBinaryVersion() throws IOException { assertNotNull(res.getHeaderString(MEMENTO_DATETIME), "Missing Memento-Datetime header!"); assertEquals(time, parse(res.getHeaderString(MEMENTO_DATETIME), RFC_1123_DATE_TIME).toInstant(), "Incorrect Memento-Datetime header value!"); - assertAll("Check Vary headers", checkVary(res, asList(RANGE, WANT_DIGEST))); + assertAll("Check Vary headers", checkVary(res, singletonList(RANGE))); final String entity = IOUtils.toString((InputStream) res.getEntity(), UTF_8); assertEquals("Some input stream", entity, "Incorrect entity value!"); @@ -1373,73 +1324,6 @@ public void testPostBinary() { assertAll("Check LDP type Link headers", checkLdpTypeHeaders(res, LDP.NonRDFSource)); } - @Test - public void testPostBinaryWithInvalidDigest() { - when(mockResource.getInteractionModel()).thenReturn(LDP.Container); - when(mockMementoService.get(eq(rdf.createIRI(TRELLIS_DATA_PREFIX + RESOURCE_PATH + "/newresource")), - any(Instant.class))).thenAnswer(inv -> completedFuture(MISSING_RESOURCE)); - final Response res = target(RESOURCE_PATH).request().header(SLUG, "newresource") - .header(DIGEST, "md5=blahblah").post(entity("some data.", TEXT_PLAIN_TYPE)); - - assertEquals(SC_BAD_REQUEST, res.getStatus(), "Unexpected response code!"); - } - - @Test - public void testPostUnparseableDigest() { - final Response res = target(RESOURCE_PATH).request() - .header(DIGEST, "digest this, man!").post(entity("some data.", TEXT_PLAIN_TYPE)); - - assertEquals(SC_BAD_REQUEST, res.getStatus(), "Unexpected response code!"); - } - - @Test - public void testPostBinaryWithInvalidDigestType() { - when(mockResource.getInteractionModel()).thenReturn(LDP.Container); - when(mockMementoService.get(eq(rdf.createIRI(TRELLIS_DATA_PREFIX + RESOURCE_PATH + "/newresource")), - any(Instant.class))).thenAnswer(inv -> completedFuture(MISSING_RESOURCE)); - final Response res = target(RESOURCE_PATH).request().header(SLUG, "newresource") - .header(DIGEST, "uh=huh").post(entity("some data.", TEXT_PLAIN_TYPE)); - - assertEquals(SC_BAD_REQUEST, res.getStatus(), "Unexpected response code!"); - } - - @Test - public void testPostBinaryWithMd5Digest() { - when(mockResource.getInteractionModel()).thenReturn(LDP.Container); - when(mockMementoService.get(eq(rdf.createIRI(TRELLIS_DATA_PREFIX + RESOURCE_PATH + "/newresource")), - any(Instant.class))).thenAnswer(inv -> completedFuture(MISSING_RESOURCE)); - final Response res = target(RESOURCE_PATH).request().header(DIGEST, "md5=BJozgIQwPzzVzSxvjQsWkA==") - .header(SLUG, "newresource").post(entity("some data.", TEXT_PLAIN_TYPE)); - - assertEquals(SC_CREATED, res.getStatus(), "Unexpected response code!"); - assertAll("Check LDP type Link headers", checkLdpTypeHeaders(res, LDP.NonRDFSource)); - } - - @Test - public void testPostBinaryWithSha1Digest() { - when(mockResource.getInteractionModel()).thenReturn(LDP.Container); - when(mockMementoService.get(eq(rdf.createIRI(TRELLIS_DATA_PREFIX + RESOURCE_PATH + "/newresource")), - any(Instant.class))).thenAnswer(inv -> completedFuture(MISSING_RESOURCE)); - final Response res = target(RESOURCE_PATH).request().header(DIGEST, "sha=3VWEuvPnAM6riDQJUu4TG7A4Ots=") - .header(SLUG, "newresource").post(entity("some data.", TEXT_PLAIN_TYPE)); - - assertEquals(SC_CREATED, res.getStatus(), "Unexpected response code!"); - assertAll("Check LDP type Link headers", checkLdpTypeHeaders(res, LDP.NonRDFSource)); - } - - @Test - public void testPostBinaryWithSha256Digest() { - when(mockResource.getInteractionModel()).thenReturn(LDP.Container); - when(mockMementoService.get(eq(rdf.createIRI(TRELLIS_DATA_PREFIX + RESOURCE_PATH + "/newresource")), - any(Instant.class))).thenAnswer(inv -> completedFuture(MISSING_RESOURCE)); - final Response res = target(RESOURCE_PATH).request() - .header(DIGEST, "sha-256=voCCIRTNXosNlEgQ/7IuX5dFNvFQx5MfG/jy1AKiLMU=") - .header(SLUG, "newresource").post(entity("some data.", TEXT_PLAIN_TYPE)); - - assertEquals(SC_CREATED, res.getStatus(), "Unexpected response code!"); - assertAll("Check LDP type Link headers", checkLdpTypeHeaders(res, LDP.NonRDFSource)); - } - @Test public void testPostTimeMap() { final Response res = target(RESOURCE_PATH).queryParam("ext", "timemap").request() @@ -1784,32 +1668,6 @@ public void testPutBinary() { assertAll("Check LDP type Link headers", checkLdpTypeHeaders(res, LDP.NonRDFSource)); } - @Test - public void testPutBinaryWithInvalidDigest() { - final Response res = target(BINARY_PATH).request().header(DIGEST, "md5=blahblah") - .put(entity("some data.", TEXT_PLAIN_TYPE)); - - assertEquals(SC_BAD_REQUEST, res.getStatus(), "Unexpected response code!"); - } - - @Test - public void testPutBinaryWithMd5Digest() { - final Response res = target(BINARY_PATH).request().header(DIGEST, "md5=BJozgIQwPzzVzSxvjQsWkA==") - .put(entity("some data.", TEXT_PLAIN_TYPE)); - - assertEquals(SC_NO_CONTENT, res.getStatus(), "Unexpected response code!"); - assertAll("Check LDP type Link headers", checkLdpTypeHeaders(res, LDP.NonRDFSource)); - } - - @Test - public void testPutBinaryWithSha1Digest() { - final Response res = target(BINARY_PATH).request().header(DIGEST, "sha=3VWEuvPnAM6riDQJUu4TG7A4Ots=") - .put(entity("some data.", TEXT_PLAIN_TYPE)); - - assertEquals(SC_NO_CONTENT, res.getStatus(), "Unexpected response code!"); - assertAll("Check LDP type Link headers", checkLdpTypeHeaders(res, LDP.NonRDFSource)); - } - @Test public void testPutBinaryToACL() { final Response res = target(BINARY_PATH).queryParam("ext", "acl").request() @@ -1945,16 +1803,6 @@ public void testPutPreconditionFailed2() { assertEquals(SC_PRECONDITION_FAILED, res.getStatus(), "Unexpected response code!"); } - @Test - public void testPutBinaryWithSha256Digest() { - final Response res = target(BINARY_PATH).request() - .header(DIGEST, "sha-256=voCCIRTNXosNlEgQ/7IuX5dFNvFQx5MfG/jy1AKiLMU=") - .put(entity("some data.", TEXT_PLAIN_TYPE)); - - assertEquals(SC_NO_CONTENT, res.getStatus(), "Unexpected response code!"); - assertAll("Check LDP type Link headers", checkLdpTypeHeaders(res, LDP.NonRDFSource)); - } - @Test public void testPutSlash() { final Response res = target(RESOURCE_PATH + "/").request() @@ -2404,7 +2252,7 @@ private Stream<Quad> getPreferQuads() { private Stream<Executable> checkVary(final Response res, final List<String> vary) { final List<String> vheaders = res.getStringHeaders().get(VARY); - return Stream.of(RANGE, WANT_DIGEST, ACCEPT_DATETIME, PREFER).map(header -> vary.contains(header) + return Stream.of(RANGE, ACCEPT_DATETIME, PREFER).map(header -> vary.contains(header) ? () -> assertTrue(vheaders.contains(header), "Missing Vary header: " + header) : () -> assertFalse(vheaders.contains(header), "Unexpected Vary header: " + header)); } @@ -2470,7 +2318,7 @@ private Stream<Executable> checkBinaryResponse(final Response res) { () -> assertTrue(res.getMediaType().isCompatible(TEXT_PLAIN_TYPE), "Incompatible content-type!"), () -> assertNotNull(res.getHeaderString(ACCEPT_RANGES), "Missing Accept-Ranges header!"), () -> assertNull(res.getHeaderString(MEMENTO_DATETIME), "Unexpected Memento-Datetime header!"), - () -> assertAll("Check Vary header", checkVary(res, asList(RANGE, WANT_DIGEST, ACCEPT_DATETIME))), + () -> assertAll("Check Vary header", checkVary(res, asList(RANGE, ACCEPT_DATETIME))), () -> assertAll("Check allowed methods", checkAllowedMethods(res, asList(PUT, DELETE, GET, HEAD, OPTIONS))), () -> assertAll("Check LDP type Link headers", checkLdpTypeHeaders(res, LDP.NonRDFSource))); diff --git a/core/http/src/test/java/org/trellisldp/http/BaseTrellisHttpResourceTest.java b/core/http/src/test/java/org/trellisldp/http/BaseTrellisHttpResourceTest.java index da4d5d099..2ecc6726e 100644 --- a/core/http/src/test/java/org/trellisldp/http/BaseTrellisHttpResourceTest.java +++ b/core/http/src/test/java/org/trellisldp/http/BaseTrellisHttpResourceTest.java @@ -17,7 +17,6 @@ import static java.time.Instant.MAX; import static java.time.Instant.ofEpochSecond; import static java.util.Arrays.asList; -import static java.util.Base64.getDecoder; import static java.util.Collections.emptySortedSet; import static java.util.Optional.empty; import static java.util.Optional.of; @@ -40,7 +39,6 @@ import java.io.ByteArrayInputStream; import java.io.InputStream; -import java.security.MessageDigest; import java.time.Instant; import java.util.HashSet; import java.util.Set; @@ -147,9 +145,6 @@ abstract class BaseTrellisHttpResourceTest extends JerseyTest { @Mock protected Binary mockBinary; - @Mock - protected MessageDigest mockDigest; - @Mock protected AccessControlService mockAccessControlService; @@ -270,18 +265,9 @@ private void setUpMementoService() { } private void setUpBinaryService() throws Exception { - when(mockBinaryService.supportedAlgorithms()).thenReturn(new HashSet<>(asList("MD5", "SHA-1", "SHA"))); - when(mockDigest.digest()).thenReturn(getDecoder().decode("Q29tcHV0ZWREaWdlc3Q=")); - when(mockBinaryService.calculateDigest(eq(binaryInternalIdentifier), any(MessageDigest.class))) - .thenReturn(completedFuture(mockDigest)); when(mockBinaryService.get(eq(binaryInternalIdentifier))).thenAnswer(inv -> completedFuture(mockBinary)); when(mockBinary.getContent(eq(3), eq(10))).thenReturn(new ByteArrayInputStream("e input".getBytes(UTF_8))); when(mockBinary.getContent()).thenReturn(new ByteArrayInputStream("Some input stream".getBytes(UTF_8))); - when(mockBinaryService.setContent(any(BinaryMetadata.class), any(InputStream.class), any())) - .thenAnswer(inv -> { - readLines((InputStream) inv.getArguments()[1], UTF_8); - return completedFuture(null); - }); when(mockBinaryService.setContent(any(BinaryMetadata.class), any(InputStream.class))) .thenAnswer(inv -> { readLines((InputStream) inv.getArguments()[1], UTF_8); @@ -289,8 +275,6 @@ private void setUpBinaryService() throws Exception { }); when(mockBinaryService.purgeContent(any(IRI.class))).thenReturn(completedFuture(null)); when(mockBinaryService.generateIdentifier()).thenReturn(RANDOM_VALUE); - doCallRealMethod().when(mockBinaryService) - .setContent(any(BinaryMetadata.class), any(InputStream.class), any()); } private void setUpResources() { diff --git a/core/http/src/test/java/org/trellisldp/http/CrossOriginResourceSharingFilterDefaultTest.java b/core/http/src/test/java/org/trellisldp/http/CrossOriginResourceSharingFilterDefaultTest.java index 9003d10ba..a1078f0a6 100644 --- a/core/http/src/test/java/org/trellisldp/http/CrossOriginResourceSharingFilterDefaultTest.java +++ b/core/http/src/test/java/org/trellisldp/http/CrossOriginResourceSharingFilterDefaultTest.java @@ -108,7 +108,7 @@ public void testCorsPreflight() { final List<String> headers = stream(res.getHeaderString("Access-Control-Allow-Headers").split(",")) .collect(toList()); - assertEquals(9L, headers.size(), "Incorrect count of -Allow-Headers values!"); + assertEquals(7L, headers.size(), "Incorrect count of -Allow-Headers values!"); assertTrue(headers.contains("accept"), "accept missing from -Allow-Headers!"); assertTrue(headers.contains("link"), "link missing from -Allow-Headers!"); assertTrue(headers.contains("content-type"), "content-type missing from -Allow-Headers!"); diff --git a/core/http/src/test/java/org/trellisldp/http/core/DigestTest.java b/core/http/src/test/java/org/trellisldp/http/core/DigestTest.java deleted file mode 100644 index 521f9ca95..000000000 --- a/core/http/src/test/java/org/trellisldp/http/core/DigestTest.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.trellisldp.http.core; - -import static org.junit.jupiter.api.Assertions.*; - -import org.junit.jupiter.api.Test; - -/** - * @author acoburn - */ -public class DigestTest { - - @Test - public void testDigest() { - final Digest d = Digest.valueOf("md5=HUXZLQLMuI/KZ5KDcJPcOA=="); - assertEquals("md5", d.getAlgorithm(), "check algorithm name"); - assertEquals("HUXZLQLMuI/KZ5KDcJPcOA==", d.getDigest(), "check digest value"); - } - - @Test - public void testDigest2() { - final Digest d = new Digest("md5", "HUXZLQLMuI/KZ5KDcJPcOA=="); - assertEquals("md5", d.getAlgorithm(), "Check md5 algorithm name"); - assertEquals("HUXZLQLMuI/KZ5KDcJPcOA==", d.getDigest(), "Check digest value"); - } - - @Test - public void testInvalidDigest() { - assertNull(Digest.valueOf("blah"), "Check parsing invalid digest"); - } -} diff --git a/core/http/src/test/java/org/trellisldp/http/core/WantDigestTest.java b/core/http/src/test/java/org/trellisldp/http/core/WantDigestTest.java deleted file mode 100644 index 8462db12f..000000000 --- a/core/http/src/test/java/org/trellisldp/http/core/WantDigestTest.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.trellisldp.http.core; - -import static org.junit.jupiter.api.Assertions.*; - -import org.junit.jupiter.api.Test; - -/** - * @author acoburn - */ -public class WantDigestTest { - - @Test - public void testWantDigest1() { - final WantDigest wantDigest = new WantDigest("md5, sha-1"); - assertEquals(2, wantDigest.getAlgorithms().size(), "Check algorithm list"); - assertEquals("MD5", wantDigest.getAlgorithms().get(0), "Check presence of MD5"); - assertEquals("SHA-1", wantDigest.getAlgorithms().get(1), "Check presence of SHA-1"); - } - - @Test - public void testWantDigest2() { - final WantDigest wantDigest = new WantDigest("sha-1, md5"); - assertEquals(2, wantDigest.getAlgorithms().size(), "Check algorithm list"); - assertEquals("SHA-1", wantDigest.getAlgorithms().get(0), "Check that sha-1 is first"); - assertEquals("MD5", wantDigest.getAlgorithms().get(1), "Check that md5 is second"); - } - - @Test - public void testWantDigest3() { - final WantDigest wantDigest = new WantDigest("sha-1;q=0.3, md5;q=1"); - assertEquals(2, wantDigest.getAlgorithms().size(), "Check algorithm list"); - assertEquals("MD5", wantDigest.getAlgorithms().get(0), "Check that md5 is first"); - assertEquals("SHA-1", wantDigest.getAlgorithms().get(1), "Check that sha-1 is second"); - } - - @Test - public void testWantDigest4() { - final WantDigest wantDigest = new WantDigest(null); - assertTrue(wantDigest.getAlgorithms().isEmpty(), "Check parsing null value"); - } - - @Test - public void testWantDigest5() { - final WantDigest wantDigest = new WantDigest("sha-1;q=0.3, md5;q=blah"); - assertEquals(2, wantDigest.getAlgorithms().size(), "Check algorithm list"); - assertEquals("SHA-1", wantDigest.getAlgorithms().get(0), "Check that sha-1 is first"); - assertEquals("MD5", wantDigest.getAlgorithms().get(1), "Check that md5 is second"); - } - - @Test - public void testWantDigest6() { - final WantDigest wantDigest = new WantDigest("sha-1;q=0.3, md5;p=1.0"); - assertEquals(2, wantDigest.getAlgorithms().size(), "Check algorithm list"); - assertEquals("SHA-1", wantDigest.getAlgorithms().get(0), "Check that sha-1 is first"); - assertEquals("MD5", wantDigest.getAlgorithms().get(1), "Check that md5 is second"); - } -} diff --git a/core/http/src/test/java/org/trellisldp/http/impl/BaseTestHandler.java b/core/http/src/test/java/org/trellisldp/http/impl/BaseTestHandler.java index c8b736ff1..b202bfc4d 100644 --- a/core/http/src/test/java/org/trellisldp/http/impl/BaseTestHandler.java +++ b/core/http/src/test/java/org/trellisldp/http/impl/BaseTestHandler.java @@ -50,7 +50,6 @@ import java.io.ByteArrayInputStream; import java.io.InputStream; -import java.security.MessageDigest; import java.time.Instant; import java.util.HashSet; import java.util.List; @@ -131,9 +130,6 @@ abstract class BaseTestHandler { @Mock protected Binary mockBinary; - @Mock - protected MessageDigest mockDigest; - @Mock protected Resource mockResource, mockParent; @@ -232,24 +228,13 @@ private void setUpBinaryService() throws Exception { when(mockBinary.getContent(eq(3), eq(10))).thenReturn(new ByteArrayInputStream("e input".getBytes(UTF_8))); when(mockBinary.getContent()).thenReturn(new ByteArrayInputStream("Some input stream".getBytes(UTF_8))); when(mockBinaryService.generateIdentifier()).thenReturn("file:///" + randomUUID()); - when(mockBinaryService.supportedAlgorithms()).thenReturn(new HashSet<>(asList("MD5", "SHA-1"))); - when(mockDigest.digest()).thenReturn("computed-digest".getBytes(UTF_8)); - when(mockBinaryService.calculateDigest(any(IRI.class), any(MessageDigest.class))) - .thenReturn(completedFuture(mockDigest)); when(mockBinaryService.get(any(IRI.class))).thenAnswer(inv -> completedFuture(mockBinary)); when(mockBinaryService.purgeContent(any(IRI.class))).thenReturn(completedFuture(null)); - when(mockBinaryService.setContent(any(BinaryMetadata.class), any(InputStream.class), any())) - .thenAnswer(inv -> { - readLines((InputStream) inv.getArguments()[1], UTF_8); - return completedFuture(null); - }); when(mockBinaryService.setContent(any(BinaryMetadata.class), any(InputStream.class))) .thenAnswer(inv -> { readLines((InputStream) inv.getArguments()[1], UTF_8); return completedFuture(null); }); - doCallRealMethod().when(mockBinaryService) - .setContent(any(BinaryMetadata.class), any(InputStream.class), any()); } private void setUpBundler() { diff --git a/core/http/src/test/java/org/trellisldp/http/impl/GetHandlerTest.java b/core/http/src/test/java/org/trellisldp/http/impl/GetHandlerTest.java index aa31ed07a..2736c01ff 100644 --- a/core/http/src/test/java/org/trellisldp/http/impl/GetHandlerTest.java +++ b/core/http/src/test/java/org/trellisldp/http/impl/GetHandlerTest.java @@ -56,7 +56,6 @@ import static org.trellisldp.http.core.HttpConstants.PREFER; import static org.trellisldp.http.core.HttpConstants.PREFERENCE_APPLIED; import static org.trellisldp.http.core.HttpConstants.RANGE; -import static org.trellisldp.http.core.HttpConstants.WANT_DIGEST; import static org.trellisldp.http.core.RdfMediaType.APPLICATION_LD_JSON; import static org.trellisldp.http.core.RdfMediaType.APPLICATION_LD_JSON_TYPE; import static org.trellisldp.http.core.RdfMediaType.APPLICATION_N_TRIPLES; @@ -101,7 +100,7 @@ public void testGetLdprs() { final GetHandler handler = new GetHandler(mockTrellisRequest, mockBundler, false, true, true, null, null); final Response res = handler.getRepresentation(handler.standardHeaders(handler.initialize(mockResource))) - .toCompletableFuture().join().build(); + .build(); assertEquals(OK, res.getStatusInfo(), "Incorrect response type!"); assertEquals(APPLICATION_SPARQL_UPDATE, res.getHeaderString(ACCEPT_PATCH), "Incorrect Accept-Patch header!"); @@ -121,7 +120,6 @@ public void testGetLdprs() { final List<Object> varies = res.getHeaders().get(VARY); assertFalse(varies.contains(RANGE), "Unexpected Vary: range header!"); - assertFalse(varies.contains(WANT_DIGEST), "Unexpected Vary: want-digest header!"); assertTrue(varies.contains(ACCEPT_DATETIME), "Unexpected Vary: accept-datetime header!"); assertTrue(varies.contains(PREFER), "Unexpected Vary: prefer header!"); } @@ -134,7 +132,7 @@ public void testGetPreferLdprs() { final GetHandler handler = new GetHandler(mockTrellisRequest, mockBundler, false, true, true, null, null); final Response res = handler.getRepresentation(handler.standardHeaders(handler.initialize(mockResource))) - .toCompletableFuture().join().build(); + .build(); assertEquals(OK, res.getStatusInfo(), "Incorrect response status!"); assertEquals("text/ldpatch", res.getHeaderString(ACCEPT_PATCH), "Incorrect Accept-Patch header!"); @@ -151,7 +149,7 @@ public void testGetPreferLdprs() { public void testGetVersionedLdprs() { final GetHandler handler = new GetHandler(mockTrellisRequest, mockBundler, true, true, true, null, null); final Response res = handler.getRepresentation(handler.standardHeaders(handler.initialize(mockResource))) - .toCompletableFuture().join().build(); + .build(); assertEquals(OK, res.getStatusInfo(), "Incorrect response code!"); assertEquals(from(time), res.getLastModified(), "Incorrect modified date!"); @@ -174,7 +172,6 @@ public void testGetVersionedLdprs() { final List<Object> varies = res.getHeaders().get(VARY); assertTrue(varies.contains(PREFER), "Missing Vary: prefer header!"); assertFalse(varies.contains(RANGE), "Unexpected Vary: range header!"); - assertFalse(varies.contains(WANT_DIGEST), "Unexpected Vary: want-digest header!"); assertFalse(varies.contains(ACCEPT_DATETIME), "Unexpected Vary: accept-datetime header!"); } @@ -190,7 +187,7 @@ public void testExtraLinks() { final GetHandler handler = new GetHandler(mockTrellisRequest, mockBundler, false, true, true, null, baseUrl); final Response res = handler.getRepresentation(handler.standardHeaders(handler.initialize(mockResource))) - .toCompletableFuture().join().build(); + .build(); assertEquals(OK, res.getStatusInfo(), "Incorrect response code!"); assertTrue(res.getLinks().stream().anyMatch(hasType(SKOS.Concept)), "Missing extra type link header!"); @@ -206,7 +203,7 @@ public void testNotAcceptableLdprs() { final GetHandler handler = new GetHandler(mockTrellisRequest, mockBundler, false, true, true, null, baseUrl); final Response res = assertThrows(NotAcceptableException.class, () -> - unwrapAsyncError(handler.getRepresentation(handler.standardHeaders(handler.initialize(mockResource)))), + handler.getRepresentation(handler.standardHeaders(handler.initialize(mockResource))), "No error thrown when given an unaccepable media type!").getResponse(); assertEquals(NOT_ACCEPTABLE, res.getStatusInfo(), "Incorrect response code!"); } @@ -218,7 +215,7 @@ public void testMinimalLdprs() { final GetHandler handler = new GetHandler(mockTrellisRequest, mockBundler, false, true, true, null, baseUrl); final Response res = handler.getRepresentation(handler.standardHeaders(handler.initialize(mockResource))) - .toCompletableFuture().join().build(); + .build(); assertEquals(NO_CONTENT, res.getStatusInfo(), "Incorrect response code!"); assertEquals(from(time), res.getLastModified(), "Incorrect modified date!"); @@ -241,7 +238,6 @@ public void testMinimalLdprs() { assertTrue(varies.contains(ACCEPT_DATETIME), "Missing Vary: accept-datetime header!"); assertTrue(varies.contains(PREFER), "Missing Vary: prefer header!"); assertFalse(varies.contains(RANGE), "Unexpected Vary: range header!"); - assertFalse(varies.contains(WANT_DIGEST), "Unexpected Vary: want-digest header!"); } @Test @@ -254,7 +250,7 @@ public void testGetLdpc() { final GetHandler handler = new GetHandler(mockTrellisRequest, mockBundler, false, true, true, null, null); final Response res = handler.getRepresentation(handler.standardHeaders(handler.initialize(mockResource))) - .toCompletableFuture().join().build(); + .build(); assertEquals(OK, res.getStatusInfo(), "Incorrect response code"); assertEquals(APPLICATION_SPARQL_UPDATE, res.getHeaderString(ACCEPT_PATCH), "Incorrect Accept-Patch header!"); assertEquals(from(time), res.getLastModified(), "Incorrect modified date!"); @@ -286,7 +282,6 @@ public void testGetLdpc() { assertTrue(varies.contains(ACCEPT_DATETIME), "Missing Vary: accept-datetime header!"); assertTrue(varies.contains(PREFER), "Missing Vary: prefer header!"); assertFalse(varies.contains(RANGE), "Unexpected Vary: range header!"); - assertFalse(varies.contains(WANT_DIGEST), "Unexpected Vary: want-digest header!"); } @Test @@ -297,7 +292,7 @@ public void testGetHTML() { final GetHandler handler = new GetHandler(mockTrellisRequest, mockBundler, false, true, true, null, null); final Response res = handler.getRepresentation(handler.standardHeaders(handler.initialize(mockResource))) - .toCompletableFuture().join().build(); + .build(); assertEquals(OK, res.getStatusInfo(), "Incorrect response code!"); assertEquals(APPLICATION_SPARQL_UPDATE, res.getHeaderString(ACCEPT_PATCH), "Incorrect Accept-Patch header!"); @@ -315,7 +310,7 @@ public void testGetBinaryDescription() { final GetHandler handler = new GetHandler(mockTrellisRequest, mockBundler, false, true, true, null, null); final Response res = handler.getRepresentation(handler.standardHeaders(handler.initialize(mockResource))) - .toCompletableFuture().join().build(); + .build(); assertAll("Check binary description", checkBinaryDescription(res)); } @@ -328,7 +323,7 @@ public void testGetBinaryDescription2() { final GetHandler handler = new GetHandler(mockTrellisRequest, mockBundler, false, true, true, null, null); final Response res = handler.getRepresentation(handler.standardHeaders(handler.initialize(mockResource))) - .toCompletableFuture().join().build(); + .build(); assertAll("Check binary description", checkBinaryDescription(res)); } @@ -356,7 +351,7 @@ public void testGetBinary() throws IOException { final GetHandler handler = new GetHandler(mockTrellisRequest, mockBundler, false, true, true, null, baseUrl); final Response res = handler.getRepresentation(handler.standardHeaders(handler.initialize(mockResource))) - .toCompletableFuture().join().build(); + .build(); assertEquals(OK, res.getStatusInfo(), "Incorrect response code!"); assertEquals(-1, res.getLength(), "Incorrect response length!"); @@ -379,7 +374,7 @@ public void testGetAcl() { final GetHandler handler = new GetHandler(mockTrellisRequest, mockBundler, false, true, true, null, baseUrl); final Response res = handler.getRepresentation(handler.standardHeaders(handler.initialize(mockResource))) - .toCompletableFuture().join().build(); + .build(); assertEquals(OK, res.getStatusInfo(), "Incorrect response code!"); assertAll("Check LDP type link headers", checkLdpType(res, LDP.RDFSource)); diff --git a/core/http/src/test/java/org/trellisldp/http/impl/PostHandlerTest.java b/core/http/src/test/java/org/trellisldp/http/impl/PostHandlerTest.java index 3bbe9f8a5..7230a4f7b 100644 --- a/core/http/src/test/java/org/trellisldp/http/impl/PostHandlerTest.java +++ b/core/http/src/test/java/org/trellisldp/http/impl/PostHandlerTest.java @@ -40,7 +40,6 @@ import javax.ws.rs.BadRequestException; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.ResponseBuilder; import org.apache.commons.rdf.api.Dataset; import org.apache.commons.rdf.api.IRI; @@ -50,7 +49,6 @@ import org.trellisldp.api.BinaryMetadata; import org.trellisldp.api.Metadata; import org.trellisldp.audit.DefaultAuditService; -import org.trellisldp.http.core.Digest; import org.trellisldp.vocabulary.DC; import org.trellisldp.vocabulary.LDP; @@ -185,7 +183,7 @@ public void testRdfEntity() throws IOException { assertEquals(create(baseUrl + path), res.getLocation(), "Incorrect Location header!"); assertAll("Check LDP type Link headers", checkLdpType(res, LDP.RDFSource)); - verify(mockBinaryService, never()).setContent(any(BinaryMetadata.class), any(InputStream.class), any()); + verify(mockBinaryService, never()).setContent(any(BinaryMetadata.class), any(InputStream.class)); verify(mockIoService).read(any(InputStream.class), eq(TURTLE), eq(baseUrl + path)); verify(mockResourceService).create(any(Metadata.class), any(Dataset.class)); } @@ -204,48 +202,6 @@ public void testBinaryEntity() throws IOException { assertAll("Check Binary response", checkBinaryEntityResponse()); } - @Test - public void testEntityWithDigest() throws IOException { - when(mockTrellisRequest.getContentType()).thenReturn("text/plain"); - when(mockTrellisRequest.getDigest()).thenReturn(new Digest("md5", "1VOyRwUXW1CPdC5nelt7GQ==")); - - final PostHandler handler = buildPostHandler("/simpleData.txt", "resource-with-entity", null); - final Response res = handler.createResource(handler.initialize(mockParent, MISSING_RESOURCE)) - .toCompletableFuture().join().build(); - - assertEquals(CREATED, res.getStatusInfo(), "Incorrect response code!"); - assertEquals(create(baseUrl + "resource-with-entity"), res.getLocation(), "Incorrect Location hearder!"); - assertAll("Check LDP type Link headers", checkLdpType(res, LDP.NonRDFSource)); - assertAll("Check Binary response", checkBinaryEntityResponse()); - } - - @Test - public void testEntityBadDigest() throws IOException { - when(mockTrellisRequest.getContentType()).thenReturn("text/plain"); - when(mockTrellisRequest.getDigest()).thenReturn(new Digest("md5", "blahblah")); - - final PostHandler handler = buildPostHandler("/simpleData.txt", "bad-digest", null); - - final Response res = handler.createResource(handler.initialize(mockParent, MISSING_RESOURCE)) - .thenApply(ResponseBuilder::build) - .exceptionally(err -> of(err).map(Throwable::getCause).filter(WebApplicationException.class::isInstance) - .map(WebApplicationException.class::cast).orElseGet(() -> new WebApplicationException(err)) - .getResponse()).toCompletableFuture().join(); - assertEquals(BAD_REQUEST, res.getStatusInfo(), "Incorrect response type!"); - } - - @Test - public void testBadDigest() throws IOException { - when(mockTrellisRequest.getContentType()).thenReturn("text/plain"); - when(mockTrellisRequest.getDigest()).thenReturn(new Digest("foo", "blahblahblah")); - - final PostHandler handler = buildPostHandler("/simpleData.txt", "bad-digest", null); - - final Response res = assertThrows(BadRequestException.class, () -> - handler.createResource(handler.initialize(mockParent, MISSING_RESOURCE))).getResponse(); - assertEquals(BAD_REQUEST, res.getStatusInfo(), "Incorrect response code!"); - } - @Test public void testError() throws IOException { when(mockResourceService.create(any(Metadata.class), any(Dataset.class))).thenReturn(asyncException()); diff --git a/core/http/src/test/java/org/trellisldp/http/impl/PutHandlerTest.java b/core/http/src/test/java/org/trellisldp/http/impl/PutHandlerTest.java index 46f0fd4ca..6163a5993 100644 --- a/core/http/src/test/java/org/trellisldp/http/impl/PutHandlerTest.java +++ b/core/http/src/test/java/org/trellisldp/http/impl/PutHandlerTest.java @@ -101,7 +101,7 @@ public void testPutLdpResourceDefaultType() { assertEquals(NO_CONTENT, res.getStatusInfo(), "Incorrect response type"); assertAll("Check LDP type Link headers", checkLdpType(res, LDP.RDFSource)); - verify(mockBinaryService, never()).setContent(any(BinaryMetadata.class), any(InputStream.class), any()); + verify(mockBinaryService, never()).setContent(any(BinaryMetadata.class), any(InputStream.class)); verify(mockIoService).read(any(InputStream.class), eq(TURTLE), eq(baseUrl + "resource")); } @@ -118,7 +118,7 @@ public void testPutLdpResourceContainer() { assertEquals(NO_CONTENT, res.getStatusInfo(), "Incorrect response code"); assertAll("Check LDP type Link headers", checkLdpType(res, LDP.Container)); - verify(mockBinaryService, never()).setContent(any(BinaryMetadata.class), any(InputStream.class), any()); + verify(mockBinaryService, never()).setContent(any(BinaryMetadata.class), any(InputStream.class)); verify(mockIoService).read(any(InputStream.class), eq(TURTLE), eq(baseUrl + "resource")); } @@ -282,7 +282,7 @@ private Stream<Executable> checkRdfPut(final Response res) { return Stream.of( () -> assertAll("Check LDP type Link headers", checkLdpType(res, LDP.RDFSource)), () -> verify(mockBinaryService, never().description("Binary service shouldn't have been called!")) - .setContent(any(BinaryMetadata.class), any(InputStream.class), any()), + .setContent(any(BinaryMetadata.class), any(InputStream.class)), () -> verify(mockIoService, description("IOService should have been called with an RDF resource")) .read(any(InputStream.class), any(RDFSyntax.class), anyString())); } diff --git a/platform/karaf/src/main/resources/features.xml b/platform/karaf/src/main/resources/features.xml index c93197a7b..34f21597c 100644 --- a/platform/karaf/src/main/resources/features.xml +++ b/platform/karaf/src/main/resources/features.xml @@ -36,7 +36,6 @@ <feature dependency="true">trellis-vocabulary</feature> <bundle dependency="true">mvn:org.apache.tamaya/tamaya-api/${tamayaVersion}</bundle> - <bundle dependency="true">mvn:commons-codec/commons-codec/${commonsCodecVersion}</bundle> <bundle dependency="true">mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.javax-inject/1_2</bundle> <bundle>mvn:org.trellisldp/trellis-file/${project.version}</bundle> diff --git a/platform/webapp/src/main/resources/META-INF/javaconfiguration.properties b/platform/webapp/src/main/resources/META-INF/javaconfiguration.properties index 2da9a921c..8ae994b14 100644 --- a/platform/webapp/src/main/resources/META-INF/javaconfiguration.properties +++ b/platform/webapp/src/main/resources/META-INF/javaconfiguration.properties @@ -25,7 +25,7 @@ trellis.http.cache.maxage=86400 trellis.webapp.cors.enabled=true trellis.http.cors.alloworigin=* trellis.http.cors.allowmethods=PUT,DELETE,PATCH,GET,HEAD,OPTIONS,POST -trellis.http.cors.allowheaders=Content-Type,Link,Accept,Accept-Datetime,Prefer,Want-Digest,Slug,Digest,Origin -trellis.http.cors.exposeheaders=Content-Type,Link,Memento-Datetime,Preference-Applied,Location,Accept-Patch,Accept-Post,Digest,Accept-Range,ETag,Vary +trellis.http.cors.allowheaders=Content-Type,Link,Accept,Accept-Datetime,Prefer,Slug,Origin +trellis.http.cors.exposeheaders=Content-Type,Link,Memento-Datetime,Preference-Applied,Location,Accept-Patch,Accept-Post,Accept-Range,ETag,Vary trellis.http.cors.allowcredentials=false trellis.http.cors.maxage=180