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 JavaUtilJarAccess javaUtilJarAccess;
74     private static JavaUtilZipFileAccess javaUtilZipFileAccess;
75     private static JavaUtilResourceBundleAccess javaUtilResourceBundleAccess;
76     private static JavaSecurityAccess javaSecurityAccess;
77     private static JavaSecuritySignatureAccess javaSecuritySignatureAccess;
78     private static JavaxCryptoSealedObjectAccess javaxCryptoSealedObjectAccess;
79 
javaUtilJarAccess()80     public static JavaUtilJarAccess javaUtilJarAccess() {
81         if (javaUtilJarAccess == null) {
82             // Ensure JarFile is initialized; we know that this class
83             // provides the shared secret
84             ensureClassInitialized(JarFile.class);
85         }
86         return javaUtilJarAccess;
87     }
88 
setJavaUtilJarAccess(JavaUtilJarAccess access)89     public static void setJavaUtilJarAccess(JavaUtilJarAccess access) {
90         javaUtilJarAccess = access;
91     }
92 
setJavaLangAccess(JavaLangAccess jla)93     public static void setJavaLangAccess(JavaLangAccess jla) {
94         javaLangAccess = jla;
95     }
96 
getJavaLangAccess()97     public static JavaLangAccess getJavaLangAccess() {
98         return javaLangAccess;
99     }
100 
setJavaLangInvokeAccess(JavaLangInvokeAccess jlia)101     public static void setJavaLangInvokeAccess(JavaLangInvokeAccess jlia) {
102         javaLangInvokeAccess = jlia;
103     }
104 
getJavaLangInvokeAccess()105     public static JavaLangInvokeAccess getJavaLangInvokeAccess() {
106         if (javaLangInvokeAccess == null) {
107             try {
108                 Class.forName("java.lang.invoke.MethodHandleImpl", true, null);
109             } catch (ClassNotFoundException e) {};
110         }
111         return javaLangInvokeAccess;
112     }
113 
setJavaLangModuleAccess(JavaLangModuleAccess jlrma)114     public static void setJavaLangModuleAccess(JavaLangModuleAccess jlrma) {
115         javaLangModuleAccess = jlrma;
116     }
117 
getJavaLangModuleAccess()118     public static JavaLangModuleAccess getJavaLangModuleAccess() {
119         if (javaLangModuleAccess == null) {
120             ensureClassInitialized(ModuleDescriptor.class);
121         }
122         return javaLangModuleAccess;
123     }
124 
setJavaLangRefAccess(JavaLangRefAccess jlra)125     public static void setJavaLangRefAccess(JavaLangRefAccess jlra) {
126         javaLangRefAccess = jlra;
127     }
128 
getJavaLangRefAccess()129     public static JavaLangRefAccess getJavaLangRefAccess() {
130         return javaLangRefAccess;
131     }
132 
setJavaLangReflectAccess(JavaLangReflectAccess jlra)133     public static void setJavaLangReflectAccess(JavaLangReflectAccess jlra) {
134         javaLangReflectAccess = jlra;
135     }
136 
getJavaLangReflectAccess()137     public static JavaLangReflectAccess getJavaLangReflectAccess() {
138         return javaLangReflectAccess;
139     }
140 
setJavaNetUriAccess(JavaNetUriAccess jnua)141     public static void setJavaNetUriAccess(JavaNetUriAccess jnua) {
142         javaNetUriAccess = jnua;
143     }
144 
getJavaNetUriAccess()145     public static JavaNetUriAccess getJavaNetUriAccess() {
146         if (javaNetUriAccess == null)
147             ensureClassInitialized(java.net.URI.class);
148         return javaNetUriAccess;
149     }
150 
setJavaNetURLAccess(JavaNetURLAccess jnua)151     public static void setJavaNetURLAccess(JavaNetURLAccess jnua) {
152         javaNetURLAccess = jnua;
153     }
154 
getJavaNetURLAccess()155     public static JavaNetURLAccess getJavaNetURLAccess() {
156         if (javaNetURLAccess == null)
157             ensureClassInitialized(java.net.URL.class);
158         return javaNetURLAccess;
159     }
160 
setJavaNetInetAddressAccess(JavaNetInetAddressAccess jna)161     public static void setJavaNetInetAddressAccess(JavaNetInetAddressAccess jna) {
162         javaNetInetAddressAccess = jna;
163     }
164 
getJavaNetInetAddressAccess()165     public static JavaNetInetAddressAccess getJavaNetInetAddressAccess() {
166         if (javaNetInetAddressAccess == null)
167             ensureClassInitialized(java.net.InetAddress.class);
168         return javaNetInetAddressAccess;
169     }
170 
setJavaNetHttpCookieAccess(JavaNetHttpCookieAccess a)171     public static void setJavaNetHttpCookieAccess(JavaNetHttpCookieAccess a) {
172         javaNetHttpCookieAccess = a;
173     }
174 
getJavaNetHttpCookieAccess()175     public static JavaNetHttpCookieAccess getJavaNetHttpCookieAccess() {
176         if (javaNetHttpCookieAccess == null)
177             ensureClassInitialized(java.net.HttpCookie.class);
178         return javaNetHttpCookieAccess;
179     }
180 
setJavaNioAccess(JavaNioAccess jna)181     public static void setJavaNioAccess(JavaNioAccess jna) {
182         javaNioAccess = jna;
183     }
184 
getJavaNioAccess()185     public static JavaNioAccess getJavaNioAccess() {
186         if (javaNioAccess == null) {
187             // Ensure java.nio.Buffer is initialized, which provides the
188             // shared secret.
189             ensureClassInitialized(java.nio.Buffer.class);
190         }
191         return javaNioAccess;
192     }
193 
setJavaIOAccess(JavaIOAccess jia)194     public static void setJavaIOAccess(JavaIOAccess jia) {
195         javaIOAccess = jia;
196     }
197 
getJavaIOAccess()198     public static JavaIOAccess getJavaIOAccess() {
199         if (javaIOAccess == null) {
200             ensureClassInitialized(Console.class);
201         }
202         return javaIOAccess;
203     }
204 
setJavaIOFileDescriptorAccess(JavaIOFileDescriptorAccess jiofda)205     public static void setJavaIOFileDescriptorAccess(JavaIOFileDescriptorAccess jiofda) {
206         javaIOFileDescriptorAccess = jiofda;
207     }
208 
getJavaIOFilePermissionAccess()209     public static JavaIOFilePermissionAccess getJavaIOFilePermissionAccess() {
210         if (javaIOFilePermissionAccess == null)
211             ensureClassInitialized(FilePermission.class);
212 
213         return javaIOFilePermissionAccess;
214     }
215 
setJavaIOFilePermissionAccess(JavaIOFilePermissionAccess jiofpa)216     public static void setJavaIOFilePermissionAccess(JavaIOFilePermissionAccess jiofpa) {
217         javaIOFilePermissionAccess = jiofpa;
218     }
219 
getJavaIOFileDescriptorAccess()220     public static JavaIOFileDescriptorAccess getJavaIOFileDescriptorAccess() {
221         if (javaIOFileDescriptorAccess == null)
222             ensureClassInitialized(FileDescriptor.class);
223 
224         return javaIOFileDescriptorAccess;
225     }
226 
setJavaSecurityAccess(JavaSecurityAccess jsa)227     public static void setJavaSecurityAccess(JavaSecurityAccess jsa) {
228         javaSecurityAccess = jsa;
229     }
230 
getJavaSecurityAccess()231     public static JavaSecurityAccess getJavaSecurityAccess() {
232         if (javaSecurityAccess == null) {
233             ensureClassInitialized(ProtectionDomain.class);
234         }
235         return javaSecurityAccess;
236     }
237 
getJavaUtilZipFileAccess()238     public static JavaUtilZipFileAccess getJavaUtilZipFileAccess() {
239         if (javaUtilZipFileAccess == null)
240             ensureClassInitialized(java.util.zip.ZipFile.class);
241         return javaUtilZipFileAccess;
242     }
243 
setJavaUtilZipFileAccess(JavaUtilZipFileAccess access)244     public static void setJavaUtilZipFileAccess(JavaUtilZipFileAccess access) {
245         javaUtilZipFileAccess = access;
246     }
247 
setJavaAWTAccess(JavaAWTAccess jaa)248     public static void setJavaAWTAccess(JavaAWTAccess jaa) {
249         javaAWTAccess = jaa;
250     }
251 
getJavaAWTAccess()252     public static JavaAWTAccess getJavaAWTAccess() {
253         // this may return null in which case calling code needs to
254         // provision for.
255         return javaAWTAccess;
256     }
257 
setJavaAWTFontAccess(JavaAWTFontAccess jafa)258     public static void setJavaAWTFontAccess(JavaAWTFontAccess jafa) {
259         javaAWTFontAccess = jafa;
260     }
261 
getJavaAWTFontAccess()262     public static JavaAWTFontAccess getJavaAWTFontAccess() {
263         // this may return null in which case calling code needs to
264         // provision for.
265         return javaAWTFontAccess;
266     }
267 
getJavaBeansAccess()268     public static JavaBeansAccess getJavaBeansAccess() {
269         return javaBeansAccess;
270     }
271 
setJavaBeansAccess(JavaBeansAccess access)272     public static void setJavaBeansAccess(JavaBeansAccess access) {
273         javaBeansAccess = access;
274     }
275 
getJavaUtilResourceBundleAccess()276     public static JavaUtilResourceBundleAccess getJavaUtilResourceBundleAccess() {
277         if (javaUtilResourceBundleAccess == null)
278             ensureClassInitialized(ResourceBundle.class);
279         return javaUtilResourceBundleAccess;
280     }
281 
setJavaUtilResourceBundleAccess(JavaUtilResourceBundleAccess access)282     public static void setJavaUtilResourceBundleAccess(JavaUtilResourceBundleAccess access) {
283         javaUtilResourceBundleAccess = access;
284     }
285 
getJavaObjectInputStreamReadString()286     public static JavaObjectInputStreamReadString getJavaObjectInputStreamReadString() {
287         if (javaObjectInputStreamReadString == null) {
288             ensureClassInitialized(ObjectInputStream.class);
289         }
290         return javaObjectInputStreamReadString;
291     }
292 
setJavaObjectInputStreamReadString(JavaObjectInputStreamReadString access)293     public static void setJavaObjectInputStreamReadString(JavaObjectInputStreamReadString access) {
294         javaObjectInputStreamReadString = access;
295     }
296 
getJavaObjectInputStreamAccess()297     public static JavaObjectInputStreamAccess getJavaObjectInputStreamAccess() {
298         if (javaObjectInputStreamAccess == null) {
299             ensureClassInitialized(ObjectInputStream.class);
300         }
301         return javaObjectInputStreamAccess;
302     }
303 
setJavaObjectInputStreamAccess(JavaObjectInputStreamAccess access)304     public static void setJavaObjectInputStreamAccess(JavaObjectInputStreamAccess access) {
305         javaObjectInputStreamAccess = access;
306     }
307 
getJavaObjectInputFilterAccess()308     public static JavaObjectInputFilterAccess getJavaObjectInputFilterAccess() {
309         if (javaObjectInputFilterAccess == null) {
310             ensureClassInitialized(ObjectInputFilter.Config.class);
311         }
312         return javaObjectInputFilterAccess;
313     }
314 
setJavaObjectInputFilterAccess(JavaObjectInputFilterAccess access)315     public static void setJavaObjectInputFilterAccess(JavaObjectInputFilterAccess access) {
316         javaObjectInputFilterAccess = access;
317     }
318 
setJavaIORandomAccessFileAccess(JavaIORandomAccessFileAccess jirafa)319     public static void setJavaIORandomAccessFileAccess(JavaIORandomAccessFileAccess jirafa) {
320         javaIORandomAccessFileAccess = jirafa;
321     }
322 
getJavaIORandomAccessFileAccess()323     public static JavaIORandomAccessFileAccess getJavaIORandomAccessFileAccess() {
324         if (javaIORandomAccessFileAccess == null) {
325             ensureClassInitialized(RandomAccessFile.class);
326         }
327         return javaIORandomAccessFileAccess;
328     }
329 
setJavaSecuritySignatureAccess(JavaSecuritySignatureAccess jssa)330     public static void setJavaSecuritySignatureAccess(JavaSecuritySignatureAccess jssa) {
331         javaSecuritySignatureAccess = jssa;
332     }
333 
getJavaSecuritySignatureAccess()334     public static JavaSecuritySignatureAccess getJavaSecuritySignatureAccess() {
335         if (javaSecuritySignatureAccess == null) {
336             ensureClassInitialized(Signature.class);
337         }
338         return javaSecuritySignatureAccess;
339     }
340 
setJavaxCryptoSealedObjectAccess(JavaxCryptoSealedObjectAccess jcsoa)341     public static void setJavaxCryptoSealedObjectAccess(JavaxCryptoSealedObjectAccess jcsoa) {
342         javaxCryptoSealedObjectAccess = jcsoa;
343     }
344 
getJavaxCryptoSealedObjectAccess()345     public static JavaxCryptoSealedObjectAccess getJavaxCryptoSealedObjectAccess() {
346         if (javaxCryptoSealedObjectAccess == null) {
347             ensureClassInitialized(SealedObject.class);
348         }
349         return javaxCryptoSealedObjectAccess;
350     }
351 
ensureClassInitialized(Class<?> c)352     private static void ensureClassInitialized(Class<?> c) {
353         try {
354             MethodHandles.lookup().ensureInitialized(c);
355         } catch (IllegalAccessException e) {}
356     }
357 }
358