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