1 /*
2  * Copyright (c) 2002, 2020, 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 sun.misc;
27 
28 import javax.crypto.SealedObject;
29 import java.util.jar.JarFile;
30 import java.io.Console;
31 import java.io.FileDescriptor;
32 import java.io.ObjectInputStream;
33 import java.security.ProtectionDomain;
34 import java.security.Signature;
35 
36 import java.security.AccessController;
37 
38 /** A repository of "shared secrets", which are a mechanism for
39     calling implementation-private methods in another package without
40     using reflection. A package-private class implements a public
41     interface and provides the ability to call package-private methods
42     within that package; the object implementing that interface is
43     provided through a third package to which access is restricted.
44     This framework avoids the primary disadvantage of using reflection
45     for this purpose, namely the loss of compile-time checking. */
46 
47 public class SharedSecrets {
48     private static final Unsafe unsafe = Unsafe.getUnsafe();
49     private static JavaUtilJarAccess javaUtilJarAccess;
50     private static JavaLangAccess javaLangAccess;
51     private static JavaLangRefAccess javaLangRefAccess;
52     private static JavaIOAccess javaIOAccess;
53     private static JavaNetAccess javaNetAccess;
54     private static JavaNetHttpCookieAccess javaNetHttpCookieAccess;
55     private static JavaNioAccess javaNioAccess;
56     private static JavaIOFileDescriptorAccess javaIOFileDescriptorAccess;
57     private static JavaSecurityProtectionDomainAccess javaSecurityProtectionDomainAccess;
58     private static JavaSecurityAccess javaSecurityAccess;
59     private static JavaUtilZipFileAccess javaUtilZipFileAccess;
60     private static JavaAWTAccess javaAWTAccess;
61     private static JavaOISAccess javaOISAccess;
62     private static JavaxCryptoSealedObjectAccess javaxCryptoSealedObjectAccess;
63     private static JavaObjectInputStreamReadString javaObjectInputStreamReadString;
64     private static JavaObjectInputStreamAccess javaObjectInputStreamAccess;
65     private static JavaSecuritySignatureAccess javaSecuritySignatureAccess;
66 
javaUtilJarAccess()67     public static JavaUtilJarAccess javaUtilJarAccess() {
68         if (javaUtilJarAccess == null) {
69             // Ensure JarFile is initialized; we know that that class
70             // provides the shared secret
71             unsafe.ensureClassInitialized(JarFile.class);
72         }
73         return javaUtilJarAccess;
74     }
75 
setJavaUtilJarAccess(JavaUtilJarAccess access)76     public static void setJavaUtilJarAccess(JavaUtilJarAccess access) {
77         javaUtilJarAccess = access;
78     }
79 
setJavaLangAccess(JavaLangAccess jla)80     public static void setJavaLangAccess(JavaLangAccess jla) {
81         javaLangAccess = jla;
82     }
83 
getJavaLangAccess()84     public static JavaLangAccess getJavaLangAccess() {
85         return javaLangAccess;
86     }
87 
setJavaLangRefAccess(JavaLangRefAccess jlra)88     public static void setJavaLangRefAccess(JavaLangRefAccess jlra) {
89         javaLangRefAccess = jlra;
90     }
91 
getJavaLangRefAccess()92     public static JavaLangRefAccess getJavaLangRefAccess() {
93         return javaLangRefAccess;
94     }
95 
setJavaNetAccess(JavaNetAccess jna)96     public static void setJavaNetAccess(JavaNetAccess jna) {
97         javaNetAccess = jna;
98     }
99 
getJavaNetAccess()100     public static JavaNetAccess getJavaNetAccess() {
101         return javaNetAccess;
102     }
103 
setJavaNetHttpCookieAccess(JavaNetHttpCookieAccess a)104     public static void setJavaNetHttpCookieAccess(JavaNetHttpCookieAccess a) {
105         javaNetHttpCookieAccess = a;
106     }
107 
getJavaNetHttpCookieAccess()108     public static JavaNetHttpCookieAccess getJavaNetHttpCookieAccess() {
109         if (javaNetHttpCookieAccess == null)
110             unsafe.ensureClassInitialized(java.net.HttpCookie.class);
111         return javaNetHttpCookieAccess;
112     }
113 
setJavaNioAccess(JavaNioAccess jna)114     public static void setJavaNioAccess(JavaNioAccess jna) {
115         javaNioAccess = jna;
116     }
117 
getJavaNioAccess()118     public static JavaNioAccess getJavaNioAccess() {
119         if (javaNioAccess == null) {
120             // Ensure java.nio.ByteOrder is initialized; we know that
121             // this class initializes java.nio.Bits that provides the
122             // shared secret.
123             unsafe.ensureClassInitialized(java.nio.ByteOrder.class);
124         }
125         return javaNioAccess;
126     }
127 
setJavaIOAccess(JavaIOAccess jia)128     public static void setJavaIOAccess(JavaIOAccess jia) {
129         javaIOAccess = jia;
130     }
131 
getJavaIOAccess()132     public static JavaIOAccess getJavaIOAccess() {
133         if (javaIOAccess == null) {
134             unsafe.ensureClassInitialized(Console.class);
135         }
136         return javaIOAccess;
137     }
138 
setJavaIOFileDescriptorAccess(JavaIOFileDescriptorAccess jiofda)139     public static void setJavaIOFileDescriptorAccess(JavaIOFileDescriptorAccess jiofda) {
140         javaIOFileDescriptorAccess = jiofda;
141     }
142 
getJavaIOFileDescriptorAccess()143     public static JavaIOFileDescriptorAccess getJavaIOFileDescriptorAccess() {
144         if (javaIOFileDescriptorAccess == null)
145             unsafe.ensureClassInitialized(FileDescriptor.class);
146 
147         return javaIOFileDescriptorAccess;
148     }
149 
setJavaOISAccess(JavaOISAccess access)150     public static void setJavaOISAccess(JavaOISAccess access) {
151         javaOISAccess = access;
152     }
153 
getJavaOISAccess()154     public static JavaOISAccess getJavaOISAccess() {
155         if (javaOISAccess == null)
156             unsafe.ensureClassInitialized(ObjectInputStream.class);
157 
158         return javaOISAccess;
159     }
160 
161 
setJavaSecurityProtectionDomainAccess(JavaSecurityProtectionDomainAccess jspda)162     public static void setJavaSecurityProtectionDomainAccess
163         (JavaSecurityProtectionDomainAccess jspda) {
164             javaSecurityProtectionDomainAccess = jspda;
165     }
166 
167     public static JavaSecurityProtectionDomainAccess
getJavaSecurityProtectionDomainAccess()168         getJavaSecurityProtectionDomainAccess() {
169             if (javaSecurityProtectionDomainAccess == null)
170                 unsafe.ensureClassInitialized(ProtectionDomain.class);
171             return javaSecurityProtectionDomainAccess;
172     }
173 
setJavaSecurityAccess(JavaSecurityAccess jsa)174     public static void setJavaSecurityAccess(JavaSecurityAccess jsa) {
175         javaSecurityAccess = jsa;
176     }
177 
getJavaSecurityAccess()178     public static JavaSecurityAccess getJavaSecurityAccess() {
179         if (javaSecurityAccess == null) {
180             unsafe.ensureClassInitialized(AccessController.class);
181         }
182         return javaSecurityAccess;
183     }
184 
getJavaUtilZipFileAccess()185     public static JavaUtilZipFileAccess getJavaUtilZipFileAccess() {
186         if (javaUtilZipFileAccess == null)
187             unsafe.ensureClassInitialized(java.util.zip.ZipFile.class);
188         return javaUtilZipFileAccess;
189     }
190 
setJavaUtilZipFileAccess(JavaUtilZipFileAccess access)191     public static void setJavaUtilZipFileAccess(JavaUtilZipFileAccess access) {
192         javaUtilZipFileAccess = access;
193     }
194 
setJavaAWTAccess(JavaAWTAccess jaa)195     public static void setJavaAWTAccess(JavaAWTAccess jaa) {
196         javaAWTAccess = jaa;
197     }
198 
getJavaAWTAccess()199     public static JavaAWTAccess getJavaAWTAccess() {
200         // this may return null in which case calling code needs to
201         // provision for.
202         if (javaAWTAccess == null) {
203             return null;
204         }
205         return javaAWTAccess;
206     }
207 
getJavaObjectInputStreamReadString()208     public static JavaObjectInputStreamReadString getJavaObjectInputStreamReadString() {
209         if (javaObjectInputStreamReadString == null) {
210             unsafe.ensureClassInitialized(ObjectInputStream.class);
211         }
212         return javaObjectInputStreamReadString;
213     }
214 
setJavaObjectInputStreamReadString(JavaObjectInputStreamReadString access)215     public static void setJavaObjectInputStreamReadString(JavaObjectInputStreamReadString access) {
216         javaObjectInputStreamReadString = access;
217     }
218 
getJavaObjectInputStreamAccess()219     public static JavaObjectInputStreamAccess getJavaObjectInputStreamAccess() {
220         if (javaObjectInputStreamAccess == null) {
221             unsafe.ensureClassInitialized(ObjectInputStream.class);
222         }
223         return javaObjectInputStreamAccess;
224     }
225 
setJavaObjectInputStreamAccess(JavaObjectInputStreamAccess access)226     public static void setJavaObjectInputStreamAccess(JavaObjectInputStreamAccess access) {
227         javaObjectInputStreamAccess = access;
228     }
229 
setJavaSecuritySignatureAccess(JavaSecuritySignatureAccess jssa)230     public static void setJavaSecuritySignatureAccess(JavaSecuritySignatureAccess jssa) {
231         javaSecuritySignatureAccess = jssa;
232     }
233 
getJavaSecuritySignatureAccess()234     public static JavaSecuritySignatureAccess getJavaSecuritySignatureAccess() {
235         if (javaSecuritySignatureAccess == null) {
236             unsafe.ensureClassInitialized(Signature.class);
237         }
238         return javaSecuritySignatureAccess;
239     }
240 
setJavaxCryptoSealedObjectAccess(JavaxCryptoSealedObjectAccess jcsoa)241     public static void setJavaxCryptoSealedObjectAccess(JavaxCryptoSealedObjectAccess jcsoa) {
242         javaxCryptoSealedObjectAccess = jcsoa;
243     }
244 
getJavaxCryptoSealedObjectAccess()245     public static JavaxCryptoSealedObjectAccess getJavaxCryptoSealedObjectAccess() {
246         if (javaxCryptoSealedObjectAccess == null) {
247             unsafe.ensureClassInitialized(SealedObject.class);
248         }
249         return javaxCryptoSealedObjectAccess;
250     }
251 }
252