diff --git a/engines/base/src/test/java/org/alfresco/transform/base/fs/FileManagerTest.java b/engines/base/src/test/java/org/alfresco/transform/base/fs/FileManagerTest.java deleted file mode 100644 index 75e7cbf5..00000000 --- a/engines/base/src/test/java/org/alfresco/transform/base/fs/FileManagerTest.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * #%L - * Alfresco Transform Core - * %% - * Copyright (C) 2005 - 2026 Alfresco Software Limited - * %% - * This file is part of the Alfresco software. - * - - * If the software was purchased under a paid Alfresco license, the terms of - * the paid license agreement will prevail. Otherwise, the software is - * provided under the following open source license terms: - * - - * Alfresco is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - - * Alfresco is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - - * You should have received a copy of the GNU Lesser General Public License - * along with Alfresco. If not, see . - * #L% - */ -package org.alfresco.transform.base.fs; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; - -import java.io.IOException; -import java.io.InputStream; -import java.net.InetSocketAddress; -import java.nio.charset.StandardCharsets; -import java.util.concurrent.atomic.AtomicReference; - -import com.sun.net.httpserver.HttpServer; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import org.alfresco.transform.exceptions.TransformException; - -/** - * Tests for {@link FileManager#getDirectAccessUrlInputStream(String)}. - *

- * In particular guards against ACS-12053 (double percent-encoding of the - * direct-access URL's query string), which broke S3/Azure pre-signed URLs - * because the rebuilt URL no longer matched the original signature. - */ -class FileManagerTest -{ - private HttpServer server; - private final AtomicReference receivedRawQuery = new AtomicReference<>(); - private final AtomicReference receivedRawPath = new AtomicReference<>(); - private int port; - - @BeforeEach - void startServer() throws IOException - { - server = HttpServer.create(new InetSocketAddress("127.0.0.1", 0), 0); - server.createContext("/", exchange -> { - receivedRawPath.set(exchange.getRequestURI().getRawPath()); - receivedRawQuery.set(exchange.getRequestURI().getRawQuery()); - byte[] body = "ok".getBytes(StandardCharsets.UTF_8); - exchange.sendResponseHeaders(200, body.length); - try (var os = exchange.getResponseBody()) - { - os.write(body); - } - }); - server.start(); - port = server.getAddress().getPort(); - } - - @AfterEach - void stopServer() - { - if (server != null) - { - server.stop(0); - } - } - - /** - * Reproduces ACS-12053. A pre-signed S3-style URL with a query string that already contains - * percent-encoded characters must be forwarded verbatim; re-encoding the {@code %} sign - * invalidates the AWS signature and yields HTTP 400 from S3. - */ - @Test - void preservesPercentEncodingInPreSignedUrlQuery() throws IOException - { - // Query taken from the ACS-12053 reproducer (truncated for the test). - // Contains pre-encoded characters: %3B (;), %20 (space), %3D (=), %22 ("), %2F (/). - String rawQuery = "response-content-disposition=attachment%3B%20filename%3D%22doc1.docx%22" - + "&X-Amz-Credential=AKIA%2F20260622%2Fus-east-2%2Fs3%2Faws4_request" - + "&X-Amz-Signature=deadbeef"; - String url = "http://127.0.0.1:" + port + "/object.bin?" + rawQuery; - - try (InputStream in = FileManager.getDirectAccessUrlInputStream(url)) - { - in.readAllBytes(); - } - - assertEquals("/object.bin", receivedRawPath.get(), - "Path must be forwarded verbatim"); - assertEquals(rawQuery, receivedRawQuery.get(), - "Query string must be forwarded verbatim without re-encoding the '%' sign (ACS-12053)"); - } - - @Test - void rejectsUnsupportedProtocol() - { - assertThrows(TransformException.class, - () -> FileManager.getDirectAccessUrlInputStream("ftp://example.com/file")); - } - - @Test - void rejectsInvalidHost() - { - // host contains characters disallowed by the validator - assertThrows(TransformException.class, - () -> FileManager.getDirectAccessUrlInputStream("http://bad host/file")); - } -}