⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jarfile.java

📁 gcc的组建
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
/* JarFile.java - Representation of a jar file   Copyright (C) 2000, 2003, 2004, 2005 Free Software Foundation, Inc.This file is part of GNU Classpath.GNU Classpath is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 2, or (at your option)any later version.GNU Classpath is distributed in the hope that it will be useful, butWITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNUGeneral Public License for more details.You should have received a copy of the GNU General Public Licensealong with GNU Classpath; see the file COPYING.  If not, write to theFree Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA02110-1301 USA.Linking this library statically or dynamically with other modules ismaking a combined work based on this library.  Thus, the terms andconditions of the GNU General Public License cover the wholecombination.As a special exception, the copyright holders of this library give youpermission to link this library with independent modules to produce anexecutable, regardless of the license terms of these independentmodules, and to copy and distribute the resulting executable underterms of your choice, provided that you also meet, for each linkedindependent module, the terms and conditions of the license of thatmodule.  An independent module is a module which is not derived fromor based on this library.  If you modify this library, you may extendthis exception to your version of the library, but you are notobligated to do so.  If you do not wish to do so, delete thisexception statement from your version. */package java.util.jar;import gnu.java.io.Base64InputStream;import gnu.java.security.OID;import gnu.java.security.pkcs.PKCS7SignedData;import gnu.java.security.pkcs.SignerInfo;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileNotFoundException;import java.io.FilterInputStream;import java.io.IOException;import java.io.InputStream;import java.security.InvalidKeyException;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.security.Signature;import java.security.SignatureException;import java.security.cert.CRLException;import java.security.cert.Certificate;import java.security.cert.CertificateException;import java.security.cert.X509Certificate;import java.util.Arrays;import java.util.Enumeration;import java.util.HashMap;import java.util.HashSet;import java.util.Iterator;import java.util.LinkedList;import java.util.List;import java.util.Map;import java.util.Set;import java.util.zip.ZipEntry;import java.util.zip.ZipException;import java.util.zip.ZipFile;/** * Representation of a jar file. * <p> * Note that this class is not a subclass of java.io.File but a subclass of * java.util.zip.ZipFile and you can only read JarFiles with it (although * there are constructors that take a File object). * * @since 1.2 * @author Mark Wielaard (mark@klomp.org) * @author Casey Marshall (csm@gnu.org) wrote the certificate and entry *  verification code. */public class JarFile extends ZipFile{  // Fields  /** The name of the manifest entry: META-INF/MANIFEST.MF */  public static final String MANIFEST_NAME = "META-INF/MANIFEST.MF";  /** The META-INF directory entry. */  private static final String META_INF = "META-INF/";  /** The suffix for PKCS7 DSA signature entries. */  private static final String PKCS7_DSA_SUFFIX = ".DSA";  /** The suffix for PKCS7 RSA signature entries. */  private static final String PKCS7_RSA_SUFFIX = ".RSA";  /** The suffix for digest attributes. */  private static final String DIGEST_KEY_SUFFIX = "-Digest";  /** The suffix for signature files. */  private static final String SF_SUFFIX = ".SF";  // Signature OIDs.  private static final OID MD2_OID = new OID("1.2.840.113549.2.2");  private static final OID MD4_OID = new OID("1.2.840.113549.2.4");  private static final OID MD5_OID = new OID("1.2.840.113549.2.5");  private static final OID SHA1_OID = new OID("1.3.14.3.2.26");  private static final OID DSA_ENCRYPTION_OID = new OID("1.2.840.10040.4.1");  private static final OID RSA_ENCRYPTION_OID = new OID("1.2.840.113549.1.1.1");  /**   * The manifest of this file, if any, otherwise null.   * Read when first needed.   */  private Manifest manifest;  /** Whether to verify the manifest and all entries. */  boolean verify;  /** Whether the has already been loaded. */  private boolean manifestRead = false;  /** Whether the signature files have been loaded. */  boolean signaturesRead = false;  /**   * A map between entry names and booleans, signaling whether or   * not that entry has been verified.   * Only be accessed with lock on this JarFile*/  HashMap verified = new HashMap();  /**   * A mapping from entry name to certificates, if any.   * Only accessed with lock on this JarFile.   */  HashMap entryCerts;  static boolean DEBUG = false;  static void debug(Object msg)  {    System.err.print(JarFile.class.getName());    System.err.print(" >>> ");    System.err.println(msg);  }  // Constructors  /**   * Creates a new JarFile. All jar entries are verified (when a Manifest file   * for this JarFile exists). You need to actually open and read the complete   * jar entry (with <code>getInputStream()</code>) to check its signature.   *   * @param fileName the name of the file to open   * @exception FileNotFoundException if the fileName cannot be found   * @exception IOException if another IO exception occurs while reading   */  public JarFile(String fileName) throws FileNotFoundException, IOException  {    this(fileName, true);  }  /**   * Creates a new JarFile. If verify is true then all jar entries are   * verified (when a Manifest file for this JarFile exists). You need to   * actually open and read the complete jar entry   * (with <code>getInputStream()</code>) to check its signature.   *   * @param fileName the name of the file to open   * @param verify checks manifest and entries when true and a manifest   * exists, when false no checks are made   * @exception FileNotFoundException if the fileName cannot be found   * @exception IOException if another IO exception occurs while reading   */  public JarFile(String fileName, boolean verify) throws    FileNotFoundException, IOException  {    super(fileName);    if (verify)      {	manifest = readManifest();	verify();      }  }  /**   * Creates a new JarFile. All jar entries are verified (when a Manifest file   * for this JarFile exists). You need to actually open and read the complete   * jar entry (with <code>getInputStream()</code>) to check its signature.   *   * @param file the file to open as a jar file   * @exception FileNotFoundException if the file does not exits   * @exception IOException if another IO exception occurs while reading   */  public JarFile(File file) throws FileNotFoundException, IOException  {    this(file, true);  }  /**   * Creates a new JarFile. If verify is true then all jar entries are   * verified (when a Manifest file for this JarFile exists). You need to   * actually open and read the complete jar entry   * (with <code>getInputStream()</code>) to check its signature.   *   * @param file the file to open to open as a jar file   * @param verify checks manifest and entries when true and a manifest   * exists, when false no checks are made   * @exception FileNotFoundException if file does not exist   * @exception IOException if another IO exception occurs while reading   */  public JarFile(File file, boolean verify) throws FileNotFoundException,    IOException  {    super(file);    if (verify)      {	manifest = readManifest();	verify();      }  }  /**   * Creates a new JarFile with the indicated mode. If verify is true then   * all jar entries are verified (when a Manifest file for this JarFile   * exists). You need to actually open and read the complete jar entry   * (with <code>getInputStream()</code>) to check its signature.   * manifest and if the manifest exists and verify is true verfies it.   *   * @param file the file to open to open as a jar file   * @param verify checks manifest and entries when true and a manifest   * exists, when false no checks are made   * @param mode either ZipFile.OPEN_READ or   *             (ZipFile.OPEN_READ | ZipFile.OPEN_DELETE)   * @exception FileNotFoundException if the file does not exist   * @exception IOException if another IO exception occurs while reading   * @exception IllegalArgumentException when given an illegal mode   *    * @since 1.3   */  public JarFile(File file, boolean verify, int mode) throws    FileNotFoundException, IOException, IllegalArgumentException  {    super(file, mode);    if (verify)      {	manifest = readManifest();	verify();      }  }  // Methods  /**   * XXX - should verify the manifest file   */  private void verify()  {    // only check if manifest is not null    if (manifest == null)      {	verify = false;	return;      }    verify = true;    // XXX - verify manifest  }  /**   * Parses and returns the manifest if it exists, otherwise returns null.   */  private Manifest readManifest()  {    try      {	ZipEntry manEntry = super.getEntry(MANIFEST_NAME);	if (manEntry != null)	  {	    InputStream in = super.getInputStream(manEntry);	    manifestRead = true;	    return new Manifest(in);	  }	else	  {	    manifestRead = true;	    return null;	  }      }    catch (IOException ioe)      {	manifestRead = true;	return null;      }  }  /**   * Returns a enumeration of all the entries in the JarFile.   * Note that also the Jar META-INF entries are returned.   *   * @exception IllegalStateException when the JarFile is already closed   */  public Enumeration entries() throws IllegalStateException  {    return new JarEnumeration(super.entries(), this);  }  /**   * Wraps a given Zip Entries Enumeration. For every zip entry a   * JarEntry is created and the corresponding Attributes are looked up.   */  private static class JarEnumeration implements Enumeration  {    private final Enumeration entries;    private final JarFile jarfile;    JarEnumeration(Enumeration e, JarFile f)    {      entries = e;      jarfile = f;    }    public boolean hasMoreElements()    {      return entries.hasMoreElements();    }    public Object nextElement()    {      ZipEntry zip = (ZipEntry) entries.nextElement();      JarEntry jar = new JarEntry(zip);      Manifest manifest;      try	{	  manifest = jarfile.getManifest();	}      catch (IOException ioe)	{	  manifest = null;	}      if (manifest != null)	{	  jar.attr = manifest.getAttributes(jar.getName());	}      synchronized(jarfile)	{	  if (jarfile.verify && !jarfile.signaturesRead)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -