diff --git a/shared/src/main/java/com/quorum/tessera/nio/unix/UnixSocketFileSystemProvider.java b/shared/src/main/java/com/quorum/tessera/nio/unix/UnixSocketFileSystemProvider.java index fbe5a68cb9..b29df8ed7e 100644 --- a/shared/src/main/java/com/quorum/tessera/nio/unix/UnixSocketFileSystemProvider.java +++ b/shared/src/main/java/com/quorum/tessera/nio/unix/UnixSocketFileSystemProvider.java @@ -7,8 +7,11 @@ import java.nio.file.FileSystem; import java.nio.file.FileSystems; import java.nio.file.Path; +import java.nio.file.Paths; import java.nio.file.spi.FileSystemProvider; import java.util.Map; +import java.util.Objects; +import java.util.regex.Pattern; /** * Implementation of FileSystemProvider that handles URIs with unix scheme @@ -28,13 +31,40 @@ public String getScheme() { return "unix"; } + private static URI handleRelative(URI uri) { + boolean isAbsolute = Pattern.matches("^unix:/.+$", Objects.toString(uri)); + if(isAbsolute) { + return uri; + } + + final String value = Objects.toString(uri); + if(value.contains("..")) { + //Treat double dots as invalid + return uri; + } + final String cwd = Paths.get("").toAbsolutePath().toString(); + final String adjustedValue; + if(Pattern.matches("^unix:\\..+",value)) { + adjustedValue = value.replaceFirst("\\.",cwd); + } else { + adjustedValue = value.replaceFirst("unix:","unix:"+ cwd +"/"); + } + return URI.create(adjustedValue); + } + private static URI convert(final URI uri) { + final URI adjustedUri = handleRelative(uri); + return UriCallback.execute( () -> new URI( "file", - uri.getUserInfo(), uri.getHost(), uri.getPort(), - uri.getPath(), uri.getQuery(), uri.getFragment() + adjustedUri.getUserInfo(), + adjustedUri.getHost(), + adjustedUri.getPort(), + adjustedUri.getPath(), + adjustedUri.getQuery(), + adjustedUri.getFragment() ) ); diff --git a/shared/src/test/java/com/quorum/tessera/nio/unix/UnixSocketFileSystemProviderTest.java b/shared/src/test/java/com/quorum/tessera/nio/unix/UnixSocketFileSystemProviderTest.java index ecd301cdbe..b7dee86272 100644 --- a/shared/src/test/java/com/quorum/tessera/nio/unix/UnixSocketFileSystemProviderTest.java +++ b/shared/src/test/java/com/quorum/tessera/nio/unix/UnixSocketFileSystemProviderTest.java @@ -5,14 +5,17 @@ import org.junit.Test; import java.io.IOException; +import java.io.UncheckedIOException; import java.net.URI; +import java.net.URISyntaxException; +import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.spi.FileSystemProvider; import java.util.HashMap; import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.*; +import static org.assertj.core.api.Assertions.failBecauseExceptionWasNotThrown; import static org.mockito.Mockito.*; public class UnixSocketFileSystemProviderTest { @@ -74,4 +77,47 @@ public void getPath() { verify(delegate).getPath(u); } + + @Test + public void getRelativePathUsingDot() { + + URI uri = URI.create("unix:./bogus.ipc"); + + provider.getPath(uri); + + Path currentRelativePath = Paths.get(""); + String s = currentRelativePath.toAbsolutePath().toString(); + + URI u = URI.create("file:./bogus.ipc".replaceFirst("\\.",s)); + verify(delegate).getPath(u); + } + + @Test + public void getRelativePathNotUsingDot() { + + URI uri = URI.create("unix:bogus.ipc"); + + provider.getPath(uri); + + Path currentRelativePath = Paths.get(""); + String s = currentRelativePath.toAbsolutePath().toString(); + + URI u = URI.create(String.format("file:%s/bogus.ipc",s)); + verify(delegate).getPath(u); + } + + @Test + public void getInavlidPathUsingDoubleDots() { + + final URI uri = URI.create("unix:../bogus.ipc"); + try { + provider.getPath(uri); + failBecauseExceptionWasNotThrown(UncheckedIOException.class); + } catch (UncheckedIOException ex) { + assertThat(ex.getCause()).isExactlyInstanceOf(IOException.class); + assertThat(ex.getCause().getCause()).isExactlyInstanceOf(URISyntaxException.class); + } + } + + }