Skip to content

Commit 48709d4

Browse files
committed
Allow SecureJar to be FS independent. Update gradle and disable JMH pending fixup for modules.
Signed-off-by: cpw <cpw+github@weeksfamily.ca>
1 parent 0e5f90f commit 48709d4

9 files changed

Lines changed: 239 additions & 37 deletions

File tree

build.gradle

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
plugins {
2-
id 'com.github.ben-manes.versions' version '0.39.0'
2+
id 'com.github.ben-manes.versions' version '0.42.0'
33
id 'net.minecraftforge.gradleutils' version '2.+'
4-
id 'me.champeau.jmh' version '0.6.5'
5-
id 'org.javamodularity.moduleplugin' version '1.8.7' apply false
4+
id 'org.javamodularity.moduleplugin' version '1.8.11' apply false
65
}
76

87
apply plugin: 'java-library'
@@ -69,20 +68,20 @@ tasks.named('compileJava') {
6968
}
7069
}
7170

72-
jmh {
73-
benchmarkMode = ['avgt' ]
74-
profilers = [ 'stack', 'jfr:dir=./build/results/jmh/' ]
75-
timeOnIteration = '3s'
76-
warmup = '2s'
77-
warmupIterations = 3
78-
iterations = 3
79-
fork = 3
80-
timeUnit = 'us'
81-
// JMH loads the main sourceset without a module context, so add exports and opens for required stuff to all unnamed and disable the missing module crash
82-
jvmArgsPrepend = ['--add-opens java.base/java.util.jar=ALL-UNNAMED --add-exports java.base/sun.security.util=ALL-UNNAMED -Dsecurejarhandler.throwOnMissingModule=false']
83-
}
84-
85-
tasks['jmh'].dependsOn(clean)
71+
//jmh {
72+
// benchmarkMode = ['avgt' ]
73+
// profilers = [ 'stack', 'jfr:dir=./build/results/jmh/' ]
74+
// timeOnIteration = '3s'
75+
// warmup = '2s'
76+
// warmupIterations = 3
77+
// iterations = 3
78+
// fork = 3
79+
// timeUnit = 'us'
80+
// // JMH loads the main sourceset without a module context, so add exports and opens for required stuff to all unnamed and disable the missing module crash
81+
// jvmArgsPrepend = ['--add-opens java.base/java.util.jar=ALL-UNNAMED --add-exports java.base/sun.security.util=ALL-UNNAMED -Dsecurejarhandler.throwOnMissingModule=false']
82+
//}
83+
84+
//tasks['jmh'].dependsOn(clean)
8685

