Skip to content

SJH 3.0: Replace BiPredicate by UnionPathFilter in UnionFS and hide SecureJar impl details #51

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/main/java/cpw/mods/jarhandling/JarContentsBuilder.java
Original file line number Diff line number Diff line change
@@ -53,6 +53,6 @@ public JarContentsBuilder pathFilter(@Nullable UnionPathFilter pathFilter) {
* Builds the jar.
*/
public JarContents build() {
return new JarContentsImpl(paths, defaultManifest, pathFilter == null ? null : pathFilter::test);
return new JarContentsImpl(paths, defaultManifest, pathFilter);
}
}
2 changes: 1 addition & 1 deletion src/main/java/cpw/mods/jarhandling/SecureJar.java
Original file line number Diff line number Diff line change
@@ -138,7 +138,7 @@ record Provider(String serviceName, List<String> providers) {
/**
* Helper method to parse service provider implementations from a {@link Path}.
*/
public static Provider fromPath(final Path path, final UnionPathFilter pkgFilter) {
public static Provider fromPath(Path path, @Nullable UnionPathFilter pkgFilter) {
final var sname = path.getFileName().toString();
try {
var entries = Files.readAllLines(path).stream()
12 changes: 10 additions & 2 deletions src/main/java/cpw/mods/niofs/union/UnionFileSystem.java
Original file line number Diff line number Diff line change
@@ -31,12 +31,17 @@
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;

/**
* Can be instantiated using the public methods in {@link UnionFileSystemProvider}.
*/
public class UnionFileSystem extends FileSystem {
private static final MethodHandle ZIPFS_CH;
private static final MethodHandle FCI_UNINTERUPTIBLE;
@@ -83,7 +88,7 @@ private static class UncheckedIOException extends java.io.UncheckedIOException {
public UncheckedIOException(final IOException cause) {
super(cause);
}

public UncheckedIOException(final String message, final IOException cause) {
super(message, cause);
}
@@ -107,6 +112,9 @@ public Path getPrimaryPath() {
return basepaths.get(basepaths.size() - 1);
}

/**
* {@return the filter for this file system, or null if there is none}
*/
@Nullable
public UnionPathFilter getFilesystemFilter() {
return pathFilter;
@@ -119,7 +127,7 @@ String getKey() {
private record EmbeddedFileSystemMetadata(Path path, FileSystem fs, SeekableByteChannel fsCh) {
}

public UnionFileSystem(final UnionFileSystemProvider provider, @Nullable UnionPathFilter pathFilter, final String key, final Path... basepaths) {
UnionFileSystem(UnionFileSystemProvider provider, @Nullable UnionPathFilter pathFilter, String key, Path... basepaths) {
this.pathFilter = pathFilter;
this.provider = provider;
this.key = key;
36 changes: 15 additions & 21 deletions src/main/java/cpw/mods/niofs/union/UnionFileSystemProvider.java
Original file line number Diff line number Diff line change
@@ -29,7 +29,6 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.BiPredicate;
import java.util.stream.Stream;

public class UnionFileSystemProvider extends FileSystemProvider {
@@ -73,24 +72,7 @@ protected Path uriToPath(URI uri) {
*/
@Override
public FileSystem newFileSystem(final URI uri, final Map<String, ?> env) throws IOException {
@SuppressWarnings("unchecked")
var additional = ((Map<String, List<Path>>)env).getOrDefault("additional", List.<Path>of());
@SuppressWarnings("unchecked")
var filter = ((Map<String, UnionPathFilter>)env).getOrDefault("filter", null);

if (filter == null && additional.isEmpty())
throw new IllegalArgumentException("Missing additional and/or filter");

if (filter == null)
filter = (p, b) -> true;

var path = uriToPath(uri);
var key = makeKey(path);
try {
return newFileSystemInternal(key, filter, Stream.concat(Stream.of(path), additional.stream()).toArray(Path[]::new));
} catch (UncheckedIOException e) {
throw e.getCause();
}
return newFileSystem(uriToPath(uri), env);
}

/**
@@ -105,8 +87,7 @@ public FileSystem newFileSystem(final URI uri, final Map<String, ?> env) throws
public FileSystem newFileSystem(final Path path, final Map<String, ?> env) throws IOException {
@SuppressWarnings("unchecked")
var additional = ((Map<String, List<Path>>)env).getOrDefault("additional", List.<Path>of());
@SuppressWarnings("unchecked")
var filter = ((Map<String, UnionPathFilter>)env).getOrDefault("filter", null);
var filter = readFilterFromEnv(env);

if (filter == null && additional.isEmpty())
throw new UnsupportedOperationException("Missing additional and/or filter");
@@ -119,6 +100,19 @@ public FileSystem newFileSystem(final Path path, final Map<String, ?> env) throw
}
}

@Nullable
private static UnionPathFilter readFilterFromEnv(Map<String, ?> env) {
Object filter = env.get("filter");

if (filter == null) {
return null;
} else if (filter instanceof UnionPathFilter unionPathFilter) {
return unionPathFilter;
} else {
throw new IllegalArgumentException("Unknown type for \"filter\" UnionFileSystem env var: " + filter.getClass().getName());
}
}

public UnionFileSystem newFileSystem(@Nullable UnionPathFilter pathfilter, final Path... paths) {
if (paths.length == 0) throw new IllegalArgumentException("Need at least one path");
var key = makeKey(paths[0]);
1 change: 0 additions & 1 deletion src/main/java/module-info.java
Original file line number Diff line number Diff line change
@@ -3,7 +3,6 @@

module cpw.mods.securejarhandler {
exports cpw.mods.jarhandling;
exports cpw.mods.jarhandling.impl; // TODO - Bump version, and remove this export, you don't need our implementation
exports cpw.mods.cl;
exports cpw.mods.niofs.union;
requires jdk.unsupported;