151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. 351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it 651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as 751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation. Oracle designates this 851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided 951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code. 1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT 1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that 1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code). 1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version 1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation, 1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any 2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions. 2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage sun.net.www.protocol.jar; 2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.*; 2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.net.*; 30e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmeraimport java.nio.file.Files; 31e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmeraimport java.nio.file.Path; 32e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmeraimport java.nio.file.StandardCopyOption; 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.*; 3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.jar.*; 3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.zip.ZipFile; 3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.zip.ZipEntry; 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.security.CodeSigner; 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.security.cert.Certificate; 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.security.AccessController; 4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.security.PrivilegedAction; 4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.security.PrivilegedExceptionAction; 4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.security.PrivilegedActionException; 4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.net.www.ParseUtil; 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* URL jar file is a common JarFile subtype used for JarURLConnection */ 4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic class URLJarFile extends JarFile { 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 4805b4a62c18b188328d483b7d3eeffa2199d7edb6Tobias Thierer// Android-changed: Removed setCallBack(URLJarFileCallBack) and field callback (dead code). 4905b4a62c18b188328d483b7d3eeffa2199d7edb6Tobias Thierer// /* 5005b4a62c18b188328d483b7d3eeffa2199d7edb6Tobias Thierer// * Interface to be able to call retrieve() in plugin if 5105b4a62c18b188328d483b7d3eeffa2199d7edb6Tobias Thierer// * this variable is set. 5205b4a62c18b188328d483b7d3eeffa2199d7edb6Tobias Thierer// */ 5305b4a62c18b188328d483b7d3eeffa2199d7edb6Tobias Thierer// private static URLJarFileCallBack callback = null; 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* Controller of the Jar File's closing */ 5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private URLJarFileCloseController closeController = null; 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static int BUF_SIZE = 2048; 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private Manifest superMan; 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private Attributes superAttr; 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private Map<String, Attributes> superEntries; 6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski static JarFile getJarFile(URL url) throws IOException { 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return getJarFile(url, null); 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski static JarFile getJarFile(URL url, URLJarFileCloseController closeController) throws IOException { 6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (isFileURL(url)) 7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return new URLJarFile(url, closeController); 7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski else { 7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return retrieve(url, closeController); 7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 76e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera /* 77e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera * Changed modifier from private to public in order to be able 78e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera * to instantiate URLJarFile from sun.plugin package. 79e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera */ 80e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera public URLJarFile(File file) throws IOException { 81e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera this(file, null); 82e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera } 83e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera 84e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera /* 85e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera * Changed modifier from private to public in order to be able 86e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera * to instantiate URLJarFile from sun.plugin package. 87e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera */ 88e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera public URLJarFile(File file, URLJarFileCloseController closeController) throws IOException { 89e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera super(file, true, ZipFile.OPEN_READ | ZipFile.OPEN_DELETE); 90e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera this.closeController = closeController; 91e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera } 92e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera 9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private URLJarFile(URL url, URLJarFileCloseController closeController) throws IOException { 9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski super(ParseUtil.decode(url.getFile())); 9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.closeController = closeController; 9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static boolean isFileURL(URL url) { 9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (url.getProtocol().equalsIgnoreCase("file")) { 10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* 10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Consider this a 'file' only if it's a LOCAL file, because 10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 'file:' URLs can be accessible through ftp. 10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String host = url.getHost(); 10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (host == null || host.equals("") || host.equals("~") || 10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski host.equalsIgnoreCase("localhost")) 10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return true; 10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* 11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * close the jar file. 11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected void finalize() throws IOException { 11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski close(); 11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the <code>ZipEntry</code> for the given entry name or 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>null</code> if not found. 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param name the JAR file entry name 12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the <code>ZipEntry</code> for the given entry name or 12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>null</code> if not found 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.util.zip.ZipEntry 12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public ZipEntry getEntry(String name) { 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ZipEntry ze = super.getEntry(name); 13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (ze != null) { 13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (ze instanceof JarEntry) 13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return new URLJarFileEntry((JarEntry)ze); 13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski else 13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new InternalError(super.getClass() + 13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski " returned unexpected entry type " + 13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ze.getClass()); 13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return null; 13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Manifest getManifest() throws IOException { 14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!isSuperMan()) { 14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return null; 14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Manifest man = new Manifest(); 14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Attributes attr = man.getMainAttributes(); 14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski attr.putAll((Map)superAttr.clone()); 15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // now deep copy the manifest entries 15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (superEntries != null) { 15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Map<String, Attributes> entries = man.getEntries(); 15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski for (String key : superEntries.keySet()) { 15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Attributes at = superEntries.get(key); 15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski entries.put(key, (Attributes) at.clone()); 15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return man; 16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* If close controller is set the notify the controller about the pending close */ 16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void close() throws IOException { 16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (closeController != null) { 16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski closeController.close(this); 16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski super.close(); 16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // optimal side-effects 17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private synchronized boolean isSuperMan() throws IOException { 17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (superMan == null) { 17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski superMan = super.getManifest(); 17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (superMan != null) { 17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski superAttr = superMan.getMainAttributes(); 18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski superEntries = superMan.getEntries(); 18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return true; 18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else 18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Given a URL, retrieves a JAR file, caches it to disk, and creates a 18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * cached JAR file object. 18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static JarFile retrieve(final URL url) throws IOException { 19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return retrieve(url, null); 19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Given a URL, retrieves a JAR file, caches it to disk, and creates a 19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * cached JAR file object. 19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static JarFile retrieve(final URL url, final URLJarFileCloseController closeController) throws IOException { 19905b4a62c18b188328d483b7d3eeffa2199d7edb6Tobias Thierer// Android-changed: Removed setCallBack(URLJarFileCallBack) and field callback (dead code). 20005b4a62c18b188328d483b7d3eeffa2199d7edb6Tobias Thierer// /* 20105b4a62c18b188328d483b7d3eeffa2199d7edb6Tobias Thierer// * See if interface is set, then call retrieve function of the class 20205b4a62c18b188328d483b7d3eeffa2199d7edb6Tobias Thierer// * that implements URLJarFileCallBack interface (sun.plugin - to 20305b4a62c18b188328d483b7d3eeffa2199d7edb6Tobias Thierer// * handle the cache failure for JARJAR file.) 20405b4a62c18b188328d483b7d3eeffa2199d7edb6Tobias Thierer// */ 20505b4a62c18b188328d483b7d3eeffa2199d7edb6Tobias Thierer// if (callback != null) 20605b4a62c18b188328d483b7d3eeffa2199d7edb6Tobias Thierer// { 20705b4a62c18b188328d483b7d3eeffa2199d7edb6Tobias Thierer// return callback.retrieve(url); 20805b4a62c18b188328d483b7d3eeffa2199d7edb6Tobias Thierer// } 20905b4a62c18b188328d483b7d3eeffa2199d7edb6Tobias Thierer// 21005b4a62c18b188328d483b7d3eeffa2199d7edb6Tobias Thierer// else 21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski { 212e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera 213e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera JarFile result = null; 214e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera 21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* get the stream before asserting privileges */ 21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try (final InputStream in = url.openConnection().getInputStream()) { 217e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera result = AccessController.doPrivileged( 218e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera new PrivilegedExceptionAction<JarFile>() { 219e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera public JarFile run() throws IOException { 220e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera Path tmpFile = Files.createTempFile("jar_cache", null); 221e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera try { 222e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera Files.copy(in, tmpFile, StandardCopyOption.REPLACE_EXISTING); 223e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera JarFile jarFile = new URLJarFile(tmpFile.toFile(), closeController); 224e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera tmpFile.toFile().deleteOnExit(); 225e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera return jarFile; 226e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera } catch (Throwable thr) { 227e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera try { 228e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera Files.delete(tmpFile); 229e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera } catch (IOException ioe) { 230e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera thr.addSuppressed(ioe); 231e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera } 232e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera throw thr; 233e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera } 234e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera } 235e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera }); 236e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera } catch (PrivilegedActionException pae) { 237e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera throw (IOException) pae.getException(); 23851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 240e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera return result; 24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 24405b4a62c18b188328d483b7d3eeffa2199d7edb6Tobias Thierer// Android-changed: Removed setCallBack(URLJarFileCallBack) and field callback (dead code). 24505b4a62c18b188328d483b7d3eeffa2199d7edb6Tobias Thierer// /* 24605b4a62c18b188328d483b7d3eeffa2199d7edb6Tobias Thierer// * Set the call back interface to call retrive function in sun.plugin 24705b4a62c18b188328d483b7d3eeffa2199d7edb6Tobias Thierer// * package if plugin is running. 24805b4a62c18b188328d483b7d3eeffa2199d7edb6Tobias Thierer// */ 24905b4a62c18b188328d483b7d3eeffa2199d7edb6Tobias Thierer// public static void setCallBack(URLJarFileCallBack cb) 25005b4a62c18b188328d483b7d3eeffa2199d7edb6Tobias Thierer// { 25105b4a62c18b188328d483b7d3eeffa2199d7edb6Tobias Thierer// callback = cb; 25205b4a62c18b188328d483b7d3eeffa2199d7edb6Tobias Thierer// } 25351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 25451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private class URLJarFileEntry extends JarEntry { 25551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private JarEntry je; 25651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 25751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski URLJarFileEntry(JarEntry je) { 25851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski super(je); 25951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.je=je; 26051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 26151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 26251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Attributes getAttributes() throws IOException { 26351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (URLJarFile.this.isSuperMan()) { 26451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Map<String, Attributes> e = URLJarFile.this.superEntries; 26551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (e != null) { 26651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Attributes a = e.get(getName()); 26751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (a != null) 26851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return (Attributes)a.clone(); 26951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 27051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 27151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return null; 27251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 27351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 27451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public java.security.cert.Certificate[] getCertificates() { 27551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Certificate[] certs = je.getCertificates(); 27651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return certs == null? null: certs.clone(); 27751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 27851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 27951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public CodeSigner[] getCodeSigners() { 28051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski CodeSigner[] csg = je.getCodeSigners(); 28151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return csg == null? null: csg.clone(); 28251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 28351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 28451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 28551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public interface URLJarFileCloseController { 28651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void close(JarFile jarFile); 28751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 28851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 289