24
24
import sun .security .util .ManifestEntryVerifier ;
25
25
26
26
import javax .annotation .Nullable ;
27
+
28
+ import java .lang .reflect .Constructor ;
27
29
import java .lang .reflect .Field ;
28
30
import java .lang .reflect .InvocationTargetException ;
29
31
import java .lang .reflect .Method ;
30
32
import java .net .URL ;
31
33
import java .security .*;
32
34
import java .util .HashMap ;
33
35
import java .util .Map ;
36
+ import java .util .function .Function ;
34
37
import java .util .jar .JarEntry ;
38
+ import java .util .jar .JarFile ;
35
39
import java .util .jar .Manifest ;
36
40
37
41
import static cpw .mods .modlauncher .LogMarkers .CLASSLOADING ;
@@ -41,6 +45,7 @@ public class SecureJarHandler {
41
45
private static final Method BEGIN_ENTRY = LamdbaExceptionUtils .uncheck (()->JVCLASS .getMethod ("beginEntry" , JarEntry .class , ManifestEntryVerifier .class ));
42
46
private static final Method UPDATE = LamdbaExceptionUtils .uncheck (()->JVCLASS .getMethod ("update" , int .class , byte [].class , int .class , int .class , ManifestEntryVerifier .class ));
43
47
private static final Field JV ;
48
+ private static final Function <Manifest , ManifestEntryVerifier > MEV_FACTORY ;
44
49
static {
45
50
Field jv ;
46
51
try {
@@ -52,7 +57,23 @@ public class SecureJarHandler {
52
57
LogManager .getLogger ().warn ("LEGACY JDK DETECTED, SECURED JAR HANDLING DISABLED" );
53
58
jv = null ;
54
59
}
60
+
61
+ Function <Manifest , ManifestEntryVerifier > mevFactory ;
62
+ try {
63
+ Constructor <ManifestEntryVerifier > mevConstructor = ManifestEntryVerifier .class .getConstructor (Manifest .class , String .class );
64
+ mevFactory = LamdbaExceptionUtils .rethrowFunction ((manifest ) -> mevConstructor .newInstance (manifest , JarFile .MANIFEST_NAME ));
65
+ } catch (NoSuchMethodException e ) {
66
+ try {
67
+ Constructor <ManifestEntryVerifier > mevConstructor = ManifestEntryVerifier .class .getConstructor (Manifest .class );
68
+ mevFactory = LamdbaExceptionUtils .rethrowFunction ((manifest ) -> mevConstructor .newInstance (manifest ));
69
+ } catch (NoSuchMethodException e2 ) {
70
+ mevFactory = null ;
71
+ jv = null ;
72
+ }
73
+ }
74
+
55
75
JV = jv ;
76
+ MEV_FACTORY = mevFactory ;
56
77
}
57
78
58
79
@@ -63,7 +84,7 @@ public static CodeSource createCodeSource(final String name, @Nullable final URL
63
84
if (manifest == null ) return null ;
64
85
if (url == null ) return null ;
65
86
JarEntry je = new JarEntry (name );
66
- ManifestEntryVerifier mev = new ManifestEntryVerifier (manifest );
87
+ ManifestEntryVerifier mev = MEV_FACTORY . apply (manifest );
67
88
Object obj = LamdbaExceptionUtils .uncheck (()->JV .get (manifest ));
68
89
if (obj == null ) {
69
90
// we don't have a fully fledged manifest with security info, for some reason (likely loaded by default JAR code, rather than our stuff)
0 commit comments