From e01a995accf8ae1ebac6d30b6e098d31ebf8064f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Fri, 19 Oct 2018 13:57:49 +0200 Subject: [PATCH] Handle special characters in file names --- .../scm/api/v2/resources/ResourceLinks.java | 7 +++++- .../api/v2/resources/ResourceLinksTest.java | 24 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ResourceLinks.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ResourceLinks.java index 2b37eda9b7..1b397480a4 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ResourceLinks.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ResourceLinks.java @@ -4,6 +4,7 @@ import sonia.scm.repository.NamespaceAndName; import javax.inject.Inject; import java.net.URI; +import java.net.URISyntaxException; class ResourceLinks { @@ -16,7 +17,11 @@ class ResourceLinks { // we have to add the file path using URI, so that path separators (aka '/') will not be encoded as '%2F' private static String addPath(String sourceWithPath, String path) { - return URI.create(sourceWithPath).resolve(path).toASCIIString(); + try { + return new URI(sourceWithPath).resolve(new URI(null, null, path, null)).toASCIIString(); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } } GroupLinks group() { diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ResourceLinksTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ResourceLinksTest.java index 0544bf6a0d..74ff49dbb7 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ResourceLinksTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ResourceLinksTest.java @@ -173,6 +173,30 @@ public class ResourceLinksTest { assertEquals(BASE_URL + ConfigResource.CONFIG_PATH_V2, url); } + @Test + public void shouldHandleSpacesInPaths() { + String url = resourceLinks.source().content("space", "name", "rev", "name with spaces"); + assertEquals(BASE_URL + RepositoryRootResource.REPOSITORIES_PATH_V2 + "space/name/content/rev/name%20with%20spaces", url); + } + + @Test + public void shouldHandleBackslashInPaths() { + String url = resourceLinks.source().content("space", "name", "rev", "name_with_\\"); + assertEquals(BASE_URL + RepositoryRootResource.REPOSITORIES_PATH_V2 + "space/name/content/rev/name_with_%5C", url); + } + + @Test + public void shouldHandleNewLineInPaths() { + String url = resourceLinks.source().content("space", "name", "rev", "name_with\nnew_line"); + assertEquals(BASE_URL + RepositoryRootResource.REPOSITORIES_PATH_V2 + "space/name/content/rev/name_with%0Anew_line", url); + } + + @Test + public void shouldKeepSlashesInInPaths() { + String url = resourceLinks.source().content("space", "name", "rev", "some/dir/somewhere"); + assertEquals(BASE_URL + RepositoryRootResource.REPOSITORIES_PATH_V2 + "space/name/content/rev/some/dir/somewhere", url); + } + @Before public void initUriInfo() { initMocks(this);