8786
jar {
8887
manifest {
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists

src/main/java/cpw/mods/cl/JarModuleFinder.java

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,12 @@
1818
import java.util.stream.Stream;
1919

2020
public class JarModuleFinder implements ModuleFinder {
21-
private final SecureJar[] jars;
2221
private final Map<String, ModuleReference> moduleReferenceMap;
2322

2423
JarModuleFinder(final SecureJar... jars) {
25-
this.jars = jars;
26-
record ref(SecureJar jar, ModuleReference ref) {}
24+
record ref(SecureJar.ModuleDataProvider jar, ModuleReference ref) {}
2725
this.moduleReferenceMap = Arrays.stream(jars)
28-
.map(jar->new ref(jar, new JarModuleReference((Jar)jar)))
26+
.map(jar->new ref(jar.moduleDataProvider(), new JarModuleReference(jar.moduleDataProvider())))
2927
.collect(Collectors.toMap(r->r.jar.name(), r->r.ref, (r1, r2)->r1));
3028
}
3129

@@ -44,10 +42,10 @@ public static JarModuleFinder of(SecureJar... jars) {
4442
}
4543

4644
static class JarModuleReference extends ModuleReference {
47-
private final Jar jar;
45+
private final SecureJar.ModuleDataProvider jar;
4846

49-
JarModuleReference(final Jar jar) {
50-
super(jar.computeDescriptor(), jar.getURI());
47+
JarModuleReference(final SecureJar.ModuleDataProvider jar) {
48+
super(jar.descriptor(), jar.uri());
5149
this.jar = jar;
5250
}
5351

@@ -56,15 +54,15 @@ public ModuleReader open() throws IOException {
5654
return new JarModuleReader(this.jar);
5755
}
5856

59-
public Jar jar() {
57+
public SecureJar.ModuleDataProvider jar() {
6058
return this.jar;
6159
}
6260
}
6361

6462
static class JarModuleReader implements ModuleReader {
65-
private final Jar jar;
63+
private final SecureJar.ModuleDataProvider jar;
6664

67-
public JarModuleReader(final Jar jar) {
65+
public JarModuleReader(final SecureJar.ModuleDataProvider jar) {
6866
this.jar = jar;
6967
}
7068

@@ -75,7 +73,7 @@ public Optional<URI> find(final String name) throws IOException {
7573

7674
@Override
7775
public Optional<InputStream> open(final String name) throws IOException {
78-
return jar.findFile(name).map(Paths::get).map(LambdaExceptionUtils.rethrowFunction(Files::newInputStream));
76+
return jar.open(name);
7977
}
8078

8179
@Override

src/main/java/cpw/mods/jarhandling/JarMetadata.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,13 @@ public interface JarMetadata {
3636
static JarMetadata from(final SecureJar jar, final Path... path) {
3737
if (path.length==0) throw new IllegalArgumentException("Need at least one path");
3838
final var pkgs = jar.getPackages();
39-
var mi = jar.findFile("module-info.class");
39+
var mi = jar.moduleDataProvider().findFile("module-info.class");
4040
if (mi.isPresent()) {
4141
return new ModuleJarMetadata(mi.get(), pkgs);
4242
} else {
4343
var providers = jar.getProviders();
4444
var fileCandidate = fromFileName(path[0], pkgs, providers);
45-
var aname = jar.getManifest().getMainAttributes().getValue("Automatic-Module-Name");
45+
var aname = jar.moduleDataProvider().getManifest().getMainAttributes().getValue("Automatic-Module-Name");
4646
if (aname != null) {
4747
return new SimpleJarMetadata(aname, fileCandidate.version(), pkgs, providers);
4848
} else {

src/main/java/cpw/mods/jarhandling/SecureJar.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
import cpw.mods.jarhandling.impl.Jar;
44

55
import java.io.IOException;
6+
import java.io.InputStream;
67
import java.io.UncheckedIOException;
8+
import java.lang.module.ModuleDescriptor;
79
import java.net.URI;
810
import java.nio.file.Files;
911
import java.nio.file.Path;
@@ -18,11 +20,21 @@
1820
import java.util.jar.Manifest;
1921

2022
public interface SecureJar {
21-
Path getPrimaryPath();
23+
interface ModuleDataProvider {
24+
String name();
25+
ModuleDescriptor descriptor();
26+
URI uri();
27+
Optional<URI> findFile(String name);
28+
Optional<InputStream> open(final String name);
29+
30+
Manifest getManifest();
2231

23-
Optional<URI> findFile(String name);
32+
CodeSigner[] verifyAndGetSigners(String cname, byte[] bytes);
33+
}
2434

25-
Manifest getManifest();
35+
ModuleDataProvider moduleDataProvider();
36+
37+
Path getPrimaryPath();
2638

2739
CodeSigner[] getManifestSigners();
2840

src/main/java/cpw/mods/jarhandling/impl/Jar.java

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,16 @@
44
import cpw.mods.jarhandling.SecureJar;
55
import cpw.mods.niofs.union.UnionFileSystem;
66
import cpw.mods.niofs.union.UnionFileSystemProvider;
7+
import cpw.mods.util.LambdaExceptionUtils;
78

89
import java.io.IOException;
10+
import java.io.InputStream;
911
import java.io.UncheckedIOException;
1012
import java.lang.module.ModuleDescriptor;
1113
import java.net.URI;
1214
import java.nio.file.Files;
1315
import java.nio.file.Path;
16+
import java.nio.file.Paths;
1417
import java.nio.file.spi.FileSystemProvider;
1518
import java.security.CodeSigner;
1619
import java.util.*;
@@ -36,6 +39,7 @@ public class Jar implements SecureJar {
3639
private final UnionFileSystem filesystem;
3740
private final boolean isMultiRelease;
3841
private final Map<Path, Integer> nameOverrides;
42+
private final JarModuleDataProvider moduleDataProvider;
3943
private Set<String> packages;
4044
private List<Provider> providers;
4145

@@ -47,12 +51,16 @@ public ModuleDescriptor computeDescriptor() {
4751
return metadata.descriptor();
4852
}
4953

54+
@Override
55+
public ModuleDataProvider moduleDataProvider() {
56+
return moduleDataProvider;
57+
}
58+
5059
@Override
5160
public Path getPrimaryPath() {
5261
return filesystem.getPrimaryPath();
5362
}
5463

55-
@Override
5664
public Optional<URI> findFile(final String name) {
5765
var rel = filesystem.getPath(name);
5866
if (this.nameOverrides.containsKey(rel)) {
@@ -72,6 +80,7 @@ public Jar(final Supplier<Manifest> defaultManifest, final Function<SecureJar, J
7280
var validPaths = Arrays.stream(paths).filter(Files::exists).toArray(Path[]::new);
7381
if (validPaths.length == 0)
7482
throw new UncheckedIOException(new IOException("Invalid paths argument, contained no existing paths: " + Arrays.toString(paths)));
83+
this.moduleDataProvider = new JarModuleDataProvider(this);
7584
this.filesystem = UFSP.newFileSystem(pathfilter, validPaths);
7685
try {
7786
Manifest mantmp = null;
@@ -134,7 +143,6 @@ public Jar(final Supplier<Manifest> defaultManifest, final Function<SecureJar, J
134143
this.metadata = metadataFunction.apply(this);
135144
}
136145

137-
@Override
138146
public Manifest getManifest() {
139147
return manifest;
140148
}
@@ -256,4 +264,41 @@ public Path getRootPath() {
256264
public String toString() {
257265
return "Jar[" + getURI() + "]";
258266
}
267+
268+
private record JarModuleDataProvider(Jar jar) implements ModuleDataProvider {
269+
@Override
270+
public String name() {
271+
return jar.name();
272+
}
273+
274+
@Override
275+
public ModuleDescriptor descriptor() {
276+
return jar.computeDescriptor();
277+
}
278+
279+
@Override
280+
public URI uri() {
281+
return jar.getURI();
282+
}
283+
284+
@Override
285+
public Optional<URI> findFile(final String name) {
286+
return jar.findFile(name);
287+
}
288+
289+
@Override
290+
public Optional<InputStream> open(final String name) {
291+
return jar.findFile(name).map(Paths::get).map(LambdaExceptionUtils.rethrowFunction(Files::newInputStream));
292+
}
293+
294+
@Override
295+
public Manifest getManifest() {
296+
return jar.getManifest();
297+
}
298+
299+
@Override
300+
public CodeSigner[] verifyAndGetSigners(final String cname, final byte[] bytes) {
301+
return jar.verifyAndGetSigners(cname, bytes);
302+
}
303+
}
259304
}

src/main/java/module-info.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
exports cpw.mods.niofs.union;
1010
requires jdk.unsupported;
1111
requires org.objectweb.asm;
12+
requires org.objectweb.asm.tree;
1213
requires java.base;
1314
provides java.nio.file.spi.FileSystemProvider with UnionFileSystemProvider;
1415
uses cpw.mods.cl.ModularURLHandler.IURLProvider;

0 commit comments

Comments
 (0)