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