1 /*
2  * Copyright (c) 2002, 2019, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.  Oracle designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Oracle in the LICENSE file that accompanied this code.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  * version 2 for more details (a copy is included in the LICENSE file that
15  * accompanied this code).
16  *
17  * You should have received a copy of the GNU General Public License version
18  * 2 along with this work; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * questions.
24  */
25 
26 package jdk.internal.access;
27 
28 import javax.crypto.SealedObject;
29 import java.io.ObjectInputFilter;
30 import java.lang.invoke.MethodHandles;
31 import java.lang.module.ModuleDescriptor;
32 import java.util.ResourceBundle;
33 import java.util.jar.JarFile;
34 import java.io.Console;
35 import java.io.FileDescriptor;
36 import java.io.FilePermission;
37 import java.io.ObjectInputStream;
38 import java.io.RandomAccessFile;
39 import java.security.ProtectionDomain;
40 import java.security.Signature;
41 
42 /** A repository of "shared secrets", which are a mechanism for
43     calling implementation-private methods in another package without
44     using reflection. A package-private class implements a public
45     interface and provides the ability to call package-private methods
46     within that package; the object implementing that interface is
47     provided through a third package to which access is restricted.
48     This framework avoids the primary disadvantage of using reflection
49     for this purpose, namely the loss of compile-time checking. */
50 
51 public class SharedSecrets {
52     private static final MethodHandles.Lookup lookup = MethodHandles.lookup();
53     private static JavaAWTAccess javaAWTAccess;
54     private static JavaAWTFontAccess javaAWTFontAccess;
55     private static JavaBeansAccess javaBeansAccess;
56     private static JavaLangAccess javaLangAccess;
57     private static JavaLangInvokeAccess javaLangInvokeAccess;
58     private static JavaLangModuleAccess javaLangModuleAccess;
59     private static JavaLangRefAccess javaLangRefAccess;
60     private static JavaLangReflectAccess javaLangReflectAccess;
61     private static JavaIOAccess javaIOAccess;
62     private static JavaIOFileDescriptorAccess javaIOFileDescriptorAccess;
63     private static JavaIOFilePermissionAccess javaIOFilePermissionAccess;
64     private static JavaIORandomAccessFileAccess javaIORandomAccessFileAccess;
65     private static JavaObjectInputStreamReadString javaObjectInputStreamReadString;
66     private static JavaObjectInputStreamAccess javaObjectInputStreamAccess;
67     private static JavaObjectInputFilterAccess javaObjectInputFilterAccess;
68     private static JavaNetInetAddressAccess javaNetInetAddressAccess;
69     private static JavaNetHttpCookieAccess javaNetHttpCookieAccess;
70     private static JavaNetUriAccess javaNetUriAccess;
71     private static JavaNetURLAccess javaNetURLAccess;
72     private static JavaNioAccess javaNioAccess;
73     private static JavaUtilCollectionAccess javaUtilCollectionAccess;
74     private static JavaUtilJarAccess javaUtilJarAccess;
75     private static JavaUtilZipFileAccess javaUtilZipFileAccess;
76     private static JavaUtilResourceBundleAccess javaUtilResourceBundleAccess;
77     private static JavaSecurityAccess javaSecurityAccess;
78     private static JavaSecuritySignatureAccess javaSecuritySignatureAccess;
79     private static JavaxCryptoSealedObjectAccess javaxCryptoSealedObjectAccess;
80 
setJavaUtilCollectionAccess(JavaUtilCollectionAccess juca)81     public static void setJavaUtilCollectionAccess(JavaUtilCollectionAccess juca) {
82         javaUtilCollectionAccess = juca;
83     }
84 
getJavaUtilCollectionAccess()85     public static JavaUtilCollectionAccess getJavaUtilCollectionAccess() {
86         if (javaUtilCollectionAccess == null) {
87             try {
88                 Class.forName("java.util.ImmutableCollections$Access", true, null);
89             } catch (ClassNotFoundException e) {};
90         }
91         return javaUtilCollectionAccess;
92     }
93 
javaUtilJarAccess()94     public static JavaUtilJarAccess javaUtilJarAccess() {
95         if (javaUtilJarAccess == null) {
96             // Ensure JarFile is initialized; we know that this class
97             // provides the shared secret
98             ensureClassInitialized(JarFile.class);
99         }
100         return javaUtilJarAccess;
101     }
102 
setJavaUtilJarAccess(JavaUtilJarAccess access)103     public static void setJavaUtilJarAccess(JavaUtilJarAccess access) {
104         javaUtilJarAccess = access;
105     }
106 
setJavaLangAccess(JavaLangAccess jla)107     public static void setJavaLangAccess(JavaLangAccess jla) {
108         javaLangAccess = jla;
109     }
110 
getJavaLangAccess()111     public static JavaLangAccess getJavaLangAccess() {
112         return javaLangAccess;
113     }
114 
setJavaLangInvokeAccess(JavaLangInvokeAccess jlia)115     public static void setJavaLangInvokeAccess(JavaLangInvokeAccess jlia) {
116         javaLangInvokeAccess = jlia;
117     }
118 
getJavaLangInvokeAccess()119     public static JavaLangInvokeAccess getJavaLangInvokeAccess() {
120         if (javaLangInvokeAccess == null) {
121             try {
122                 Class.forName("java.lang.invoke.MethodHandleImpl", true, null);
123             } catch (ClassNotFoundException e) {};
124         }
125         return javaLangInvokeAccess;
126     }
127 
setJavaLangModuleAccess(JavaLangModuleAccess jlrma)128     public static void setJavaLangModuleAccess(JavaLangModuleAccess jlrma) {
129         javaLangModuleAccess = jlrma;
130     }
131 
getJavaLangModuleAccess()132     public static JavaLangModuleAccess getJavaLangModuleAccess() {
133         if (javaLangModuleAccess == null) {
134             ensureClassInitialized(ModuleDescriptor.class);
135         }
136         return javaLangModuleAccess;
137     }
138 
setJavaLangRefAccess(JavaLangRefAccess jlra)139     public static void setJavaLangRefAccess(JavaLangRefAccess jlra) {
140         javaLangRefAccess = jlra;
141     }
142 
getJavaLangRefAccess()143     public static JavaLangRefAccess getJavaLangRefAccess() {
144         return javaLangRefAccess;
145     }
146 
setJavaLangReflectAccess(JavaLangReflectAccess jlra)147     public static void setJavaLangReflectAccess(JavaLangReflectAccess jlra) {
148         javaLangReflectAccess = jlra;
149     }
150 
getJavaLangReflectAccess()151     public static JavaLangReflectAccess getJavaLangReflectAccess() {
152         return javaLangReflectAccess;
153     }
154 
setJavaNetUriAccess(JavaNetUriAccess jnua)155     public static void setJavaNetUriAccess(JavaNetUriAccess jnua) {
156         javaNetUriAccess = jnua;
157     }
158 
getJavaNetUriAccess()159     public static JavaNetUriAccess getJavaNetUriAccess() {
160         if (javaNetUriAccess == null)
161             ensureClassInitialized(java.net.URI.class);
162         return javaNetUriAccess;
163     }
164 
setJavaNetURLAccess(JavaNetURLAccess jnua)165     public static void setJavaNetURLAccess(JavaNetURLAccess jnua) {
166         javaNetURLAccess = jnua;
167     }
168 
getJavaNetURLAccess()169     public static JavaNetURLAccess getJavaNetURLAccess() {
170         if (javaNetURLAccess == null)
171             ensureClassInitialized(java.net.URL.class);
172         return javaNetURLAccess;
173     }
174 
setJavaNetInetAddressAccess(JavaNetInetAddressAccess jna)175     public static void setJavaNetInetAddressAccess(JavaNetInetAddressAccess jna) {
176         javaNetInetAddressAccess = jna;
177     }
178 
getJavaNetInetAddressAccess()179     public static JavaNetInetAddressAccess getJavaNetInetAddressAccess() {
180         if (javaNetInetAddressAccess == null)
181             ensureClassInitialized(java.net.InetAddress.class);
182         return javaNetInetAddressAccess;
183     }
184 
setJavaNetHttpCookieAccess(JavaNetHttpCookieAccess a)185     public static void setJavaNetHttpCookieAccess(JavaNetHttpCookieAccess a) {
186         javaNetHttpCookieAccess = a;
187     }
188 
getJavaNetHttpCookieAccess()189     public static JavaNetHttpCookieAccess getJavaNetHttpCookieAccess() {
190         if (javaNetHttpCookieAccess == null)
191             ensureClassInitialized(java.net.HttpCookie.class);
192         return javaNetHttpCookieAccess;
193     }
194 
setJavaNioAccess(JavaNioAccess jna)195     public static void setJavaNioAccess(JavaNioAccess jna) {
196         javaNioAccess = jna;
197     }
198 
getJavaNioAccess()199     public static JavaNioAccess getJavaNioAccess() {
200         if (javaNioAccess == null) {
201             // Ensure java.nio.Buffer is initialized, which provides the
202             // shared secret.
203             ensureClassInitialized(java.nio.Buffer.class);
204         }
205         return javaNioAccess;
206     }
207 
setJavaIOAccess(JavaIOAccess jia)208     public static void setJavaIOAccess(JavaIOAccess jia) {
209         javaIOAccess = jia;
210     }
211 
getJavaIOAccess()212     public static JavaIOAccess getJavaIOAccess() {
213         if (javaIOAccess == null) {
214             ensureClassInitialized(Console.class);
215         }
216         return javaIOAccess;
217     }
218 
setJavaIOFileDescriptorAccess(JavaIOFileDescriptorAccess jiofda)219     public static void setJavaIOFileDescriptorAccess(JavaIOFileDescriptorAccess jiofda) {
220         javaIOFileDescriptorAccess = jiofda;
221     }
222 
getJavaIOFilePermissionAccess()223     public static JavaIOFilePermissionAccess getJavaIOFilePermissionAccess() {
224         if (javaIOFilePermissionAccess == null)
225             ensureClassInitialized(FilePermission.class);
226 
227         return javaIOFilePermissionAccess;
228     }
229 
setJavaIOFilePermissionAccess(JavaIOFilePermissionAccess jiofpa)230     public static void setJavaIOFilePermissionAccess(JavaIOFilePermissionAccess jiofpa) {
231         javaIOFilePermissionAccess = jiofpa;
232     }
233 
getJavaIOFileDescriptorAccess()234     public static JavaIOFileDescriptorAccess getJavaIOFileDescriptorAccess() {
235         if (javaIOFileDescriptorAccess == null)
236             ensureClassInitialized(FileDescriptor.class);
237 
238         return javaIOFileDescriptorAccess;
239     }
240 
setJavaSecurityAccess(JavaSecurityAccess jsa)241     public static void setJavaSecurityAccess(JavaSecurityAccess jsa) {
242         javaSecurityAccess = jsa;
243     }
244 
getJavaSecurityAccess()245     public static JavaSecurityAccess getJavaSecurityAccess() {
246         if (javaSecurityAccess == null) {
247             ensureClassInitialized(ProtectionDomain.class);
248         }
249         return javaSecurityAccess;
250     }
251 
getJavaUtilZipFileAccess()252     public static JavaUtilZipFileAccess getJavaUtilZipFileAccess() {
253         if (javaUtilZipFileAccess == null)
254             ensureClassInitialized(java.util.zip.ZipFile.class);
255         return javaUtilZipFileAccess;
256     }
257 
setJavaUtilZipFileAccess(JavaUtilZipFileAccess access)258     public static void setJavaUtilZipFileAccess(JavaUtilZipFileAccess access) {
259         javaUtilZipFileAccess = access;
260     }
261 
setJavaAWTAccess(JavaAWTAccess jaa)262     public static void setJavaAWTAccess(JavaAWTAccess jaa) {
263         javaAWTAccess = jaa;
264     }
265 
getJavaAWTAccess()266     public static JavaAWTAccess getJavaAWTAccess() {
267         // this may return null in which case calling code needs to
268         // provision for.
269         return javaAWTAccess;
270     }
271 
setJavaAWTFontAccess(JavaAWTFontAccess jafa)272     public static void setJavaAWTFontAccess(JavaAWTFontAccess jafa) {
273         javaAWTFontAccess = jafa;
274     }
275 
getJavaAWTFontAccess()276     public static JavaAWTFontAccess getJavaAWTFontAccess() {
277         // this may return null in which case calling code needs to
278         // provision for.
279         return javaAWTFontAccess;
280     }
281 
getJavaBeansAccess()282     public static JavaBeansAccess getJavaBeansAccess() {
283         return javaBeansAccess;
284     }
285 
setJavaBeansAccess(JavaBeansAccess access)286     public static void setJavaBeansAccess(JavaBeansAccess access) {
287         javaBeansAccess = access;
288     }
289 
getJavaUtilResourceBundleAccess()290     public static JavaUtilResourceBundleAccess getJavaUtilResourceBundleAccess() {
291         if (javaUtilResourceBundleAccess == null)
292             ensureClassInitialized(ResourceBundle.class);
293         return javaUtilResourceBundleAccess;
294     }
295 
setJavaUtilResourceBundleAccess(JavaUtilResourceBundleAccess access)296     public static void setJavaUtilResourceBundleAccess(JavaUtilResourceBundleAccess access) {
297         javaUtilResourceBundleAccess = access;
298     }
299 
getJavaObjectInputStreamReadString()300     public static JavaObjectInputStreamReadString getJavaObjectInputStreamReadString() {
301         if (javaObjectInputStreamReadString == null) {
302             ensureClassInitialized(ObjectInputStream.class);
303         }
304         return javaObjectInputStreamReadString;
305     }
306 
setJavaObjectInputStreamReadString(JavaObjectInputStreamReadString access)307     public static void setJavaObjectInputStreamReadString(JavaObjectInputStreamReadString access) {
308         javaObjectInputStreamReadString = access;
309     }
310 
getJavaObjectInputStreamAccess()311     public static JavaObjectInputStreamAccess getJavaObjectInputStreamAccess() {
312         if (javaObjectInputStreamAccess == null) {
313             ensureClassInitialized(ObjectInputStream.class);
314         }
315         return javaObjectInputStreamAccess;
316     }
317 
setJavaObjectInputStreamAccess(JavaObjectInputStreamAccess access)318     public static void setJavaObjectInputStreamAccess(JavaObjectInputStreamAccess access) {
319         javaObjectInputStreamAccess = access;
320     }
321 
getJavaObjectInputFilterAccess()322     public static JavaObjectInputFilterAccess getJavaObjectInputFilterAccess() {
323         if (javaObjectInputFilterAccess == null) {
324             ensureClassInitialized(ObjectInputFilter.Config.class);
325         }
326         return javaObjectInputFilterAccess;
327     }
328 
setJavaObjectInputFilterAccess(JavaObjectInputFilterAccess access)329     public static void setJavaObjectInputFilterAccess(JavaObjectInputFilterAccess access) {
330         javaObjectInputFilterAccess = access;
331     }
332 
setJavaIORandomAccessFileAccess(JavaIORandomAccessFileAccess jirafa)333     public static void setJavaIORandomAccessFileAccess(JavaIORandomAccessFileAccess jirafa) {
334         javaIORandomAccessFileAccess = jirafa;
335     }
336 
getJavaIORandomAccessFileAccess()337     public static JavaIORandomAccessFileAccess getJavaIORandomAccessFileAccess() {
338         if (javaIORandomAccessFileAccess == null) {
339             ensureClassInitialized(RandomAccessFile.class);
340         }
341         return javaIORandomAccessFileAccess;
342     }
343 
setJavaSecuritySignatureAccess(JavaSecuritySignatureAccess jssa)344     public static void setJavaSecuritySignatureAccess(JavaSecuritySignatureAccess jssa) {
345         javaSecuritySignatureAccess = jssa;
346     }
347 
getJavaSecuritySignatureAccess()348     public static JavaSecuritySignatureAccess getJavaSecuritySignatureAccess() {
349         if (javaSecuritySignatureAccess == null) {
350             ensureClassInitialized(Signature.class);
351         }
352         return javaSecuritySignatureAccess;
353     }
354 
setJavaxCryptoSealedObjectAccess(JavaxCryptoSealedObjectAccess jcsoa)355     public static void setJavaxCryptoSealedObjectAccess(JavaxCryptoSealedObjectAccess jcsoa) {
356         javaxCryptoSealedObjectAccess = jcsoa;
357     }
358 
getJavaxCryptoSealedObjectAccess()359     public static JavaxCryptoSealedObjectAccess getJavaxCryptoSealedObjectAccess() {
360         if (javaxCryptoSealedObjectAccess == null) {
361             ensureClassInitialized(SealedObject.class);
362         }
363         return javaxCryptoSealedObjectAccess;
364     }
365 
ensureClassInitialized(Class<?> c)366     private static void ensureClassInitialized(Class<?> c) {
367         try {
368             MethodHandles.lookup().ensureInitialized(c);
369         } catch (IllegalAccessException e) {}
370     }
371 }
372