Imported GNU Classpath 0.90
Imported GNU Classpath 0.90
* scripts/makemake.tcl: LocaleData.java moved to gnu/java/locale.
* sources.am: Regenerated.
* gcj/javaprims.h: Regenerated.
* Makefile.in: Regenerated.
* gcj/Makefile.in: Regenerated.
* include/Makefile.in: Regenerated.
* testsuite/Makefile.in: Regenerated.
* gnu/java/lang/VMInstrumentationImpl.java: New override.
* gnu/java/net/local/LocalSocketImpl.java: Likewise.
* gnu/classpath/jdwp/VMMethod.java: Likewise.
* gnu/classpath/jdwp/VMVirtualMachine.java: Update to latest
interface.
* java/lang/Thread.java: Add UncaughtExceptionHandler.
* java/lang/reflect/Method.java: Implements GenericDeclaration and
isSynthetic(),
* java/lang/reflect/Field.java: Likewise.
* java/lang/reflect/Constructor.java
* java/lang/Class.java: Implements Type, GenericDeclaration,
getSimpleName() and getEnclosing*() methods.
* java/lang/Class.h: Add new public methods.
* java/lang/Math.java: Add signum(), ulp() and log10().
* java/lang/natMath.cc (log10): New function.
* java/security/VMSecureRandom.java: New override.
* java/util/logging/Logger.java: Updated to latest classpath
version.
* java/util/logging/LogManager.java: New override.
From-SVN: r113887
This commit is contained in:
@@ -37,6 +37,8 @@ exception statement from your version. */
|
||||
|
||||
package java.util.jar;
|
||||
|
||||
import gnu.java.util.jar.JarUtils;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Hashtable;
|
||||
import java.util.Map;
|
||||
@@ -65,7 +67,8 @@ import java.util.Set;
|
||||
* @see java.util.jar.Attributes.Name
|
||||
* @author Mark Wielaard (mark@klomp.org)
|
||||
*/
|
||||
public class Attributes implements Cloneable, Map
|
||||
public class Attributes
|
||||
implements Cloneable, java.util.Map // Fully qualified for jikes 1.22
|
||||
{
|
||||
|
||||
// Fields
|
||||
@@ -121,14 +124,13 @@ public class Attributes implements Cloneable, Map
|
||||
* General main attribute -
|
||||
* the version of this Manifest file.
|
||||
*/
|
||||
public static final Name MANIFEST_VERSION = new Name("Manifest-Version");
|
||||
public static final Name MANIFEST_VERSION = new Name(JarUtils.MANIFEST_VERSION);
|
||||
|
||||
/**
|
||||
* General main attribute -
|
||||
* the version of the jar file signature.
|
||||
*/
|
||||
public static final Name SIGNATURE_VERSION
|
||||
= new Name("Signature-Version");
|
||||
public static final Name SIGNATURE_VERSION = new Name(JarUtils.SIGNATURE_VERSION);
|
||||
|
||||
/**
|
||||
* General main attribute -
|
||||
@@ -433,7 +435,7 @@ public class Attributes implements Cloneable, Map
|
||||
* @returns the old value of the attribute name or null if it didn't exist
|
||||
* yet
|
||||
*/
|
||||
public String putValue(Name name, String value)
|
||||
private String putValue(Name name, String value)
|
||||
{
|
||||
return (String) put(name, value);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* JarFile.java - Representation of a jar file
|
||||
Copyright (C) 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
|
||||
Copyright (C) 2000, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GNU Classpath.
|
||||
|
||||
@@ -42,6 +42,7 @@ import gnu.java.io.Base64InputStream;
|
||||
import gnu.java.security.OID;
|
||||
import gnu.java.security.pkcs.PKCS7SignedData;
|
||||
import gnu.java.security.pkcs.SignerInfo;
|
||||
import gnu.java.security.provider.Gnu;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
@@ -105,6 +106,14 @@ public class JarFile extends ZipFile
|
||||
/** The suffix for signature files. */
|
||||
private static final String SF_SUFFIX = ".SF";
|
||||
|
||||
/**
|
||||
* The security provider to use for signature verification.
|
||||
* We need a known fallback to be able to read any signed jar file
|
||||
* (which might contain the user selected security provider).
|
||||
* This is package-private to avoid accessor methods for inner classes.
|
||||
*/
|
||||
static final Gnu provider = new Gnu();
|
||||
|
||||
// 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");
|
||||
@@ -636,19 +645,19 @@ public class JarFile extends ZipFile
|
||||
{
|
||||
if (!signerInfo.getDigestAlgorithmId().equals(SHA1_OID))
|
||||
return;
|
||||
sig = Signature.getInstance("SHA1withDSA");
|
||||
sig = Signature.getInstance("SHA1withDSA", provider);
|
||||
}
|
||||
else if (alg.equals(RSA_ENCRYPTION_OID))
|
||||
{
|
||||
OID hash = signerInfo.getDigestAlgorithmId();
|
||||
if (hash.equals(MD2_OID))
|
||||
sig = Signature.getInstance("md2WithRsaEncryption");
|
||||
sig = Signature.getInstance("md2WithRsaEncryption", provider);
|
||||
else if (hash.equals(MD4_OID))
|
||||
sig = Signature.getInstance("md4WithRsaEncryption");
|
||||
sig = Signature.getInstance("md4WithRsaEncryption", provider);
|
||||
else if (hash.equals(MD5_OID))
|
||||
sig = Signature.getInstance("md5WithRsaEncryption");
|
||||
sig = Signature.getInstance("md5WithRsaEncryption", provider);
|
||||
else if (hash.equals(SHA1_OID))
|
||||
sig = Signature.getInstance("sha1WithRsaEncryption");
|
||||
sig = Signature.getInstance("sha1WithRsaEncryption", provider);
|
||||
else
|
||||
return;
|
||||
}
|
||||
@@ -756,7 +765,7 @@ public class JarFile extends ZipFile
|
||||
try
|
||||
{
|
||||
byte[] hash = Base64InputStream.decode((String) e.getValue());
|
||||
MessageDigest md = MessageDigest.getInstance(alg);
|
||||
MessageDigest md = MessageDigest.getInstance(alg, provider);
|
||||
md.update(entryBytes);
|
||||
byte[] hash2 = md.digest();
|
||||
if (DEBUG)
|
||||
@@ -939,8 +948,9 @@ public class JarFile extends ZipFile
|
||||
hashes.add(Base64InputStream.decode((String) e.getValue()));
|
||||
try
|
||||
{
|
||||
md.add(MessageDigest.getInstance
|
||||
(key.substring(0, key.length() - DIGEST_KEY_SUFFIX.length())));
|
||||
int length = key.length() - DIGEST_KEY_SUFFIX.length();
|
||||
String alg = key.substring(0, length);
|
||||
md.add(MessageDigest.getInstance(alg, provider));
|
||||
}
|
||||
catch (NoSuchAlgorithmException nsae)
|
||||
{
|
||||
|
||||
@@ -37,16 +37,12 @@ exception statement from your version. */
|
||||
|
||||
package java.util.jar;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.BufferedWriter;
|
||||
import gnu.java.util.jar.JarUtils;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.OutputStream;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.io.PrintWriter;
|
||||
import java.util.Hashtable;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
@@ -156,282 +152,27 @@ public class Manifest implements Cloneable
|
||||
}
|
||||
|
||||
/**
|
||||
* XXX
|
||||
* Read and merge a <code>Mainfest</code> from the designated input stream.
|
||||
*
|
||||
* @param in the input stream to read from.
|
||||
* @throws IOException if an I/O related exception occurs during the process.
|
||||
*/
|
||||
public void read(InputStream in) throws IOException
|
||||
{
|
||||
BufferedReader br =
|
||||
new BufferedReader(new InputStreamReader(in, "8859_1"));
|
||||
read_main_section(getMainAttributes(), br);
|
||||
read_individual_sections(getEntries(), br);
|
||||
}
|
||||
|
||||
// Private Static methods for reading the Manifest file from BufferedReader
|
||||
|
||||
private static void read_main_section(Attributes attr,
|
||||
BufferedReader br) throws IOException
|
||||
{
|
||||
// According to the spec we should actually call read_version_info() here.
|
||||
read_attributes(attr, br);
|
||||
// Explicitly set Manifest-Version attribute if not set in Main
|
||||
// attributes of Manifest.
|
||||
if (attr.getValue(Attributes.Name.MANIFEST_VERSION) == null)
|
||||
attr.putValue(Attributes.Name.MANIFEST_VERSION, "0.0");
|
||||
JarUtils.readMFManifest(getMainAttributes(), getEntries(), in);
|
||||
}
|
||||
|
||||
/**
|
||||
* Pedantic method that requires the next attribute in the Manifest to be
|
||||
* the "Manifest-Version". This follows the Manifest spec closely but
|
||||
* reject some jar Manifest files out in the wild.
|
||||
*/
|
||||
private static void read_version_info(Attributes attr,
|
||||
BufferedReader br) throws IOException
|
||||
{
|
||||
String version_header = Attributes.Name.MANIFEST_VERSION.toString();
|
||||
try
|
||||
{
|
||||
String value = expect_header(version_header, br);
|
||||
attr.putValue(Attributes.Name.MANIFEST_VERSION, value);
|
||||
}
|
||||
catch (IOException ioe)
|
||||
{
|
||||
throw new JarException("Manifest should start with a " +
|
||||
version_header + ": " + ioe.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
private static String expect_header(String header, BufferedReader br)
|
||||
throws IOException
|
||||
{
|
||||
String s = br.readLine();
|
||||
if (s == null)
|
||||
{
|
||||
throw new JarException("unexpected end of file");
|
||||
}
|
||||
return expect_header(header, br, s);
|
||||
}
|
||||
|
||||
private static String expect_header(String header, BufferedReader br,
|
||||
String s) throws IOException
|
||||
{
|
||||
try
|
||||
{
|
||||
String name = s.substring(0, header.length() + 1);
|
||||
if (name.equalsIgnoreCase(header + ":"))
|
||||
{
|
||||
String value_start = s.substring(header.length() + 2);
|
||||
return read_header_value(value_start, br);
|
||||
}
|
||||
}
|
||||
catch (IndexOutOfBoundsException iobe)
|
||||
{
|
||||
}
|
||||
// If we arrive here, something went wrong
|
||||
throw new JarException("unexpected '" + s + "'");
|
||||
}
|
||||
|
||||
private static String read_header_value(String s, BufferedReader br)
|
||||
throws IOException
|
||||
{
|
||||
boolean try_next = true;
|
||||
while (try_next)
|
||||
{
|
||||
// Lets see if there is something on the next line
|
||||
br.mark(1);
|
||||
if (br.read() == ' ')
|
||||
{
|
||||
s += br.readLine();
|
||||
}
|
||||
else
|
||||
{
|
||||
br.reset();
|
||||
try_next = false;
|
||||
}
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
private static void read_attributes(Attributes attr,
|
||||
BufferedReader br) throws IOException
|
||||
{
|
||||
String s = br.readLine();
|
||||
while (s != null && (!s.equals("")))
|
||||
{
|
||||
read_attribute(attr, s, br);
|
||||
s = br.readLine();
|
||||
}
|
||||
}
|
||||
|
||||
private static void read_attribute(Attributes attr, String s,
|
||||
BufferedReader br) throws IOException
|
||||
{
|
||||
try
|
||||
{
|
||||
int colon = s.indexOf(": ");
|
||||
String name = s.substring(0, colon);
|
||||
String value_start = s.substring(colon + 2);
|
||||
String value = read_header_value(value_start, br);
|
||||
attr.putValue(name, value);
|
||||
}
|
||||
catch (IndexOutOfBoundsException iobe)
|
||||
{
|
||||
throw new JarException("Manifest contains a bad header: " + s);
|
||||
}
|
||||
}
|
||||
|
||||
private static void read_individual_sections(Map entries,
|
||||
BufferedReader br) throws
|
||||
IOException
|
||||
{
|
||||
String s = br.readLine();
|
||||
while (s != null && (!s.equals("")))
|
||||
{
|
||||
Attributes attr = read_section_name(s, br, entries);
|
||||
read_attributes(attr, br);
|
||||
s = br.readLine();
|
||||
}
|
||||
}
|
||||
|
||||
private static Attributes read_section_name(String s, BufferedReader br,
|
||||
Map entries) throws JarException
|
||||
{
|
||||
try
|
||||
{
|
||||
String name = expect_header("Name", br, s);
|
||||
Attributes attr = new Attributes();
|
||||
entries.put(name, attr);
|
||||
return attr;
|
||||
}
|
||||
catch (IOException ioe)
|
||||
{
|
||||
throw new JarException
|
||||
("Section should start with a Name header: " + ioe.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* XXX
|
||||
* Writes the contents of this <code>Manifest</code> to the designated
|
||||
* output stream. Line-endings are platform-independent and consist of the
|
||||
* 2-codepoint sequence <code>0x0D</code> and <code>0x0A</code>.
|
||||
*
|
||||
* @param out the output stream to write this <code>Manifest</code> to.
|
||||
* @throws IOException if an I/O related exception occurs during the process.
|
||||
*/
|
||||
public void write(OutputStream out) throws IOException
|
||||
{
|
||||
PrintWriter pw =
|
||||
new PrintWriter(new
|
||||
BufferedWriter(new OutputStreamWriter(out, "8859_1")));
|
||||
write_main_section(getMainAttributes(), pw);
|
||||
pw.println();
|
||||
write_individual_sections(getEntries(), pw);
|
||||
if (pw.checkError())
|
||||
{
|
||||
throw new JarException("Error while writing manifest");
|
||||
}
|
||||
}
|
||||
|
||||
// Private Static functions for writing the Manifest file to a PrintWriter
|
||||
|
||||
private static void write_main_section(Attributes attr,
|
||||
PrintWriter pw) throws JarException
|
||||
{
|
||||
write_version_info(attr, pw);
|
||||
write_main_attributes(attr, pw);
|
||||
}
|
||||
|
||||
private static void write_version_info(Attributes attr, PrintWriter pw)
|
||||
{
|
||||
// First check if there is already a version attribute set
|
||||
String version = attr.getValue(Attributes.Name.MANIFEST_VERSION);
|
||||
if (version == null)
|
||||
{
|
||||
version = "1.0";
|
||||
}
|
||||
write_header(Attributes.Name.MANIFEST_VERSION.toString(), version, pw);
|
||||
}
|
||||
|
||||
private static void write_header(String name, String value, PrintWriter pw)
|
||||
{
|
||||
pw.print(name + ": ");
|
||||
|
||||
int last = 68 - name.length();
|
||||
if (last > value.length())
|
||||
{
|
||||
pw.println(value);
|
||||
}
|
||||
else
|
||||
{
|
||||
pw.println(value.substring(0, last));
|
||||
}
|
||||
while (last < value.length())
|
||||
{
|
||||
pw.print(" ");
|
||||
int end = (last + 69);
|
||||
if (end > value.length())
|
||||
{
|
||||
pw.println(value.substring(last));
|
||||
}
|
||||
else
|
||||
{
|
||||
pw.println(value.substring(last, end));
|
||||
}
|
||||
last = end;
|
||||
}
|
||||
}
|
||||
|
||||
private static void write_main_attributes(Attributes attr, PrintWriter pw)
|
||||
throws JarException
|
||||
{
|
||||
Iterator it = attr.entrySet().iterator();
|
||||
while (it.hasNext())
|
||||
{
|
||||
Map.Entry entry = (Map.Entry) it.next();
|
||||
// Don't print the manifest version again
|
||||
if (!Attributes.Name.MANIFEST_VERSION.equals(entry.getKey()))
|
||||
{
|
||||
write_attribute_entry(entry, pw);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void write_attribute_entry(Map.Entry entry, PrintWriter pw)
|
||||
throws JarException
|
||||
{
|
||||
String name = entry.getKey().toString();
|
||||
String value = entry.getValue().toString();
|
||||
|
||||
if (name.equalsIgnoreCase("Name"))
|
||||
{
|
||||
throw new JarException("Attributes cannot be called 'Name'");
|
||||
}
|
||||
if (name.startsWith("From"))
|
||||
{
|
||||
throw new
|
||||
JarException("Header cannot start with the four letters 'From'" +
|
||||
name);
|
||||
}
|
||||
write_header(name, value, pw);
|
||||
}
|
||||
|
||||
private static void write_individual_sections(Map entries, PrintWriter pw)
|
||||
throws JarException
|
||||
{
|
||||
|
||||
Iterator it = entries.entrySet().iterator();
|
||||
while (it.hasNext())
|
||||
{
|
||||
Map.Entry entry = (Map.Entry) it.next();
|
||||
write_header("Name", entry.getKey().toString(), pw);
|
||||
write_entry_attributes((Attributes) entry.getValue(), pw);
|
||||
pw.println();
|
||||
}
|
||||
}
|
||||
|
||||
private static void write_entry_attributes(Attributes attr, PrintWriter pw)
|
||||
throws JarException
|
||||
{
|
||||
Iterator it = attr.entrySet().iterator();
|
||||
while (it.hasNext())
|
||||
{
|
||||
Map.Entry entry = (Map.Entry) it.next();
|
||||
write_attribute_entry(entry, pw);
|
||||
}
|
||||
JarUtils.writeMFManifest(getMainAttributes(), getEntries(), out);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user