mirror of
https://github.com/openjdk/jdk.git
synced 2026-03-24 14:49:58 +00:00
Merge
This commit is contained in:
commit
060c593078
1
.hgtags
1
.hgtags
@ -50,3 +50,4 @@ df4bcd06e1d0ab306efa5a44f24a409dc0c0c742 jdk7-b72
|
||||
ce74bd35ce948d629a356e168797f44b593b1578 jdk7-b73
|
||||
4e7661eaa211e186674f6cbefec4aef1144ac2a0 jdk7-b74
|
||||
946518568340c4e511549318f19f47f06b7f5f9b jdk7-b75
|
||||
09e0b33177af2b98a03c9ca19eedf61440bd1cf6 jdk7-b76
|
||||
|
||||
@ -50,3 +50,4 @@ e1b972ff53cd58f825791f8ed9b2deffd16e768c jdk7-b68
|
||||
3ac6dcf7823205546fbbc3d4ea59f37358d0b0d4 jdk7-b73
|
||||
2c88089b6e1c053597418099a14232182c387edc jdk7-b74
|
||||
d1516b9f23954b29b8e76e6f4efc467c08c78133 jdk7-b75
|
||||
c8b63075403d53a208104a8a6ea5072c1cb66aab jdk7-b76
|
||||
|
||||
@ -50,3 +50,4 @@ c793a31209263fbb867c23c752599d85c21abb73 jdk7-b72
|
||||
b751c528c55560cf2adeaeef24b39ca1f4d1cbf7 jdk7-b73
|
||||
5d0cf59a3203b9f57aceebc33ae656b884987955 jdk7-b74
|
||||
0fb137085952c8e47878e240d1cb40f14de463c4 jdk7-b75
|
||||
937144222e2219939101b0129d26a872a7956b13 jdk7-b76
|
||||
|
||||
@ -187,6 +187,9 @@ ifeq ($(SYSTEM_UNAME), Linux)
|
||||
sparc*) \
|
||||
echo sparc \
|
||||
;; \
|
||||
arm*) \
|
||||
echo arm \
|
||||
;; \
|
||||
*) \
|
||||
echo $(mach) \
|
||||
;; \
|
||||
|
||||
@ -50,3 +50,4 @@ a94714c550658fd6741793ef036cb9625dc2ab1a jdk7-b72
|
||||
faf94d94786b621f8e13cbcc941ca69c6d967c3f jdk7-b73
|
||||
f4b900403d6e4b0af51447bd13bbe23fe3a1dac7 jdk7-b74
|
||||
d8dd291a362acb656026a9c0a9da48501505a1e7 jdk7-b75
|
||||
9174bb32e934965288121f75394874eeb1fcb649 jdk7-b76
|
||||
|
||||
@ -50,3 +50,4 @@ ff94d8ce0daded647bb326630e643d010357afce jdk7-b71
|
||||
feb05980f9f2964e6bc2b3a8532f9b3054c2289b jdk7-b73
|
||||
ea7b88c676dd8b269bc858a4a17c14dc96c8aed1 jdk7-b74
|
||||
555fb78ee4cebed082ca7ddabff46d2e5b4c9026 jdk7-b75
|
||||
233a4871d3364ec305efd4a58cfd676620a03a90 jdk7-b76
|
||||
|
||||
@ -34,6 +34,10 @@ drops.dir=${slashjava}/devtools/share/jdk7-drops
|
||||
# one of the standard user build.properties files (see build.xml)
|
||||
javac.jar=${bootstrap.dir}/lib/javac.jar
|
||||
|
||||
# The tools.jar is needed in the classpath to compile these sources
|
||||
jdk.home=${java.home}/..
|
||||
tools.jar=${jdk.home}/lib/tools.jar
|
||||
|
||||
# options for the <javac> tasks used to compile the tools
|
||||
javac.source = 7
|
||||
javac.target = 7
|
||||
|
||||
@ -113,7 +113,10 @@
|
||||
<!-- Build (compilation) of sources to class files. -->
|
||||
<target name="build"
|
||||
depends="init, -init-src-dirs, -build-prep">
|
||||
<javac fork="true"
|
||||
<javac
|
||||
includeAntRuntime="false"
|
||||
classpath="${build.classes.dir}"
|
||||
fork="true"
|
||||
destdir="${build.classes.dir}"
|
||||
memoryInitialSize="${javac.memoryInitialSize}"
|
||||
memoryMaximumSize="${javac.memoryMaximumSize}"
|
||||
|
||||
@ -113,11 +113,13 @@ endif
|
||||
ifdef ALT_LANGTOOLS_DIST
|
||||
ifdef ALT_BOOTDIR
|
||||
ANT_JAVA_HOME = JAVA_HOME=$(ALT_BOOTDIR)
|
||||
ANT_OPTIONS += -Djdk.home=$(ALT_BOOTDIR)
|
||||
endif
|
||||
ANT_OPTIONS += -Dbootstrap.dir=$(ALT_LANGTOOLS_DIST)/bootstrap
|
||||
else
|
||||
ifdef ALT_JDK_IMPORT_PATH
|
||||
ANT_JAVA_HOME = JAVA_HOME=$(ALT_JDK_IMPORT_PATH)
|
||||
ANT_OPTIONS += -Djdk.home=$(ALT_JDK_IMPORT_PATH)
|
||||
endif
|
||||
endif
|
||||
|
||||
@ -141,7 +143,7 @@ ANT_TARGETS = all source drop_included build dist clobber clean sanity
|
||||
|
||||
# Create a make target for each
|
||||
$(ANT_TARGETS):
|
||||
cd .. && $(ANT_JAVA_HOME) $(ANT) -version
|
||||
cd .. && $(ANT_JAVA_HOME) $(ANT) $(ANT_OPTIONS) -version
|
||||
cd .. && $(ANT_JAVA_HOME) $(ANT) $(ANT_OPTIONS) $@
|
||||
|
||||
# Help target
|
||||
|
||||
@ -50,3 +50,4 @@ dd3c5f3ec28d5d5e5c0dc3229fdd52d85d04274d jdk7-b70
|
||||
558985e26fe16f5a6ebb2edb9180a42e1c8e8202 jdk7-b73
|
||||
f4466e1b608088c90e11beaa4b600f102608c6a1 jdk7-b74
|
||||
fcf2b8b5d606641659419f247fcee4b284c45e6e jdk7-b75
|
||||
765d2077d1e652e234d27fe85ba58a986b488503 jdk7-b76
|
||||
|
||||
@ -34,6 +34,10 @@ drops.dir=${slashjava}/devtools/share/jdk7-drops
|
||||
# one of the standard user build.properties files (see build.xml)
|
||||
javac.jar=${bootstrap.dir}/lib/javac.jar
|
||||
|
||||
# The tools.jar is needed in the classpath to compile these sources
|
||||
jdk.home=${java.home}/..
|
||||
tools.jar=${jdk.home}/lib/tools.jar
|
||||
|
||||
# options for the <javac> tasks used to compile the tools
|
||||
javac.source = 7
|
||||
javac.target = 7
|
||||
|
||||
@ -113,7 +113,10 @@
|
||||
<!-- Build (compilation) of sources to class files. -->
|
||||
<target name="build"
|
||||
depends="init, -init-src-dirs, -build-prep">
|
||||
<javac fork="true"
|
||||
<javac
|
||||
includeAntRuntime="false"
|
||||
classpath="${build.classes.dir}:${tools.jar}"
|
||||
fork="true"
|
||||
destdir="${build.classes.dir}"
|
||||
memoryInitialSize="${javac.memoryInitialSize}"
|
||||
memoryMaximumSize="${javac.memoryMaximumSize}"
|
||||
|
||||
@ -113,11 +113,13 @@ endif
|
||||
ifdef ALT_LANGTOOLS_DIST
|
||||
ifdef ALT_BOOTDIR
|
||||
ANT_JAVA_HOME = JAVA_HOME=$(ALT_BOOTDIR)
|
||||
ANT_OPTIONS += -Djdk.home=$(ALT_BOOTDIR)
|
||||
endif
|
||||
ANT_OPTIONS += -Dbootstrap.dir=$(ALT_LANGTOOLS_DIST)/bootstrap
|
||||
else
|
||||
ifdef ALT_JDK_IMPORT_PATH
|
||||
ANT_JAVA_HOME = JAVA_HOME=$(ALT_JDK_IMPORT_PATH)
|
||||
ANT_OPTIONS += -Djdk.home=$(ALT_JDK_IMPORT_PATH)
|
||||
endif
|
||||
endif
|
||||
|
||||
@ -141,7 +143,7 @@ ANT_TARGETS = all source drop_included build dist clobber clean sanity
|
||||
|
||||
# Create a make target for each
|
||||
$(ANT_TARGETS):
|
||||
cd .. && $(ANT_JAVA_HOME) $(ANT) -version
|
||||
cd .. && $(ANT_JAVA_HOME) $(ANT) $(ANT_OPTIONS) -version
|
||||
cd .. && $(ANT_JAVA_HOME) $(ANT) $(ANT_OPTIONS) $@
|
||||
|
||||
# Help target
|
||||
|
||||
@ -51,3 +51,4 @@ f708138c9aca4b389872838fe6773872fce3609e jdk7-b73
|
||||
eacb36e30327e7ae33baa068e82ddccbd91eaae2 jdk7-b74
|
||||
8885b22565077236a927e824ef450742e434a230 jdk7-b75
|
||||
8fb602395be0f7d5af4e7e93b7df2d960faf9d17 jdk7-b76
|
||||
e6a5d095c356a547cf5b3c8885885aca5e91e09b jdk7-b77
|
||||
|
||||
@ -165,6 +165,9 @@ ifeq ($(SYSTEM_UNAME), Linux)
|
||||
sparc*) \
|
||||
echo sparc \
|
||||
;; \
|
||||
arm*) \
|
||||
echo arm \
|
||||
;; \
|
||||
*) \
|
||||
echo $(mach) \
|
||||
;; \
|
||||
|
||||
@ -390,7 +390,7 @@ clean::
|
||||
LOCALES_GEN_SH = localelist.sh
|
||||
|
||||
$(GENSRCDIR)/sun/util/CoreResourceBundleControl.java: \
|
||||
$(SHARE_SRC)/classes/sun/util/CoreResourceBundleControl-XLocales.java $(LOCALES_GEN_SH)
|
||||
$(SHARE_SRC)/classes/sun/util/CoreResourceBundleControl-XLocales.java.template $(LOCALES_GEN_SH)
|
||||
@$(prep-target)
|
||||
NAWK="$(NAWK)" SED="$(SED)" $(SH) $(LOCALES_GEN_SH) "$(JRE_NONEXIST_LOCALES)" \
|
||||
$< $@
|
||||
|
||||
@ -68,7 +68,7 @@ NonEuro_Resources_properties := $(FILES_compiled_properties)
|
||||
FILES_java := $(FILES_java_orig)
|
||||
FILES_compiled_properties := $(FILES_compiled_properties_orig)
|
||||
|
||||
LocaleDataMetaInfo_Src=$(SHARE_SRC)/classes/sun/util/LocaleDataMetaInfo-XLocales.java
|
||||
LocaleDataMetaInfo_Src=$(SHARE_SRC)/classes/sun/util/LocaleDataMetaInfo-XLocales.java.template
|
||||
LocaleDataMetaInfo_Dest=$(GENSRCDIR)/sun/util/LocaleDataMetaInfo.java
|
||||
LOCALEGEN_SH=localegen.sh
|
||||
RESOURCE_NAMES="FormatData CollationData TimeZoneNames LocaleNames CurrencyNames CalendarData"
|
||||
|
||||
@ -27,7 +27,7 @@
|
||||
|
||||
#
|
||||
# This script is to generate the supported locale list string and replace the
|
||||
# LocaleDataMetaInfo-XLocales.java in <ws>/src/share/classes/sun/util
|
||||
# LocaleDataMetaInfo-XLocales.java.template in <ws>/src/share/classes/sun/util
|
||||
#
|
||||
# SORT, NAWK & SED is passed in as environment variables.
|
||||
#
|
||||
|
||||
@ -96,6 +96,7 @@ OTHER_CPPFLAGS += $(LIBARCH_DEFINES)
|
||||
|
||||
|
||||
ifneq ($(PLATFORM), windows) # UNIX systems
|
||||
LD_RUNPATH_EXTRAS += ..
|
||||
LIB_LOCATION = $(LIBDIR)/$(LIBARCH)/jli
|
||||
# Note: its important to keep this order meaning -lc is the
|
||||
# last library otherwise it could cause compatibility issues
|
||||
|
||||
@ -61,8 +61,5 @@ OTHER_CPPFLAGS += -DLAUNCHER_NAME='"$(LAUNCHER_NAME)"'
|
||||
|
||||
ifeq ($(PLATFORM), solaris)
|
||||
LDFLAGS += -R$(OPENWIN_LIB)
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM), solaris)
|
||||
LDFLAGS += -M mapfile-$(ARCH)
|
||||
endif
|
||||
|
||||
@ -834,7 +834,7 @@ $(SCH_GEN)/SocketOptionRegistry.java: $(GENSOR_EXE)
|
||||
GENCSSRC = $(BUILDDIR)/tools/CharsetMapping
|
||||
CHARSETMAPPING_JARFILE = $(BUILDTOOLJARDIR)/charsetmapping.jar
|
||||
|
||||
$(FILES_gensbcs_out): $(GENCSSRC)/SingleByte-X.java $(GENCSSRC)/sbcs
|
||||
$(FILES_gensbcs_out): $(GENCSSRC)/SingleByte-X.java.template $(GENCSSRC)/sbcs
|
||||
@$(prep-target)
|
||||
$(BOOT_JAVA_CMD) -jar $(CHARSETMAPPING_JARFILE) $(GENCSSRC) $(SCS_GEN) sbcs
|
||||
|
||||
|
||||
@ -194,10 +194,8 @@ endif
|
||||
# For backwards compatability, make a link of the 32-bit client JVM to $(LIBDIR)
|
||||
IMPORT_LIST += $(LIB_LOCATION)/$(JVM_NAME)
|
||||
|
||||
# create a link from lib/libjvm.so to client/libjvm.so
|
||||
$(LIB_LOCATION)/$(JVM_NAME): $(LIB_LOCATION)/$(CLIENT_LOCATION)/$(JVM_NAME)
|
||||
@$(prep-target)
|
||||
$(LN) -s $(CLIENT_LOCATION)/$(JVM_NAME) $@
|
||||
|
||||
# solaris ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ solaris
|
||||
endif # 32bit solaris
|
||||
|
||||
@ -411,7 +411,7 @@ Creating your own NetBeans project
|
||||
java/util/regex/,\
|
||||
java/util/spi/,\
|
||||
java/util/zip/,\
|
||||
**/*-XLocales.java
|
||||
**/*-XLocales.java.template
|
||||
jtreg.tests=\
|
||||
java/util/**/*Collection/ \
|
||||
java/util/**/*Map/ \
|
||||
|
||||
@ -82,7 +82,9 @@ $(FILES_DAT): $(FILES_MAP)
|
||||
$(FILES_MAP) $(FILES_DAT) sjis0213
|
||||
|
||||
|
||||
$(FILES_genout_extcs): $(GENCSDATASRC)/SingleByte-X.java $(GENCSDATASRC)/DoubleByte-X.java \
|
||||
$(FILES_genout_extcs): \
|
||||
$(GENCSDATASRC)/SingleByte-X.java.template \
|
||||
$(GENCSDATASRC)/DoubleByte-X.java.template \
|
||||
$(GENCSDATASRC)/extsbcs $(GENCSDATASRC)/dbcs
|
||||
@$(prep-target)
|
||||
$(RM) -r $(GENCSEXT)
|
||||
|
||||
@ -126,6 +126,8 @@ SUNWprivate_1.1 {
|
||||
Java_sun_awt_X11_XlibWrapper_ServerVendor;
|
||||
Java_sun_awt_X11_XlibWrapper_VendorRelease;
|
||||
Java_sun_awt_X11_XlibWrapper_IsXsunKPBehavior;
|
||||
Java_sun_awt_X11_XlibWrapper_IsSunKeyboard;
|
||||
Java_sun_awt_X11_XlibWrapper_IsKanaKeyboard;
|
||||
Java_sun_awt_X11_XlibWrapper_SetToolkitErrorHandler;
|
||||
Java_sun_awt_X11_XlibWrapper_XSetErrorHandler;
|
||||
Java_sun_awt_X11_XlibWrapper_CallErrorHandler;
|
||||
@ -306,6 +308,7 @@ SUNWprivate_1.1 {
|
||||
Java_sun_awt_X11_XlibWrapper_XkbTranslateKeyCode;
|
||||
Java_sun_awt_X11_XlibWrapper_XGetModifierMapping;
|
||||
Java_sun_awt_X11_XlibWrapper_XFreeModifiermap;
|
||||
Java_sun_awt_X11_XlibWrapper_XRefreshKeyboardMapping;
|
||||
Java_sun_awt_X11_XlibWrapper_XChangeActivePointerGrab;
|
||||
Java_sun_awt_X11_XlibWrapper_XNextSecondaryLoopEvent;
|
||||
Java_sun_awt_X11_XlibWrapper_ExitSecondaryLoop;
|
||||
|
||||
@ -63,7 +63,7 @@ public class GenerateDBCS {
|
||||
int b2Min = toInteger(fields[8]);
|
||||
int b2Max = toInteger(fields[9]);
|
||||
System.out.printf("%s,%s,%s,%b,%s%n", clzName, csName, hisName, isASCII, pkgName);
|
||||
genClass(args[0], args[1], "DoubleByte-X.java",
|
||||
genClass(args[0], args[1], "DoubleByte-X.java.template",
|
||||
clzName, csName, hisName, pkgName,
|
||||
isASCII, type,
|
||||
b1Min, b1Max, b2Min, b2Max);
|
||||
|
||||
@ -55,7 +55,7 @@ public class GenerateSBCS {
|
||||
String pkgName = fields[4];
|
||||
System.out.printf("%s,%s,%s,%b,%s%n", clzName, csName, hisName, isASCII, pkgName);
|
||||
|
||||
genClass(args[0], args[1], "SingleByte-X.java",
|
||||
genClass(args[0], args[1], "SingleByte-X.java.template",
|
||||
clzName, csName, hisName, pkgName, isASCII);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 1995-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -41,15 +41,13 @@
|
||||
* options are turned into "-foo" options to the vm. This option
|
||||
* filtering is handled in a number of places in the launcher, some of
|
||||
* it in machine-dependent code. In this file, the function
|
||||
* CheckJVMType removes vm style options and TranslateApplicationArgs
|
||||
* removes "-J" prefixes. On unix platforms, the
|
||||
* CreateExecutionEnvironment function from the unix java_md.c file
|
||||
* processes and removes -d<n> options. However, in case
|
||||
* CreateExecutionEnvironment does not need to exec because
|
||||
* LD_LIBRARY_PATH is set acceptably and the data model does not need
|
||||
* to be changed, ParseArguments will screen out the redundant -d<n>
|
||||
* options and prevent them from being passed to the vm; this is done
|
||||
* by RemovableOption.
|
||||
* CheckJvmType removes vm style options and TranslateApplicationArgs
|
||||
* removes "-J" prefixes. The CreateExecutionEnvironment function processes
|
||||
* and removes -d<n> options. On unix, there is a possibility that the running
|
||||
* data model may not match to the desired data model, in this case an exec is
|
||||
* required to start the desired model. If the data models match, then
|
||||
* ParseArguments will remove the -d<n> flags. If the data models do not match
|
||||
* the CreateExecutionEnviroment will remove the -d<n> flags.
|
||||
*/
|
||||
|
||||
|
||||
@ -1891,11 +1889,11 @@ DumpState()
|
||||
* Return JNI_TRUE for an option string that has no effect but should
|
||||
* _not_ be passed on to the vm; return JNI_FALSE otherwise. On
|
||||
* Solaris SPARC, this screening needs to be done if:
|
||||
* 1) LD_LIBRARY_PATH does _not_ need to be reset and
|
||||
* 2) -d32 or -d64 is passed to a binary with a matching data model
|
||||
* (the exec in SetLibraryPath removes -d<n> options and points the
|
||||
* exec to the proper binary). When this exec is not done, these options
|
||||
* would end up getting passed onto the vm.
|
||||
* -d32 or -d64 is passed to a binary with an unmatched data model
|
||||
* (the exec in CreateExecutionEnvironment removes -d<n> options and points the
|
||||
* exec to the proper binary). In the case of when the data model and the
|
||||
* requested version is matched, an exec would not occur, and these options
|
||||
* were erroneously passed to the vm.
|
||||
*/
|
||||
jboolean
|
||||
RemovableOption(char * option)
|
||||
|
||||
@ -36,7 +36,7 @@ import java.security.spec.*;
|
||||
|
||||
/**
|
||||
* This class constitutes the core of HMAC-<MD> algorithms, where
|
||||
* <MD> can be SHA1 or MD5, etc.
|
||||
* <MD> can be SHA1 or MD5, etc. See RFC 2104 for spec.
|
||||
*
|
||||
* It also contains the implementation classes for the SHA-256,
|
||||
* SHA-384, and SHA-512 HMACs.
|
||||
@ -116,7 +116,7 @@ final class HmacCore implements Cloneable {
|
||||
}
|
||||
|
||||
byte[] secret = key.getEncoded();
|
||||
if (secret == null || secret.length == 0) {
|
||||
if (secret == null) {
|
||||
throw new InvalidKeyException("Missing key data");
|
||||
}
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 2005-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -25,21 +25,19 @@
|
||||
|
||||
package com.sun.crypto.provider;
|
||||
|
||||
import java.io.*;
|
||||
import java.io.ObjectStreamException;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.CharBuffer;
|
||||
import java.nio.charset.Charset;
|
||||
import java.util.Arrays;
|
||||
import java.security.KeyRep;
|
||||
import java.security.GeneralSecurityException;
|
||||
import java.security.InvalidKeyException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.NoSuchProviderException;
|
||||
import java.security.spec.InvalidKeySpecException;
|
||||
import javax.crypto.Mac;
|
||||
import javax.crypto.SecretKey;
|
||||
import javax.crypto.spec.PBEKeySpec;
|
||||
import javax.crypto.spec.SecretKeySpec;
|
||||
|
||||
/**
|
||||
* This class represents a PBE key derived using PBKDF2 defined
|
||||
@ -123,7 +121,7 @@ final class PBKDF2KeyImpl implements javax.crypto.interfaces.PBEKey {
|
||||
this.key = deriveKey(prf, passwdBytes, salt, iterCount, keyLength);
|
||||
}
|
||||
|
||||
private static byte[] deriveKey(Mac prf, byte[] password, byte[] salt,
|
||||
private static byte[] deriveKey(final Mac prf, final byte[] password, byte[] salt,
|
||||
int iterCount, int keyLengthInBit) {
|
||||
int keyLength = keyLengthInBit/8;
|
||||
byte[] key = new byte[keyLength];
|
||||
@ -133,7 +131,34 @@ final class PBKDF2KeyImpl implements javax.crypto.interfaces.PBEKey {
|
||||
int intR = keyLength - (intL - 1)*hlen; // residue
|
||||
byte[] ui = new byte[hlen];
|
||||
byte[] ti = new byte[hlen];
|
||||
SecretKey macKey = new SecretKeySpec(password, prf.getAlgorithm());
|
||||
// SecretKeySpec cannot be used, since password can be empty here.
|
||||
SecretKey macKey = new SecretKey() {
|
||||
@Override
|
||||
public String getAlgorithm() {
|
||||
return prf.getAlgorithm();
|
||||
}
|
||||
@Override
|
||||
public String getFormat() {
|
||||
return "RAW";
|
||||
}
|
||||
@Override
|
||||
public byte[] getEncoded() {
|
||||
return password;
|
||||
}
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Arrays.hashCode(password) * 41 +
|
||||
prf.getAlgorithm().toLowerCase().hashCode();
|
||||
}
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj) return true;
|
||||
if (this.getClass() != obj.getClass()) return false;
|
||||
SecretKey sk = (SecretKey)obj;
|
||||
return prf.getAlgorithm().equalsIgnoreCase(sk.getAlgorithm()) &&
|
||||
Arrays.equals(password, sk.getEncoded());
|
||||
}
|
||||
};
|
||||
prf.init(macKey);
|
||||
|
||||
byte[] ibytes = new byte[4];
|
||||
@ -230,7 +255,7 @@ final class PBKDF2KeyImpl implements javax.crypto.interfaces.PBEKey {
|
||||
* @throws ObjectStreamException if a new object representing
|
||||
* this PBE key could not be created
|
||||
*/
|
||||
private Object writeReplace() throws java.io.ObjectStreamException {
|
||||
private Object writeReplace() throws ObjectStreamException {
|
||||
return new KeyRep(KeyRep.Type.SECRET, getAlgorithm(),
|
||||
getFormat(), getEncoded());
|
||||
}
|
||||
|
||||
@ -26,6 +26,7 @@
|
||||
package com.sun.jmx.mbeanserver;
|
||||
|
||||
import java.lang.annotation.Annotation;
|
||||
import java.lang.ref.SoftReference;
|
||||
import java.lang.reflect.AnnotatedElement;
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.Method;
|
||||
@ -33,8 +34,13 @@ import java.lang.reflect.Modifier;
|
||||
import java.lang.reflect.Proxy;
|
||||
import java.lang.reflect.UndeclaredThrowableException;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.LinkedList;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.WeakHashMap;
|
||||
|
||||
import javax.management.Descriptor;
|
||||
import javax.management.DescriptorKey;
|
||||
@ -506,11 +512,25 @@ public class Introspector {
|
||||
} else {
|
||||
// Java Beans introspection
|
||||
//
|
||||
BeanInfo bi = java.beans.Introspector.getBeanInfo(complex.getClass());
|
||||
PropertyDescriptor[] pds = bi.getPropertyDescriptors();
|
||||
for (PropertyDescriptor pd : pds)
|
||||
if (pd.getName().equals(element))
|
||||
return pd.getReadMethod().invoke(complex);
|
||||
Class<?> clazz = complex.getClass();
|
||||
Method readMethod = null;
|
||||
if (BeansHelper.isAvailable()) {
|
||||
Object bi = BeansHelper.getBeanInfo(clazz);
|
||||
Object[] pds = BeansHelper.getPropertyDescriptors(bi);
|
||||
for (Object pd: pds) {
|
||||
if (BeansHelper.getPropertyName(pd).equals(element)) {
|
||||
readMethod = BeansHelper.getReadMethod(pd);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Java Beans not available so use simple introspection
|
||||
// to locate method
|
||||
readMethod = SimpleIntrospector.getReadMethod(clazz, element);
|
||||
}
|
||||
if (readMethod != null)
|
||||
return readMethod.invoke(complex);
|
||||
|
||||
throw new AttributeNotFoundException(
|
||||
"Could not find the getter method for the property " +
|
||||
element + " using the Java Beans introspector");
|
||||
@ -524,4 +544,235 @@ public class Introspector {
|
||||
new AttributeNotFoundException(e.getMessage()), e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A simple introspector that uses reflection to analyze a class and
|
||||
* identify its "getter" methods. This class is intended for use only when
|
||||
* Java Beans is not present (which implies that there isn't explicit
|
||||
* information about the bean available).
|
||||
*/
|
||||
private static class SimpleIntrospector {
|
||||
private SimpleIntrospector() { }
|
||||
|
||||
private static final String GET_METHOD_PREFIX = "get";
|
||||
private static final String IS_METHOD_PREFIX = "is";
|
||||
|
||||
// cache to avoid repeated lookups
|
||||
private static final Map<Class<?>,SoftReference<List<Method>>> cache =
|
||||
Collections.synchronizedMap(
|
||||
new WeakHashMap<Class<?>,SoftReference<List<Method>>> ());
|
||||
|
||||
/**
|
||||
* Returns the list of methods cached for the given class, or {@code null}
|
||||
* if not cached.
|
||||
*/
|
||||
private static List<Method> getCachedMethods(Class<?> clazz) {
|
||||
// return cached methods if possible
|
||||
SoftReference<List<Method>> ref = cache.get(clazz);
|
||||
if (ref != null) {
|
||||
List<Method> cached = ref.get();
|
||||
if (cached != null)
|
||||
return cached;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns {@code true} if the given method is a "getter" method (where
|
||||
* "getter" method is a public method of the form getXXX or "boolean
|
||||
* isXXX")
|
||||
*/
|
||||
static boolean isReadMethod(Method method) {
|
||||
// ignore static methods
|
||||
int modifiers = method.getModifiers();
|
||||
if (Modifier.isStatic(modifiers))
|
||||
return false;
|
||||
|
||||
String name = method.getName();
|
||||
Class<?>[] paramTypes = method.getParameterTypes();
|
||||
int paramCount = paramTypes.length;
|
||||
|
||||
if (paramCount == 0 && name.length() > 2) {
|
||||
// boolean isXXX()
|
||||
if (name.startsWith(IS_METHOD_PREFIX))
|
||||
return (method.getReturnType() == boolean.class);
|
||||
// getXXX()
|
||||
if (name.length() > 3 && name.startsWith(GET_METHOD_PREFIX))
|
||||
return (method.getReturnType() != void.class);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the list of "getter" methods for the given class. The list
|
||||
* is ordered so that isXXX methods appear before getXXX methods - this
|
||||
* is for compatability with the JavaBeans Introspector.
|
||||
*/
|
||||
static List<Method> getReadMethods(Class<?> clazz) {
|
||||
// return cached result if available
|
||||
List<Method> cachedResult = getCachedMethods(clazz);
|
||||
if (cachedResult != null)
|
||||
return cachedResult;
|
||||
|
||||
// get list of public methods, filtering out methods that have
|
||||
// been overridden to return a more specific type.
|
||||
List<Method> methods =
|
||||
StandardMBeanIntrospector.getInstance().getMethods(clazz);
|
||||
methods = MBeanAnalyzer.eliminateCovariantMethods(methods);
|
||||
|
||||
// filter out the non-getter methods
|
||||
List<Method> result = new LinkedList<Method>();
|
||||
for (Method m: methods) {
|
||||
if (isReadMethod(m)) {
|
||||
// favor isXXX over getXXX
|
||||
if (m.getName().startsWith(IS_METHOD_PREFIX)) {
|
||||
result.add(0, m);
|
||||
} else {
|
||||
result.add(m);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// add result to cache
|
||||
cache.put(clazz, new SoftReference<List<Method>>(result));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the "getter" to read the given property from the given class or
|
||||
* {@code null} if no method is found.
|
||||
*/
|
||||
static Method getReadMethod(Class<?> clazz, String property) {
|
||||
// first character in uppercase (compatability with JavaBeans)
|
||||
property = property.substring(0, 1).toUpperCase(Locale.ENGLISH) +
|
||||
property.substring(1);
|
||||
String getMethod = GET_METHOD_PREFIX + property;
|
||||
String isMethod = IS_METHOD_PREFIX + property;
|
||||
for (Method m: getReadMethods(clazz)) {
|
||||
String name = m.getName();
|
||||
if (name.equals(isMethod) || name.equals(getMethod)) {
|
||||
return m;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A class that provides access to the JavaBeans Introspector and
|
||||
* PropertyDescriptors without creating a static dependency on java.beans.
|
||||
*/
|
||||
private static class BeansHelper {
|
||||
private static final Class<?> introspectorClass =
|
||||
getClass("java.beans.Introspector");
|
||||
private static final Class<?> beanInfoClass =
|
||||
(introspectorClass == null) ? null : getClass("java.beans.BeanInfo");
|
||||
private static final Class<?> getPropertyDescriptorClass =
|
||||
(beanInfoClass == null) ? null : getClass("java.beans.PropertyDescriptor");
|
||||
|
||||
private static final Method getBeanInfo =
|
||||
getMethod(introspectorClass, "getBeanInfo", Class.class);
|
||||
private static final Method getPropertyDescriptors =
|
||||
getMethod(beanInfoClass, "getPropertyDescriptors");
|
||||
private static final Method getPropertyName =
|
||||
getMethod(getPropertyDescriptorClass, "getName");
|
||||
private static final Method getReadMethod =
|
||||
getMethod(getPropertyDescriptorClass, "getReadMethod");
|
||||
|
||||
private static Class<?> getClass(String name) {
|
||||
try {
|
||||
return Class.forName(name, true, null);
|
||||
} catch (ClassNotFoundException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
private static Method getMethod(Class<?> clazz,
|
||||
String name,
|
||||
Class<?>... paramTypes)
|
||||
{
|
||||
if (clazz != null) {
|
||||
try {
|
||||
return clazz.getMethod(name, paramTypes);
|
||||
} catch (NoSuchMethodException e) {
|
||||
throw new AssertionError(e);
|
||||
}
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private BeansHelper() { }
|
||||
|
||||
/**
|
||||
* Returns {@code true} if java.beans is available.
|
||||
*/
|
||||
static boolean isAvailable() {
|
||||
return introspectorClass != null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Invokes java.beans.Introspector.getBeanInfo(Class)
|
||||
*/
|
||||
static Object getBeanInfo(Class<?> clazz) throws Exception {
|
||||
try {
|
||||
return getBeanInfo.invoke(null, clazz);
|
||||
} catch (InvocationTargetException e) {
|
||||
Throwable cause = e.getCause();
|
||||
if (cause instanceof Exception)
|
||||
throw (Exception)cause;
|
||||
throw new AssertionError(e);
|
||||
} catch (IllegalAccessException iae) {
|
||||
throw new AssertionError(iae);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Invokes java.beans.BeanInfo.getPropertyDescriptors()
|
||||
*/
|
||||
static Object[] getPropertyDescriptors(Object bi) {
|
||||
try {
|
||||
return (Object[])getPropertyDescriptors.invoke(bi);
|
||||
} catch (InvocationTargetException e) {
|
||||
Throwable cause = e.getCause();
|
||||
if (cause instanceof RuntimeException)
|
||||
throw (RuntimeException)cause;
|
||||
throw new AssertionError(e);
|
||||
} catch (IllegalAccessException iae) {
|
||||
throw new AssertionError(iae);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Invokes java.beans.PropertyDescriptor.getName()
|
||||
*/
|
||||
static String getPropertyName(Object pd) {
|
||||
try {
|
||||
return (String)getPropertyName.invoke(pd);
|
||||
} catch (InvocationTargetException e) {
|
||||
Throwable cause = e.getCause();
|
||||
if (cause instanceof RuntimeException)
|
||||
throw (RuntimeException)cause;
|
||||
throw new AssertionError(e);
|
||||
} catch (IllegalAccessException iae) {
|
||||
throw new AssertionError(iae);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Invokes java.beans.PropertyDescriptor.getReadMethod()
|
||||
*/
|
||||
static Method getReadMethod(Object pd) {
|
||||
try {
|
||||
return (Method)getReadMethod.invoke(pd);
|
||||
} catch (InvocationTargetException e) {
|
||||
Throwable cause = e.getCause();
|
||||
if (cause instanceof RuntimeException)
|
||||
throw (RuntimeException)cause;
|
||||
throw new AssertionError(e);
|
||||
} catch (IllegalAccessException iae) {
|
||||
throw new AssertionError(iae);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -175,7 +175,7 @@ abstract class MBeanIntrospector<M> {
|
||||
/**
|
||||
* Get the methods to be analyzed to build the MBean interface.
|
||||
*/
|
||||
List<Method> getMethods(final Class<?> mbeanType) throws Exception {
|
||||
List<Method> getMethods(final Class<?> mbeanType) {
|
||||
return Arrays.asList(mbeanType.getMethods());
|
||||
}
|
||||
|
||||
|
||||
@ -34,8 +34,6 @@ import java.util.*;
|
||||
|
||||
import java.security.AccessController;
|
||||
import java.security.CodeSource;
|
||||
import java.security.Identity;
|
||||
import java.security.IdentityScope;
|
||||
import java.security.KeyStore;
|
||||
import java.security.KeyStoreException;
|
||||
import java.security.Permission;
|
||||
@ -267,7 +265,7 @@ public class PolicyFile extends javax.security.auth.Policy {
|
||||
private boolean initialized = false;
|
||||
|
||||
private boolean expandProperties = true;
|
||||
private boolean ignoreIdentityScope = false;
|
||||
private boolean ignoreIdentityScope = true;
|
||||
|
||||
// for use with the reflection API
|
||||
|
||||
@ -459,9 +457,6 @@ public class PolicyFile extends javax.security.auth.Policy {
|
||||
}
|
||||
}
|
||||
|
||||
/** the scope to check */
|
||||
private static IdentityScope scope = null;
|
||||
|
||||
/**
|
||||
* Checks public key. If it is marked as trusted in
|
||||
* the identity database, add it to the policy
|
||||
|
||||
@ -99,4 +99,58 @@ public interface ExtendedGSSContext extends GSSContext {
|
||||
*/
|
||||
public Object inquireSecContext(InquireType type)
|
||||
throws GSSException;
|
||||
|
||||
/**
|
||||
* Requests that the delegation policy be respected. When a true value is
|
||||
* requested, the underlying context would use the delegation policy
|
||||
* defined by the environment as a hint to determine whether credentials
|
||||
* delegation should be performed. This request can only be made on the
|
||||
* context initiator's side and it has to be done prior to the first
|
||||
* call to <code>initSecContext</code>.
|
||||
* <p>
|
||||
* When this flag is false, delegation will only be tried when the
|
||||
* {@link GSSContext#requestCredDeleg(boolean) credentials delegation flag}
|
||||
* is true.
|
||||
* <p>
|
||||
* When this flag is true but the
|
||||
* {@link GSSContext#requestCredDeleg(boolean) credentials delegation flag}
|
||||
* is false, delegation will be only tried if the delegation policy permits
|
||||
* delegation.
|
||||
* <p>
|
||||
* When both this flag and the
|
||||
* {@link GSSContext#requestCredDeleg(boolean) credentials delegation flag}
|
||||
* are true, delegation will be always tried. However, if the delegation
|
||||
* policy does not permit delegation, the value of
|
||||
* {@link #getDelegPolicyState} will be false, even
|
||||
* if delegation is performed successfully.
|
||||
* <p>
|
||||
* In any case, if the delegation is not successful, the value returned
|
||||
* by {@link GSSContext#getCredDelegState()} is false, and the value
|
||||
* returned by {@link #getDelegPolicyState()} is also false.
|
||||
* <p>
|
||||
* Not all mechanisms support delegation policy. Therefore, the
|
||||
* application should check to see if the request was honored with the
|
||||
* {@link #getDelegPolicyState() getDelegPolicyState} method. When
|
||||
* delegation policy is not supported, <code>requestDelegPolicy</code>
|
||||
* should return silently without throwing an exception.
|
||||
* <p>
|
||||
* Note: for the Kerberos 5 mechanism, the delegation policy is expressed
|
||||
* through the OK-AS-DELEGATE flag in the service ticket. When it's true,
|
||||
* the KDC permits delegation to the target server. In a cross-realm
|
||||
* environment, in order for delegation be permitted, all cross-realm TGTs
|
||||
* on the authentication path must also have the OK-AS-DELAGATE flags set.
|
||||
* @param state true if the policy should be respected
|
||||
* @throws GSSException containing the following
|
||||
* major error codes:
|
||||
* {@link GSSException#FAILURE GSSException.FAILURE}
|
||||
*/
|
||||
public void requestDelegPolicy(boolean state) throws GSSException;
|
||||
|
||||
/**
|
||||
* Returns the delegation policy response. Called after a security context
|
||||
* is established. This method can be only called on the initiator's side.
|
||||
* See {@link ExtendedGSSContext#requestDelegPolicy}.
|
||||
* @return the delegation policy response
|
||||
*/
|
||||
public boolean getDelegPolicyState();
|
||||
}
|
||||
|
||||
@ -57,7 +57,10 @@ public class JavaStatic {
|
||||
id = ((JavaObjectRef)value).getId();
|
||||
}
|
||||
value = value.dereference(snapshot, field);
|
||||
if (value.isHeapAllocated()) {
|
||||
if (value.isHeapAllocated() &&
|
||||
clazz.getLoader() == snapshot.getNullThing()) {
|
||||
// static fields are only roots if they are in classes
|
||||
// loaded by the root classloader.
|
||||
JavaHeapObject ho = (JavaHeapObject) value;
|
||||
String s = "Static reference from " + clazz.getName()
|
||||
+ "." + field.getName();
|
||||
|
||||
@ -4,7 +4,10 @@ package com.sun.tracing;
|
||||
import java.util.HashSet;
|
||||
import java.io.PrintStream;
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.logging.Logger;
|
||||
import java.security.AccessController;
|
||||
import java.security.PrivilegedActionException;
|
||||
import java.security.PrivilegedExceptionAction;
|
||||
import sun.security.action.GetPropertyAction;
|
||||
|
||||
import sun.tracing.NullProviderFactory;
|
||||
import sun.tracing.PrintStreamProviderFactory;
|
||||
@ -52,23 +55,17 @@ public abstract class ProviderFactory {
|
||||
HashSet<ProviderFactory> factories = new HashSet<ProviderFactory>();
|
||||
|
||||
// Try to instantiate a DTraceProviderFactory
|
||||
String prop = null;
|
||||
try { prop = System.getProperty("com.sun.tracing.dtrace"); }
|
||||
catch (java.security.AccessControlException e) {
|
||||
Logger.getAnonymousLogger().fine(
|
||||
"Cannot access property com.sun.tracing.dtrace");
|
||||
}
|
||||
String prop = AccessController.doPrivileged(
|
||||
new GetPropertyAction("com.sun.tracing.dtrace"));
|
||||
|
||||
if ( (prop == null || !prop.equals("disable")) &&
|
||||
DTraceProviderFactory.isSupported() ) {
|
||||
factories.add(new DTraceProviderFactory());
|
||||
}
|
||||
|
||||
// Try to instantiate an output stream factory
|
||||
try { prop = System.getProperty("sun.tracing.stream"); }
|
||||
catch (java.security.AccessControlException e) {
|
||||
Logger.getAnonymousLogger().fine(
|
||||
"Cannot access property sun.tracing.stream");
|
||||
}
|
||||
prop = AccessController.doPrivileged(
|
||||
new GetPropertyAction("sun.tracing.stream"));
|
||||
if (prop != null) {
|
||||
for (String spec : prop.split(",")) {
|
||||
PrintStream ps = getPrintStreamFromSpec(spec);
|
||||
@ -89,22 +86,29 @@ public abstract class ProviderFactory {
|
||||
}
|
||||
}
|
||||
|
||||
private static PrintStream getPrintStreamFromSpec(String spec) {
|
||||
private static PrintStream getPrintStreamFromSpec(final String spec) {
|
||||
try {
|
||||
// spec is in the form of <class>.<field>, where <class> is
|
||||
// a fully specified class name, and <field> is a static member
|
||||
// in that class. The <field> must be a 'PrintStream' or subtype
|
||||
// in order to be used.
|
||||
int fieldpos = spec.lastIndexOf('.');
|
||||
Class<?> cls = Class.forName(spec.substring(0, fieldpos));
|
||||
Field f = cls.getField(spec.substring(fieldpos + 1));
|
||||
Class<?> fieldType = f.getType();
|
||||
final int fieldpos = spec.lastIndexOf('.');
|
||||
final Class<?> cls = Class.forName(spec.substring(0, fieldpos));
|
||||
|
||||
Field f = AccessController.doPrivileged(new PrivilegedExceptionAction<Field>() {
|
||||
public Field run() throws NoSuchFieldException {
|
||||
return cls.getField(spec.substring(fieldpos + 1));
|
||||
}
|
||||
});
|
||||
|
||||
return (PrintStream)f.get(null);
|
||||
} catch (Exception e) {
|
||||
Logger.getAnonymousLogger().warning(
|
||||
"Could not parse sun.tracing.stream property: " + e);
|
||||
} catch (ClassNotFoundException e) {
|
||||
throw new AssertionError(e);
|
||||
} catch (IllegalAccessException e) {
|
||||
throw new AssertionError(e);
|
||||
} catch (PrivilegedActionException e) {
|
||||
throw new AssertionError(e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -871,7 +871,7 @@ public abstract class Component implements ImageObserver, MenuContainer,
|
||||
return comp.canBeFocusOwner();
|
||||
}
|
||||
|
||||
public boolean isVisible_NoClientCode(Component comp) {
|
||||
public boolean isVisible(Component comp) {
|
||||
return comp.isVisible_NoClientCode();
|
||||
}
|
||||
public void setRequestFocusController
|
||||
@ -885,6 +885,71 @@ public abstract class Component implements ImageObserver, MenuContainer,
|
||||
public void setAppContext(Component comp, AppContext appContext) {
|
||||
comp.appContext = appContext;
|
||||
}
|
||||
public Container getParent(Component comp) {
|
||||
return comp.getParent_NoClientCode();
|
||||
}
|
||||
public void setParent(Component comp, Container parent) {
|
||||
comp.parent = parent;
|
||||
}
|
||||
public void setSize(Component comp, int width, int height) {
|
||||
comp.width = width;
|
||||
comp.height = height;
|
||||
}
|
||||
public Point getLocation(Component comp) {
|
||||
return comp.location_NoClientCode();
|
||||
}
|
||||
public void setLocation(Component comp, int x, int y) {
|
||||
comp.x = x;
|
||||
comp.y = y;
|
||||
}
|
||||
public boolean isEnabled(Component comp) {
|
||||
return comp.isEnabledImpl();
|
||||
}
|
||||
public boolean isDisplayable(Component comp) {
|
||||
return comp.peer != null;
|
||||
}
|
||||
public Cursor getCursor(Component comp) {
|
||||
return comp.getCursor_NoClientCode();
|
||||
}
|
||||
public ComponentPeer getPeer(Component comp) {
|
||||
return comp.peer;
|
||||
}
|
||||
public void setPeer(Component comp, ComponentPeer peer) {
|
||||
comp.peer = peer;
|
||||
}
|
||||
public boolean isLightweight(Component comp) {
|
||||
return (comp.peer instanceof LightweightPeer);
|
||||
}
|
||||
public boolean getIgnoreRepaint(Component comp) {
|
||||
return comp.ignoreRepaint;
|
||||
}
|
||||
public int getWidth(Component comp) {
|
||||
return comp.width;
|
||||
}
|
||||
public int getHeight(Component comp) {
|
||||
return comp.height;
|
||||
}
|
||||
public int getX(Component comp) {
|
||||
return comp.x;
|
||||
}
|
||||
public int getY(Component comp) {
|
||||
return comp.y;
|
||||
}
|
||||
public Color getForeground(Component comp) {
|
||||
return comp.foreground;
|
||||
}
|
||||
public Color getBackground(Component comp) {
|
||||
return comp.background;
|
||||
}
|
||||
public void setBackground(Component comp, Color background) {
|
||||
comp.background = background;
|
||||
}
|
||||
public Font getFont(Component comp) {
|
||||
return comp.getFont_NoClientCode();
|
||||
}
|
||||
public void processEvent(Component comp, AWTEvent e) {
|
||||
comp.processEvent(e);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@ -8021,7 +8086,7 @@ public abstract class Component implements ImageObserver, MenuContainer,
|
||||
Container getNativeContainer() {
|
||||
Container p = parent;
|
||||
while (p != null && p.peer instanceof LightweightPeer) {
|
||||
p = p.getParent();
|
||||
p = p.getParent_NoClientCode();
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
@ -104,11 +104,8 @@ class EventDispatchThread extends Thread {
|
||||
} else {
|
||||
stopEvent.dispatch();
|
||||
}
|
||||
synchronized (theQueue) {
|
||||
if (theQueue.getDispatchThread() == this) {
|
||||
theQueue.detachDispatchThread();
|
||||
}
|
||||
}
|
||||
|
||||
theQueue.detachDispatchThread(this, false);
|
||||
}
|
||||
|
||||
public void stopDispatching() {
|
||||
@ -142,35 +139,7 @@ class EventDispatchThread extends Thread {
|
||||
}
|
||||
});
|
||||
} finally {
|
||||
/*
|
||||
* This synchronized block is to secure that the event dispatch
|
||||
* thread won't die in the middle of posting a new event to the
|
||||
* associated event queue. It is important because we notify
|
||||
* that the event dispatch thread is busy after posting a new event
|
||||
* to its queue, so the EventQueue.dispatchThread reference must
|
||||
* be valid at that point.
|
||||
*/
|
||||
synchronized (theQueue) {
|
||||
if (theQueue.getDispatchThread() == this) {
|
||||
theQueue.detachDispatchThread();
|
||||
}
|
||||
/*
|
||||
* Event dispatch thread dies in case of an uncaught exception.
|
||||
* A new event dispatch thread for this queue will be started
|
||||
* only if a new event is posted to it. In case if no more
|
||||
* events are posted after this thread died all events that
|
||||
* currently are in the queue will never be dispatched.
|
||||
*/
|
||||
/*
|
||||
* Fix for 4648733. Check both the associated java event
|
||||
* queue and the PostEventQueue.
|
||||
*/
|
||||
if (theQueue.peekEvent() != null ||
|
||||
!SunToolkit.isPostEventQueueEmpty()) {
|
||||
theQueue.initDispatchThread();
|
||||
}
|
||||
AWTAutoShutdown.getInstance().notifyThreadFree(this);
|
||||
}
|
||||
theQueue.detachDispatchThread(this, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -45,6 +45,9 @@ import sun.awt.SunToolkit;
|
||||
import sun.awt.EventQueueItem;
|
||||
import sun.awt.AWTAccessor;
|
||||
|
||||
import java.util.concurrent.locks.Condition;
|
||||
import java.util.concurrent.locks.Lock;
|
||||
|
||||
/**
|
||||
* <code>EventQueue</code> is a platform-independent class
|
||||
* that queues events, both from the underlying peer classes
|
||||
@ -127,6 +130,14 @@ public class EventQueue {
|
||||
*/
|
||||
private EventQueue previousQueue;
|
||||
|
||||
/*
|
||||
* A single lock to synchronize the push()/pop() and related operations with
|
||||
* all the EventQueues from the AppContext. Synchronization on any particular
|
||||
* event queue(s) is not enough: we should lock the whole stack.
|
||||
*/
|
||||
private final Lock pushPopLock;
|
||||
private final Condition pushPopCond;
|
||||
|
||||
private EventDispatchThread dispatchThread;
|
||||
|
||||
private final ThreadGroup threadGroup =
|
||||
@ -158,11 +169,11 @@ public class EventQueue {
|
||||
static {
|
||||
AWTAccessor.setEventQueueAccessor(
|
||||
new AWTAccessor.EventQueueAccessor() {
|
||||
public EventQueue getNextQueue(EventQueue eventQueue) {
|
||||
return eventQueue.nextQueue;
|
||||
}
|
||||
public Thread getDispatchThread(EventQueue eventQueue) {
|
||||
return eventQueue.dispatchThread;
|
||||
return eventQueue.getDispatchThread();
|
||||
}
|
||||
public boolean isDispatchThreadImpl(EventQueue eventQueue) {
|
||||
return eventQueue.isDispatchThreadImpl();
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -179,6 +190,9 @@ public class EventQueue {
|
||||
* may call AppContext.getAppContext() before createNewAppContext()
|
||||
* completes thus causing mess in thread group to appcontext mapping.
|
||||
*/
|
||||
|
||||
pushPopLock = (Lock)AppContext.getAppContext().get(AppContext.EVENT_QUEUE_LOCK_KEY);
|
||||
pushPopCond = (Condition)AppContext.getAppContext().get(AppContext.EVENT_QUEUE_COND_KEY);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -207,7 +221,8 @@ public class EventQueue {
|
||||
*/
|
||||
final void postEventPrivate(AWTEvent theEvent) {
|
||||
theEvent.isPosted = true;
|
||||
synchronized(this) {
|
||||
pushPopLock.lock();
|
||||
try {
|
||||
if (dispatchThread == null && nextQueue == null) {
|
||||
if (theEvent.getSource() == AWTAutoShutdown.getInstance()) {
|
||||
return;
|
||||
@ -221,6 +236,8 @@ public class EventQueue {
|
||||
return;
|
||||
}
|
||||
postEvent(theEvent, getPriority(theEvent));
|
||||
} finally {
|
||||
pushPopLock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
@ -280,9 +297,9 @@ public class EventQueue {
|
||||
if (theEvent.getSource() != AWTAutoShutdown.getInstance()) {
|
||||
AWTAutoShutdown.getInstance().notifyThreadBusy(dispatchThread);
|
||||
}
|
||||
notifyAll();
|
||||
pushPopCond.signalAll();
|
||||
} else if (notifyID) {
|
||||
notifyAll();
|
||||
pushPopCond.signalAll();
|
||||
}
|
||||
} else {
|
||||
// The event was not coalesced or has non-Component source.
|
||||
@ -290,7 +307,7 @@ public class EventQueue {
|
||||
queues[priority].tail.next = newItem;
|
||||
queues[priority].tail = newItem;
|
||||
if (notifyID) {
|
||||
notifyAll();
|
||||
pushPopCond.signalAll();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -482,7 +499,8 @@ public class EventQueue {
|
||||
* event queues are nested with push()/pop().
|
||||
*/
|
||||
SunToolkit.flushPendingEvents();
|
||||
synchronized (this) {
|
||||
pushPopLock.lock();
|
||||
try {
|
||||
for (int i = NUM_PRIORITIES - 1; i >= 0; i--) {
|
||||
if (queues[i].head != null) {
|
||||
EventQueueItem entry = queues[i].head;
|
||||
@ -495,7 +513,9 @@ public class EventQueue {
|
||||
}
|
||||
}
|
||||
AWTAutoShutdown.getInstance().notifyThreadFree(dispatchThread);
|
||||
wait();
|
||||
pushPopCond.await();
|
||||
} finally {
|
||||
pushPopLock.unlock();
|
||||
}
|
||||
} while(true);
|
||||
}
|
||||
@ -508,7 +528,8 @@ public class EventQueue {
|
||||
* event queues are nested with push()/pop().
|
||||
*/
|
||||
SunToolkit.flushPendingEvents();
|
||||
synchronized (this) {
|
||||
pushPopLock.lock();
|
||||
try {
|
||||
for (int i = 0; i < NUM_PRIORITIES; i++) {
|
||||
for (EventQueueItem entry = queues[i].head, prev = null;
|
||||
entry != null; prev = entry, entry = entry.next)
|
||||
@ -527,9 +548,11 @@ public class EventQueue {
|
||||
}
|
||||
}
|
||||
}
|
||||
this.waitForID = id;
|
||||
wait();
|
||||
this.waitForID = 0;
|
||||
waitForID = id;
|
||||
pushPopCond.await();
|
||||
waitForID = 0;
|
||||
} finally {
|
||||
pushPopLock.unlock();
|
||||
}
|
||||
} while(true);
|
||||
}
|
||||
@ -539,11 +562,16 @@ public class EventQueue {
|
||||
* without removing it.
|
||||
* @return the first event
|
||||
*/
|
||||
public synchronized AWTEvent peekEvent() {
|
||||
for (int i = NUM_PRIORITIES - 1; i >= 0; i--) {
|
||||
if (queues[i].head != null) {
|
||||
return queues[i].head.event;
|
||||
public AWTEvent peekEvent() {
|
||||
pushPopLock.lock();
|
||||
try {
|
||||
for (int i = NUM_PRIORITIES - 1; i >= 0; i--) {
|
||||
if (queues[i].head != null) {
|
||||
return queues[i].head.event;
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
pushPopLock.unlock();
|
||||
}
|
||||
|
||||
return null;
|
||||
@ -555,14 +583,19 @@ public class EventQueue {
|
||||
* @return the first event of the specified id or <code>null</code>
|
||||
* if there is no such event
|
||||
*/
|
||||
public synchronized AWTEvent peekEvent(int id) {
|
||||
for (int i = NUM_PRIORITIES - 1; i >= 0; i--) {
|
||||
EventQueueItem q = queues[i].head;
|
||||
for (; q != null; q = q.next) {
|
||||
if (q.event.getID() == id) {
|
||||
return q.event;
|
||||
public AWTEvent peekEvent(int id) {
|
||||
pushPopLock.lock();
|
||||
try {
|
||||
for (int i = NUM_PRIORITIES - 1; i >= 0; i--) {
|
||||
EventQueueItem q = queues[i].head;
|
||||
for (; q != null; q = q.next) {
|
||||
if (q.event.getID() == id) {
|
||||
return q.event;
|
||||
}
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
pushPopLock.unlock();
|
||||
}
|
||||
|
||||
return null;
|
||||
@ -661,17 +694,27 @@ public class EventQueue {
|
||||
public static long getMostRecentEventTime() {
|
||||
return Toolkit.getEventQueue().getMostRecentEventTimeImpl();
|
||||
}
|
||||
private synchronized long getMostRecentEventTimeImpl() {
|
||||
return (Thread.currentThread() == dispatchThread)
|
||||
? mostRecentEventTime
|
||||
: System.currentTimeMillis();
|
||||
private long getMostRecentEventTimeImpl() {
|
||||
pushPopLock.lock();
|
||||
try {
|
||||
return (Thread.currentThread() == dispatchThread)
|
||||
? mostRecentEventTime
|
||||
: System.currentTimeMillis();
|
||||
} finally {
|
||||
pushPopLock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return most recent event time on all threads.
|
||||
*/
|
||||
synchronized long getMostRecentEventTimeEx() {
|
||||
return mostRecentEventTime;
|
||||
long getMostRecentEventTimeEx() {
|
||||
pushPopLock.lock();
|
||||
try {
|
||||
return mostRecentEventTime;
|
||||
} finally {
|
||||
pushPopLock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -689,10 +732,15 @@ public class EventQueue {
|
||||
public static AWTEvent getCurrentEvent() {
|
||||
return Toolkit.getEventQueue().getCurrentEventImpl();
|
||||
}
|
||||
private synchronized AWTEvent getCurrentEventImpl() {
|
||||
return (Thread.currentThread() == dispatchThread)
|
||||
? ((AWTEvent)currentEvent.get())
|
||||
: null;
|
||||
private AWTEvent getCurrentEventImpl() {
|
||||
pushPopLock.lock();
|
||||
try {
|
||||
return (Thread.currentThread() == dispatchThread)
|
||||
? ((AWTEvent)currentEvent.get())
|
||||
: null;
|
||||
} finally {
|
||||
pushPopLock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -706,21 +754,22 @@ public class EventQueue {
|
||||
* @throws NullPointerException if <code>newEventQueue</code> is <code>null</code>
|
||||
* @since 1.2
|
||||
*/
|
||||
public synchronized void push(EventQueue newEventQueue) {
|
||||
public void push(EventQueue newEventQueue) {
|
||||
if (eventLog.isLoggable(PlatformLogger.FINE)) {
|
||||
eventLog.fine("EventQueue.push(" + newEventQueue + ")");
|
||||
}
|
||||
|
||||
if (nextQueue != null) {
|
||||
nextQueue.push(newEventQueue);
|
||||
return;
|
||||
}
|
||||
pushPopLock.lock();
|
||||
try {
|
||||
EventQueue toPush = this;
|
||||
while (toPush.nextQueue != null) {
|
||||
toPush = toPush.nextQueue;
|
||||
}
|
||||
|
||||
synchronized (newEventQueue) {
|
||||
// Transfer all events forward to new EventQueue.
|
||||
while (peekEvent() != null) {
|
||||
while (toPush.peekEvent() != null) {
|
||||
try {
|
||||
newEventQueue.postEventPrivate(getNextEvent());
|
||||
newEventQueue.postEventPrivate(toPush.getNextEvent());
|
||||
} catch (InterruptedException ie) {
|
||||
if (eventLog.isLoggable(PlatformLogger.FINE)) {
|
||||
eventLog.fine("Interrupted push", ie);
|
||||
@ -728,27 +777,30 @@ public class EventQueue {
|
||||
}
|
||||
}
|
||||
|
||||
newEventQueue.previousQueue = this;
|
||||
}
|
||||
/*
|
||||
* Stop the event dispatch thread associated with the currently
|
||||
* active event queue, so that after the new queue is pushed
|
||||
* on the top this event dispatch thread won't prevent AWT from
|
||||
* being automatically shut down.
|
||||
* Use stopDispatchingLater() to avoid deadlock: stopDispatching()
|
||||
* waits for the dispatch thread to exit, so if the dispatch
|
||||
* thread attempts to synchronize on this EventQueue object
|
||||
* it will never exit since we already hold this lock.
|
||||
*/
|
||||
if (dispatchThread != null) {
|
||||
dispatchThread.stopDispatchingLater();
|
||||
}
|
||||
newEventQueue.previousQueue = toPush;
|
||||
|
||||
nextQueue = newEventQueue;
|
||||
/*
|
||||
* Stop the event dispatch thread associated with the currently
|
||||
* active event queue, so that after the new queue is pushed
|
||||
* on the top this event dispatch thread won't prevent AWT from
|
||||
* being automatically shut down.
|
||||
* Use stopDispatchingLater() to avoid deadlock: stopDispatching()
|
||||
* waits for the dispatch thread to exit, which in turn waits
|
||||
* for the lock in EQ.detachDispatchThread(), which is hold by
|
||||
* this method.
|
||||
*/
|
||||
if (toPush.dispatchThread != null) {
|
||||
toPush.dispatchThread.stopDispatchingLater();
|
||||
}
|
||||
|
||||
AppContext appContext = AppContext.getAppContext();
|
||||
if (appContext.get(AppContext.EVENT_QUEUE_KEY) == this) {
|
||||
appContext.put(AppContext.EVENT_QUEUE_KEY, newEventQueue);
|
||||
toPush.nextQueue = newEventQueue;
|
||||
|
||||
AppContext appContext = AppContext.getAppContext();
|
||||
if (appContext.get(AppContext.EVENT_QUEUE_KEY) == toPush) {
|
||||
appContext.put(AppContext.EVENT_QUEUE_KEY, newEventQueue);
|
||||
}
|
||||
} finally {
|
||||
pushPopLock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
@ -770,25 +822,24 @@ public class EventQueue {
|
||||
eventLog.fine("EventQueue.pop(" + this + ")");
|
||||
}
|
||||
|
||||
// To prevent deadlock, we lock on the previous EventQueue before
|
||||
// this one. This uses the same locking order as everything else
|
||||
// in EventQueue.java, so deadlock isn't possible.
|
||||
EventQueue prev = previousQueue;
|
||||
synchronized ((prev != null) ? prev : this) {
|
||||
synchronized(this) {
|
||||
if (nextQueue != null) {
|
||||
nextQueue.pop();
|
||||
return;
|
||||
EventDispatchThread dt = null;
|
||||
pushPopLock.lock();
|
||||
try {
|
||||
EventQueue toPop = this;
|
||||
while (toPop.nextQueue != null) {
|
||||
toPop = toPop.nextQueue;
|
||||
}
|
||||
if (previousQueue == null) {
|
||||
EventQueue prev = toPop.previousQueue;
|
||||
if (prev == null) {
|
||||
throw new EmptyStackException();
|
||||
}
|
||||
toPop.previousQueue = null;
|
||||
|
||||
// Transfer all events back to previous EventQueue.
|
||||
previousQueue.nextQueue = null;
|
||||
while (peekEvent() != null) {
|
||||
prev.nextQueue = null;
|
||||
while (toPop.peekEvent() != null) {
|
||||
try {
|
||||
previousQueue.postEventPrivate(getNextEvent());
|
||||
prev.postEventPrivate(toPop.getNextEvent());
|
||||
} catch (InterruptedException ie) {
|
||||
if (eventLog.isLoggable(PlatformLogger.FINE)) {
|
||||
eventLog.fine("Interrupted pop", ie);
|
||||
@ -797,14 +848,14 @@ public class EventQueue {
|
||||
}
|
||||
AppContext appContext = AppContext.getAppContext();
|
||||
if (appContext.get(AppContext.EVENT_QUEUE_KEY) == this) {
|
||||
appContext.put(AppContext.EVENT_QUEUE_KEY, previousQueue);
|
||||
appContext.put(AppContext.EVENT_QUEUE_KEY, prev);
|
||||
}
|
||||
|
||||
previousQueue = null;
|
||||
}
|
||||
dt = toPop.dispatchThread;
|
||||
} finally {
|
||||
pushPopLock.unlock();
|
||||
}
|
||||
|
||||
EventDispatchThread dt = this.dispatchThread;
|
||||
if (dt != null) {
|
||||
dt.stopDispatching(); // Must be done outside synchronized
|
||||
// block to avoid possible deadlock
|
||||
@ -833,16 +884,27 @@ public class EventQueue {
|
||||
*/
|
||||
public static boolean isDispatchThread() {
|
||||
EventQueue eq = Toolkit.getEventQueue();
|
||||
EventQueue next = eq.nextQueue;
|
||||
while (next != null) {
|
||||
eq = next;
|
||||
next = eq.nextQueue;
|
||||
return eq.isDispatchThreadImpl();
|
||||
}
|
||||
|
||||
final boolean isDispatchThreadImpl() {
|
||||
EventQueue eq = this;
|
||||
pushPopLock.lock();
|
||||
try {
|
||||
EventQueue next = eq.nextQueue;
|
||||
while (next != null) {
|
||||
eq = next;
|
||||
next = eq.nextQueue;
|
||||
}
|
||||
return (Thread.currentThread() == eq.dispatchThread);
|
||||
} finally {
|
||||
pushPopLock.unlock();
|
||||
}
|
||||
return (Thread.currentThread() == eq.dispatchThread);
|
||||
}
|
||||
|
||||
final void initDispatchThread() {
|
||||
synchronized (this) {
|
||||
pushPopLock.lock();
|
||||
try {
|
||||
AppContext appContext = AppContext.getAppContext();
|
||||
if (dispatchThread == null && !threadGroup.isDestroyed() && !appContext.isDisposed()) {
|
||||
dispatchThread = (EventDispatchThread)
|
||||
@ -861,11 +923,45 @@ public class EventQueue {
|
||||
AWTAutoShutdown.getInstance().notifyThreadBusy(dispatchThread);
|
||||
dispatchThread.start();
|
||||
}
|
||||
} finally {
|
||||
pushPopLock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
final void detachDispatchThread() {
|
||||
dispatchThread = null;
|
||||
final void detachDispatchThread(EventDispatchThread edt, boolean restart) {
|
||||
/*
|
||||
* This synchronized block is to secure that the event dispatch
|
||||
* thread won't die in the middle of posting a new event to the
|
||||
* associated event queue. It is important because we notify
|
||||
* that the event dispatch thread is busy after posting a new event
|
||||
* to its queue, so the EventQueue.dispatchThread reference must
|
||||
* be valid at that point.
|
||||
*/
|
||||
pushPopLock.lock();
|
||||
try {
|
||||
EventDispatchThread oldDispatchThread = dispatchThread;
|
||||
if (dispatchThread == edt) {
|
||||
dispatchThread = null;
|
||||
}
|
||||
if (restart) {
|
||||
/*
|
||||
* Event dispatch thread dies in case of an uncaught exception.
|
||||
* A new event dispatch thread for this queue will be started
|
||||
* only if a new event is posted to it. In case if no more
|
||||
* events are posted after this thread died all events that
|
||||
* currently are in the queue will never be dispatched.
|
||||
*
|
||||
* Fix for 4648733. Check both the associated java event
|
||||
* queue and the PostEventQueue.
|
||||
*/
|
||||
if ((peekEvent() != null) || !SunToolkit.isPostEventQueueEmpty()) {
|
||||
initDispatchThread();
|
||||
}
|
||||
AWTAutoShutdown.getInstance().notifyThreadFree(oldDispatchThread);
|
||||
}
|
||||
} finally {
|
||||
pushPopLock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@ -878,7 +974,12 @@ public class EventQueue {
|
||||
* @see java.awt.EventQueue#detachDispatchThread
|
||||
*/
|
||||
final EventDispatchThread getDispatchThread() {
|
||||
return dispatchThread;
|
||||
pushPopLock.lock();
|
||||
try {
|
||||
return dispatchThread;
|
||||
} finally {
|
||||
pushPopLock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@ -895,7 +996,8 @@ public class EventQueue {
|
||||
*/
|
||||
final void removeSourceEvents(Object source, boolean removeAllEvents) {
|
||||
SunToolkit.flushPendingEvents();
|
||||
synchronized (this) {
|
||||
pushPopLock.lock();
|
||||
try {
|
||||
for (int i = 0; i < NUM_PRIORITIES; i++) {
|
||||
EventQueueItem entry = queues[i].head;
|
||||
EventQueueItem prev = null;
|
||||
@ -928,43 +1030,49 @@ public class EventQueue {
|
||||
}
|
||||
queues[i].tail = prev;
|
||||
}
|
||||
} finally {
|
||||
pushPopLock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
static void setCurrentEventAndMostRecentTime(AWTEvent e) {
|
||||
Toolkit.getEventQueue().setCurrentEventAndMostRecentTimeImpl(e);
|
||||
}
|
||||
private synchronized void setCurrentEventAndMostRecentTimeImpl(AWTEvent e)
|
||||
{
|
||||
if (Thread.currentThread() != dispatchThread) {
|
||||
return;
|
||||
}
|
||||
private void setCurrentEventAndMostRecentTimeImpl(AWTEvent e) {
|
||||
pushPopLock.lock();
|
||||
try {
|
||||
if (Thread.currentThread() != dispatchThread) {
|
||||
return;
|
||||
}
|
||||
|
||||
currentEvent = new WeakReference(e);
|
||||
currentEvent = new WeakReference(e);
|
||||
|
||||
// This series of 'instanceof' checks should be replaced with a
|
||||
// polymorphic type (for example, an interface which declares a
|
||||
// getWhen() method). However, this would require us to make such
|
||||
// a type public, or to place it in sun.awt. Both of these approaches
|
||||
// have been frowned upon. So for now, we hack.
|
||||
//
|
||||
// In tiger, we will probably give timestamps to all events, so this
|
||||
// will no longer be an issue.
|
||||
long mostRecentEventTime2 = Long.MIN_VALUE;
|
||||
if (e instanceof InputEvent) {
|
||||
InputEvent ie = (InputEvent)e;
|
||||
mostRecentEventTime2 = ie.getWhen();
|
||||
} else if (e instanceof InputMethodEvent) {
|
||||
InputMethodEvent ime = (InputMethodEvent)e;
|
||||
mostRecentEventTime2 = ime.getWhen();
|
||||
} else if (e instanceof ActionEvent) {
|
||||
ActionEvent ae = (ActionEvent)e;
|
||||
mostRecentEventTime2 = ae.getWhen();
|
||||
} else if (e instanceof InvocationEvent) {
|
||||
InvocationEvent ie = (InvocationEvent)e;
|
||||
mostRecentEventTime2 = ie.getWhen();
|
||||
// This series of 'instanceof' checks should be replaced with a
|
||||
// polymorphic type (for example, an interface which declares a
|
||||
// getWhen() method). However, this would require us to make such
|
||||
// a type public, or to place it in sun.awt. Both of these approaches
|
||||
// have been frowned upon. So for now, we hack.
|
||||
//
|
||||
// In tiger, we will probably give timestamps to all events, so this
|
||||
// will no longer be an issue.
|
||||
long mostRecentEventTime2 = Long.MIN_VALUE;
|
||||
if (e instanceof InputEvent) {
|
||||
InputEvent ie = (InputEvent)e;
|
||||
mostRecentEventTime2 = ie.getWhen();
|
||||
} else if (e instanceof InputMethodEvent) {
|
||||
InputMethodEvent ime = (InputMethodEvent)e;
|
||||
mostRecentEventTime2 = ime.getWhen();
|
||||
} else if (e instanceof ActionEvent) {
|
||||
ActionEvent ae = (ActionEvent)e;
|
||||
mostRecentEventTime2 = ae.getWhen();
|
||||
} else if (e instanceof InvocationEvent) {
|
||||
InvocationEvent ie = (InvocationEvent)e;
|
||||
mostRecentEventTime2 = ie.getWhen();
|
||||
}
|
||||
mostRecentEventTime = Math.max(mostRecentEventTime, mostRecentEventTime2);
|
||||
} finally {
|
||||
pushPopLock.unlock();
|
||||
}
|
||||
mostRecentEventTime = Math.max(mostRecentEventTime, mostRecentEventTime2);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1045,15 +1153,18 @@ public class EventQueue {
|
||||
* or starts a new one otherwise.
|
||||
*/
|
||||
private void wakeup(boolean isShutdown) {
|
||||
synchronized(this) {
|
||||
pushPopLock.lock();
|
||||
try {
|
||||
if (nextQueue != null) {
|
||||
// Forward call to the top of EventQueue stack.
|
||||
nextQueue.wakeup(isShutdown);
|
||||
} else if (dispatchThread != null) {
|
||||
notifyAll();
|
||||
pushPopCond.signalAll();
|
||||
} else if (!isShutdown) {
|
||||
initDispatchThread();
|
||||
}
|
||||
} finally {
|
||||
pushPopLock.unlock();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -53,8 +53,7 @@ import java.util.Set;
|
||||
import java.util.StringTokenizer;
|
||||
import java.util.WeakHashMap;
|
||||
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import sun.util.logging.PlatformLogger;
|
||||
|
||||
import sun.awt.AppContext;
|
||||
import sun.awt.HeadlessToolkit;
|
||||
@ -111,7 +110,7 @@ public abstract class KeyboardFocusManager
|
||||
{
|
||||
|
||||
// Shared focus engine logger
|
||||
private static final Logger focusLog = Logger.getLogger("java.awt.focus.KeyboardFocusManager");
|
||||
private static final PlatformLogger focusLog = PlatformLogger.getLogger("java.awt.focus.KeyboardFocusManager");
|
||||
|
||||
static {
|
||||
/* ensure that the necessary native libraries are loaded */
|
||||
@ -154,7 +153,7 @@ public abstract class KeyboardFocusManager
|
||||
*/
|
||||
private static native void initIDs();
|
||||
|
||||
private static final Logger log = Logger.getLogger("java.awt.KeyboardFocusManager");
|
||||
private static final PlatformLogger log = PlatformLogger.getLogger("java.awt.KeyboardFocusManager");
|
||||
|
||||
/**
|
||||
* The identifier for the Forward focus traversal keys.
|
||||
@ -504,8 +503,8 @@ public abstract class KeyboardFocusManager
|
||||
if (this == getCurrentKeyboardFocusManager()) {
|
||||
return focusOwner;
|
||||
} else {
|
||||
if (focusLog.isLoggable(Level.FINER)) {
|
||||
focusLog.log(Level.FINER, "This manager is " + this + ", current is " + getCurrentKeyboardFocusManager());
|
||||
if (focusLog.isLoggable(PlatformLogger.FINER)) {
|
||||
focusLog.finer("This manager is " + this + ", current is " + getCurrentKeyboardFocusManager());
|
||||
}
|
||||
throw new SecurityException(notPrivileged);
|
||||
}
|
||||
@ -609,9 +608,9 @@ public abstract class KeyboardFocusManager
|
||||
}
|
||||
|
||||
void setNativeFocusOwner(Component comp) {
|
||||
if (focusLog.isLoggable(Level.FINEST)) {
|
||||
focusLog.log(Level.FINEST, "Calling peer {0} setCurrentFocusOwner for {1}",
|
||||
new Object[] {String.valueOf(peer), String.valueOf(comp)});
|
||||
if (focusLog.isLoggable(PlatformLogger.FINEST)) {
|
||||
focusLog.finest("Calling peer {0} setCurrentFocusOwner for {1}",
|
||||
String.valueOf(peer), String.valueOf(comp));
|
||||
}
|
||||
peer.setCurrentFocusOwner(comp);
|
||||
}
|
||||
@ -673,8 +672,8 @@ public abstract class KeyboardFocusManager
|
||||
if (this == getCurrentKeyboardFocusManager()) {
|
||||
return permanentFocusOwner;
|
||||
} else {
|
||||
if (focusLog.isLoggable(Level.FINER)) {
|
||||
focusLog.log(Level.FINER, "This manager is " + this + ", current is " + getCurrentKeyboardFocusManager());
|
||||
if (focusLog.isLoggable(PlatformLogger.FINER)) {
|
||||
focusLog.finer("This manager is " + this + ", current is " + getCurrentKeyboardFocusManager());
|
||||
}
|
||||
throw new SecurityException(notPrivileged);
|
||||
}
|
||||
@ -781,8 +780,8 @@ public abstract class KeyboardFocusManager
|
||||
if (this == getCurrentKeyboardFocusManager()) {
|
||||
return focusedWindow;
|
||||
} else {
|
||||
if (focusLog.isLoggable(Level.FINER)) {
|
||||
focusLog.log(Level.FINER, "This manager is " + this + ", current is " + getCurrentKeyboardFocusManager());
|
||||
if (focusLog.isLoggable(PlatformLogger.FINER)) {
|
||||
focusLog.finer("This manager is " + this + ", current is " + getCurrentKeyboardFocusManager());
|
||||
}
|
||||
throw new SecurityException(notPrivileged);
|
||||
}
|
||||
@ -885,8 +884,8 @@ public abstract class KeyboardFocusManager
|
||||
if (this == getCurrentKeyboardFocusManager()) {
|
||||
return activeWindow;
|
||||
} else {
|
||||
if (focusLog.isLoggable(Level.FINER)) {
|
||||
focusLog.log(Level.FINER, "This manager is " + this + ", current is " + getCurrentKeyboardFocusManager());
|
||||
if (focusLog.isLoggable(PlatformLogger.FINER)) {
|
||||
focusLog.finer("This manager is " + this + ", current is " + getCurrentKeyboardFocusManager());
|
||||
}
|
||||
throw new SecurityException(notPrivileged);
|
||||
}
|
||||
@ -919,8 +918,8 @@ public abstract class KeyboardFocusManager
|
||||
Window oldActiveWindow;
|
||||
synchronized (KeyboardFocusManager.class) {
|
||||
oldActiveWindow = getActiveWindow();
|
||||
if (focusLog.isLoggable(Level.FINER)) {
|
||||
focusLog.log(Level.FINER, "Setting global active window to " + activeWindow + ", old active " + oldActiveWindow);
|
||||
if (focusLog.isLoggable(PlatformLogger.FINER)) {
|
||||
focusLog.finer("Setting global active window to " + activeWindow + ", old active " + oldActiveWindow);
|
||||
}
|
||||
|
||||
try {
|
||||
@ -1215,8 +1214,8 @@ public abstract class KeyboardFocusManager
|
||||
if (this == getCurrentKeyboardFocusManager()) {
|
||||
return currentFocusCycleRoot;
|
||||
} else {
|
||||
if (focusLog.isLoggable(Level.FINER)) {
|
||||
focusLog.log(Level.FINER, "This manager is " + this + ", current is " + getCurrentKeyboardFocusManager());
|
||||
if (focusLog.isLoggable(PlatformLogger.FINER)) {
|
||||
focusLog.finer("This manager is " + this + ", current is " + getCurrentKeyboardFocusManager());
|
||||
}
|
||||
throw new SecurityException(notPrivileged);
|
||||
}
|
||||
@ -2149,9 +2148,9 @@ public abstract class KeyboardFocusManager
|
||||
|
||||
HeavyweightFocusRequest(Component heavyweight, Component descendant,
|
||||
boolean temporary, CausedFocusEvent.Cause cause) {
|
||||
if (log.isLoggable(Level.FINE)) {
|
||||
if (log.isLoggable(PlatformLogger.FINE)) {
|
||||
if (heavyweight == null) {
|
||||
log.log(Level.FINE, "Assertion (heavyweight != null) failed");
|
||||
log.fine("Assertion (heavyweight != null) failed");
|
||||
}
|
||||
}
|
||||
|
||||
@ -2161,12 +2160,12 @@ public abstract class KeyboardFocusManager
|
||||
}
|
||||
boolean addLightweightRequest(Component descendant,
|
||||
boolean temporary, CausedFocusEvent.Cause cause) {
|
||||
if (log.isLoggable(Level.FINE)) {
|
||||
if (log.isLoggable(PlatformLogger.FINE)) {
|
||||
if (this == HeavyweightFocusRequest.CLEAR_GLOBAL_FOCUS_OWNER) {
|
||||
log.log(Level.FINE, "Assertion (this != HeavyweightFocusRequest.CLEAR_GLOBAL_FOCUS_OWNER) failed");
|
||||
log.fine("Assertion (this != HeavyweightFocusRequest.CLEAR_GLOBAL_FOCUS_OWNER) failed");
|
||||
}
|
||||
if (descendant == null) {
|
||||
log.log(Level.FINE, "Assertion (descendant != null) failed");
|
||||
log.fine("Assertion (descendant != null) failed");
|
||||
}
|
||||
}
|
||||
|
||||
@ -2339,12 +2338,12 @@ public abstract class KeyboardFocusManager
|
||||
(Component heavyweight, Component descendant, boolean temporary,
|
||||
boolean focusedWindowChangeAllowed, long time, CausedFocusEvent.Cause cause)
|
||||
{
|
||||
if (log.isLoggable(Level.FINE)) {
|
||||
if (log.isLoggable(PlatformLogger.FINE)) {
|
||||
if (heavyweight == null) {
|
||||
log.log(Level.FINE, "Assertion (heavyweight != null) failed");
|
||||
log.fine("Assertion (heavyweight != null) failed");
|
||||
}
|
||||
if (time == 0) {
|
||||
log.log(Level.FINE, "Assertion (time != 0) failed");
|
||||
log.fine("Assertion (time != 0) failed");
|
||||
}
|
||||
}
|
||||
|
||||
@ -2361,31 +2360,31 @@ public abstract class KeyboardFocusManager
|
||||
Component currentFocusOwner = thisManager.getGlobalFocusOwner();
|
||||
Component nativeFocusOwner = thisManager.getNativeFocusOwner();
|
||||
Window nativeFocusedWindow = thisManager.getNativeFocusedWindow();
|
||||
if (focusLog.isLoggable(Level.FINER)) {
|
||||
focusLog.log(Level.FINER, "SNFH for {0} in {1}",
|
||||
new Object[] {String.valueOf(descendant), String.valueOf(heavyweight)});
|
||||
if (focusLog.isLoggable(PlatformLogger.FINER)) {
|
||||
focusLog.finer("SNFH for {0} in {1}",
|
||||
String.valueOf(descendant), String.valueOf(heavyweight));
|
||||
}
|
||||
if (focusLog.isLoggable(Level.FINEST)) {
|
||||
focusLog.log(Level.FINEST, "0. Current focus owner {0}",
|
||||
String.valueOf(currentFocusOwner));
|
||||
focusLog.log(Level.FINEST, "0. Native focus owner {0}",
|
||||
String.valueOf(nativeFocusOwner));
|
||||
focusLog.log(Level.FINEST, "0. Native focused window {0}",
|
||||
String.valueOf(nativeFocusedWindow));
|
||||
if (focusLog.isLoggable(PlatformLogger.FINEST)) {
|
||||
focusLog.finest("0. Current focus owner {0}",
|
||||
String.valueOf(currentFocusOwner));
|
||||
focusLog.finest("0. Native focus owner {0}",
|
||||
String.valueOf(nativeFocusOwner));
|
||||
focusLog.finest("0. Native focused window {0}",
|
||||
String.valueOf(nativeFocusedWindow));
|
||||
}
|
||||
synchronized (heavyweightRequests) {
|
||||
HeavyweightFocusRequest hwFocusRequest = getLastHWRequest();
|
||||
if (focusLog.isLoggable(Level.FINEST)) {
|
||||
focusLog.log(Level.FINEST, "Request {0}", String.valueOf(hwFocusRequest));
|
||||
if (focusLog.isLoggable(PlatformLogger.FINEST)) {
|
||||
focusLog.finest("Request {0}", String.valueOf(hwFocusRequest));
|
||||
}
|
||||
if (hwFocusRequest == null &&
|
||||
heavyweight == nativeFocusOwner)
|
||||
{
|
||||
if (descendant == currentFocusOwner) {
|
||||
// Redundant request.
|
||||
if (focusLog.isLoggable(Level.FINEST))
|
||||
focusLog.log(Level.FINEST, "1. SNFH_FAILURE for {0}",
|
||||
String.valueOf(descendant));
|
||||
if (focusLog.isLoggable(PlatformLogger.FINEST))
|
||||
focusLog.finest("1. SNFH_FAILURE for {0}",
|
||||
String.valueOf(descendant));
|
||||
return SNFH_FAILURE;
|
||||
}
|
||||
|
||||
@ -2417,8 +2416,8 @@ public abstract class KeyboardFocusManager
|
||||
// SunToolkit.postPriorityEvent(newFocusOwnerEvent);
|
||||
SunToolkit.postEvent(descendant.appContext, newFocusOwnerEvent);
|
||||
|
||||
if (focusLog.isLoggable(Level.FINEST))
|
||||
focusLog.log(Level.FINEST, "2. SNFH_HANDLED for {0}", String.valueOf(descendant));
|
||||
if (focusLog.isLoggable(PlatformLogger.FINEST))
|
||||
focusLog.finest("2. SNFH_HANDLED for {0}", String.valueOf(descendant));
|
||||
return SNFH_SUCCESS_HANDLED;
|
||||
} else if (hwFocusRequest != null &&
|
||||
hwFocusRequest.heavyweight == heavyweight) {
|
||||
@ -2431,7 +2430,7 @@ public abstract class KeyboardFocusManager
|
||||
manager.enqueueKeyEvents(time, descendant);
|
||||
}
|
||||
|
||||
if (focusLog.isLoggable(Level.FINEST))
|
||||
if (focusLog.isLoggable(PlatformLogger.FINEST))
|
||||
focusLog.finest("3. SNFH_HANDLED for lightweight" +
|
||||
descendant + " in " + heavyweight);
|
||||
return SNFH_SUCCESS_HANDLED;
|
||||
@ -2454,7 +2453,7 @@ public abstract class KeyboardFocusManager
|
||||
(hwFocusRequest != null)
|
||||
? hwFocusRequest.heavyweight
|
||||
: nativeFocusedWindow)) {
|
||||
if (focusLog.isLoggable(Level.FINEST))
|
||||
if (focusLog.isLoggable(PlatformLogger.FINEST))
|
||||
focusLog.finest("4. SNFH_FAILURE for " + descendant);
|
||||
return SNFH_FAILURE;
|
||||
}
|
||||
@ -2464,7 +2463,7 @@ public abstract class KeyboardFocusManager
|
||||
heavyweightRequests.add
|
||||
(new HeavyweightFocusRequest(heavyweight, descendant,
|
||||
temporary, cause));
|
||||
if (focusLog.isLoggable(Level.FINEST))
|
||||
if (focusLog.isLoggable(PlatformLogger.FINEST))
|
||||
focusLog.finest("5. SNFH_PROCEED for " + descendant);
|
||||
return SNFH_SUCCESS_PROCEED;
|
||||
}
|
||||
@ -2855,14 +2854,14 @@ public abstract class KeyboardFocusManager
|
||||
}
|
||||
|
||||
KeyboardFocusManager manager = getCurrentKeyboardFocusManager();
|
||||
if (focusLog.isLoggable(Level.FINER)) {
|
||||
if (focusLog.isLoggable(PlatformLogger.FINER)) {
|
||||
if (event instanceof FocusEvent || event instanceof WindowEvent) {
|
||||
focusLog.log(Level.FINER, ">>> {0}", new Object[] {String.valueOf(event)});
|
||||
focusLog.finer(">>> {0}", String.valueOf(event));
|
||||
}
|
||||
if (focusLog.isLoggable(Level.FINER) && event instanceof KeyEvent) {
|
||||
focusLog.log(Level.FINER, " focus owner is {0}",
|
||||
new Object[] {String.valueOf(manager.getGlobalFocusOwner())});
|
||||
focusLog.log(Level.FINER, ">>> {0}", new Object[] {String.valueOf(event)});
|
||||
if (focusLog.isLoggable(PlatformLogger.FINER) && event instanceof KeyEvent) {
|
||||
focusLog.finer(" focus owner is {0}",
|
||||
String.valueOf(manager.getGlobalFocusOwner()));
|
||||
focusLog.finer(">>> {0}", String.valueOf(event));
|
||||
}
|
||||
}
|
||||
|
||||
@ -2946,9 +2945,9 @@ public abstract class KeyboardFocusManager
|
||||
}
|
||||
}
|
||||
static void removeLastFocusRequest(Component heavyweight) {
|
||||
if (log.isLoggable(Level.FINE)) {
|
||||
if (log.isLoggable(PlatformLogger.FINE)) {
|
||||
if (heavyweight == null) {
|
||||
log.log(Level.FINE, "Assertion (heavyweight != null) failed");
|
||||
log.fine("Assertion (heavyweight != null) failed");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -147,6 +147,51 @@ import sun.util.logging.PlatformLogger;
|
||||
*/
|
||||
public class Window extends Container implements Accessible {
|
||||
|
||||
/**
|
||||
* Enumeration of available <i>window types</i>.
|
||||
*
|
||||
* A window type defines the generic visual appearance and behavior of a
|
||||
* top-level window. For example, the type may affect the kind of
|
||||
* decorations of a decorated {@code Frame} or {@code Dialog} instance.
|
||||
* <p>
|
||||
* Some platforms may not fully support a certain window type. Depending on
|
||||
* the level of support, some properties of the window type may be
|
||||
* disobeyed.
|
||||
*
|
||||
* @see #getType
|
||||
* @see #setType
|
||||
* @since 1.7
|
||||
*/
|
||||
public static enum Type {
|
||||
/**
|
||||
* Represents a <i>normal</i> window.
|
||||
*
|
||||
* This is the default type for objects of the {@code Window} class or
|
||||
* its descendants. Use this type for regular top-level windows.
|
||||
*/
|
||||
NORMAL,
|
||||
|
||||
/**
|
||||
* Represents a <i>utility</i> window.
|
||||
*
|
||||
* A utility window is usually a small window such as a toolbar or a
|
||||
* palette. The native system may render the window with smaller
|
||||
* title-bar if the window is either a {@code Frame} or a {@code
|
||||
* Dialog} object, and if it has its decorations enabled.
|
||||
*/
|
||||
UTILITY,
|
||||
|
||||
/**
|
||||
* Represents a <i>popup</i> window.
|
||||
*
|
||||
* A popup window is a temporary window such as a drop-down menu or a
|
||||
* tooltip. On some platforms, windows of that type may be forcibly
|
||||
* made undecorated even if they are instances of the {@code Frame} or
|
||||
* {@code Dialog} class, and have decorations enabled.
|
||||
*/
|
||||
POPUP
|
||||
}
|
||||
|
||||
/**
|
||||
* This represents the warning message that is
|
||||
* to be displayed in a non secure window. ie :
|
||||
@ -2717,6 +2762,52 @@ public class Window extends Container implements Accessible {
|
||||
removeFromWindowList(appContext, weakThis);
|
||||
}
|
||||
|
||||
/**
|
||||
* Window type.
|
||||
*
|
||||
* Synchronization: ObjectLock
|
||||
*/
|
||||
private Type type = Type.NORMAL;
|
||||
|
||||
/**
|
||||
* Sets the type of the window.
|
||||
*
|
||||
* This method can only be called while the window is not displayable.
|
||||
*
|
||||
* @throws IllegalComponentStateException if the window
|
||||
* is displayable.
|
||||
* @throws IllegalArgumentException if the type is {@code null}
|
||||
* @see Component#isDisplayable
|
||||
* @see #getType
|
||||
* @since 1.7
|
||||
*/
|
||||
public void setType(Type type) {
|
||||
if (type == null) {
|
||||
throw new IllegalArgumentException("type should not be null.");
|
||||
}
|
||||
synchronized (getTreeLock()) {
|
||||
if (isDisplayable()) {
|
||||
throw new IllegalComponentStateException(
|
||||
"The window is displayable.");
|
||||
}
|
||||
synchronized (getObjectLock()) {
|
||||
this.type = type;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the type of the window.
|
||||
*
|
||||
* @see #setType
|
||||
* @since 1.7
|
||||
*/
|
||||
public Type getType() {
|
||||
synchronized (getObjectLock()) {
|
||||
return type;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The window serialized data version.
|
||||
*
|
||||
@ -3873,6 +3964,18 @@ public class Window extends Container implements Accessible {
|
||||
public void setLWRequestStatus(Window changed, boolean status) {
|
||||
changed.syncLWRequests = status;
|
||||
}
|
||||
|
||||
public boolean isAutoRequestFocus(Window w) {
|
||||
return w.autoRequestFocus;
|
||||
}
|
||||
|
||||
public boolean isTrayIconWindow(Window w) {
|
||||
return w.isTrayIconWindow;
|
||||
}
|
||||
|
||||
public void setTrayIconWindow(Window w, boolean isTrayIconWindow) {
|
||||
w.isTrayIconWindow = isTrayIconWindow;
|
||||
}
|
||||
}); // WindowAccessor
|
||||
} // static
|
||||
|
||||
|
||||
@ -175,15 +175,8 @@ import sun.security.util.SecurityConstants;
|
||||
public abstract class ClassLoader {
|
||||
|
||||
private static native void registerNatives();
|
||||
|
||||
// Set of classes which are registered as parallel capable class loaders
|
||||
private static final Set<Class<? extends ClassLoader>> parallelLoaders
|
||||
= Collections.newSetFromMap(Collections.synchronizedMap
|
||||
(new WeakHashMap<Class<? extends ClassLoader>, Boolean>()));
|
||||
|
||||
static {
|
||||
registerNatives();
|
||||
parallelLoaders.add(ClassLoader.class);
|
||||
}
|
||||
|
||||
// The parent class loader for delegation
|
||||
@ -191,6 +184,52 @@ public abstract class ClassLoader {
|
||||
// must be added *after* it.
|
||||
private final ClassLoader parent;
|
||||
|
||||
/**
|
||||
* Encapsulates the set of parallel capable loader types.
|
||||
*/
|
||||
private static class ParallelLoaders {
|
||||
private ParallelLoaders() {}
|
||||
|
||||
// the set of parallel capable loader types
|
||||
private static final Set<Class<? extends ClassLoader>> loaderTypes =
|
||||
Collections.newSetFromMap(
|
||||
new WeakHashMap<Class<? extends ClassLoader>, Boolean>());
|
||||
static {
|
||||
synchronized (loaderTypes) { loaderTypes.add(ClassLoader.class); }
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers the given class loader type as parallel capabale.
|
||||
* Returns {@code true} is successfully registered; {@code false} if
|
||||
* loader's super class is not registered.
|
||||
*/
|
||||
static boolean register(Class<? extends ClassLoader> c) {
|
||||
synchronized (loaderTypes) {
|
||||
if (loaderTypes.contains(c.getSuperclass())) {
|
||||
// register the class loader as parallel capable
|
||||
// if and only if all of its super classes are.
|
||||
// Note: given current classloading sequence, if
|
||||
// the immediate super class is parallel capable,
|
||||
// all the super classes higher up must be too.
|
||||
loaderTypes.add(c);
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns {@code true} if the given class loader type is
|
||||
* registered as parallel capable.
|
||||
*/
|
||||
static boolean isRegistered(Class<? extends ClassLoader> c) {
|
||||
synchronized (loaderTypes) {
|
||||
return loaderTypes.contains(c);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Maps class name to the corresponding lock object when the current
|
||||
// class loader is parallel capable.
|
||||
// Note: VM also uses this field to decide if the current class loader
|
||||
@ -237,7 +276,7 @@ public abstract class ClassLoader {
|
||||
|
||||
private ClassLoader(Void unused, ClassLoader parent) {
|
||||
this.parent = parent;
|
||||
if (parallelLoaders.contains(this.getClass())) {
|
||||
if (ParallelLoaders.isRegistered(this.getClass())) {
|
||||
parallelLockMap = new ConcurrentHashMap<String, Object>();
|
||||
package2certs = new ConcurrentHashMap<String, Certificate[]>();
|
||||
domains =
|
||||
@ -1194,24 +1233,7 @@ public abstract class ClassLoader {
|
||||
* @since 1.7
|
||||
*/
|
||||
protected static boolean registerAsParallelCapable() {
|
||||
Class<? extends ClassLoader> caller = getCaller(1);
|
||||
Class superCls = caller.getSuperclass();
|
||||
boolean result = false;
|
||||
// Explicit synchronization needed for composite action
|
||||
synchronized (parallelLoaders) {
|
||||
if (!parallelLoaders.contains(caller)) {
|
||||
if (parallelLoaders.contains(superCls)) {
|
||||
// register the immediate caller as parallel capable
|
||||
// if and only if all of its super classes are.
|
||||
// Note: given current classloading sequence, if
|
||||
// the immediate super class is parallel capable,
|
||||
// all the super classes higher up must be too.
|
||||
result = true;
|
||||
parallelLoaders.add(caller);
|
||||
}
|
||||
} else result = true;
|
||||
}
|
||||
return result;
|
||||
return ParallelLoaders.register(getCaller(1));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2174,4 +2196,3 @@ class SystemClassLoaderAction
|
||||
return sys;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -619,6 +619,20 @@ public final class System {
|
||||
return props;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the system-dependent line separator string. It always
|
||||
* returns the same value - the initial value of the {@linkplain
|
||||
* #getProperty(String) system property} {@code line.separator}.
|
||||
*
|
||||
* <p>On UNIX systems, it returns {@code "\n"}; on Microsoft
|
||||
* Windows systems it returns {@code "\r\n"}.
|
||||
*/
|
||||
public static String lineSeparator() {
|
||||
return lineSeparator;
|
||||
}
|
||||
|
||||
private static String lineSeparator;
|
||||
|
||||
/**
|
||||
* Sets the system properties to the <code>Properties</code>
|
||||
* argument.
|
||||
@ -1104,6 +1118,7 @@ public final class System {
|
||||
private static void initializeSystemClass() {
|
||||
props = new Properties();
|
||||
initProperties(props);
|
||||
lineSeparator = props.getProperty("line.separator");
|
||||
sun.misc.Version.init();
|
||||
|
||||
// Workaround until DownloadManager initialization is revisited.
|
||||
@ -1192,7 +1207,7 @@ public final class System {
|
||||
}
|
||||
|
||||
/* returns the class of the caller. */
|
||||
static Class getCallerClass() {
|
||||
static Class<?> getCallerClass() {
|
||||
// NOTE use of more generic Reflection.getCallerClass()
|
||||
return Reflection.getCallerClass(3);
|
||||
}
|
||||
|
||||
@ -30,6 +30,7 @@ import java.util.List;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.io.IOException;
|
||||
import sun.util.logging.PlatformLogger;
|
||||
|
||||
/**
|
||||
* CookieManager provides a concrete implementation of {@link CookieHandler},
|
||||
@ -263,6 +264,7 @@ public class CookieManager extends CookieHandler
|
||||
if (cookieJar == null)
|
||||
return;
|
||||
|
||||
PlatformLogger logger = PlatformLogger.getLogger("java.net.CookieManager");
|
||||
for (String headerKey : responseHeaders.keySet()) {
|
||||
// RFC 2965 3.2.2, key must be 'Set-Cookie2'
|
||||
// we also accept 'Set-Cookie' here for backward compatibility
|
||||
@ -277,7 +279,16 @@ public class CookieManager extends CookieHandler
|
||||
|
||||
for (String headerValue : responseHeaders.get(headerKey)) {
|
||||
try {
|
||||
List<HttpCookie> cookies = HttpCookie.parse(headerValue);
|
||||
List<HttpCookie> cookies;
|
||||
try {
|
||||
cookies = HttpCookie.parse(headerValue);
|
||||
} catch (IllegalArgumentException e) {
|
||||
// Bogus header, make an empty list and log the error
|
||||
cookies = java.util.Collections.EMPTY_LIST;
|
||||
if (logger.isLoggable(PlatformLogger.SEVERE)) {
|
||||
logger.severe("Invalid cookie for " + uri + ": " + headerValue);
|
||||
}
|
||||
}
|
||||
for (HttpCookie cookie : cookies) {
|
||||
if (cookie.getPath() == null) {
|
||||
// If no path is specified, then by default
|
||||
|
||||
@ -1036,7 +1036,7 @@ public final class HttpCookie implements Cloneable {
|
||||
int version = Integer.parseInt(attrValue);
|
||||
cookie.setVersion(version);
|
||||
} catch (NumberFormatException ignored) {
|
||||
throw new IllegalArgumentException("Illegal cookie version attribute");
|
||||
// Just ignore bogus version, it will default to 0 or 1
|
||||
}
|
||||
}
|
||||
});
|
||||
@ -1147,12 +1147,15 @@ public final class HttpCookie implements Cloneable {
|
||||
}
|
||||
|
||||
private static String stripOffSurroundingQuote(String str) {
|
||||
if (str != null && str.length() > 0 &&
|
||||
if (str != null && str.length() > 2 &&
|
||||
str.charAt(0) == '"' && str.charAt(str.length() - 1) == '"') {
|
||||
return str.substring(1, str.length() - 1);
|
||||
} else {
|
||||
return str;
|
||||
}
|
||||
if (str != null && str.length() > 2 &&
|
||||
str.charAt(0) == '\'' && str.charAt(str.length() - 1) == '\'') {
|
||||
return str.substring(1, str.length() - 1);
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
private static boolean equalsIgnoreCase(String s, String t) {
|
||||
|
||||
@ -25,6 +25,7 @@
|
||||
|
||||
package java.nio.channels;
|
||||
|
||||
import java.io.Closeable;
|
||||
import java.io.IOException;
|
||||
import java.nio.channels.spi.SelectorProvider;
|
||||
import java.util.Set;
|
||||
@ -202,7 +203,7 @@ import java.util.Set;
|
||||
* @see SelectionKey
|
||||
*/
|
||||
|
||||
public abstract class Selector {
|
||||
public abstract class Selector implements Closeable {
|
||||
|
||||
/**
|
||||
* Initializes a new instance of this class.
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -2552,9 +2552,6 @@ public final class Formatter implements Closeable, Flushable {
|
||||
private boolean dt = false;
|
||||
private char c;
|
||||
|
||||
// cache the line separator
|
||||
private String ls;
|
||||
|
||||
private int index(String s) {
|
||||
if (s != null) {
|
||||
try {
|
||||
@ -2702,9 +2699,7 @@ public final class Formatter implements Closeable, Flushable {
|
||||
printHashCode(arg);
|
||||
break;
|
||||
case Conversion.LINE_SEPARATOR:
|
||||
if (ls == null)
|
||||
ls = System.getProperty("line.separator");
|
||||
a.append(ls);
|
||||
a.append(System.lineSeparator());
|
||||
break;
|
||||
case Conversion.PERCENT_SIGN:
|
||||
a.append('%');
|
||||
|
||||
@ -318,7 +318,7 @@ class Deflater {
|
||||
/**
|
||||
* Compresses the input data and fills specified buffer with compressed
|
||||
* data. Returns actual number of bytes of compressed data. A return value
|
||||
* of 0 indicates that {@link needsInput() needsInput} should be called
|
||||
* of 0 indicates that {@link #needsInput() needsInput} should be called
|
||||
* in order to determine if more input data is required.
|
||||
*
|
||||
* <p>This method uses {@link #NO_FLUSH} as its compression flush mode.
|
||||
@ -339,7 +339,7 @@ class Deflater {
|
||||
/**
|
||||
* Compresses the input data and fills specified buffer with compressed
|
||||
* data. Returns actual number of bytes of compressed data. A return value
|
||||
* of 0 indicates that {@link needsInput() needsInput} should be called
|
||||
* of 0 indicates that {@link #needsInput() needsInput} should be called
|
||||
* in order to determine if more input data is required.
|
||||
*
|
||||
* <p>This method uses {@link #NO_FLUSH} as its compression flush mode.
|
||||
|
||||
@ -66,7 +66,7 @@ class DeflaterOutputStream extends FilterOutputStream {
|
||||
* @param def the compressor ("deflater")
|
||||
* @param size the output buffer size
|
||||
* @param syncFlush
|
||||
* if {@code true} the {@link flush()} method of this
|
||||
* if {@code true} the {@link #flush()} method of this
|
||||
* instance flushes the compressor with flush mode
|
||||
* {@link Deflater#SYNC_FLUSH} before flushing the output
|
||||
* stream, otherwise only flushes the output stream
|
||||
@ -114,7 +114,7 @@ class DeflaterOutputStream extends FilterOutputStream {
|
||||
* @param out the output stream
|
||||
* @param def the compressor ("deflater")
|
||||
* @param syncFlush
|
||||
* if {@code true} the {@link flush()} method of this
|
||||
* if {@code true} the {@link #flush()} method of this
|
||||
* instance flushes the compressor with flush mode
|
||||
* {@link Deflater#SYNC_FLUSH} before flushing the output
|
||||
* stream, otherwise only flushes the output stream
|
||||
@ -151,7 +151,7 @@ class DeflaterOutputStream extends FilterOutputStream {
|
||||
*
|
||||
* @param out the output stream
|
||||
* @param syncFlush
|
||||
* if {@code true} the {@link flush()} method of this
|
||||
* if {@code true} the {@link #flush()} method of this
|
||||
* instance flushes the compressor with flush mode
|
||||
* {@link Deflater#SYNC_FLUSH} before flushing the output
|
||||
* stream, otherwise only flushes the output stream
|
||||
@ -262,10 +262,10 @@ class DeflaterOutputStream extends FilterOutputStream {
|
||||
/**
|
||||
* Flushes the compressed output stream.
|
||||
*
|
||||
* If {@link DeflaterOutputStream(OutputStream, Deflater, int, boolean)
|
||||
* If {@link #DeflaterOutputStream(OutputStream, Deflater, int, boolean)
|
||||
* syncFlush} is {@code true} when this compressed output stream is
|
||||
* constructed this method flushes the underlying {@code compressor}
|
||||
* first with the flush mode {@link Deflater#SYNC_FLUSH} to force
|
||||
* constructed, this method first flushes the underlying {@code compressor}
|
||||
* with the flush mode {@link Deflater#SYNC_FLUSH} to force
|
||||
* all pending data to be flushed out to the output stream and then
|
||||
* flushes the output stream. Otherwise this method only flushes the
|
||||
* output stream without flushing the {@code compressor}.
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 1999-2005 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 1999-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -198,6 +198,8 @@ public class InitialContext implements Context {
|
||||
*
|
||||
* <p> This constructor will not modify <tt>environment</tt>
|
||||
* or save a reference to it, but may save a clone.
|
||||
* Caller should not modify mutable keys and values in
|
||||
* <tt>environment</tt> after it has been passed to the constructor.
|
||||
*
|
||||
* @param environment
|
||||
* environment used to create the initial context.
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 1999-2004 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 1999-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -86,6 +86,8 @@ public class InitialDirContext extends InitialContext implements DirContext {
|
||||
*
|
||||
* <p> This constructor will not modify <tt>environment</tt>
|
||||
* or save a reference to it, but may save a clone.
|
||||
* Caller should not modify mutable keys and values in
|
||||
* <tt>environment</tt> after it has been passed to the constructor.
|
||||
*
|
||||
* @param environment
|
||||
* environment used to create the initial DirContext.
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 1999-2004 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 1999-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -110,6 +110,8 @@ public class InitialLdapContext extends InitialDirContext implements LdapContext
|
||||
*
|
||||
* <p> This constructor will not modify its parameters or
|
||||
* save references to them, but may save a clone or copy.
|
||||
* Caller should not modify mutable keys and values in
|
||||
* <tt>environment</tt> after it has been passed to the constructor.
|
||||
*
|
||||
* <p> <tt>connCtls</tt> is used as the underlying context instance's
|
||||
* connection request controls. See the class description
|
||||
|
||||
@ -40,7 +40,6 @@ import java.security.PrivilegedExceptionAction;
|
||||
import java.security.PrivilegedActionException;
|
||||
import java.security.ProtectionDomain;
|
||||
import sun.security.util.ResourcesMgr;
|
||||
import sun.security.util.SecurityConstants;
|
||||
|
||||
/**
|
||||
* <p> A <code>Subject</code> represents a grouping of related information
|
||||
@ -239,7 +238,7 @@ public final class Subject implements java.io.Serializable {
|
||||
public void setReadOnly() {
|
||||
java.lang.SecurityManager sm = System.getSecurityManager();
|
||||
if (sm != null) {
|
||||
sm.checkPermission(new AuthPermission("setReadOnly"));
|
||||
sm.checkPermission(AuthPermissionHolder.SET_READ_ONLY_PERMISSION);
|
||||
}
|
||||
|
||||
this.readOnly = true;
|
||||
@ -285,7 +284,7 @@ public final class Subject implements java.io.Serializable {
|
||||
|
||||
java.lang.SecurityManager sm = System.getSecurityManager();
|
||||
if (sm != null) {
|
||||
sm.checkPermission(new AuthPermission("getSubject"));
|
||||
sm.checkPermission(AuthPermissionHolder.GET_SUBJECT_PERMISSION);
|
||||
}
|
||||
|
||||
if (acc == null) {
|
||||
@ -343,7 +342,7 @@ public final class Subject implements java.io.Serializable {
|
||||
|
||||
java.lang.SecurityManager sm = System.getSecurityManager();
|
||||
if (sm != null) {
|
||||
sm.checkPermission(SecurityConstants.DO_AS_PERMISSION);
|
||||
sm.checkPermission(AuthPermissionHolder.DO_AS_PERMISSION);
|
||||
}
|
||||
if (action == null)
|
||||
throw new NullPointerException
|
||||
@ -402,7 +401,7 @@ public final class Subject implements java.io.Serializable {
|
||||
|
||||
java.lang.SecurityManager sm = System.getSecurityManager();
|
||||
if (sm != null) {
|
||||
sm.checkPermission(SecurityConstants.DO_AS_PERMISSION);
|
||||
sm.checkPermission(AuthPermissionHolder.DO_AS_PERMISSION);
|
||||
}
|
||||
|
||||
if (action == null)
|
||||
@ -456,7 +455,7 @@ public final class Subject implements java.io.Serializable {
|
||||
|
||||
java.lang.SecurityManager sm = System.getSecurityManager();
|
||||
if (sm != null) {
|
||||
sm.checkPermission(SecurityConstants.DO_AS_PRIVILEGED_PERMISSION);
|
||||
sm.checkPermission(AuthPermissionHolder.DO_AS_PRIVILEGED_PERMISSION);
|
||||
}
|
||||
|
||||
if (action == null)
|
||||
@ -520,7 +519,7 @@ public final class Subject implements java.io.Serializable {
|
||||
|
||||
java.lang.SecurityManager sm = System.getSecurityManager();
|
||||
if (sm != null) {
|
||||
sm.checkPermission(SecurityConstants.DO_AS_PRIVILEGED_PERMISSION);
|
||||
sm.checkPermission(AuthPermissionHolder.DO_AS_PRIVILEGED_PERMISSION);
|
||||
}
|
||||
|
||||
if (action == null)
|
||||
@ -1044,16 +1043,13 @@ public final class Subject implements java.io.Serializable {
|
||||
if (sm != null) {
|
||||
switch (which) {
|
||||
case Subject.PRINCIPAL_SET:
|
||||
sm.checkPermission(new AuthPermission
|
||||
("modifyPrincipals"));
|
||||
sm.checkPermission(AuthPermissionHolder.MODIFY_PRINCIPALS_PERMISSION);
|
||||
break;
|
||||
case Subject.PUB_CREDENTIAL_SET:
|
||||
sm.checkPermission(new AuthPermission
|
||||
("modifyPublicCredentials"));
|
||||
sm.checkPermission(AuthPermissionHolder.MODIFY_PUBLIC_CREDENTIALS_PERMISSION);
|
||||
break;
|
||||
default:
|
||||
sm.checkPermission(new AuthPermission
|
||||
("modifyPrivateCredentials"));
|
||||
sm.checkPermission(AuthPermissionHolder.MODIFY_PRIVATE_CREDENTIALS_PERMISSION);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -1073,16 +1069,13 @@ public final class Subject implements java.io.Serializable {
|
||||
if (sm != null) {
|
||||
switch (which) {
|
||||
case Subject.PRINCIPAL_SET:
|
||||
sm.checkPermission
|
||||
(new AuthPermission("modifyPrincipals"));
|
||||
sm.checkPermission(AuthPermissionHolder.MODIFY_PRINCIPALS_PERMISSION);
|
||||
break;
|
||||
case Subject.PUB_CREDENTIAL_SET:
|
||||
sm.checkPermission
|
||||
(new AuthPermission("modifyPublicCredentials"));
|
||||
sm.checkPermission(AuthPermissionHolder.MODIFY_PUBLIC_CREDENTIALS_PERMISSION);
|
||||
break;
|
||||
default:
|
||||
sm.checkPermission
|
||||
(new AuthPermission("modifyPrivateCredentials"));
|
||||
sm.checkPermission(AuthPermissionHolder.MODIFY_PRIVATE_CREDENTIALS_PERMISSION);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -1405,4 +1398,27 @@ public final class Subject implements java.io.Serializable {
|
||||
return set.add(o);
|
||||
}
|
||||
}
|
||||
|
||||
static class AuthPermissionHolder {
|
||||
static final AuthPermission DO_AS_PERMISSION =
|
||||
new AuthPermission("doAs");
|
||||
|
||||
static final AuthPermission DO_AS_PRIVILEGED_PERMISSION =
|
||||
new AuthPermission("doAsPrivileged");
|
||||
|
||||
static final AuthPermission SET_READ_ONLY_PERMISSION =
|
||||
new AuthPermission("setReadOnly");
|
||||
|
||||
static final AuthPermission GET_SUBJECT_PERMISSION =
|
||||
new AuthPermission("getSubject");
|
||||
|
||||
static final AuthPermission MODIFY_PRINCIPALS_PERMISSION =
|
||||
new AuthPermission("modifyPrincipals");
|
||||
|
||||
static final AuthPermission MODIFY_PUBLIC_CREDENTIALS_PERMISSION =
|
||||
new AuthPermission("modifyPublicCredentials");
|
||||
|
||||
static final AuthPermission MODIFY_PRIVATE_CREDENTIALS_PERMISSION =
|
||||
new AuthPermission("modifyPrivateCredentials");
|
||||
}
|
||||
}
|
||||
|
||||
@ -227,12 +227,8 @@ public class Popup {
|
||||
HeavyWeightWindow(Window parent) {
|
||||
super(parent);
|
||||
setFocusableWindowState(false);
|
||||
Toolkit tk = Toolkit.getDefaultToolkit();
|
||||
if (tk instanceof SunToolkit) {
|
||||
// all the short-lived windows like Popups should be
|
||||
// OverrideRedirect on X11 platforms
|
||||
((SunToolkit)tk).setOverrideRedirect(this);
|
||||
}
|
||||
setType(Window.Type.POPUP);
|
||||
|
||||
// Popups are typically transient and most likely won't benefit
|
||||
// from true double buffering. Turn it off here.
|
||||
getRootPane().setUseTrueDoubleBuffering(false);
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2001 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 2000-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -678,7 +678,7 @@ public interface GSSContext {
|
||||
* are not definitive then the method will attempt to treat all
|
||||
* available bytes as part of the token.<p>
|
||||
*
|
||||
* Other than the possible blocking behaviour described above, this
|
||||
* Other than the possible blocking behavior described above, this
|
||||
* method is equivalent to the byte array based {@link #unwrap(byte[],
|
||||
* int, int, MessageProp) unwrap} method.<p>
|
||||
*
|
||||
@ -826,7 +826,7 @@ public interface GSSContext {
|
||||
* are not definitive then the method will attempt to treat all
|
||||
* available bytes as part of the token.<p>
|
||||
*
|
||||
* Other than the possible blocking behaviour described above, this
|
||||
* Other than the possible blocking behavior described above, this
|
||||
* method is equivalent to the byte array based {@link #verifyMIC(byte[],
|
||||
* int, int, byte[], int, int, MessageProp) verifyMIC} method.<p>
|
||||
*
|
||||
@ -917,7 +917,7 @@ public interface GSSContext {
|
||||
* getMutualAuthState} method.<p>
|
||||
*
|
||||
* @param state a boolean value indicating whether mutual
|
||||
* authentication shouls be used or not.
|
||||
* authentication should be used or not.
|
||||
* @see #getMutualAuthState()
|
||||
*
|
||||
* @throws GSSException containing the following
|
||||
@ -928,7 +928,7 @@ public interface GSSContext {
|
||||
|
||||
/**
|
||||
* Requests that replay detection be enabled for the
|
||||
* per-message security services after context establishemnt. This
|
||||
* per-message security services after context establishment. This
|
||||
* request can only be made on the context initiator's side and it has
|
||||
* to be done prior to the first call to
|
||||
* <code>initSecContext</code>. During context establishment replay
|
||||
@ -958,7 +958,7 @@ public interface GSSContext {
|
||||
|
||||
/**
|
||||
* Requests that sequence checking be enabled for the
|
||||
* per-message security services after context establishemnt. This
|
||||
* per-message security services after context establishment. This
|
||||
* request can only be made on the context initiator's side and it has
|
||||
* to be done prior to the first call to
|
||||
* <code>initSecContext</code>. During context establishment sequence
|
||||
|
||||
@ -98,7 +98,7 @@ public final class AWTAccessor {
|
||||
* Returns whether the component is visible without invoking
|
||||
* any client code.
|
||||
*/
|
||||
boolean isVisible_NoClientCode(Component comp);
|
||||
boolean isVisible(Component comp);
|
||||
|
||||
/**
|
||||
* Sets the RequestFocusController.
|
||||
@ -114,6 +114,112 @@ public final class AWTAccessor {
|
||||
* Sets the appContext of the component.
|
||||
*/
|
||||
void setAppContext(Component comp, AppContext appContext);
|
||||
|
||||
/**
|
||||
* Returns the parent of the component.
|
||||
*/
|
||||
Container getParent(Component comp);
|
||||
|
||||
/**
|
||||
* Sets the parent of the component to the specified parent.
|
||||
*/
|
||||
void setParent(Component comp, Container parent);
|
||||
|
||||
/**
|
||||
* Resizes the component to the specified width and height.
|
||||
*/
|
||||
void setSize(Component comp, int width, int height);
|
||||
|
||||
/**
|
||||
* Returns the location of the component.
|
||||
*/
|
||||
Point getLocation(Component comp);
|
||||
|
||||
/**
|
||||
* Moves the component to the new location.
|
||||
*/
|
||||
void setLocation(Component comp, int x, int y);
|
||||
|
||||
/**
|
||||
* Determines whether this component is enabled.
|
||||
*/
|
||||
boolean isEnabled(Component comp);
|
||||
|
||||
/**
|
||||
* Determines whether this component is displayable.
|
||||
*/
|
||||
boolean isDisplayable(Component comp);
|
||||
|
||||
/**
|
||||
* Gets the cursor set in the component.
|
||||
*/
|
||||
Cursor getCursor(Component comp);
|
||||
|
||||
/**
|
||||
* Returns the peer of the component.
|
||||
*/
|
||||
ComponentPeer getPeer(Component comp);
|
||||
|
||||
/**
|
||||
* Sets the peer of the component to the specified peer.
|
||||
*/
|
||||
void setPeer(Component comp, ComponentPeer peer);
|
||||
|
||||
/**
|
||||
* Determines whether this component is lightweight.
|
||||
*/
|
||||
boolean isLightweight(Component comp);
|
||||
|
||||
/**
|
||||
* Returns whether or not paint messages received from
|
||||
* the operating system should be ignored.
|
||||
*/
|
||||
boolean getIgnoreRepaint(Component comp);
|
||||
|
||||
/**
|
||||
* Returns the width of the component.
|
||||
*/
|
||||
int getWidth(Component comp);
|
||||
|
||||
/**
|
||||
* Returns the height of the component.
|
||||
*/
|
||||
int getHeight(Component comp);
|
||||
|
||||
/**
|
||||
* Returns the x coordinate of the component.
|
||||
*/
|
||||
int getX(Component comp);
|
||||
|
||||
/**
|
||||
* Returns the y coordinate of the component.
|
||||
*/
|
||||
int getY(Component comp);
|
||||
|
||||
/**
|
||||
* Gets the foreground color of this component.
|
||||
*/
|
||||
Color getForeground(Component comp);
|
||||
|
||||
/**
|
||||
* Gets the background color of this component.
|
||||
*/
|
||||
Color getBackground(Component comp);
|
||||
|
||||
/**
|
||||
* Sets the background of this component to the specified color.
|
||||
*/
|
||||
void setBackground(Component comp, Color background);
|
||||
|
||||
/**
|
||||
* Gets the font of the component.
|
||||
*/
|
||||
Font getFont(Component comp);
|
||||
|
||||
/**
|
||||
* Processes events occurring on this component.
|
||||
*/
|
||||
void processEvent(Component comp, AWTEvent e);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -169,6 +275,22 @@ public final class AWTAccessor {
|
||||
* components in the specified window to the specified value.
|
||||
*/
|
||||
void setLWRequestStatus(Window changed, boolean status);
|
||||
|
||||
/**
|
||||
* Indicates whether this window should receive focus on subsequently
|
||||
* being shown, or being moved to the front.
|
||||
*/
|
||||
boolean isAutoRequestFocus(Window w);
|
||||
|
||||
/**
|
||||
* Indicates whether the specified window is an utility window for TrayIcon.
|
||||
*/
|
||||
boolean isTrayIconWindow(Window w);
|
||||
|
||||
/**
|
||||
* Marks the specified window as an utility window for TrayIcon.
|
||||
*/
|
||||
void setTrayIconWindow(Window w, boolean isTrayIconWindow);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -248,14 +370,14 @@ public final class AWTAccessor {
|
||||
* An accessor for the EventQueue class
|
||||
*/
|
||||
public interface EventQueueAccessor {
|
||||
/*
|
||||
* Gets the next event queue.
|
||||
*/
|
||||
EventQueue getNextQueue(EventQueue eventQueue);
|
||||
/*
|
||||
* Gets the event dispatch thread.
|
||||
*/
|
||||
Thread getDispatchThread(EventQueue eventQueue);
|
||||
/*
|
||||
* Checks if the current thread is EDT for the given EQ.
|
||||
*/
|
||||
public boolean isDispatchThreadImpl(EventQueue eventQueue);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@ -43,6 +43,9 @@ import java.util.HashSet;
|
||||
import java.beans.PropertyChangeSupport;
|
||||
import java.beans.PropertyChangeListener;
|
||||
import sun.util.logging.PlatformLogger;
|
||||
import java.util.concurrent.locks.Condition;
|
||||
import java.util.concurrent.locks.Lock;
|
||||
import java.util.concurrent.locks.ReentrantLock;
|
||||
|
||||
/**
|
||||
* The AppContext is a table referenced by ThreadGroup which stores
|
||||
@ -132,10 +135,17 @@ public final class AppContext {
|
||||
/* Since the contents of an AppContext are unique to each Java
|
||||
* session, this class should never be serialized. */
|
||||
|
||||
/* The key to put()/get() the Java EventQueue into/from the AppContext.
|
||||
/*
|
||||
* The key to put()/get() the Java EventQueue into/from the AppContext.
|
||||
*/
|
||||
public static final Object EVENT_QUEUE_KEY = new StringBuffer("EventQueue");
|
||||
|
||||
/*
|
||||
* The keys to store EventQueue push/pop lock and condition.
|
||||
*/
|
||||
public final static Object EVENT_QUEUE_LOCK_KEY = new StringBuilder("EventQueue.Lock");
|
||||
public final static Object EVENT_QUEUE_COND_KEY = new StringBuilder("EventQueue.Condition");
|
||||
|
||||
/* A map of AppContexts, referenced by ThreadGroup.
|
||||
*/
|
||||
private static final Map<ThreadGroup, AppContext> threadGroup2appContext =
|
||||
@ -244,6 +254,13 @@ public final class AppContext {
|
||||
return Thread.currentThread().getContextClassLoader();
|
||||
}
|
||||
});
|
||||
|
||||
// Initialize push/pop lock and its condition to be used by all the
|
||||
// EventQueues within this AppContext
|
||||
Lock eventQueuePushPopLock = new ReentrantLock();
|
||||
put(EVENT_QUEUE_LOCK_KEY, eventQueuePushPopLock);
|
||||
Condition eventQueuePushPopCond = eventQueuePushPopLock.newCondition();
|
||||
put(EVENT_QUEUE_COND_KEY, eventQueuePushPopCond);
|
||||
}
|
||||
|
||||
private static final ThreadLocal<AppContext> threadAppContext =
|
||||
|
||||
@ -1,483 +0,0 @@
|
||||
/*
|
||||
* Copyright 2002-2007 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Sun designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Sun in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
package sun.awt;
|
||||
|
||||
import java.awt.Component;
|
||||
import java.awt.Container;
|
||||
import java.awt.AWTEvent;
|
||||
import java.awt.Font;
|
||||
import java.awt.Color;
|
||||
import java.awt.Cursor;
|
||||
import java.awt.Point;
|
||||
|
||||
import java.awt.peer.ComponentPeer;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
|
||||
import sun.util.logging.PlatformLogger;
|
||||
|
||||
import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
|
||||
/**
|
||||
* A collection of methods for modifying package private fields in AWT components.
|
||||
* This class is meant to be used by Peer code only. Previously peer code
|
||||
* got around this problem by modifying fields from native code. However
|
||||
* as we move away from native code to Pure-java peers we need this class.
|
||||
*
|
||||
* @author Bino George
|
||||
*/
|
||||
|
||||
|
||||
public class ComponentAccessor
|
||||
{
|
||||
private static Class componentClass;
|
||||
private static Field fieldX;
|
||||
private static Field fieldY;
|
||||
private static Field fieldWidth;
|
||||
private static Field fieldHeight;
|
||||
private static Method methodGetParentNoClientCode;
|
||||
private static Method methodGetFontNoClientCode;
|
||||
private static Method methodProcessEvent;
|
||||
private static Method methodEnableEvents;
|
||||
private static Field fieldParent;
|
||||
private static Field fieldBackground;
|
||||
private static Field fieldForeground;
|
||||
private static Field fieldFont;
|
||||
private static Field fieldPacked;
|
||||
private static Field fieldIgnoreRepaint;
|
||||
private static Field fieldPeer;
|
||||
private static Field fieldVisible;
|
||||
private static Method methodIsEnabledImpl;
|
||||
private static Method methodGetCursorNoClientCode;
|
||||
private static Method methodLocationNoClientCode;
|
||||
|
||||
private static final PlatformLogger log = PlatformLogger.getLogger("sun.awt.ComponentAccessor");
|
||||
|
||||
private ComponentAccessor() {
|
||||
}
|
||||
|
||||
static {
|
||||
AccessController.doPrivileged( new PrivilegedAction() {
|
||||
public Object run() {
|
||||
try {
|
||||
componentClass = Class.forName("java.awt.Component");
|
||||
fieldX = componentClass.getDeclaredField("x");
|
||||
fieldX.setAccessible(true);
|
||||
fieldY = componentClass.getDeclaredField("y");
|
||||
fieldY.setAccessible(true);
|
||||
fieldWidth = componentClass.getDeclaredField("width");
|
||||
fieldWidth.setAccessible(true);
|
||||
fieldHeight = componentClass.getDeclaredField("height");
|
||||
fieldHeight.setAccessible(true);
|
||||
fieldForeground = componentClass.getDeclaredField("foreground");
|
||||
fieldForeground.setAccessible(true);
|
||||
fieldBackground = componentClass.getDeclaredField("background");
|
||||
fieldBackground.setAccessible(true);
|
||||
fieldFont = componentClass.getDeclaredField("font");
|
||||
fieldFont.setAccessible(true);
|
||||
methodGetParentNoClientCode = componentClass.getDeclaredMethod("getParent_NoClientCode", (Class[]) null);
|
||||
methodGetParentNoClientCode.setAccessible(true);
|
||||
methodGetFontNoClientCode = componentClass.getDeclaredMethod("getFont_NoClientCode", (Class[]) null);
|
||||
methodGetFontNoClientCode.setAccessible(true);
|
||||
Class[] argTypes = { AWTEvent.class };
|
||||
methodProcessEvent = componentClass.getDeclaredMethod("processEvent",argTypes);
|
||||
methodProcessEvent.setAccessible(true);
|
||||
Class[] argTypesForMethodEnableEvents = { Long.TYPE };
|
||||
methodEnableEvents = componentClass.getDeclaredMethod("enableEvents",argTypesForMethodEnableEvents);
|
||||
methodEnableEvents.setAccessible(true);
|
||||
|
||||
fieldParent = componentClass.getDeclaredField("parent");
|
||||
fieldParent.setAccessible(true);
|
||||
fieldPacked = componentClass.getDeclaredField("isPacked");
|
||||
fieldPacked.setAccessible(true);
|
||||
fieldIgnoreRepaint = componentClass.getDeclaredField("ignoreRepaint");
|
||||
fieldIgnoreRepaint.setAccessible(true);
|
||||
|
||||
fieldPeer = componentClass.getDeclaredField("peer");
|
||||
fieldPeer.setAccessible(true);
|
||||
|
||||
fieldVisible = componentClass.getDeclaredField("visible");
|
||||
fieldVisible.setAccessible(true);
|
||||
|
||||
methodIsEnabledImpl = componentClass.getDeclaredMethod("isEnabledImpl", (Class[]) null);
|
||||
methodIsEnabledImpl.setAccessible(true);
|
||||
|
||||
methodGetCursorNoClientCode = componentClass.getDeclaredMethod("getCursor_NoClientCode", (Class[]) null);
|
||||
methodGetCursorNoClientCode.setAccessible(true);
|
||||
|
||||
methodLocationNoClientCode = componentClass.getDeclaredMethod("location_NoClientCode", (Class[]) null);
|
||||
methodLocationNoClientCode.setAccessible(true);
|
||||
}
|
||||
catch (NoSuchFieldException e) {
|
||||
log.fine("Unable to initialize ComponentAccessor", e);
|
||||
}
|
||||
catch (ClassNotFoundException e) {
|
||||
log.fine("Unable to initialize ComponentAccessor", e);
|
||||
}
|
||||
catch (NoSuchMethodException e) {
|
||||
log.fine("Unable to initialize ComponentAccessor", e);
|
||||
}
|
||||
// to please javac
|
||||
return null;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public static void setX(Component c, int x)
|
||||
{
|
||||
try {
|
||||
fieldX.setInt(c,x);
|
||||
}
|
||||
catch (IllegalAccessException e)
|
||||
{
|
||||
log.fine("Unable to access the Component object", e);
|
||||
}
|
||||
}
|
||||
|
||||
public static void setY(Component c, int y)
|
||||
{
|
||||
try {
|
||||
fieldY.setInt(c,y);
|
||||
}
|
||||
catch (IllegalAccessException e)
|
||||
{
|
||||
log.fine("Unable to access the Component object", e);
|
||||
}
|
||||
}
|
||||
|
||||
public static void setWidth(Component c, int width)
|
||||
{
|
||||
try {
|
||||
fieldWidth.setInt(c,width);
|
||||
}
|
||||
catch (IllegalAccessException e)
|
||||
{
|
||||
log.fine("Unable to access the Component object", e);
|
||||
}
|
||||
}
|
||||
|
||||
public static void setHeight(Component c, int height)
|
||||
{
|
||||
try {
|
||||
fieldHeight.setInt(c,height);
|
||||
}
|
||||
catch (IllegalAccessException e)
|
||||
{
|
||||
log.fine("Unable to access the Component object", e);
|
||||
}
|
||||
}
|
||||
|
||||
public static void setBounds(Component c, int x, int y, int width, int height)
|
||||
{
|
||||
try {
|
||||
fieldX.setInt(c,x);
|
||||
fieldY.setInt(c,y);
|
||||
fieldWidth.setInt(c,width);
|
||||
fieldHeight.setInt(c,height);
|
||||
}
|
||||
catch (IllegalAccessException e)
|
||||
{
|
||||
log.fine("Unable to access the Component object", e);
|
||||
}
|
||||
}
|
||||
|
||||
public static int getX(Component c) {
|
||||
try {
|
||||
return fieldX.getInt(c);
|
||||
}
|
||||
catch (IllegalAccessException e)
|
||||
{
|
||||
log.fine("Unable to access the Component object", e);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static int getY(Component c) {
|
||||
try {
|
||||
return fieldY.getInt(c);
|
||||
}
|
||||
catch (IllegalAccessException e)
|
||||
{
|
||||
log.fine("Unable to access the Component object", e);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static int getWidth(Component c) {
|
||||
try {
|
||||
return fieldWidth.getInt(c);
|
||||
}
|
||||
catch (IllegalAccessException e)
|
||||
{
|
||||
log.fine("Unable to access the Component object", e);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static int getHeight(Component c) {
|
||||
try {
|
||||
return fieldHeight.getInt(c);
|
||||
}
|
||||
catch (IllegalAccessException e)
|
||||
{
|
||||
log.fine("Unable to access the Component object", e);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static boolean getIsPacked(Component c) {
|
||||
try {
|
||||
return fieldPacked.getBoolean(c);
|
||||
}
|
||||
catch (IllegalAccessException e)
|
||||
{
|
||||
log.fine("Unable to access the Component object", e);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static Container getParent_NoClientCode(Component c) {
|
||||
Container parent=null;
|
||||
|
||||
try {
|
||||
parent = (Container) methodGetParentNoClientCode.invoke(c, (Object[]) null);
|
||||
}
|
||||
catch (IllegalAccessException e)
|
||||
{
|
||||
log.fine("Unable to access the Component object", e);
|
||||
}
|
||||
catch (InvocationTargetException e) {
|
||||
log.fine("Unable to invoke on the Component object", e);
|
||||
}
|
||||
|
||||
return parent;
|
||||
}
|
||||
|
||||
public static Font getFont_NoClientCode(Component c) {
|
||||
Font font=null;
|
||||
|
||||
try {
|
||||
font = (Font) methodGetFontNoClientCode.invoke(c, (Object[]) null);
|
||||
}
|
||||
catch (IllegalAccessException e)
|
||||
{
|
||||
log.fine("Unable to access the Component object", e);
|
||||
}
|
||||
catch (InvocationTargetException e) {
|
||||
log.fine("Unable to invoke on the Component object", e);
|
||||
}
|
||||
|
||||
return font;
|
||||
}
|
||||
|
||||
public static void processEvent(Component c, AWTEvent event) {
|
||||
Font font=null;
|
||||
|
||||
try {
|
||||
Object[] args = new Object[1];
|
||||
args[0] = event;
|
||||
methodProcessEvent.invoke(c,args);
|
||||
}
|
||||
catch (IllegalAccessException e)
|
||||
{
|
||||
log.fine("Unable to access the Component object", e);
|
||||
}
|
||||
catch (InvocationTargetException e) {
|
||||
log.fine("Unable to invoke on the Component object", e);
|
||||
}
|
||||
}
|
||||
|
||||
public static void enableEvents(Component c, long event_mask) {
|
||||
try {
|
||||
Object[] args = new Object[1];
|
||||
args[0] = Long.valueOf(event_mask);
|
||||
methodEnableEvents.invoke(c,args);
|
||||
}
|
||||
catch (IllegalAccessException e)
|
||||
{
|
||||
log.fine("Unable to access the Component object", e);
|
||||
}
|
||||
catch (InvocationTargetException e) {
|
||||
log.fine("Unable to invoke on the Component object", e);
|
||||
}
|
||||
}
|
||||
|
||||
public static void setParent(Component c, Container parent)
|
||||
{
|
||||
try {
|
||||
fieldParent.set(c,parent);
|
||||
}
|
||||
catch (IllegalAccessException e)
|
||||
{
|
||||
log.fine("Unable to access the Component object", e);
|
||||
}
|
||||
}
|
||||
|
||||
public static Color getForeground(Component c)
|
||||
{
|
||||
Color color = null;
|
||||
try {
|
||||
color = (Color) fieldForeground.get(c);
|
||||
}
|
||||
catch (IllegalAccessException e)
|
||||
{
|
||||
log.fine("Unable to access the Component object", e);
|
||||
}
|
||||
return color;
|
||||
}
|
||||
|
||||
public static Color getBackground(Component c)
|
||||
{
|
||||
Color color = null;
|
||||
try {
|
||||
color = (Color) fieldBackground.get(c);
|
||||
}
|
||||
catch (IllegalAccessException e)
|
||||
{
|
||||
log.fine("Unable to access the Component object", e);
|
||||
}
|
||||
return color;
|
||||
}
|
||||
|
||||
public static void setBackground(Component c, Color color) {
|
||||
try {
|
||||
fieldBackground.set(c, color);
|
||||
}
|
||||
catch (IllegalAccessException e)
|
||||
{
|
||||
log.fine("Unable to access the Component object", e);
|
||||
}
|
||||
}
|
||||
|
||||
public static Font getFont(Component c)
|
||||
{
|
||||
Font f = null;
|
||||
try {
|
||||
f = (Font) fieldFont.get(c);
|
||||
}
|
||||
catch (IllegalAccessException e)
|
||||
{
|
||||
log.fine("Unable to access the Component object", e);
|
||||
}
|
||||
return f;
|
||||
}
|
||||
|
||||
public static ComponentPeer getPeer(Component c) {
|
||||
ComponentPeer peer = null;
|
||||
try {
|
||||
peer = (ComponentPeer)fieldPeer.get(c);
|
||||
}
|
||||
catch (IllegalAccessException e)
|
||||
{
|
||||
log.fine("Unable to access the Component object", e);
|
||||
}
|
||||
return peer;
|
||||
}
|
||||
|
||||
public static void setPeer(Component c, ComponentPeer peer) {
|
||||
try {
|
||||
fieldPeer.set(c, peer);
|
||||
} catch (IllegalAccessException e)
|
||||
{
|
||||
log.fine("Unable to access the Component object", e);
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean getIgnoreRepaint(Component comp) {
|
||||
try {
|
||||
return fieldIgnoreRepaint.getBoolean(comp);
|
||||
}
|
||||
catch (IllegalAccessException e) {
|
||||
log.fine("Unable to access the Component object", e);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public static boolean getVisible(Component c) {
|
||||
try {
|
||||
return fieldVisible.getBoolean(c);
|
||||
}
|
||||
catch (IllegalAccessException e)
|
||||
{
|
||||
log.fine("Unable to access the Component object", e);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static boolean isEnabledImpl(Component c) {
|
||||
boolean enabled = true;
|
||||
try {
|
||||
enabled = (Boolean) methodIsEnabledImpl.invoke(c, (Object[]) null);
|
||||
}
|
||||
catch (IllegalAccessException e)
|
||||
{
|
||||
log.fine("Unable to access the Component object", e);
|
||||
}
|
||||
catch (InvocationTargetException e) {
|
||||
log.fine("Unable to invoke on the Component object", e);
|
||||
}
|
||||
return enabled;
|
||||
}
|
||||
|
||||
public static Cursor getCursor_NoClientCode(Component c) {
|
||||
Cursor cursor = null;
|
||||
|
||||
try {
|
||||
cursor = (Cursor) methodGetCursorNoClientCode.invoke(c, (Object[]) null);
|
||||
}
|
||||
catch (IllegalAccessException e)
|
||||
{
|
||||
log.fine("Unable to access the Component object", e);
|
||||
}
|
||||
catch (InvocationTargetException e) {
|
||||
log.fine("Unable to invoke on the Component object", e);
|
||||
}
|
||||
|
||||
return cursor;
|
||||
}
|
||||
|
||||
public static Point getLocation_NoClientCode(Component c) {
|
||||
Point loc = null;
|
||||
|
||||
try {
|
||||
loc = (Point) methodLocationNoClientCode.invoke(c, (Object[]) null);
|
||||
}
|
||||
catch (IllegalAccessException e)
|
||||
{
|
||||
log.fine("Unable to access the Component object", e);
|
||||
}
|
||||
catch (InvocationTargetException e) {
|
||||
log.fine("Unable to invoke on the Component object", e);
|
||||
}
|
||||
|
||||
return loc;
|
||||
}
|
||||
|
||||
}
|
||||
@ -183,7 +183,7 @@ public abstract class GlobalCursorManager {
|
||||
}
|
||||
|
||||
if (comp instanceof Window) {
|
||||
p = ComponentAccessor.getLocation_NoClientCode(comp);
|
||||
p = AWTAccessor.getComponentAccessor().getLocation(comp);
|
||||
} else if (comp instanceof Container) {
|
||||
p = getLocationOnScreen(comp);
|
||||
}
|
||||
@ -202,7 +202,7 @@ public abstract class GlobalCursorManager {
|
||||
}
|
||||
}
|
||||
|
||||
setCursor(comp, ComponentAccessor.getCursor_NoClientCode(comp), useCache);
|
||||
setCursor(comp, AWTAccessor.getComponentAccessor().getCursor(comp), useCache);
|
||||
|
||||
} catch (IllegalComponentStateException e) {
|
||||
// Shouldn't happen, but if it does, abort.
|
||||
|
||||
@ -722,13 +722,7 @@ public abstract class SunToolkit extends Toolkit
|
||||
EventQueue eq = (EventQueue)appContext.get(AppContext.EVENT_QUEUE_KEY);
|
||||
|
||||
AWTAccessor.EventQueueAccessor accessor = AWTAccessor.getEventQueueAccessor();
|
||||
EventQueue next = accessor.getNextQueue(eq);
|
||||
while (next != null) {
|
||||
eq = next;
|
||||
next = accessor.getNextQueue(eq);
|
||||
}
|
||||
|
||||
return (Thread.currentThread() == accessor.getDispatchThread(eq));
|
||||
return accessor.isDispatchThreadImpl(eq);
|
||||
}
|
||||
|
||||
public Dimension getScreenSize() {
|
||||
@ -806,17 +800,9 @@ public abstract class SunToolkit extends Toolkit
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Makes the window OverrideRedirect, on X11 platforms. See
|
||||
* ICCCM specification for more details about OverrideRedirect
|
||||
* windows. Implemented in XToolkit, no-op in WToolkit.
|
||||
*/
|
||||
public void setOverrideRedirect(Window target) {
|
||||
}
|
||||
static final SoftCache imgCache = new SoftCache();
|
||||
|
||||
static SoftCache imgCache = new SoftCache();
|
||||
|
||||
static synchronized Image getImageFromHash(Toolkit tk, URL url) {
|
||||
static Image getImageFromHash(Toolkit tk, URL url) {
|
||||
SecurityManager sm = System.getSecurityManager();
|
||||
if (sm != null) {
|
||||
try {
|
||||
@ -844,32 +830,36 @@ public abstract class SunToolkit extends Toolkit
|
||||
sm.checkConnect(url.getHost(), url.getPort());
|
||||
}
|
||||
}
|
||||
Image img = (Image)imgCache.get(url);
|
||||
if (img == null) {
|
||||
try {
|
||||
img = tk.createImage(new URLImageSource(url));
|
||||
imgCache.put(url, img);
|
||||
} catch (Exception e) {
|
||||
synchronized (imgCache) {
|
||||
Image img = (Image)imgCache.get(url);
|
||||
if (img == null) {
|
||||
try {
|
||||
img = tk.createImage(new URLImageSource(url));
|
||||
imgCache.put(url, img);
|
||||
} catch (Exception e) {
|
||||
}
|
||||
}
|
||||
return img;
|
||||
}
|
||||
return img;
|
||||
}
|
||||
|
||||
static synchronized Image getImageFromHash(Toolkit tk,
|
||||
static Image getImageFromHash(Toolkit tk,
|
||||
String filename) {
|
||||
SecurityManager security = System.getSecurityManager();
|
||||
if (security != null) {
|
||||
security.checkRead(filename);
|
||||
}
|
||||
Image img = (Image)imgCache.get(filename);
|
||||
if (img == null) {
|
||||
try {
|
||||
img = tk.createImage(new FileImageSource(filename));
|
||||
imgCache.put(filename, img);
|
||||
} catch (Exception e) {
|
||||
synchronized (imgCache) {
|
||||
Image img = (Image)imgCache.get(filename);
|
||||
if (img == null) {
|
||||
try {
|
||||
img = tk.createImage(new FileImageSource(filename));
|
||||
imgCache.put(filename, img);
|
||||
} catch (Exception e) {
|
||||
}
|
||||
}
|
||||
return img;
|
||||
}
|
||||
return img;
|
||||
}
|
||||
|
||||
public Image getImage(String filename) {
|
||||
@ -1128,6 +1118,18 @@ public abstract class SunToolkit extends Toolkit
|
||||
return Toolkit.getNativeContainer(c);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gives native peers the ability to query the closest HW component.
|
||||
* If the given component is heavyweight, then it returns this. Otherwise,
|
||||
* it goes one level up in the hierarchy and tests next component.
|
||||
*/
|
||||
public static Component getHeavyweightComponent(Component c) {
|
||||
while (c != null && AWTAccessor.getComponentAccessor().isLightweight(c)) {
|
||||
c = AWTAccessor.getComponentAccessor().getParent(c);
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a new input method window, with behavior as specified in
|
||||
* {@link java.awt.im.spi.InputMethodContext#createInputMethodWindow}.
|
||||
|
||||
@ -1,96 +0,0 @@
|
||||
/*
|
||||
* Copyright 2007 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Sun designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Sun in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
package sun.awt;
|
||||
|
||||
import java.awt.Window;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
import sun.util.logging.PlatformLogger;
|
||||
|
||||
import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
|
||||
public class WindowAccessor {
|
||||
|
||||
private static Class windowClass;
|
||||
private static Field fieldIsAutoRequestFocus;
|
||||
private static Field fieldIsTrayIconWindow;
|
||||
|
||||
private static final PlatformLogger log = PlatformLogger.getLogger("sun.awt.WindowAccessor");
|
||||
|
||||
private WindowAccessor() {
|
||||
}
|
||||
|
||||
static {
|
||||
AccessController.doPrivileged( new PrivilegedAction() {
|
||||
public Object run() {
|
||||
try {
|
||||
windowClass = Class.forName("java.awt.Window");
|
||||
fieldIsAutoRequestFocus = windowClass.getDeclaredField("autoRequestFocus");
|
||||
fieldIsAutoRequestFocus.setAccessible(true);
|
||||
fieldIsTrayIconWindow = windowClass.getDeclaredField("isTrayIconWindow");
|
||||
fieldIsTrayIconWindow.setAccessible(true);
|
||||
|
||||
} catch (NoSuchFieldException e) {
|
||||
log.fine("Unable to initialize WindowAccessor: ", e);
|
||||
} catch (ClassNotFoundException e) {
|
||||
log.fine("Unable to initialize WindowAccessor: ", e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public static boolean isAutoRequestFocus(Window w) {
|
||||
try {
|
||||
return fieldIsAutoRequestFocus.getBoolean(w);
|
||||
|
||||
} catch (IllegalAccessException e) {
|
||||
log.fine("Unable to access the Window object", e);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public static boolean isTrayIconWindow(Window w) {
|
||||
try {
|
||||
return fieldIsTrayIconWindow.getBoolean(w);
|
||||
|
||||
} catch (IllegalAccessException e) {
|
||||
log.fine("Unable to access the Window object", e);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static void setTrayIconWindow(Window w, boolean isTrayIconWindow) {
|
||||
try {
|
||||
fieldIsTrayIconWindow.set(w, isTrayIconWindow);
|
||||
|
||||
} catch (IllegalAccessException e) {
|
||||
log.fine("Unable to access the Window object", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -51,6 +51,9 @@ import java.io.Reader;
|
||||
import java.io.SequenceInputStream;
|
||||
import java.io.StringReader;
|
||||
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.CharBuffer;
|
||||
import java.nio.charset.Charset;
|
||||
@ -625,6 +628,14 @@ public abstract class DataTransferer {
|
||||
*/
|
||||
public abstract boolean isImageFormat(long format);
|
||||
|
||||
/**
|
||||
* Determines whether the format is a URI list we can convert to
|
||||
* a DataFlavor.javaFileListFlavor.
|
||||
*/
|
||||
protected boolean isURIListFormat(long format) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a Map whose keys are all of the possible formats into which the
|
||||
* Transferable's transfer data flavors can be translated. The value of
|
||||
@ -1297,45 +1308,53 @@ search:
|
||||
if (!DataFlavor.javaFileListFlavor.equals(flavor)) {
|
||||
throw new IOException("data translation failed");
|
||||
}
|
||||
final List list = (List)obj;
|
||||
|
||||
final ArrayList fileList = new ArrayList();
|
||||
final List list = (List)obj;
|
||||
|
||||
final ProtectionDomain userProtectionDomain = getUserProtectionDomain(contents);
|
||||
|
||||
int nFiles = 0;
|
||||
for (int i = 0; i < list.size(); i++) {
|
||||
Object o = list.get(i);
|
||||
if (o instanceof File || o instanceof String) {
|
||||
nFiles++;
|
||||
final ArrayList<String> fileList = castToFiles(list, userProtectionDomain);
|
||||
|
||||
bos = convertFileListToBytes(fileList);
|
||||
|
||||
|
||||
// Target data is a URI list. Source data must be a
|
||||
// java.util.List which contains java.io.File or String instances.
|
||||
} else if (isURIListFormat(format)) {
|
||||
if (!DataFlavor.javaFileListFlavor.equals(flavor)) {
|
||||
throw new IOException("data translation failed");
|
||||
}
|
||||
String nat = getNativeForFormat(format);
|
||||
String targetCharset = null;
|
||||
if (nat != null) {
|
||||
try {
|
||||
targetCharset = new DataFlavor(nat).getParameter("charset");
|
||||
} catch (ClassNotFoundException cnfe) {
|
||||
throw new IOException(cnfe);
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
AccessController.doPrivileged(new PrivilegedExceptionAction() {
|
||||
public Object run() throws IOException {
|
||||
for (Object fileObject : list)
|
||||
{
|
||||
File file = castToFile(fileObject);
|
||||
if (null == System.getSecurityManager() ||
|
||||
!(isFileInWebstartedCache(file) ||
|
||||
isForbiddenToRead(file, userProtectionDomain)))
|
||||
{
|
||||
fileList.add(file.getCanonicalPath());
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
});
|
||||
} catch (PrivilegedActionException pae) {
|
||||
throw new IOException(pae.getMessage());
|
||||
if (targetCharset == null) {
|
||||
targetCharset = "UTF-8";
|
||||
}
|
||||
final List list = (List)obj;
|
||||
final ProtectionDomain userProtectionDomain = getUserProtectionDomain(contents);
|
||||
final ArrayList<String> fileList = castToFiles(list, userProtectionDomain);
|
||||
final ArrayList<String> uriList = new ArrayList<String>(fileList.size());
|
||||
for (String fileObject : fileList) {
|
||||
final URI uri = new File(fileObject).toURI();
|
||||
// Some implementations are fussy about the number of slashes (file:///path/to/file is best)
|
||||
try {
|
||||
uriList.add(new URI(uri.getScheme(), "", uri.getPath(), uri.getFragment()).toString());
|
||||
} catch (URISyntaxException uriSyntaxException) {
|
||||
throw new IOException(uriSyntaxException);
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < fileList.size(); i++)
|
||||
{
|
||||
byte[] bytes = ((String)fileList.get(i)).getBytes();
|
||||
if (i != 0) bos.write(0);
|
||||
byte[] eoln = "\r\n".getBytes(targetCharset);
|
||||
for (int i = 0; i < uriList.size(); i++) {
|
||||
byte[] bytes = uriList.get(i).getBytes(targetCharset);
|
||||
bos.write(bytes, 0, bytes.length);
|
||||
bos.write(eoln, 0, eoln.length);
|
||||
}
|
||||
|
||||
// Source data is an InputStream. For arbitrary flavors, just grab the
|
||||
@ -1385,6 +1404,8 @@ search:
|
||||
return ret;
|
||||
}
|
||||
|
||||
protected abstract ByteArrayOutputStream convertFileListToBytes(ArrayList<String> fileList) throws IOException;
|
||||
|
||||
private String removeSuspectedData(DataFlavor flavor, final Transferable contents, final String str)
|
||||
throws IOException
|
||||
{
|
||||
@ -1452,6 +1473,33 @@ search:
|
||||
return true;
|
||||
}
|
||||
|
||||
private ArrayList<String> castToFiles(final List files,
|
||||
final ProtectionDomain userProtectionDomain) throws IOException
|
||||
{
|
||||
final ArrayList<String> fileList = new ArrayList<String>();
|
||||
try {
|
||||
AccessController.doPrivileged(new PrivilegedExceptionAction() {
|
||||
public Object run() throws IOException {
|
||||
for (Object fileObject : files)
|
||||
{
|
||||
File file = castToFile(fileObject);
|
||||
if (file != null &&
|
||||
(null == System.getSecurityManager() ||
|
||||
!(isFileInWebstartedCache(file) ||
|
||||
isForbiddenToRead(file, userProtectionDomain))))
|
||||
{
|
||||
fileList.add(file.getCanonicalPath());
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
});
|
||||
} catch (PrivilegedActionException pae) {
|
||||
throw new IOException(pae.getMessage());
|
||||
}
|
||||
return fileList;
|
||||
}
|
||||
|
||||
// It is important do not use user's successors
|
||||
// of File class.
|
||||
private File castToFile(Object fileObject) throws IOException {
|
||||
@ -1460,6 +1508,8 @@ search:
|
||||
filePath = ((File)fileObject).getCanonicalPath();
|
||||
} else if (fileObject instanceof String) {
|
||||
filePath = (String) fileObject;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
return new File(filePath);
|
||||
}
|
||||
@ -1565,6 +1615,29 @@ search:
|
||||
// Turn the list of Files into a List and return
|
||||
return Arrays.asList(files);
|
||||
|
||||
// Source data is a URI list. Convert to DataFlavor.javaFileListFlavor
|
||||
// where possible.
|
||||
} else if (isURIListFormat(format) && DataFlavor.javaFileListFlavor.equals(flavor)) {
|
||||
try {
|
||||
URI uris[] = dragQueryURIs(str, bytes, format, localeTransferable);
|
||||
if (uris == null) {
|
||||
return null;
|
||||
}
|
||||
ArrayList files = new ArrayList();
|
||||
for (URI uri : uris) {
|
||||
try {
|
||||
files.add(new File(uri));
|
||||
} catch (IllegalArgumentException illegalArg) {
|
||||
// When converting from URIs to less generic files,
|
||||
// common practice (Wine, SWT) seems to be to
|
||||
// silently drop the URIs that aren't local files.
|
||||
}
|
||||
}
|
||||
return files;
|
||||
} finally {
|
||||
str.close();
|
||||
}
|
||||
|
||||
// Target data is a String. Strip terminating NUL bytes. Decode bytes
|
||||
// into characters. Search-and-replace EOLN.
|
||||
} else if (String.class.equals(flavor.getRepresentationClass()) &&
|
||||
@ -1949,6 +2022,19 @@ search:
|
||||
*/
|
||||
protected abstract String[] dragQueryFile(byte[] bytes);
|
||||
|
||||
/**
|
||||
* Decodes URIs from either a byte array or a stream.
|
||||
*/
|
||||
protected URI[] dragQueryURIs(InputStream stream,
|
||||
byte[] bytes,
|
||||
long format,
|
||||
Transferable localeTransferable)
|
||||
throws IOException
|
||||
{
|
||||
throw new IOException(
|
||||
new UnsupportedOperationException("not implemented on this platform"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Translates either a byte array or an input stream which contain
|
||||
* platform-specific image data in the given format into an Image.
|
||||
|
||||
@ -396,12 +396,19 @@ public class StandardGlyphVector extends GlyphVector {
|
||||
|
||||
// !!! not cached, assume TextLayout will cache if necessary
|
||||
public Rectangle2D getVisualBounds() {
|
||||
if (glyphs.length == 0) {
|
||||
return new Rectangle2D.Float(0, 0, 0, 0);
|
||||
Rectangle2D result = null;
|
||||
for (int i = 0; i < glyphs.length; ++i) {
|
||||
Rectangle2D glyphVB = getGlyphVisualBounds(i).getBounds2D();
|
||||
if (!glyphVB.isEmpty()) {
|
||||
if (result == null) {
|
||||
result = glyphVB;
|
||||
} else {
|
||||
Rectangle2D.union(result, glyphVB, result);
|
||||
}
|
||||
}
|
||||
}
|
||||
Rectangle2D result = getGlyphVisualBounds(0).getBounds2D();
|
||||
for (int i = 1; i < glyphs.length; ++i) {
|
||||
Rectangle2D.union(result, getGlyphVisualBounds(i).getBounds2D(), result);
|
||||
if (result == null) {
|
||||
result = new Rectangle2D.Float(0, 0, 0, 0);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@ -1787,8 +1794,19 @@ public class StandardGlyphVector extends GlyphVector {
|
||||
gp.transform(sgv.invdtx);
|
||||
result = gp.getBounds2D();
|
||||
}
|
||||
result.setRect(result.getMinX() + x + dx, result.getMinY() + y + dy,
|
||||
result.getWidth(), result.getHeight());
|
||||
/* Since x is the logical advance of the glyph to this point.
|
||||
* Because of the way that Rectangle.union is specified, this
|
||||
* means that subsequent unioning of a rect including that
|
||||
* will be affected, even if the glyph is empty. So skip such
|
||||
* cases. This alone isn't a complete solution since x==0
|
||||
* may also not be what is wanted. The code that does the
|
||||
* unioning also needs to be aware to ignore empty glyphs.
|
||||
*/
|
||||
if (!result.isEmpty()) {
|
||||
result.setRect(result.getMinX() + x + dx,
|
||||
result.getMinY() + y + dy,
|
||||
result.getWidth(), result.getHeight());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@ -25,6 +25,7 @@
|
||||
|
||||
package sun.net.www.protocol.http.spnego;
|
||||
|
||||
import com.sun.security.jgss.ExtendedGSSContext;
|
||||
import java.io.IOException;
|
||||
|
||||
import org.ietf.jgss.GSSContext;
|
||||
@ -100,15 +101,10 @@ public class NegotiatorImpl extends Negotiator {
|
||||
null,
|
||||
GSSContext.DEFAULT_LIFETIME);
|
||||
|
||||
// In order to support credential delegation in HTTP/SPNEGO,
|
||||
// we always request it before initSecContext. The current
|
||||
// implementation will check the OK-AS-DELEGATE flag inside
|
||||
// the service ticket of the web server, and only enable
|
||||
// delegation when this flag is set. This check is only
|
||||
// performed when the GSS caller is CALLER_HTTP_NEGOTIATE,
|
||||
// so all other normal GSS-API calls are not affected.
|
||||
|
||||
context.requestCredDeleg(true);
|
||||
// Always respect delegation policy in HTTP/SPNEGO.
|
||||
if (context instanceof ExtendedGSSContext) {
|
||||
((ExtendedGSSContext)context).requestDelegPolicy(true);
|
||||
}
|
||||
oneToken = context.initSecContext(new byte[0], 0, 0);
|
||||
}
|
||||
|
||||
|
||||
@ -89,7 +89,8 @@ import com.sun.security.jgss.*;
|
||||
*/
|
||||
class GSSContextImpl implements ExtendedGSSContext {
|
||||
|
||||
private GSSManagerImpl gssManager = null;
|
||||
private final GSSManagerImpl gssManager;
|
||||
private final boolean initiator;
|
||||
|
||||
// private flags for the context state
|
||||
private static final int PRE_INIT = 1;
|
||||
@ -99,14 +100,12 @@ class GSSContextImpl implements ExtendedGSSContext {
|
||||
|
||||
// instance variables
|
||||
private int currentState = PRE_INIT;
|
||||
private boolean initiator;
|
||||
|
||||
private GSSContextSpi mechCtxt = null;
|
||||
private Oid mechOid = null;
|
||||
private ObjectIdentifier objId = null;
|
||||
|
||||
private GSSCredentialImpl myCred = null;
|
||||
private GSSCredentialImpl delegCred = null;
|
||||
|
||||
private GSSNameImpl srcName = null;
|
||||
private GSSNameImpl targName = null;
|
||||
@ -121,6 +120,7 @@ class GSSContextImpl implements ExtendedGSSContext {
|
||||
private boolean reqSequenceDetState = true;
|
||||
private boolean reqCredDelegState = false;
|
||||
private boolean reqAnonState = false;
|
||||
private boolean reqDelegPolicyState = false;
|
||||
|
||||
/**
|
||||
* Creates a GSSContextImp on the context initiator's side.
|
||||
@ -221,6 +221,7 @@ class GSSContextImpl implements ExtendedGSSContext {
|
||||
mechCtxt.requestSequenceDet(reqSequenceDetState);
|
||||
mechCtxt.requestAnonymity(reqAnonState);
|
||||
mechCtxt.setChannelBinding(channelBindings);
|
||||
mechCtxt.requestDelegPolicy(reqDelegPolicyState);
|
||||
|
||||
objId = new ObjectIdentifier(mechOid.toString());
|
||||
|
||||
@ -465,42 +466,42 @@ class GSSContextImpl implements ExtendedGSSContext {
|
||||
}
|
||||
|
||||
public void requestMutualAuth(boolean state) throws GSSException {
|
||||
if (mechCtxt == null)
|
||||
if (mechCtxt == null && initiator)
|
||||
reqMutualAuthState = state;
|
||||
}
|
||||
|
||||
public void requestReplayDet(boolean state) throws GSSException {
|
||||
if (mechCtxt == null)
|
||||
if (mechCtxt == null && initiator)
|
||||
reqReplayDetState = state;
|
||||
}
|
||||
|
||||
public void requestSequenceDet(boolean state) throws GSSException {
|
||||
if (mechCtxt == null)
|
||||
if (mechCtxt == null && initiator)
|
||||
reqSequenceDetState = state;
|
||||
}
|
||||
|
||||
public void requestCredDeleg(boolean state) throws GSSException {
|
||||
if (mechCtxt == null)
|
||||
if (mechCtxt == null && initiator)
|
||||
reqCredDelegState = state;
|
||||
}
|
||||
|
||||
public void requestAnonymity(boolean state) throws GSSException {
|
||||
if (mechCtxt == null)
|
||||
if (mechCtxt == null && initiator)
|
||||
reqAnonState = state;
|
||||
}
|
||||
|
||||
public void requestConf(boolean state) throws GSSException {
|
||||
if (mechCtxt == null)
|
||||
if (mechCtxt == null && initiator)
|
||||
reqConfState = state;
|
||||
}
|
||||
|
||||
public void requestInteg(boolean state) throws GSSException {
|
||||
if (mechCtxt == null)
|
||||
if (mechCtxt == null && initiator)
|
||||
reqIntegState = state;
|
||||
}
|
||||
|
||||
public void requestLifetime(int lifetime) throws GSSException {
|
||||
if (mechCtxt == null)
|
||||
if (mechCtxt == null && initiator)
|
||||
reqLifetime = lifetime;
|
||||
}
|
||||
|
||||
@ -630,6 +631,8 @@ class GSSContextImpl implements ExtendedGSSContext {
|
||||
targName = null;
|
||||
}
|
||||
|
||||
// ExtendedGSSContext methods:
|
||||
|
||||
@Override
|
||||
public Object inquireSecContext(InquireType type) throws GSSException {
|
||||
SecurityManager security = System.getSecurityManager();
|
||||
@ -641,4 +644,18 @@ class GSSContextImpl implements ExtendedGSSContext {
|
||||
}
|
||||
return mechCtxt.inquireSecContext(type);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void requestDelegPolicy(boolean state) throws GSSException {
|
||||
if (mechCtxt == null && initiator)
|
||||
reqDelegPolicyState = state;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getDelegPolicyState() {
|
||||
if (mechCtxt != null)
|
||||
return mechCtxt.getDelegPolicyState();
|
||||
else
|
||||
return reqDelegPolicyState;
|
||||
}
|
||||
}
|
||||
|
||||
@ -85,32 +85,39 @@ abstract class InitialToken extends Krb5Token {
|
||||
int size = CHECKSUM_LENGTH_SIZE + CHECKSUM_BINDINGS_SIZE +
|
||||
CHECKSUM_FLAGS_SIZE;
|
||||
|
||||
if (context.getCredDelegState()) {
|
||||
if (context.getCaller() instanceof HttpCaller &&
|
||||
!serviceTicket.getFlags()[Krb5.TKT_OPTS_DELEGATE]) {
|
||||
// When the caller is HTTP/SPNEGO and OK-AS-DELEGATE
|
||||
// is not present in the service ticket, delegation
|
||||
// is disabled.
|
||||
context.setCredDelegState(false);
|
||||
} else if (!tgt.isForwardable()) {
|
||||
// XXX log this resetting of delegation state
|
||||
context.setCredDelegState(false);
|
||||
} else {
|
||||
KrbCred krbCred = null;
|
||||
CipherHelper cipherHelper =
|
||||
context.getCipherHelper(serviceTicket.getSessionKey());
|
||||
if (useNullKey(cipherHelper)) {
|
||||
krbCred = new KrbCred(tgt, serviceTicket,
|
||||
EncryptionKey.NULL_KEY);
|
||||
} else {
|
||||
krbCred = new KrbCred(tgt, serviceTicket,
|
||||
serviceTicket.getSessionKey());
|
||||
if (!tgt.isForwardable()) {
|
||||
context.setCredDelegState(false);
|
||||
context.setDelegPolicyState(false);
|
||||
} else if (context.getCredDelegState()) {
|
||||
if (context.getDelegPolicyState()) {
|
||||
if (!serviceTicket.checkDelegate()) {
|
||||
// delegation not permitted by server policy, mark it
|
||||
context.setDelegPolicyState(false);
|
||||
}
|
||||
krbCredMessage = krbCred.getMessage();
|
||||
size += CHECKSUM_DELEG_OPT_SIZE +
|
||||
CHECKSUM_DELEG_LGTH_SIZE +
|
||||
krbCredMessage.length;
|
||||
}
|
||||
} else if (context.getDelegPolicyState()) {
|
||||
if (serviceTicket.checkDelegate()) {
|
||||
context.setCredDelegState(true);
|
||||
} else {
|
||||
context.setDelegPolicyState(false);
|
||||
}
|
||||
}
|
||||
|
||||
if (context.getCredDelegState()) {
|
||||
KrbCred krbCred = null;
|
||||
CipherHelper cipherHelper =
|
||||
context.getCipherHelper(serviceTicket.getSessionKey());
|
||||
if (useNullKey(cipherHelper)) {
|
||||
krbCred = new KrbCred(tgt, serviceTicket,
|
||||
EncryptionKey.NULL_KEY);
|
||||
} else {
|
||||
krbCred = new KrbCred(tgt, serviceTicket,
|
||||
serviceTicket.getSessionKey());
|
||||
}
|
||||
krbCredMessage = krbCred.getMessage();
|
||||
size += CHECKSUM_DELEG_OPT_SIZE +
|
||||
CHECKSUM_DELEG_LGTH_SIZE +
|
||||
krbCredMessage.length;
|
||||
}
|
||||
|
||||
checksumBytes = new byte[size];
|
||||
@ -296,6 +303,7 @@ abstract class InitialToken extends Krb5Token {
|
||||
return delegCreds;
|
||||
}
|
||||
|
||||
// Only called by acceptor
|
||||
public void setContextFlags(Krb5Context context) {
|
||||
// default for cred delegation is false
|
||||
if ((flags & CHECKSUM_DELEG_FLAG) > 0)
|
||||
|
||||
@ -78,6 +78,7 @@ class Krb5Context implements GSSContextSpi {
|
||||
private boolean sequenceDetState = true;
|
||||
private boolean confState = true;
|
||||
private boolean integState = true;
|
||||
private boolean delegPolicyState = false;
|
||||
|
||||
private int mySeqNumber;
|
||||
private int peerSeqNumber;
|
||||
@ -299,6 +300,21 @@ class Krb5Context implements GSSContextSpi {
|
||||
return sequenceDetState || replayDetState;
|
||||
}
|
||||
|
||||
/**
|
||||
* Requests that the deleg policy be respected.
|
||||
*/
|
||||
public final void requestDelegPolicy(boolean value) {
|
||||
if (state == STATE_NEW && isInitiator())
|
||||
delegPolicyState = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Is deleg policy respected?
|
||||
*/
|
||||
public final boolean getDelegPolicyState() {
|
||||
return delegPolicyState;
|
||||
}
|
||||
|
||||
/*
|
||||
* Anonymity is a little different in that after an application
|
||||
* requests anonymity it will want to know whether the mechanism
|
||||
@ -422,6 +438,10 @@ class Krb5Context implements GSSContextSpi {
|
||||
integState = state;
|
||||
}
|
||||
|
||||
final void setDelegPolicyState(boolean state) {
|
||||
delegPolicyState = state;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the channel bindings to be used during context
|
||||
* establishment.
|
||||
|
||||
@ -124,6 +124,8 @@ public interface GSSContextSpi {
|
||||
|
||||
public void requestInteg(boolean state) throws GSSException;
|
||||
|
||||
public void requestDelegPolicy(boolean state) throws GSSException;
|
||||
|
||||
public void setChannelBinding(ChannelBinding cb) throws GSSException;
|
||||
|
||||
public boolean getCredDelegState();
|
||||
@ -136,6 +138,8 @@ public interface GSSContextSpi {
|
||||
|
||||
public boolean getAnonymityState();
|
||||
|
||||
public boolean getDelegPolicyState();
|
||||
|
||||
public boolean isTransferable() throws GSSException;
|
||||
|
||||
public boolean isProtReady();
|
||||
|
||||
@ -63,6 +63,7 @@ public class SpNegoContext implements GSSContextSpi {
|
||||
private boolean sequenceDetState = true;
|
||||
private boolean confState = true;
|
||||
private boolean integState = true;
|
||||
private boolean delegPolicyState = false;
|
||||
|
||||
private GSSNameSpi peerName = null;
|
||||
private GSSNameSpi myName = null;
|
||||
@ -153,6 +154,14 @@ public class SpNegoContext implements GSSContextSpi {
|
||||
integState = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Requests that deleg policy be respected.
|
||||
*/
|
||||
public final void requestDelegPolicy(boolean value) throws GSSException {
|
||||
if (state == STATE_NEW && isInitiator())
|
||||
delegPolicyState = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Is integrity available?
|
||||
*/
|
||||
@ -160,6 +169,19 @@ public class SpNegoContext implements GSSContextSpi {
|
||||
return integState;
|
||||
}
|
||||
|
||||
/**
|
||||
* Is deleg policy respected?
|
||||
*/
|
||||
public final boolean getDelegPolicyState() {
|
||||
if (isInitiator() && mechContext != null &&
|
||||
mechContext instanceof ExtendedGSSContext &&
|
||||
(state == STATE_IN_PROCESS || state == STATE_DONE)) {
|
||||
return ((ExtendedGSSContext)mechContext).getDelegPolicyState();
|
||||
} else {
|
||||
return delegPolicyState;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Requests that credential delegation be done during context
|
||||
* establishment.
|
||||
@ -173,7 +195,7 @@ public class SpNegoContext implements GSSContextSpi {
|
||||
* Is credential delegation enabled?
|
||||
*/
|
||||
public final boolean getCredDelegState() {
|
||||
if (mechContext != null &&
|
||||
if (isInitiator() && mechContext != null &&
|
||||
(state == STATE_IN_PROCESS || state == STATE_DONE)) {
|
||||
return mechContext.getCredDelegState();
|
||||
} else {
|
||||
@ -201,30 +223,6 @@ public class SpNegoContext implements GSSContextSpi {
|
||||
return mutualAuthState;
|
||||
}
|
||||
|
||||
final void setCredDelegState(boolean state) {
|
||||
credDelegState = state;
|
||||
}
|
||||
|
||||
final void setMutualAuthState(boolean state) {
|
||||
mutualAuthState = state;
|
||||
}
|
||||
|
||||
final void setReplayDetState(boolean state) {
|
||||
replayDetState = state;
|
||||
}
|
||||
|
||||
final void setSequenceDetState(boolean state) {
|
||||
sequenceDetState = state;
|
||||
}
|
||||
|
||||
final void setConfState(boolean state) {
|
||||
confState = state;
|
||||
}
|
||||
|
||||
final void setIntegState(boolean state) {
|
||||
integState = state;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the mechanism oid.
|
||||
*
|
||||
@ -319,14 +317,9 @@ public class SpNegoContext implements GSSContextSpi {
|
||||
mechToken = GSS_initSecContext(null);
|
||||
|
||||
errorCode = GSSException.DEFECTIVE_TOKEN;
|
||||
byte[] micToken = null;
|
||||
if (!GSSUtil.useMSInterop()) {
|
||||
// calculate MIC only in normal mode
|
||||
micToken = generateMechListMIC(DER_mechTypes);
|
||||
}
|
||||
// generate SPNEGO token
|
||||
initToken = new NegTokenInit(DER_mechTypes, getContextFlags(),
|
||||
mechToken, micToken);
|
||||
mechToken, null);
|
||||
if (DEBUG) {
|
||||
System.out.println("SpNegoContext.initSecContext: " +
|
||||
"sending token of type = " +
|
||||
@ -585,15 +578,9 @@ public class SpNegoContext implements GSSContextSpi {
|
||||
"negotiated result = " + negoResult);
|
||||
}
|
||||
|
||||
// calculate MIC only in normal mode
|
||||
byte[] micToken = null;
|
||||
if (!GSSUtil.useMSInterop() && valid) {
|
||||
micToken = generateMechListMIC(DER_mechTypes);
|
||||
}
|
||||
|
||||
// generate SPNEGO token
|
||||
NegTokenTarg targToken = new NegTokenTarg(negoResult.ordinal(),
|
||||
mech_wanted, accept_token, micToken);
|
||||
mech_wanted, accept_token, null);
|
||||
if (DEBUG) {
|
||||
System.out.println("SpNegoContext.acceptSecContext: " +
|
||||
"sending token of type = " +
|
||||
@ -653,6 +640,10 @@ public class SpNegoContext implements GSSContextSpi {
|
||||
throw gssException;
|
||||
}
|
||||
|
||||
if (state == STATE_DONE) {
|
||||
// now set the context flags for acceptor
|
||||
setContextFlags();
|
||||
}
|
||||
return retVal;
|
||||
}
|
||||
|
||||
@ -703,36 +694,39 @@ public class SpNegoContext implements GSSContextSpi {
|
||||
return out;
|
||||
}
|
||||
|
||||
// Only called on acceptor side. On the initiator side, most flags
|
||||
// are already set at request. For those that might get chanegd,
|
||||
// state from mech below is used.
|
||||
private void setContextFlags() {
|
||||
|
||||
if (mechContext != null) {
|
||||
// default for cred delegation is false
|
||||
if (mechContext.getCredDelegState()) {
|
||||
setCredDelegState(true);
|
||||
credDelegState = true;
|
||||
}
|
||||
// default for the following are true
|
||||
if (!mechContext.getMutualAuthState()) {
|
||||
setMutualAuthState(false);
|
||||
mutualAuthState = false;
|
||||
}
|
||||
if (!mechContext.getReplayDetState()) {
|
||||
setReplayDetState(false);
|
||||
replayDetState = false;
|
||||
}
|
||||
if (!mechContext.getSequenceDetState()) {
|
||||
setSequenceDetState(false);
|
||||
sequenceDetState = false;
|
||||
}
|
||||
if (!mechContext.getIntegState()) {
|
||||
setIntegState(false);
|
||||
integState = false;
|
||||
}
|
||||
if (!mechContext.getConfState()) {
|
||||
setConfState(false);
|
||||
confState = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* generate MIC on mechList
|
||||
* generate MIC on mechList. Not used at the moment.
|
||||
*/
|
||||
private byte[] generateMechListMIC(byte[] mechTypes)
|
||||
/*private byte[] generateMechListMIC(byte[] mechTypes)
|
||||
throws GSSException {
|
||||
|
||||
// sanity check the required input
|
||||
@ -769,7 +763,7 @@ public class SpNegoContext implements GSSContextSpi {
|
||||
}
|
||||
}
|
||||
return mic;
|
||||
}
|
||||
}*/
|
||||
|
||||
/**
|
||||
* verify MIC on MechList
|
||||
@ -837,6 +831,10 @@ public class SpNegoContext implements GSSContextSpi {
|
||||
mechContext.requestMutualAuth(mutualAuthState);
|
||||
mechContext.requestReplayDet(replayDetState);
|
||||
mechContext.requestSequenceDet(sequenceDetState);
|
||||
if (mechContext instanceof ExtendedGSSContext) {
|
||||
((ExtendedGSSContext)mechContext).requestDelegPolicy(
|
||||
delegPolicyState);
|
||||
}
|
||||
}
|
||||
|
||||
// pass token
|
||||
@ -1202,5 +1200,5 @@ public class SpNegoContext implements GSSContextSpi {
|
||||
"inquireSecContext not supported by underlying mech.");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -57,6 +57,12 @@ public final class SpNegoMechFactory implements MechanismFactory {
|
||||
GSSName.NT_HOSTBASED_SERVICE,
|
||||
GSSName.NT_EXPORT_NAME};
|
||||
|
||||
// The default underlying mech of SPNEGO, must not be SPNEGO itself.
|
||||
private static final Oid DEFAULT_SPNEGO_MECH_OID =
|
||||
ProviderList.DEFAULT_MECH_OID.equals(GSS_SPNEGO_MECH_OID)?
|
||||
GSSUtil.GSS_KRB5_MECH_OID:
|
||||
ProviderList.DEFAULT_MECH_OID;
|
||||
|
||||
// Use an instance of a GSSManager whose provider list
|
||||
// does not include native provider
|
||||
final GSSManagerImpl manager;
|
||||
@ -100,18 +106,27 @@ public final class SpNegoMechFactory implements MechanismFactory {
|
||||
availableMechs[j++] = mechs[i];
|
||||
}
|
||||
}
|
||||
// Move the preferred mech to first place
|
||||
for (int i=0; i<availableMechs.length; i++) {
|
||||
if (availableMechs[i].equals(DEFAULT_SPNEGO_MECH_OID)) {
|
||||
if (i != 0) {
|
||||
availableMechs[i] = availableMechs[0];
|
||||
availableMechs[0] = DEFAULT_SPNEGO_MECH_OID;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public GSSNameSpi getNameElement(String nameStr, Oid nameType)
|
||||
throws GSSException {
|
||||
// get NameElement for the default Mechanism
|
||||
return manager.getNameElement(nameStr, nameType, null);
|
||||
throws GSSException {
|
||||
return manager.getNameElement(
|
||||
nameStr, nameType, DEFAULT_SPNEGO_MECH_OID);
|
||||
}
|
||||
|
||||
public GSSNameSpi getNameElement(byte[] name, Oid nameType)
|
||||
throws GSSException {
|
||||
// get NameElement for the default Mechanism
|
||||
return manager.getNameElement(name, nameType, null);
|
||||
throws GSSException {
|
||||
return manager.getNameElement(name, nameType, DEFAULT_SPNEGO_MECH_OID);
|
||||
}
|
||||
|
||||
public GSSCredentialSpi getCredentialElement(GSSNameSpi name,
|
||||
|
||||
@ -549,6 +549,9 @@ class NativeGSSContext implements GSSContextSpi {
|
||||
public void requestInteg(boolean state) throws GSSException {
|
||||
changeFlags(GSS_C_INTEG_FLAG, state);
|
||||
}
|
||||
public void requestDelegPolicy(boolean state) throws GSSException {
|
||||
// Not supported, ignore
|
||||
}
|
||||
public void requestLifetime(int lifetime) throws GSSException {
|
||||
if (isInitiator && pContext == 0) {
|
||||
this.lifetime = lifetime;
|
||||
@ -590,6 +593,9 @@ class NativeGSSContext implements GSSContextSpi {
|
||||
public boolean getIntegState() {
|
||||
return checkFlags(GSS_C_INTEG_FLAG);
|
||||
}
|
||||
public boolean getDelegPolicyState() {
|
||||
return false;
|
||||
}
|
||||
public int getLifetime() {
|
||||
return cStub.getContextTime(pContext);
|
||||
}
|
||||
|
||||
@ -234,7 +234,19 @@ public class Credentials {
|
||||
* @return true if OK-AS_DELEGATE flag is set, otherwise, return false.
|
||||
*/
|
||||
public boolean checkDelegate() {
|
||||
return (flags.get(Krb5.TKT_OPTS_DELEGATE));
|
||||
return flags.get(Krb5.TKT_OPTS_DELEGATE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset TKT_OPTS_DELEGATE to false, called at credentials acquirement
|
||||
* when one of the cross-realm TGTs does not have the OK-AS-DELEGATE
|
||||
* flag set. This info must be preservable and restorable through
|
||||
* the Krb5Util.credsToTicket/ticketToCreds() methods so that even if
|
||||
* the service ticket is cached it still remembers the cross-realm
|
||||
* authentication result.
|
||||
*/
|
||||
public void resetDelegate() {
|
||||
flags.set(Krb5.TKT_OPTS_DELEGATE, false);
|
||||
}
|
||||
|
||||
public Credentials renew() throws KrbException, IOException {
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Portions Copyright 2001-2004 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Portions Copyright 2001-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -117,6 +117,7 @@ rs.
|
||||
|
||||
// Get a list of realms to traverse
|
||||
String[] realms = Realm.getRealmsList(localRealm, serviceRealm);
|
||||
boolean okAsDelegate = true;
|
||||
|
||||
if (realms == null || realms.length == 0)
|
||||
{
|
||||
@ -194,6 +195,15 @@ rs.
|
||||
*/
|
||||
|
||||
newTgtRealm = newTgt.getServer().getInstanceComponent();
|
||||
if (okAsDelegate && !newTgt.checkDelegate()) {
|
||||
if (DEBUG)
|
||||
{
|
||||
System.out.println(">>> Credentials acquireServiceCreds: " +
|
||||
"global OK-AS-DELEGATE turned off at " +
|
||||
newTgt.getServer());
|
||||
}
|
||||
okAsDelegate = false;
|
||||
}
|
||||
|
||||
if (DEBUG)
|
||||
{
|
||||
@ -283,6 +293,9 @@ rs.
|
||||
System.out.println(">>> Credentials acquireServiceCreds: returning creds:");
|
||||
Credentials.printDebug(theCreds);
|
||||
}
|
||||
if (!okAsDelegate) {
|
||||
theCreds.resetDelegate();
|
||||
}
|
||||
return theCreds;
|
||||
}
|
||||
throw new KrbApErrException(Krb5.KRB_AP_ERR_GEN_CRED,
|
||||
|
||||
@ -44,7 +44,6 @@ import sun.security.util.*;
|
||||
import sun.security.x509.AlgorithmId;
|
||||
import sun.security.x509.X509Key;
|
||||
import sun.security.x509.X500Name;
|
||||
import sun.security.x509.X500Signer;
|
||||
|
||||
/**
|
||||
* A PKCS #10 certificate request is created and sent to a Certificate
|
||||
@ -183,13 +182,13 @@ public class PKCS10 {
|
||||
* Create the signed certificate request. This will later be
|
||||
* retrieved in either string or binary format.
|
||||
*
|
||||
* @param requester identifies the signer (by X.500 name)
|
||||
* and provides the private key used to sign.
|
||||
* @param subject identifies the signer (by X.500 name).
|
||||
* @param signature private key and signing algorithm to use.
|
||||
* @exception IOException on errors.
|
||||
* @exception CertificateException on certificate handling errors.
|
||||
* @exception SignatureException on signature handling errors.
|
||||
*/
|
||||
public void encodeAndSign(X500Signer requester)
|
||||
public void encodeAndSign(X500Name subject, Signature signature)
|
||||
throws CertificateException, IOException, SignatureException {
|
||||
DerOutputStream out, scratch;
|
||||
byte[] certificateRequestInfo;
|
||||
@ -198,7 +197,7 @@ public class PKCS10 {
|
||||
if (encoded != null)
|
||||
throw new SignatureException("request is already signed");
|
||||
|
||||
subject = requester.getSigner();
|
||||
this.subject = subject;
|
||||
|
||||
/*
|
||||
* Encode cert request info, wrap in a sequence for signing
|
||||
@ -217,14 +216,20 @@ public class PKCS10 {
|
||||
/*
|
||||
* Sign it ...
|
||||
*/
|
||||
requester.update(certificateRequestInfo, 0,
|
||||
signature.update(certificateRequestInfo, 0,
|
||||
certificateRequestInfo.length);
|
||||
sig = requester.sign();
|
||||
sig = signature.sign();
|
||||
|
||||
/*
|
||||
* Build guts of SIGNED macro
|
||||
*/
|
||||
requester.getAlgorithmId().encode(scratch); // sig algorithm
|
||||
AlgorithmId algId = null;
|
||||
try {
|
||||
algId = AlgorithmId.getAlgorithmId(signature.getAlgorithm());
|
||||
} catch (NoSuchAlgorithmException nsae) {
|
||||
throw new SignatureException(nsae);
|
||||
}
|
||||
algId.encode(scratch); // sig algorithm
|
||||
scratch.putBitString(sig); // sig
|
||||
|
||||
/*
|
||||
|
||||
@ -1,427 +0,0 @@
|
||||
/*
|
||||
* Copyright 1996-2006 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Sun designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Sun in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
package sun.security.provider;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
import java.security.*;
|
||||
|
||||
/**
|
||||
* An implementation of IdentityScope as a persistent identity
|
||||
* database.
|
||||
*
|
||||
* @see Identity
|
||||
* @see Key
|
||||
*
|
||||
* @author Benjamin Renaud
|
||||
*/
|
||||
public
|
||||
class IdentityDatabase extends IdentityScope implements Serializable {
|
||||
|
||||
/** use serialVersionUID from JDK 1.1. for interoperability */
|
||||
private static final long serialVersionUID = 4923799573357658384L;
|
||||
|
||||
/* Are we debugging? */
|
||||
private static final boolean debug = false;
|
||||
|
||||
/* Are we printing out error messages? */
|
||||
private static final boolean error = true;
|
||||
|
||||
/* The source file, if any, for this database.*/
|
||||
File sourceFile;
|
||||
|
||||
/* The private representation of the database.*/
|
||||
Hashtable<String, Identity> identities;
|
||||
|
||||
IdentityDatabase() throws InvalidParameterException {
|
||||
this("restoring...");
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct a new, empty database with a specified source file.
|
||||
*
|
||||
* @param file the source file.
|
||||
*/
|
||||
public IdentityDatabase(File file) throws InvalidParameterException {
|
||||
this(file.getName());
|
||||
sourceFile = file;
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct a new, empty database.
|
||||
*/
|
||||
public IdentityDatabase(String name) throws InvalidParameterException {
|
||||
super(name);
|
||||
identities = new Hashtable<String, Identity>();
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize an identity database from a stream. The stream should
|
||||
* contain data to initialized a serialized IdentityDatabase
|
||||
* object.
|
||||
*
|
||||
* @param is the input stream from which to restore the database.
|
||||
*
|
||||
* @exception IOException if a stream IO exception occurs
|
||||
*/
|
||||
public static IdentityDatabase fromStream(InputStream is)
|
||||
throws IOException {
|
||||
IdentityDatabase db = null;
|
||||
try {
|
||||
ObjectInputStream ois = new ObjectInputStream(is);
|
||||
db = (IdentityDatabase)ois.readObject();
|
||||
} catch (ClassNotFoundException e) {
|
||||
// this can't happen.
|
||||
debug("This should not be happening.", e);
|
||||
error(
|
||||
"The version of the database is obsolete. Cannot initialize.");
|
||||
|
||||
} catch (InvalidClassException e) {
|
||||
// this may happen in developers workspaces happen.
|
||||
debug("This should not be happening.", e);
|
||||
error("Unable to initialize system identity scope: " +
|
||||
" InvalidClassException. \nThis is most likely due to " +
|
||||
"a serialization versioning problem: a class used in " +
|
||||
"key management was obsoleted");
|
||||
|
||||
} catch (StreamCorruptedException e) {
|
||||
debug("The serialization stream is corrupted. Unable to load.", e);
|
||||
error("Unable to initialize system identity scope." +
|
||||
" StreamCorruptedException.");
|
||||
}
|
||||
|
||||
if (db == null) {
|
||||
db = new IdentityDatabase("uninitialized");
|
||||
}
|
||||
|
||||
return db;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize an IdentityDatabase from file.
|
||||
*
|
||||
* @param f the filename where the identity database is stored.
|
||||
*
|
||||
* @exception IOException a file-related exception occurs (e.g.
|
||||
* the directory of the file passed does not exists, etc.
|
||||
*
|
||||
* @IOException if a file IO exception occurs.
|
||||
*/
|
||||
public static IdentityDatabase fromFile(File f) throws IOException {
|
||||
FileInputStream fis = new FileInputStream(f);
|
||||
IdentityDatabase edb = fromStream(fis);
|
||||
edb.sourceFile = f;
|
||||
return edb;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @return the number of identities in the database.
|
||||
*/
|
||||
public int size() {
|
||||
return identities.size();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param name the name of the identity to be retrieved.
|
||||
*
|
||||
* @return the identity named name, or null if there are
|
||||
* no identities named name in the database.
|
||||
*/
|
||||
public Identity getIdentity(String name) {
|
||||
Identity id = identities.get(name);
|
||||
if (id instanceof Signer) {
|
||||
localCheck("get.signer");
|
||||
}
|
||||
return id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get an identity by key.
|
||||
*
|
||||
* @param name the key of the identity to be retrieved.
|
||||
*
|
||||
* @return the identity with a given key, or null if there are no
|
||||
* identities with that key in the database.
|
||||
*/
|
||||
public Identity getIdentity(PublicKey key) {
|
||||
if (key == null) {
|
||||
return null;
|
||||
}
|
||||
Enumeration<Identity> e = identities();
|
||||
while (e.hasMoreElements()) {
|
||||
Identity i = e.nextElement();
|
||||
PublicKey k = i.getPublicKey();
|
||||
if (k != null && keyEqual(k, key)) {
|
||||
if (i instanceof Signer) {
|
||||
localCheck("get.signer");
|
||||
}
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private boolean keyEqual(Key key1, Key key2) {
|
||||
if (key1 == key2) {
|
||||
return true;
|
||||
} else {
|
||||
return MessageDigest.isEqual(key1.getEncoded(), key2.getEncoded());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds an identity to the database.
|
||||
*
|
||||
* @param identity the identity to be added.
|
||||
*
|
||||
* @exception KeyManagementException if a name or key clash
|
||||
* occurs, or if another exception occurs.
|
||||
*/
|
||||
public void addIdentity(Identity identity)
|
||||
throws KeyManagementException {
|
||||
localCheck("add.identity");
|
||||
Identity byName = getIdentity(identity.getName());
|
||||
Identity byKey = getIdentity(identity.getPublicKey());
|
||||
String msg = null;
|
||||
|
||||
if (byName != null) {
|
||||
msg = "name conflict";
|
||||
}
|
||||
if (byKey != null) {
|
||||
msg = "key conflict";
|
||||
}
|
||||
if (msg != null) {
|
||||
throw new KeyManagementException(msg);
|
||||
}
|
||||
identities.put(identity.getName(), identity);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes an identity to the database.
|
||||
*/
|
||||
public void removeIdentity(Identity identity)
|
||||
throws KeyManagementException {
|
||||
localCheck("remove.identity");
|
||||
String name = identity.getName();
|
||||
if (identities.get(name) == null) {
|
||||
throw new KeyManagementException("there is no identity named " +
|
||||
name + " in " + this);
|
||||
}
|
||||
identities.remove(name);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return an enumeration of all identities in the database.
|
||||
*/
|
||||
public Enumeration<Identity> identities() {
|
||||
return identities.elements();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the source file for this database.
|
||||
*/
|
||||
void setSourceFile(File f) {
|
||||
sourceFile = f;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the source file for this database.
|
||||
*/
|
||||
File getSourceFile() {
|
||||
return sourceFile;
|
||||
}
|
||||
|
||||
/**
|
||||
* Save the database in its current state to an output stream.
|
||||
*
|
||||
* @param os the output stream to which the database should be serialized.
|
||||
*
|
||||
* @exception IOException if an IO exception is raised by stream
|
||||
* operations.
|
||||
*/
|
||||
public void save(OutputStream os) throws IOException {
|
||||
try {
|
||||
ObjectOutputStream oos = new ObjectOutputStream(os);
|
||||
oos.writeObject(this);
|
||||
oos.flush();
|
||||
} catch (InvalidClassException e) {
|
||||
debug("This should not be happening.", e);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Save the database to a file.
|
||||
*
|
||||
* @exception IOException if an IO exception is raised by stream
|
||||
* operations.
|
||||
*/
|
||||
void save(File f) throws IOException {
|
||||
setSourceFile(f);
|
||||
FileOutputStream fos = new FileOutputStream(f);
|
||||
save(fos);
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves the database to the default source file.
|
||||
*
|
||||
* @exception KeyManagementException when there is no default source
|
||||
* file specified for this database.
|
||||
*/
|
||||
public void save() throws IOException {
|
||||
if (sourceFile == null) {
|
||||
throw new IOException("this database has no source file");
|
||||
}
|
||||
save(sourceFile);
|
||||
}
|
||||
|
||||
/**
|
||||
* This method returns the file from which to initialize the
|
||||
* system database.
|
||||
*/
|
||||
private static File systemDatabaseFile() {
|
||||
|
||||
// First figure out where the identity database is hiding, if anywhere.
|
||||
String dbPath = Security.getProperty("identity.database");
|
||||
// if nowhere, it's the canonical place.
|
||||
if (dbPath == null) {
|
||||
dbPath = System.getProperty("user.home") + File.separatorChar +
|
||||
"identitydb.obj";
|
||||
}
|
||||
return new File(dbPath);
|
||||
}
|
||||
|
||||
|
||||
/* This block initializes the system database, if there is one. */
|
||||
static {
|
||||
java.security.AccessController.doPrivileged(
|
||||
new java.security.PrivilegedAction<Void>() {
|
||||
public Void run() {
|
||||
initializeSystem();
|
||||
return null;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* This method initializes the system's identity database. The
|
||||
* canonical location is
|
||||
* <user.home>/identitydatabase.obj. This is settable through
|
||||
* the identity.database property. */
|
||||
private static void initializeSystem() {
|
||||
|
||||
IdentityDatabase systemDatabase;
|
||||
File dbFile = systemDatabaseFile();
|
||||
|
||||
// Second figure out if it's there, and if it isn't, create one.
|
||||
try {
|
||||
if (dbFile.exists()) {
|
||||
debug("loading system database from file: " + dbFile);
|
||||
systemDatabase = fromFile(dbFile);
|
||||
} else {
|
||||
systemDatabase = new IdentityDatabase(dbFile);
|
||||
}
|
||||
IdentityScope.setSystemScope(systemDatabase);
|
||||
debug("System database initialized: " + systemDatabase);
|
||||
} catch (IOException e) {
|
||||
debug("Error initializing identity database: " + dbFile, e);
|
||||
return;
|
||||
} catch (InvalidParameterException e) {
|
||||
debug("Error trying to instantiate a system identities db in " +
|
||||
dbFile, e);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
private static File securityPropFile(String filename) {
|
||||
// maybe check for a system property which will specify where to
|
||||
// look.
|
||||
String sep = File.separator;
|
||||
return new File(System.getProperty("java.home") +
|
||||
sep + "lib" + sep + "security" +
|
||||
sep + filename);
|
||||
}
|
||||
*/
|
||||
|
||||
public String toString() {
|
||||
return "sun.security.provider.IdentityDatabase, source file: " +
|
||||
sourceFile;
|
||||
}
|
||||
|
||||
|
||||
private static void debug(String s) {
|
||||
if (debug) {
|
||||
System.err.println(s);
|
||||
}
|
||||
}
|
||||
|
||||
private static void debug(String s, Throwable t) {
|
||||
if (debug) {
|
||||
t.printStackTrace();
|
||||
System.err.println(s);
|
||||
}
|
||||
}
|
||||
|
||||
private static void error(String s) {
|
||||
if (error) {
|
||||
System.err.println(s);
|
||||
}
|
||||
}
|
||||
|
||||
void localCheck(String directive) {
|
||||
SecurityManager security = System.getSecurityManager();
|
||||
if (security != null) {
|
||||
directive = this.getClass().getName() + "." +
|
||||
directive + "." + localFullName();
|
||||
security.checkSecurityAccess(directive);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a parsable name for identity: identityName.scopeName
|
||||
*/
|
||||
String localFullName() {
|
||||
String parsable = getName();
|
||||
if (getScope() != null) {
|
||||
parsable += "." +getScope().getName();
|
||||
}
|
||||
return parsable;
|
||||
}
|
||||
|
||||
/**
|
||||
* Serialization write.
|
||||
*/
|
||||
private synchronized void writeObject (java.io.ObjectOutputStream stream)
|
||||
throws IOException {
|
||||
localCheck("serialize.identity.database");
|
||||
stream.writeObject(identities);
|
||||
stream.writeObject(sourceFile);
|
||||
}
|
||||
}
|
||||
@ -295,16 +295,13 @@ public class PolicyFile extends java.security.Policy {
|
||||
|
||||
private static final int DEFAULT_CACHE_SIZE = 1;
|
||||
|
||||
/** the scope to check */
|
||||
private static IdentityScope scope = null;
|
||||
|
||||
// contains the policy grant entries, PD cache, and alias mapping
|
||||
private AtomicReference<PolicyInfo> policyInfo =
|
||||
new AtomicReference<PolicyInfo>();
|
||||
private boolean constructed = false;
|
||||
|
||||
private boolean expandProperties = true;
|
||||
private boolean ignoreIdentityScope = false;
|
||||
private boolean ignoreIdentityScope = true;
|
||||
private boolean allowSystemProperties = true;
|
||||
private boolean notUtf8 = false;
|
||||
private URL url;
|
||||
@ -2024,85 +2021,9 @@ public class PolicyFile extends java.security.Policy {
|
||||
private boolean checkForTrustedIdentity(final Certificate cert,
|
||||
PolicyInfo myInfo)
|
||||
{
|
||||
if (cert == null)
|
||||
return false;
|
||||
|
||||
// see if we are ignoring the identity scope or not
|
||||
if (ignoreIdentityScope)
|
||||
return false;
|
||||
|
||||
// try to initialize scope
|
||||
synchronized(PolicyFile.class) {
|
||||
if (scope == null) {
|
||||
IdentityScope is = IdentityScope.getSystemScope();
|
||||
|
||||
if (is instanceof sun.security.provider.IdentityDatabase) {
|
||||
scope = is;
|
||||
} else {
|
||||
// leave scope null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (scope == null) {
|
||||
ignoreIdentityScope = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
// need privileged block for getIdentity in case we are trying
|
||||
// to get a signer
|
||||
final Identity id = AccessController.doPrivileged(
|
||||
new java.security.PrivilegedAction<Identity>() {
|
||||
public Identity run() {
|
||||
return scope.getIdentity(cert.getPublicKey());
|
||||
}
|
||||
});
|
||||
|
||||
if (isTrusted(id)) {
|
||||
if (debug != null) {
|
||||
debug.println("Adding policy entry for trusted Identity: ");
|
||||
//needed for identity toString!
|
||||
AccessController.doPrivileged(
|
||||
new java.security.PrivilegedAction<Void>() {
|
||||
public Void run() {
|
||||
debug.println(" identity = " + id);
|
||||
return null;
|
||||
}
|
||||
});
|
||||
debug.println("");
|
||||
}
|
||||
|
||||
// add it to the policy for future reference
|
||||
Certificate certs[] = new Certificate[] {cert};
|
||||
PolicyEntry pe = new PolicyEntry(new CodeSource(null, certs));
|
||||
pe.add(SecurityConstants.ALL_PERMISSION);
|
||||
|
||||
myInfo.identityPolicyEntries.add(pe);
|
||||
|
||||
// add it to the mapping as well so
|
||||
// we don't have to go through this again
|
||||
myInfo.aliasMapping.put(cert, id.getName());
|
||||
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private static boolean isTrusted(Identity id) {
|
||||
if (id instanceof SystemIdentity) {
|
||||
SystemIdentity sysid = (SystemIdentity)id;
|
||||
if (sysid.isTrusted()) {
|
||||
return true;
|
||||
}
|
||||
} else if (id instanceof SystemSigner) {
|
||||
SystemSigner sysid = (SystemSigner)id;
|
||||
if (sysid.isTrusted()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Each entry in the policy configuration file is represented by a
|
||||
* PolicyEntry object. <p>
|
||||
|
||||
@ -1,107 +0,0 @@
|
||||
/*
|
||||
* Copyright 1996-2000 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Sun designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Sun in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
package sun.security.provider;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Enumeration;
|
||||
import java.security.*;
|
||||
|
||||
/**
|
||||
* An identity with a very simple trust mechanism.
|
||||
*
|
||||
* @author Benjamin Renaud
|
||||
*/
|
||||
|
||||
public class SystemIdentity extends Identity implements Serializable {
|
||||
|
||||
/** use serialVersionUID from JDK 1.1. for interoperability */
|
||||
private static final long serialVersionUID = 9060648952088498478L;
|
||||
|
||||
/* This should be changed to ACL */
|
||||
boolean trusted = false;
|
||||
|
||||
/* Free form additional information about this identity. */
|
||||
private String info;
|
||||
|
||||
public SystemIdentity(String name, IdentityScope scope)
|
||||
throws InvalidParameterException, KeyManagementException {
|
||||
super(name, scope);
|
||||
}
|
||||
|
||||
/**
|
||||
* Is this identity trusted by sun.* facilities?
|
||||
*/
|
||||
public boolean isTrusted() {
|
||||
return trusted;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the trust status of this identity.
|
||||
*/
|
||||
protected void setTrusted(boolean trusted) {
|
||||
this.trusted = trusted;
|
||||
}
|
||||
|
||||
void setIdentityInfo(String info) {
|
||||
super.setInfo(info);
|
||||
}
|
||||
|
||||
String getIndentityInfo() {
|
||||
return super.getInfo();
|
||||
}
|
||||
|
||||
/**
|
||||
* Call back method into a protected method for package friends.
|
||||
*/
|
||||
void setIdentityPublicKey(PublicKey key) throws KeyManagementException {
|
||||
setPublicKey(key);
|
||||
}
|
||||
|
||||
/**
|
||||
* Call back method into a protected method for package friends.
|
||||
*/
|
||||
void addIdentityCertificate(Certificate cert)
|
||||
throws KeyManagementException {
|
||||
addCertificate(cert);
|
||||
}
|
||||
|
||||
void clearCertificates() throws KeyManagementException {
|
||||
Certificate[] certs = certificates();
|
||||
for (int i = 0; i < certs.length; i++) {
|
||||
removeCertificate(certs[i]);
|
||||
}
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
String trustedString = "not trusted";
|
||||
if (trusted) {
|
||||
trustedString = "trusted";
|
||||
}
|
||||
return super.toString() + "[" + trustedString + "]";
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -1,115 +0,0 @@
|
||||
/*
|
||||
* Copyright 1996-2000 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Sun designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Sun in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
package sun.security.provider;
|
||||
|
||||
import java.util.*;
|
||||
import java.security.*;
|
||||
|
||||
/**
|
||||
* SunSecurity signer. Like SystemIdentity, it has a trust bit, which
|
||||
* can be set by SunSecurity classes, and a set of accessors for other
|
||||
* classes in sun.security.*.
|
||||
*
|
||||
* @author Benjamin Renaud
|
||||
*/
|
||||
|
||||
public class SystemSigner extends Signer {
|
||||
|
||||
/** use serialVersionUID from JDK 1.1. for interoperability */
|
||||
private static final long serialVersionUID = -2127743304301557711L;
|
||||
|
||||
/* Is this signer trusted */
|
||||
private boolean trusted = false;
|
||||
|
||||
/**
|
||||
* Construct a signer with a given name.
|
||||
*/
|
||||
public SystemSigner(String name) {
|
||||
super(name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct a signer with a name and a scope.
|
||||
*
|
||||
* @param name the signer's name.
|
||||
*
|
||||
* @param scope the scope for this signer.
|
||||
*/
|
||||
public SystemSigner(String name, IdentityScope scope)
|
||||
throws KeyManagementException {
|
||||
|
||||
super(name, scope);
|
||||
}
|
||||
|
||||
/* Set the trust status of this signer */
|
||||
void setTrusted(boolean trusted) {
|
||||
this.trusted = trusted;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if this signer is trusted.
|
||||
*/
|
||||
public boolean isTrusted() {
|
||||
return trusted;
|
||||
}
|
||||
|
||||
/* friendly callback for set keys */
|
||||
void setSignerKeyPair(KeyPair pair)
|
||||
throws InvalidParameterException, KeyException {
|
||||
setKeyPair(pair);
|
||||
}
|
||||
|
||||
/* friendly callback for getting private keys */
|
||||
PrivateKey getSignerPrivateKey() {
|
||||
return getPrivateKey();
|
||||
}
|
||||
|
||||
void setSignerInfo(String s) {
|
||||
setInfo(s);
|
||||
}
|
||||
|
||||
/**
|
||||
* Call back method into a protected method for package friends.
|
||||
*/
|
||||
void addSignerCertificate(Certificate cert) throws KeyManagementException {
|
||||
addCertificate(cert);
|
||||
}
|
||||
|
||||
void clearCertificates() throws KeyManagementException {
|
||||
Certificate[] certs = certificates();
|
||||
for (int i = 0; i < certs.length; i++) {
|
||||
removeCertificate(certs[i]);
|
||||
}
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
String trustedString = "not trusted";
|
||||
if (trusted) {
|
||||
trustedString = "trusted";
|
||||
}
|
||||
return super.toString() + "[" + trustedString + "]";
|
||||
}
|
||||
}
|
||||
@ -335,10 +335,13 @@ class OCSPChecker extends PKIXCertPathChecker {
|
||||
response = OCSP.check(Collections.singletonList(certId), uri,
|
||||
responderCert, pkixParams.getDate());
|
||||
} catch (Exception e) {
|
||||
// Wrap all exceptions in CertPathValidatorException so that
|
||||
// we can fallback to CRLs, if enabled.
|
||||
throw new CertPathValidatorException
|
||||
("Unable to send OCSP request", e);
|
||||
if (e instanceof CertPathValidatorException) {
|
||||
throw (CertPathValidatorException) e;
|
||||
} else {
|
||||
// Wrap exceptions in CertPathValidatorException so that
|
||||
// we can fallback to CRLs, if enabled.
|
||||
throw new CertPathValidatorException(e);
|
||||
}
|
||||
}
|
||||
|
||||
RevocationStatus rs = (RevocationStatus) response.getSingleResponse(certId);
|
||||
|
||||
@ -118,8 +118,6 @@ public class JarSigner {
|
||||
KeyStore store; // the keystore specified by -keystore
|
||||
// or the default keystore, never null
|
||||
|
||||
IdentityScope scope;
|
||||
|
||||
String keystore; // key store file
|
||||
boolean nullStream = false; // null keystore input stream (NONE)
|
||||
boolean token = false; // token-based keystore
|
||||
@ -212,7 +210,6 @@ public class JarSigner {
|
||||
if (verify) {
|
||||
try {
|
||||
loadKeyStore(keystore, false);
|
||||
scope = IdentityScope.getSystemScope();
|
||||
} catch (Exception e) {
|
||||
if ((keystore != null) || (storepass != null)) {
|
||||
System.out.println(rb.getString("jarsigner error: ") +
|
||||
@ -984,13 +981,6 @@ public class JarSigner {
|
||||
result |= IN_KEYSTORE;
|
||||
}
|
||||
}
|
||||
if (!found && (scope != null)) {
|
||||
Identity id = scope.getIdentity(c.getPublicKey());
|
||||
if (id != null) {
|
||||
result |= IN_SCOPE;
|
||||
storeHash.put(c, "[" + id.getName() + "]");
|
||||
}
|
||||
}
|
||||
if (ckaliases.contains(alias)) {
|
||||
result |= SIGNED_BY_ALIAS;
|
||||
}
|
||||
|
||||
@ -40,7 +40,6 @@ import java.security.UnrecoverableEntryException;
|
||||
import java.security.UnrecoverableKeyException;
|
||||
import java.security.Principal;
|
||||
import java.security.Provider;
|
||||
import java.security.Identity;
|
||||
import java.security.cert.Certificate;
|
||||
import java.security.cert.CertificateFactory;
|
||||
import java.security.cert.X509Certificate;
|
||||
@ -57,9 +56,6 @@ import java.net.URLClassLoader;
|
||||
import sun.misc.BASE64Encoder;
|
||||
import sun.security.util.ObjectIdentifier;
|
||||
import sun.security.pkcs.PKCS10;
|
||||
import sun.security.provider.IdentityDatabase;
|
||||
import sun.security.provider.SystemSigner;
|
||||
import sun.security.provider.SystemIdentity;
|
||||
import sun.security.provider.X509Factory;
|
||||
import sun.security.util.DerOutputStream;
|
||||
import sun.security.util.Password;
|
||||
@ -1163,18 +1159,16 @@ public final class KeyTool {
|
||||
Signature signature = Signature.getInstance(sigAlgName);
|
||||
signature.initSign(privateKey);
|
||||
|
||||
X500Signer signer = new X500Signer(signature, issuer);
|
||||
|
||||
X509CertInfo info = new X509CertInfo();
|
||||
info.set(X509CertInfo.VALIDITY, interval);
|
||||
info.set(X509CertInfo.SERIAL_NUMBER, new CertificateSerialNumber(
|
||||
new java.util.Random().nextInt() & 0x7fffffff));
|
||||
info.set(X509CertInfo.VERSION,
|
||||
new CertificateVersion(CertificateVersion.V3));
|
||||
new CertificateVersion(CertificateVersion.V3));
|
||||
info.set(X509CertInfo.ALGORITHM_ID,
|
||||
new CertificateAlgorithmId(signer.getAlgorithmId()));
|
||||
info.set(X509CertInfo.ISSUER,
|
||||
new CertificateIssuerName(signer.getSigner()));
|
||||
new CertificateAlgorithmId(
|
||||
AlgorithmId.getAlgorithmId(sigAlgName)));
|
||||
info.set(X509CertInfo.ISSUER, new CertificateIssuerName(issuer));
|
||||
|
||||
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
|
||||
boolean canRead = false;
|
||||
@ -1249,7 +1243,7 @@ public final class KeyTool {
|
||||
request.getAttributes().setAttribute(X509CertInfo.EXTENSIONS,
|
||||
new PKCS10Attribute(PKCS9Attribute.EXTENSION_REQUEST_OID, ext));
|
||||
|
||||
// Construct an X500Signer object, so that we can sign the request
|
||||
// Construct a Signature object, so that we can sign the request
|
||||
if (sigAlgName == null) {
|
||||
sigAlgName = getCompatibleSigAlgName(privKey.getAlgorithm());
|
||||
}
|
||||
@ -1259,10 +1253,9 @@ public final class KeyTool {
|
||||
X500Name subject = dname == null?
|
||||
new X500Name(((X509Certificate)cert).getSubjectDN().toString()):
|
||||
new X500Name(dname);
|
||||
X500Signer signer = new X500Signer(signature, subject);
|
||||
|
||||
// Sign the request and base-64 encode it
|
||||
request.encodeAndSign(signer);
|
||||
request.encodeAndSign(subject, signature);
|
||||
request.print(out);
|
||||
}
|
||||
|
||||
@ -1564,75 +1557,8 @@ public final class KeyTool {
|
||||
private void doImportIdentityDatabase(InputStream in)
|
||||
throws Exception
|
||||
{
|
||||
byte[] encoded;
|
||||
ByteArrayInputStream bais;
|
||||
java.security.cert.X509Certificate newCert;
|
||||
java.security.cert.Certificate[] chain = null;
|
||||
PrivateKey privKey;
|
||||
boolean modified = false;
|
||||
|
||||
IdentityDatabase idb = IdentityDatabase.fromStream(in);
|
||||
for (Enumeration<Identity> enum_ = idb.identities();
|
||||
enum_.hasMoreElements();) {
|
||||
Identity id = enum_.nextElement();
|
||||
newCert = null;
|
||||
// only store trusted identities in keystore
|
||||
if ((id instanceof SystemSigner && ((SystemSigner)id).isTrusted())
|
||||
|| (id instanceof SystemIdentity
|
||||
&& ((SystemIdentity)id).isTrusted())) {
|
||||
// ignore if keystore entry with same alias name already exists
|
||||
if (keyStore.containsAlias(id.getName())) {
|
||||
MessageFormat form = new MessageFormat
|
||||
(rb.getString("Keystore entry for <id.getName()> already exists"));
|
||||
Object[] source = {id.getName()};
|
||||
System.err.println(form.format(source));
|
||||
continue;
|
||||
}
|
||||
java.security.Certificate[] certs = id.certificates();
|
||||
if (certs!=null && certs.length>0) {
|
||||
// we can only store one user cert per identity.
|
||||
// convert old-style to new-style cert via the encoding
|
||||
DerOutputStream dos = new DerOutputStream();
|
||||
certs[0].encode(dos);
|
||||
encoded = dos.toByteArray();
|
||||
bais = new ByteArrayInputStream(encoded);
|
||||
newCert = (X509Certificate)cf.generateCertificate(bais);
|
||||
bais.close();
|
||||
|
||||
// if certificate is self-signed, make sure it verifies
|
||||
if (isSelfSigned(newCert)) {
|
||||
PublicKey pubKey = newCert.getPublicKey();
|
||||
try {
|
||||
newCert.verify(pubKey);
|
||||
} catch (Exception e) {
|
||||
// ignore this cert
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (id instanceof SystemSigner) {
|
||||
MessageFormat form = new MessageFormat(rb.getString
|
||||
("Creating keystore entry for <id.getName()> ..."));
|
||||
Object[] source = {id.getName()};
|
||||
System.err.println(form.format(source));
|
||||
if (chain==null) {
|
||||
chain = new java.security.cert.Certificate[1];
|
||||
}
|
||||
chain[0] = newCert;
|
||||
privKey = ((SystemSigner)id).getPrivateKey();
|
||||
keyStore.setKeyEntry(id.getName(), privKey, storePass,
|
||||
chain);
|
||||
} else {
|
||||
keyStore.setCertificateEntry(id.getName(), newCert);
|
||||
}
|
||||
kssave = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!kssave) {
|
||||
System.err.println(rb.getString
|
||||
("No entries from identity database added"));
|
||||
}
|
||||
System.err.println(rb.getString
|
||||
("No entries from identity database added"));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -33,7 +33,6 @@ import java.security.Permission;
|
||||
import java.security.BasicPermission;
|
||||
import java.security.SecurityPermission;
|
||||
import java.security.AllPermission;
|
||||
import javax.security.auth.AuthPermission;
|
||||
|
||||
/**
|
||||
* Permission constants and string constants used to create permissions
|
||||
@ -259,12 +258,4 @@ public final class SecurityConstants {
|
||||
// java.lang.SecurityManager
|
||||
public static final SocketPermission LOCAL_LISTEN_PERMISSION =
|
||||
new SocketPermission("localhost:1024-", SOCKET_LISTEN_ACTION);
|
||||
|
||||
// javax.security.auth.Subject
|
||||
public static final AuthPermission DO_AS_PERMISSION =
|
||||
new AuthPermission("doAs");
|
||||
|
||||
// javax.security.auth.Subject
|
||||
public static final AuthPermission DO_AS_PRIVILEGED_PERMISSION =
|
||||
new AuthPermission("doAsPrivileged");
|
||||
}
|
||||
|
||||
@ -150,9 +150,17 @@ public final class PKIXValidator extends Validator {
|
||||
("null or zero-length certificate chain");
|
||||
}
|
||||
if (TRY_VALIDATOR) {
|
||||
// check if chain contains trust anchor
|
||||
// check that chain is in correct order and check if chain contains
|
||||
// trust anchor
|
||||
X500Principal prevIssuer = null;
|
||||
for (int i = 0; i < chain.length; i++) {
|
||||
if (trustedCerts.contains(chain[i])) {
|
||||
X509Certificate cert = chain[i];
|
||||
if (i != 0 &&
|
||||
!cert.getSubjectX500Principal().equals(prevIssuer)) {
|
||||
// chain is not ordered correctly, call builder instead
|
||||
return doBuild(chain, otherCerts);
|
||||
}
|
||||
if (trustedCerts.contains(cert)) {
|
||||
if (i == 0) {
|
||||
return new X509Certificate[] {chain[0]};
|
||||
}
|
||||
@ -161,6 +169,7 @@ public final class PKIXValidator extends Validator {
|
||||
System.arraycopy(chain, 0, newChain, 0, i);
|
||||
return doValidate(newChain);
|
||||
}
|
||||
prevIssuer = cert.getIssuerX500Principal();
|
||||
}
|
||||
|
||||
// apparently issued by trust anchor?
|
||||
@ -303,5 +312,4 @@ public final class PKIXValidator extends Validator {
|
||||
("PKIX path building failed: " + e.toString(), e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -189,41 +189,6 @@ public final class CertAndKeyGen {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns a self-signed X.509v1 certificate for the public key.
|
||||
* The certificate is immediately valid.
|
||||
*
|
||||
* <P>Such certificates normally are used to identify a "Certificate
|
||||
* Authority" (CA). Accordingly, they will not always be accepted by
|
||||
* other parties. However, such certificates are also useful when
|
||||
* you are bootstrapping your security infrastructure, or deploying
|
||||
* system prototypes.
|
||||
*
|
||||
* @deprecated Use the new <a href =
|
||||
* "#getSelfCertificate(sun.security.x509.X500Name, long)">
|
||||
*
|
||||
* @param myname X.500 name of the subject (who is also the issuer)
|
||||
* @param validity how long the certificate should be valid, in seconds
|
||||
*/
|
||||
@Deprecated
|
||||
public X509Cert getSelfCert (X500Name myname, long validity)
|
||||
throws InvalidKeyException, SignatureException, NoSuchAlgorithmException
|
||||
{
|
||||
X509Certificate cert;
|
||||
|
||||
try {
|
||||
cert = getSelfCertificate(myname, validity);
|
||||
return new X509Cert(cert.getEncoded());
|
||||
} catch (CertificateException e) {
|
||||
throw new SignatureException(e.getMessage());
|
||||
} catch (NoSuchProviderException e) {
|
||||
throw new NoSuchAlgorithmException(e.getMessage());
|
||||
} catch (IOException e) {
|
||||
throw new SignatureException(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns a self-signed X.509v3 certificate for the public key.
|
||||
* The certificate is immediately valid. No extensions.
|
||||
@ -248,13 +213,10 @@ public final class CertAndKeyGen {
|
||||
throws CertificateException, InvalidKeyException, SignatureException,
|
||||
NoSuchAlgorithmException, NoSuchProviderException
|
||||
{
|
||||
X500Signer issuer;
|
||||
X509CertImpl cert;
|
||||
Date lastDate;
|
||||
|
||||
try {
|
||||
issuer = getSigner (myname);
|
||||
|
||||
lastDate = new Date ();
|
||||
lastDate.setTime (firstDate.getTime () + validity * 1000);
|
||||
|
||||
@ -267,14 +229,13 @@ public final class CertAndKeyGen {
|
||||
new CertificateVersion(CertificateVersion.V3));
|
||||
info.set(X509CertInfo.SERIAL_NUMBER, new CertificateSerialNumber(
|
||||
new java.util.Random().nextInt() & 0x7fffffff));
|
||||
AlgorithmId algID = issuer.getAlgorithmId();
|
||||
AlgorithmId algID = AlgorithmId.getAlgorithmId(sigAlg);
|
||||
info.set(X509CertInfo.ALGORITHM_ID,
|
||||
new CertificateAlgorithmId(algID));
|
||||
info.set(X509CertInfo.SUBJECT, new CertificateSubjectName(myname));
|
||||
info.set(X509CertInfo.KEY, new CertificateX509Key(publicKey));
|
||||
info.set(X509CertInfo.VALIDITY, interval);
|
||||
info.set(X509CertInfo.ISSUER,
|
||||
new CertificateIssuerName(issuer.getSigner()));
|
||||
info.set(X509CertInfo.ISSUER, new CertificateIssuerName(myname));
|
||||
|
||||
cert = new X509CertImpl(info);
|
||||
cert.sign(privateKey, this.sigAlg);
|
||||
@ -315,7 +276,9 @@ public final class CertAndKeyGen {
|
||||
PKCS10 req = new PKCS10 (publicKey);
|
||||
|
||||
try {
|
||||
req.encodeAndSign (getSigner (myname));
|
||||
Signature signature = Signature.getInstance(sigAlg);
|
||||
signature.initSign (privateKey);
|
||||
req.encodeAndSign(myname, signature);
|
||||
|
||||
} catch (CertificateException e) {
|
||||
throw new SignatureException (sigAlg + " CertificateException");
|
||||
@ -330,18 +293,6 @@ public final class CertAndKeyGen {
|
||||
return req;
|
||||
}
|
||||
|
||||
private X500Signer getSigner (X500Name me)
|
||||
throws InvalidKeyException, NoSuchAlgorithmException
|
||||
{
|
||||
Signature signature = Signature.getInstance(sigAlg);
|
||||
|
||||
// XXX should have a way to pass prng to the signature
|
||||
// algorithm ... appropriate for DSS/DSA, not RSA
|
||||
|
||||
signature.initSign (privateKey);
|
||||
return new X500Signer (signature, me);
|
||||
}
|
||||
|
||||
private SecureRandom prng;
|
||||
private String sigAlg;
|
||||
private KeyPairGenerator keyGen;
|
||||
|
||||
@ -1,115 +0,0 @@
|
||||
/*
|
||||
* Copyright 1996-2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Sun designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Sun in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
package sun.security.x509;
|
||||
|
||||
import java.security.Signature;
|
||||
import java.security.SignatureException;
|
||||
import java.security.Signer;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
|
||||
/**
|
||||
* This class provides a binding between a Signature object and an
|
||||
* authenticated X.500 name (from an X.509 certificate chain), which
|
||||
* is needed in many public key signing applications.
|
||||
*
|
||||
* <P>The name of the signer is important, both because knowing it is the
|
||||
* whole point of the signature, and because the associated X.509 certificate
|
||||
* is always used to verify the signature.
|
||||
*
|
||||
* <P><em>The X.509 certificate chain is temporarily not associated with
|
||||
* the signer, but this omission will be resolved.</em>
|
||||
*
|
||||
*
|
||||
* @author David Brownell
|
||||
* @author Amit Kapoor
|
||||
* @author Hemma Prafullchandra
|
||||
*/
|
||||
public final class X500Signer extends Signer
|
||||
{
|
||||
private static final long serialVersionUID = -8609982645394364834L;
|
||||
|
||||
/**
|
||||
* Called for each chunk of the data being signed. That
|
||||
* is, you can present the data in many chunks, so that
|
||||
* it doesn't need to be in a single sequential buffer.
|
||||
*
|
||||
* @param buf buffer holding the next chunk of the data to be signed
|
||||
* @param offset starting point of to-be-signed data
|
||||
* @param len how many bytes of data are to be signed
|
||||
* @exception SignatureException on errors.
|
||||
*/
|
||||
public void update(byte buf[], int offset, int len)
|
||||
throws SignatureException {
|
||||
sig.update (buf, offset, len);
|
||||
}
|
||||
|
||||
/**
|
||||
* Produces the signature for the data processed by update().
|
||||
*
|
||||
* @exception SignatureException on errors.
|
||||
*/
|
||||
public byte[] sign() throws SignatureException {
|
||||
return sig.sign();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the algorithm used to sign.
|
||||
*/
|
||||
public AlgorithmId getAlgorithmId() {
|
||||
return algid;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name of the signing agent.
|
||||
*/
|
||||
public X500Name getSigner() {
|
||||
return agent;
|
||||
}
|
||||
|
||||
/*
|
||||
* Constructs a binding between a signature and an X500 name
|
||||
* from an X.509 certificate.
|
||||
*/
|
||||
// package private ----hmmmmm ?????
|
||||
public X500Signer(Signature sig, X500Name agent) {
|
||||
if (sig == null || agent == null)
|
||||
throw new IllegalArgumentException ("null parameter");
|
||||
|
||||
this.sig = sig;
|
||||
this.agent = agent;
|
||||
|
||||
try {
|
||||
this.algid = AlgorithmId.getAlgorithmId(sig.getAlgorithm());
|
||||
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
throw new RuntimeException("internal error! " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
private Signature sig;
|
||||
private X500Name agent; // XXX should be X509CertChain
|
||||
private AlgorithmId algid;
|
||||
}
|
||||
@ -1,892 +0,0 @@
|
||||
/*
|
||||
* Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Sun designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Sun in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
package sun.security.x509;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.io.ObjectInputStream;
|
||||
import java.io.ObjectOutputStream;
|
||||
import java.io.Serializable;
|
||||
import java.math.BigInteger;
|
||||
import java.security.*;
|
||||
import java.util.Date;
|
||||
import java.util.Enumeration;
|
||||
|
||||
import sun.security.util.*; // DER
|
||||
|
||||
/**
|
||||
* @author David Brownell
|
||||
*
|
||||
* @see CertAndKeyGen
|
||||
* @deprecated Use the new X509Certificate class.
|
||||
* This class is only restored for backwards compatibility.
|
||||
*/
|
||||
@Deprecated
|
||||
public class X509Cert implements Certificate, Serializable {
|
||||
|
||||
static final long serialVersionUID = -52595524744692374L;
|
||||
|
||||
/*
|
||||
* NOTE: All fields are marked transient, because we do not want them to
|
||||
* be included in the class description when we serialize an object of
|
||||
* this class. We override "writeObject" and "readObject" to use the
|
||||
* ASN.1 encoding of a certificate as the serialized form, instead of
|
||||
* calling the default routines which would operate on the field values.
|
||||
*
|
||||
* MAKE SURE TO MARK ANY FIELDS THAT ARE ADDED IN THE FUTURE AS TRANSIENT.
|
||||
*/
|
||||
|
||||
/* The algorithm id */
|
||||
transient protected AlgorithmId algid;
|
||||
|
||||
/*
|
||||
* Certificate data, and its envelope
|
||||
*/
|
||||
transient private byte rawCert [];
|
||||
transient private byte signature [];
|
||||
transient private byte signedCert [];
|
||||
|
||||
/*
|
||||
* X509.v1 data (parsed)
|
||||
*/
|
||||
transient private X500Name subject; // from subject
|
||||
transient private PublicKey pubkey;
|
||||
|
||||
transient private Date notafter; // from CA (constructor)
|
||||
transient private Date notbefore;
|
||||
|
||||
transient private int version; // from CA (signAndEncode)
|
||||
transient private BigInteger serialnum;
|
||||
transient private X500Name issuer;
|
||||
transient private AlgorithmId issuerSigAlg;
|
||||
|
||||
/*
|
||||
* flag to indicate whether or not this certificate has already been parsed
|
||||
* (through a call to one of the constructors or the "decode" or
|
||||
* "readObject" methods). This is to ensure that certificates are
|
||||
* immutable.
|
||||
*/
|
||||
transient private boolean parsed=false;
|
||||
|
||||
/*
|
||||
* X509.v2 extensions
|
||||
*/
|
||||
|
||||
/*
|
||||
* X509.v3 extensions
|
||||
*/
|
||||
|
||||
/*
|
||||
* Other extensions ... Netscape, Verisign, SET, etc
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Construct a uninitialized X509 Cert on which <a href="#decode">
|
||||
* decode</a> must later be called (or which may be deserialized).
|
||||
*/
|
||||
// XXX deprecated, delete this
|
||||
public X509Cert() { }
|
||||
|
||||
|
||||
/**
|
||||
* Unmarshals a certificate from its encoded form, parsing the
|
||||
* encoded bytes. This form of constructor is used by agents which
|
||||
* need to examine and use certificate contents. That is, this is
|
||||
* one of the more commonly used constructors. Note that the buffer
|
||||
* must include only a certificate, and no "garbage" may be left at
|
||||
* the end. If you need to ignore data at the end of a certificate,
|
||||
* use another constructor.
|
||||
*
|
||||
* @param cert the encoded bytes, with no terminatu (CONSUMED)
|
||||
* @exception IOException when the certificate is improperly encoded.
|
||||
*/
|
||||
public X509Cert(byte cert []) throws IOException
|
||||
{
|
||||
DerValue in = new DerValue (cert);
|
||||
parse (in);
|
||||
if (in.data.available () != 0)
|
||||
throw new CertParseError ("garbage at end");
|
||||
signedCert = cert;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Unmarshals a certificate from its encoded form, parsing the
|
||||
* encoded bytes. This form of constructor is used by agents which
|
||||
* need to examine and use certificate contents. That is, this is
|
||||
* one of the most commonly used constructors.
|
||||
*
|
||||
* @param buf the buffer holding the encoded bytes
|
||||
* @param offset the offset in the buffer where the bytes begin
|
||||
* @param len how many bytes of certificate exist
|
||||
*
|
||||
* @exception IOException when the certificate is improperly encoded.
|
||||
*/
|
||||
public X509Cert(byte buf [], int offset, int len) throws IOException
|
||||
{
|
||||
DerValue in = new DerValue (buf, offset, len);
|
||||
|
||||
parse (in);
|
||||
if (in.data.available () != 0)
|
||||
throw new CertParseError ("garbage at end");
|
||||
signedCert = new byte [len];
|
||||
System.arraycopy (buf, offset, signedCert, 0, len);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Unmarshal a certificate from its encoded form, parsing a DER value.
|
||||
* This form of constructor is used by agents which need to examine
|
||||
* and use certificate contents.
|
||||
*
|
||||
* @param derVal the der value containing the encoded cert.
|
||||
* @exception IOException when the certificate is improperly encoded.
|
||||
*/
|
||||
public X509Cert(DerValue derVal) throws IOException
|
||||
{
|
||||
parse (derVal);
|
||||
if (derVal.data.available () != 0)
|
||||
throw new CertParseError ("garbage at end");
|
||||
signedCert = derVal.toByteArray ();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Partially constructs a certificate from descriptive parameters.
|
||||
* This constructor may be used by Certificate Authority (CA) code,
|
||||
* which later <a href="#signAndEncode">signs and encodes</a> the
|
||||
* certificate. Also, self-signed certificates serve as CA certificates,
|
||||
* and are sometimes used as certificate requests.
|
||||
*
|
||||
* <P>Until the certificate has been signed and encoded, some of
|
||||
* the mandatory fields in the certificate will not be available
|
||||
* via accessor functions: the serial number, issuer name and signing
|
||||
* algorithm, and of course the signed certificate. The fields passed
|
||||
* to this constructor are available, and must be non-null.
|
||||
*
|
||||
* <P>Note that the public key being signed is generally independent of
|
||||
* the signature algorithm being used. So for example Diffie-Hellman
|
||||
* keys (which do not support signatures) can be placed in X.509
|
||||
* certificates when some other signature algorithm (e.g. DSS/DSA,
|
||||
* or one of the RSA based algorithms) is used.
|
||||
*
|
||||
* @see CertAndKeyGen
|
||||
*
|
||||
* @param subjectName the X.500 distinguished name being certified
|
||||
* @param subjectPublicKey the public key being certified. This
|
||||
* must be an "X509Key" implementing the "PublicKey" interface.
|
||||
* @param notBefore the first time the certificate is valid
|
||||
* @param notAfter the last time the certificate is valid
|
||||
*
|
||||
* @exception CertException if the public key is inappropriate
|
||||
*/
|
||||
public X509Cert(X500Name subjectName, X509Key subjectPublicKey,
|
||||
Date notBefore, Date notAfter) throws CertException
|
||||
{
|
||||
subject = subjectName;
|
||||
|
||||
if (!(subjectPublicKey instanceof PublicKey))
|
||||
throw new CertException (CertException.err_INVALID_PUBLIC_KEY,
|
||||
"Doesn't implement PublicKey interface");
|
||||
|
||||
// The X509 cert API requires X509 keys, else things break.
|
||||
pubkey = subjectPublicKey;
|
||||
notbefore = notBefore;
|
||||
notafter = notAfter;
|
||||
version = 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Decode an X.509 certificate from an input stream.
|
||||
*
|
||||
* @param in an input stream holding at least one certificate
|
||||
* @exception IOException when the certificate is improperly encoded, or
|
||||
* if it has already been parsed.
|
||||
*/
|
||||
public void decode(InputStream in) throws IOException
|
||||
{
|
||||
DerValue val = new DerValue(in);
|
||||
parse(val);
|
||||
signedCert = val.toByteArray();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Appends the certificate to an output stream.
|
||||
*
|
||||
* @param out an input stream to which the certificate is appended.
|
||||
* @exception IOException when appending fails.
|
||||
*/
|
||||
public void encode (OutputStream out) throws IOException
|
||||
{ out.write (getSignedCert ()); }
|
||||
|
||||
|
||||
/**
|
||||
* Compares two certificates. This is false if the
|
||||
* certificates are not both X.509 certs, otherwise it
|
||||
* compares them as binary data.
|
||||
*
|
||||
* @param other the object being compared with this one
|
||||
* @return true iff the certificates are equivalent
|
||||
*/
|
||||
public boolean equals (Object other)
|
||||
{
|
||||
if (other instanceof X509Cert)
|
||||
return equals ((X509Cert) other);
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Compares two certificates, returning false if any data
|
||||
* differs between the two.
|
||||
*
|
||||
* @param other the object being compared with this one
|
||||
* @return true iff the certificates are equivalent
|
||||
*/
|
||||
public boolean equals (X509Cert src)
|
||||
{
|
||||
if (this == src)
|
||||
return true;
|
||||
if (signedCert == null || src.signedCert == null)
|
||||
return false;
|
||||
if (signedCert.length != src.signedCert.length)
|
||||
return false;
|
||||
for (int i = 0; i < signedCert.length; i++)
|
||||
if (signedCert [i] != src.signedCert [i])
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/** Returns the "X.509" format identifier. */
|
||||
public String getFormat () // for Certificate
|
||||
{ return "X.509"; }
|
||||
|
||||
|
||||
/** Returns <a href="#getIssuerName">getIssuerName</a> */
|
||||
public Principal getGuarantor () // for Certificate
|
||||
{ return getIssuerName (); }
|
||||
|
||||
|
||||
/** Returns <a href="#getSubjectName">getSubjectName</a> */
|
||||
public Principal getPrincipal ()
|
||||
{ return getSubjectName (); }
|
||||
|
||||
|
||||
/**
|
||||
* Throws an exception if the certificate is invalid because it is
|
||||
* now outside of the certificate's validity period, or because it
|
||||
* was not signed using the verification key provided. Successfully
|
||||
* verifying a certificate does <em>not</em> indicate that one should
|
||||
* trust the entity which it represents.
|
||||
*
|
||||
* <P><em>Note that since this class represents only a single X.509
|
||||
* certificate, it cannot know anything about the certificate chain
|
||||
* which is used to provide the verification key and to establish trust.
|
||||
* Other code must manage and use those cert chains.
|
||||
*
|
||||
* <P>For now, you must walk the cert chain being used to verify any
|
||||
* given cert. Start at the root, which is a self-signed certificate;
|
||||
* verify it using the key inside the certificate. Then use that to
|
||||
* verify the next certificate in the chain, issued by that CA. In
|
||||
* this manner, verify each certificate until you reach the particular
|
||||
* certificate you wish to verify. You should not use a certificate
|
||||
* if any of the verification operations for its certificate chain
|
||||
* were unsuccessful.
|
||||
* </em>
|
||||
*
|
||||
* @param issuerPublicKey the public key of the issuing CA
|
||||
* @exception CertException when the certificate is not valid.
|
||||
*/
|
||||
public void verify (PublicKey issuerPublicKey)
|
||||
throws CertException
|
||||
{
|
||||
Date now = new Date ();
|
||||
|
||||
if (now.before (notbefore))
|
||||
throw new CertException (CertException.verf_INVALID_NOTBEFORE);
|
||||
if (now.after (notafter))
|
||||
throw new CertException (CertException.verf_INVALID_EXPIRED);
|
||||
if (signedCert == null)
|
||||
throw new CertException (CertException.verf_INVALID_SIG,
|
||||
"?? certificate is not signed yet ??");
|
||||
|
||||
//
|
||||
// Verify the signature ...
|
||||
//
|
||||
String algName = null;
|
||||
|
||||
try {
|
||||
Signature sigVerf = null;
|
||||
|
||||
algName = issuerSigAlg.getName();
|
||||
sigVerf = Signature.getInstance(algName);
|
||||
sigVerf.initVerify (issuerPublicKey);
|
||||
sigVerf.update (rawCert, 0, rawCert.length);
|
||||
|
||||
if (!sigVerf.verify (signature)) {
|
||||
throw new CertException (CertException.verf_INVALID_SIG,
|
||||
"Signature ... by <" + issuer + "> for <" + subject + ">");
|
||||
}
|
||||
|
||||
// Gag -- too many catch clauses, let most through.
|
||||
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
throw new CertException (CertException.verf_INVALID_SIG,
|
||||
"Unsupported signature algorithm (" + algName + ")");
|
||||
|
||||
} catch (InvalidKeyException e) {
|
||||
// e.printStackTrace();
|
||||
throw new CertException (CertException.err_INVALID_PUBLIC_KEY,
|
||||
"Algorithm (" + algName + ") rejected public key");
|
||||
|
||||
} catch (SignatureException e) {
|
||||
throw new CertException (CertException.verf_INVALID_SIG,
|
||||
"Signature by <" + issuer + "> for <" + subject + ">");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates an X.509 certificate, and signs it using the issuer
|
||||
* passed (associating a signature algorithm and an X.500 name).
|
||||
* This operation is used to implement the certificate generation
|
||||
* functionality of a certificate authority.
|
||||
*
|
||||
* @see #getSignedCert
|
||||
* @see #getSigner
|
||||
* @see CertAndKeyGen
|
||||
*
|
||||
* @param serial the serial number of the certificate (non-null)
|
||||
* @param issuer the certificate issuer (CA) (non-null)
|
||||
* @return the signed certificate, as returned by getSignedCert
|
||||
*
|
||||
* @exception IOException if any of the data could not be encoded,
|
||||
* or when any mandatory data was omitted
|
||||
* @exception SignatureException on signing failures
|
||||
*/
|
||||
public byte []
|
||||
encodeAndSign (
|
||||
BigInteger serial,
|
||||
X500Signer issuer
|
||||
) throws IOException, SignatureException
|
||||
{
|
||||
rawCert = null;
|
||||
|
||||
/*
|
||||
* Get the remaining cert parameters, and make sure we have enough.
|
||||
*
|
||||
* We deduce version based on what attribute data are available
|
||||
* For now, we have no attributes, so we always deduce X.509v1 !
|
||||
*/
|
||||
version = 0;
|
||||
serialnum = serial;
|
||||
this.issuer = issuer.getSigner ();
|
||||
issuerSigAlg = issuer.getAlgorithmId ();
|
||||
|
||||
if (subject == null || pubkey == null
|
||||
|| notbefore == null || notafter == null)
|
||||
throw new IOException ("not enough cert parameters");
|
||||
|
||||
/*
|
||||
* Encode the raw cert, create its signature and put it
|
||||
* into the envelope.
|
||||
*/
|
||||
rawCert = DERencode ();
|
||||
signedCert = sign (issuer, rawCert);
|
||||
return signedCert;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns an X500Signer that may be used to create signatures. Those
|
||||
* signature may in turn be verified using this certificate (or a
|
||||
* copy of it).
|
||||
*
|
||||
* <P><em><b>NOTE:</b> If the private key is by itself capable of
|
||||
* creating signatures, this fact may not be recognized at this time.
|
||||
* Specifically, the case of DSS/DSA keys which get their algorithm
|
||||
* parameters from higher in the certificate chain is not supportable
|
||||
* without using an X509CertChain API, and there is no current support
|
||||
* for other sources of algorithm parameters.</em>
|
||||
*
|
||||
* @param algorithm the signature algorithm to be used. Note that a
|
||||
* given public/private key pair may support several such algorithms.
|
||||
* @param privateKey the private key used to create the signature,
|
||||
* which must correspond to the public key in this certificate
|
||||
* @return the Signer object
|
||||
*
|
||||
* @exception NoSuchAlgorithmException if the signature
|
||||
* algorithm is not supported
|
||||
* @exception InvalidKeyException if either the key in the certificate,
|
||||
* or the private key parameter, does not support the requested
|
||||
* signature algorithm
|
||||
*/
|
||||
public X500Signer getSigner (AlgorithmId algorithmId,
|
||||
PrivateKey privateKey)
|
||||
throws NoSuchAlgorithmException, InvalidKeyException
|
||||
{
|
||||
String algorithm;
|
||||
Signature sig;
|
||||
|
||||
if (privateKey instanceof Key) {
|
||||
Key key = (Key)privateKey;
|
||||
algorithm = key.getAlgorithm();
|
||||
} else {
|
||||
throw new InvalidKeyException("private key not a key!");
|
||||
}
|
||||
|
||||
sig = Signature.getInstance(algorithmId.getName());
|
||||
|
||||
if (!pubkey.getAlgorithm ().equals (algorithm)) {
|
||||
|
||||
throw new InvalidKeyException( "Private key algorithm " +
|
||||
algorithm +
|
||||
" incompatible with certificate " +
|
||||
pubkey.getAlgorithm());
|
||||
}
|
||||
sig.initSign (privateKey);
|
||||
return new X500Signer (sig, subject);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns a signature object that may be used to verify signatures
|
||||
* created using a specified signature algorithm and the public key
|
||||
* contained in this certificate.
|
||||
*
|
||||
* <P><em><b>NOTE:</b> If the public key in this certificate is not by
|
||||
* itself capable of verifying signatures, this may not be recognized
|
||||
* at this time. Specifically, the case of DSS/DSA keys which get
|
||||
* their algorithm parameters from higher in the certificate chain
|
||||
* is not supportable without using an X509CertChain API, and there
|
||||
* is no current support for other sources of algorithm parameters.</em>
|
||||
*
|
||||
* @param algorithm the algorithm of the signature to be verified
|
||||
* @return the Signature object
|
||||
* @exception NoSuchAlgorithmException if the signature
|
||||
* algorithm is not supported
|
||||
* @exception InvalidKeyException if the key in the certificate
|
||||
* does not support the requested signature algorithm
|
||||
*/
|
||||
public Signature getVerifier(String algorithm)
|
||||
throws NoSuchAlgorithmException, InvalidKeyException
|
||||
{
|
||||
String algName;
|
||||
Signature sig;
|
||||
|
||||
sig = Signature.getInstance(algorithm);
|
||||
sig.initVerify (pubkey);
|
||||
return sig;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Return the signed X.509 certificate as a byte array.
|
||||
* The bytes are in standard DER marshaled form.
|
||||
* Null is returned in the case of a partially constructed cert.
|
||||
*/
|
||||
public byte [] getSignedCert ()
|
||||
{ return signedCert.clone(); }
|
||||
|
||||
|
||||
/**
|
||||
* Returns the certificate's serial number.
|
||||
* Null is returned in the case of a partially constructed cert.
|
||||
*/
|
||||
public BigInteger getSerialNumber ()
|
||||
{ return serialnum; }
|
||||
|
||||
|
||||
/**
|
||||
* Returns the subject's X.500 distinguished name.
|
||||
*/
|
||||
public X500Name getSubjectName ()
|
||||
{ return subject; }
|
||||
|
||||
|
||||
/**
|
||||
* Returns the certificate issuer's X.500 distinguished name.
|
||||
* Null is returned in the case of a partially constructed cert.
|
||||
*/
|
||||
public X500Name getIssuerName ()
|
||||
{ return issuer; }
|
||||
|
||||
|
||||
/**
|
||||
* Returns the algorithm used by the issuer to sign the certificate.
|
||||
* Null is returned in the case of a partially constructed cert.
|
||||
*/
|
||||
public AlgorithmId getIssuerAlgorithmId ()
|
||||
{ return issuerSigAlg; }
|
||||
|
||||
|
||||
/**
|
||||
* Returns the first time the certificate is valid.
|
||||
*/
|
||||
public Date getNotBefore ()
|
||||
{ return new Date(notbefore.getTime()); }
|
||||
|
||||
|
||||
/**
|
||||
* Returns the last time the certificate is valid.
|
||||
*/
|
||||
public Date getNotAfter ()
|
||||
{ return new Date(notafter.getTime()); }
|
||||
|
||||
|
||||
/**
|
||||
* Returns the subject's public key. Note that some public key
|
||||
* algorithms support an optional certificate generation policy
|
||||
* where the keys in the certificates are not in themselves sufficient
|
||||
* to perform a public key operation. Those keys need to be augmented
|
||||
* by algorithm parameters, which the certificate generation policy
|
||||
* chose not to place in the certificate.
|
||||
*
|
||||
* <P>Two such public key algorithms are: DSS/DSA, where algorithm
|
||||
* parameters could be acquired from a CA certificate in the chain
|
||||
* of issuers; and Diffie-Hellman, with a similar solution although
|
||||
* the CA then needs both a Diffie-Hellman certificate and a signature
|
||||
* capable certificate.
|
||||
*/
|
||||
public PublicKey getPublicKey ()
|
||||
{ return pubkey; }
|
||||
|
||||
|
||||
/**
|
||||
* Returns the X.509 version number of this certificate, zero based.
|
||||
* That is, "2" indicates an X.509 version 3 (1993) certificate,
|
||||
* and "0" indicates X.509v1 (1988).
|
||||
* Zero is returned in the case of a partially constructed cert.
|
||||
*/
|
||||
public int getVersion ()
|
||||
{ return version; }
|
||||
|
||||
|
||||
/**
|
||||
* Calculates a hash code value for the object. Objects
|
||||
* which are equal will also have the same hashcode.
|
||||
*/
|
||||
public int hashCode ()
|
||||
{
|
||||
int retval = 0;
|
||||
|
||||
for (int i = 0; i < signedCert.length; i++)
|
||||
retval += signedCert [i] * i;
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns a printable representation of the certificate. This does not
|
||||
* contain all the information available to distinguish this from any
|
||||
* other certificate. The certificate must be fully constructed
|
||||
* before this function may be called; in particular, if you are
|
||||
* creating certificates you must call encodeAndSign() before calling
|
||||
* this function.
|
||||
*/
|
||||
public String toString ()
|
||||
{
|
||||
String s;
|
||||
|
||||
if (subject == null || pubkey == null
|
||||
|| notbefore == null || notafter == null
|
||||
|| issuer == null || issuerSigAlg == null
|
||||
|| serialnum == null)
|
||||
throw new NullPointerException ("X.509 cert is incomplete");
|
||||
|
||||
s = " X.509v" + (version + 1) + " certificate,\n";
|
||||
s += " Subject is " + subject + "\n";
|
||||
s += " Key: " + pubkey;
|
||||
s += " Validity <" + notbefore + "> until <" + notafter + ">\n";
|
||||
s += " Issuer is " + issuer + "\n";
|
||||
s += " Issuer signature used " + issuerSigAlg.toString () + "\n";
|
||||
s += " Serial number = " + Debug.toHexString(serialnum) + "\n";
|
||||
|
||||
// optional v2, v3 extras
|
||||
|
||||
return "[\n" + s + "]";
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns a printable representation of the certificate.
|
||||
*
|
||||
* @param detailed true iff lots of detail is requested
|
||||
*/
|
||||
public String toString (boolean detailed)
|
||||
{ return toString (); }
|
||||
|
||||
|
||||
/************************************************************/
|
||||
|
||||
/*
|
||||
* Cert is a SIGNED ASN.1 macro, a three elment sequence:
|
||||
*
|
||||
* - Data to be signed (ToBeSigned) -- the "raw" cert
|
||||
* - Signature algorithm (SigAlgId)
|
||||
* - The signature bits
|
||||
*
|
||||
* This routine unmarshals the certificate, saving the signature
|
||||
* parts away for later verification.
|
||||
*/
|
||||
private void parse (DerValue val) throws IOException
|
||||
{
|
||||
if (parsed == true) {
|
||||
throw new IOException("Certificate already parsed");
|
||||
}
|
||||
|
||||
DerValue seq [] = new DerValue [3];
|
||||
|
||||
seq [0] = val.data.getDerValue ();
|
||||
seq [1] = val.data.getDerValue ();
|
||||
seq [2] = val.data.getDerValue ();
|
||||
|
||||
if (val.data.available () != 0)
|
||||
throw new CertParseError ("signed overrun, bytes = "
|
||||
+ val.data.available ());
|
||||
if (seq [0].tag != DerValue.tag_Sequence)
|
||||
throw new CertParseError ("signed fields invalid");
|
||||
|
||||
rawCert = seq [0].toByteArray (); // XXX slow; fixme!
|
||||
|
||||
|
||||
issuerSigAlg = AlgorithmId.parse (seq [1]);
|
||||
signature = seq [2].getBitString ();
|
||||
|
||||
if (seq [1].data.available () != 0) {
|
||||
// XXX why was this error check commented out?
|
||||
// It was originally part of the next check.
|
||||
throw new CertParseError ("algid field overrun");
|
||||
}
|
||||
|
||||
if (seq [2].data.available () != 0)
|
||||
throw new CertParseError ("signed fields overrun");
|
||||
|
||||
/*
|
||||
* Let's have fun parsing the cert itself.
|
||||
*/
|
||||
DerInputStream in;
|
||||
DerValue tmp;
|
||||
|
||||
in = seq [0].data;
|
||||
|
||||
/*
|
||||
* Version -- this is optional (default zero). If it's there it's
|
||||
* the first field and is specially tagged.
|
||||
*
|
||||
* Both branches leave "tmp" holding a value for the serial
|
||||
* number that comes next.
|
||||
*/
|
||||
version = 0;
|
||||
tmp = in.getDerValue ();
|
||||
if (tmp.isConstructed () && tmp.isContextSpecific ()) {
|
||||
version = tmp.data.getInteger();
|
||||
if (tmp.data.available () != 0)
|
||||
throw new IOException ("X.509 version, bad format");
|
||||
tmp = in.getDerValue ();
|
||||
}
|
||||
|
||||
/*
|
||||
* serial number ... an integer
|
||||
*/
|
||||
serialnum = tmp.getBigInteger ();
|
||||
|
||||
/*
|
||||
* algorithm type for CA's signature ... needs to match the
|
||||
* one on the envelope, and that's about it! different IDs
|
||||
* may represent a signature attack. In general we want to
|
||||
* inherit parameters.
|
||||
*/
|
||||
tmp = in.getDerValue ();
|
||||
{
|
||||
AlgorithmId algid;
|
||||
|
||||
|
||||
algid = AlgorithmId.parse(tmp);
|
||||
|
||||
if (!algid.equals (issuerSigAlg))
|
||||
throw new CertParseError ("CA Algorithm mismatch!");
|
||||
|
||||
this.algid = algid;
|
||||
}
|
||||
|
||||
/*
|
||||
* issuer name
|
||||
*/
|
||||
issuer = new X500Name (in);
|
||||
|
||||
/*
|
||||
* validity: SEQUENCE { start date, end date }
|
||||
*/
|
||||
tmp = in.getDerValue ();
|
||||
if (tmp.tag != DerValue.tag_Sequence)
|
||||
throw new CertParseError ("corrupt validity field");
|
||||
|
||||
notbefore = tmp.data.getUTCTime ();
|
||||
notafter = tmp.data.getUTCTime ();
|
||||
if (tmp.data.available () != 0)
|
||||
throw new CertParseError ("excess validity data");
|
||||
|
||||
/*
|
||||
* subject name and public key
|
||||
*/
|
||||
subject = new X500Name (in);
|
||||
|
||||
tmp = in.getDerValue ();
|
||||
pubkey = X509Key.parse (tmp);
|
||||
|
||||
/*
|
||||
* XXX for v2 and later, a bunch of tagged options follow
|
||||
*/
|
||||
|
||||
if (in.available () != 0) {
|
||||
/*
|
||||
* Until we parse V2/V3 data ... ignore it.
|
||||
*
|
||||
// throw new CertParseError ("excess cert data");
|
||||
System.out.println (
|
||||
"@end'o'cert, optional V2/V3 data unparsed: "
|
||||
+ in.available ()
|
||||
+ " bytes"
|
||||
);
|
||||
*/
|
||||
}
|
||||
|
||||
parsed = true;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Encode only the parts that will later be signed.
|
||||
*/
|
||||
private byte [] DERencode () throws IOException
|
||||
{
|
||||
DerOutputStream raw = new DerOutputStream ();
|
||||
|
||||
encode (raw);
|
||||
return raw.toByteArray ();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Marshal the contents of a "raw" certificate into a DER sequence.
|
||||
*/
|
||||
private void encode (DerOutputStream out) throws IOException
|
||||
{
|
||||
DerOutputStream tmp = new DerOutputStream ();
|
||||
|
||||
/*
|
||||
* encode serial number, issuer signing algorithm,
|
||||
* and issuer name into the data we'll return
|
||||
*/
|
||||
tmp.putInteger (serialnum);
|
||||
issuerSigAlg.encode (tmp);
|
||||
issuer.encode (tmp);
|
||||
|
||||
/*
|
||||
* Validity is a two element sequence ... encode the
|
||||
* elements, then wrap them into the data we'll return
|
||||
*/
|
||||
{
|
||||
DerOutputStream seq = new DerOutputStream ();
|
||||
|
||||
seq.putUTCTime (notbefore);
|
||||
seq.putUTCTime (notafter);
|
||||
tmp.write (DerValue.tag_Sequence, seq);
|
||||
}
|
||||
|
||||
/*
|
||||
* Encode subject (principal) and associated key
|
||||
*/
|
||||
subject.encode (tmp);
|
||||
tmp.write(pubkey.getEncoded());
|
||||
|
||||
/*
|
||||
* Wrap the data; encoding of the "raw" cert is now complete.
|
||||
*/
|
||||
out.write (DerValue.tag_Sequence, tmp);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Calculate the signature of the "raw" certificate,
|
||||
* and marshal the cert with the signature and a
|
||||
* description of the signing algorithm.
|
||||
*/
|
||||
private byte [] sign (X500Signer issuer, byte data [])
|
||||
throws IOException, SignatureException
|
||||
{
|
||||
/*
|
||||
* Encode the to-be-signed data, then the algorithm used
|
||||
* to create the signature.
|
||||
*/
|
||||
DerOutputStream out = new DerOutputStream ();
|
||||
DerOutputStream tmp = new DerOutputStream ();
|
||||
|
||||
tmp.write (data);
|
||||
issuer.getAlgorithmId ().encode(tmp);
|
||||
|
||||
|
||||
/*
|
||||
* Create and encode the signature itself.
|
||||
*/
|
||||
issuer.update (data, 0, data.length);
|
||||
signature = issuer.sign ();
|
||||
tmp.putBitString (signature);
|
||||
|
||||
/*
|
||||
* Wrap the signed data in a SEQUENCE { data, algorithm, sig }
|
||||
*/
|
||||
out.write (DerValue.tag_Sequence, tmp);
|
||||
return out.toByteArray ();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Serialization write ... X.509 certificates serialize as
|
||||
* themselves, and they're parsed when they get read back.
|
||||
* (Actually they serialize as some type data from the
|
||||
* serialization subsystem, then the cert data.)
|
||||
*/
|
||||
private void writeObject (java.io.ObjectOutputStream stream)
|
||||
throws IOException
|
||||
{ encode(stream); }
|
||||
|
||||
/**
|
||||
* Serialization read ... X.509 certificates serialize as
|
||||
* themselves, and they're parsed when they get read back.
|
||||
*/
|
||||
private void readObject (ObjectInputStream stream)
|
||||
throws IOException
|
||||
{ decode(stream); }
|
||||
}
|
||||
@ -1,295 +0,0 @@
|
||||
/*
|
||||
* Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Sun designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Sun in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
package sun.tools.jar;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
import java.util.zip.*;
|
||||
import java.util.jar.*;
|
||||
import java.security.cert.Certificate;
|
||||
import java.security.AccessController;
|
||||
import java.security.cert.X509Certificate;
|
||||
import java.security.PublicKey;
|
||||
import java.security.Principal;
|
||||
import sun.security.provider.SystemIdentity;
|
||||
|
||||
/**
|
||||
* This is OBSOLETE. DO NOT USE THIS. Use
|
||||
* java.util.jar.JarEntry.getCertificates instead. It has to stay here
|
||||
* because some apps (namely HJ and HJV) call directly into it.
|
||||
*
|
||||
* This class is stripped down greatly from JDK 1.1.x.
|
||||
*
|
||||
* @author Roland Schemers
|
||||
*/
|
||||
public class JarVerifierStream extends ZipInputStream {
|
||||
|
||||
private JarEntry current;
|
||||
private Hashtable<String, Vector<SystemIdentity>> verified
|
||||
= new Hashtable<String, Vector<SystemIdentity>>();
|
||||
private JarInputStream jis;
|
||||
private sun.tools.jar.Manifest man = null;
|
||||
|
||||
/**
|
||||
* construct a JarVerfierStream from an input stream.
|
||||
*/
|
||||
public JarVerifierStream(InputStream is)
|
||||
throws IOException
|
||||
{
|
||||
super(is);
|
||||
jis = new JarInputStream(is);
|
||||
}
|
||||
|
||||
public void close()
|
||||
throws IOException
|
||||
{
|
||||
jis.close();
|
||||
}
|
||||
|
||||
public void closeEntry() throws IOException {
|
||||
jis.closeEntry();
|
||||
}
|
||||
|
||||
/**
|
||||
* This method scans to see which entry we're parsing and
|
||||
* keeps various state information depending on what type of
|
||||
* file is being parsed. Files it treats specially are: <ul>
|
||||
*
|
||||
* <li>Manifest files. At any point, this stream can be queried
|
||||
* for a manifest. If it is present, a Manifest object will be
|
||||
* returned.
|
||||
*
|
||||
* <li>Block Signature file. Like with the manifest, the stream
|
||||
* can be queried at any time for all blocks parsed thus far.
|
||||
*
|
||||
* </ul>
|
||||
*/
|
||||
public synchronized ZipEntry getNextEntry() throws IOException {
|
||||
current = (JarEntry) jis.getNextEntry();
|
||||
return current;
|
||||
}
|
||||
|
||||
/**
|
||||
* read a single byte.
|
||||
*/
|
||||
public int read() throws IOException {
|
||||
int n = jis.read();
|
||||
if (n == -1) {
|
||||
addIds();
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
/**
|
||||
* read an array of bytes.
|
||||
*/
|
||||
public int read(byte[] b, int off, int len) throws IOException {
|
||||
int n = jis.read(b, off, len);
|
||||
if (n == -1) {
|
||||
addIds();
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
private void addIds()
|
||||
{
|
||||
|
||||
if (current != null) {
|
||||
Certificate[] certs = current.getCertificates();
|
||||
if (certs != null) {
|
||||
Vector<SystemIdentity> ids = getIds(certs);
|
||||
if (ids != null) {
|
||||
verified.put(current.getName(), ids);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a Hashtable mapping filenames to vectors of identities.
|
||||
*/
|
||||
public Hashtable getVerifiedSignatures() {
|
||||
/* we may want to return a copy of this at some point.
|
||||
For now we simply trust the caller */
|
||||
if (verified.isEmpty())
|
||||
return null;
|
||||
else
|
||||
return verified;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an enumeration of PKCS7 blocks. This looks bogus,
|
||||
* but Hotjava just checks to see if enumeration is not null
|
||||
* to see if anything was signed!
|
||||
*/
|
||||
public Enumeration getBlocks() {
|
||||
if (verified.isEmpty()) {
|
||||
return null;
|
||||
} else {
|
||||
return new Enumeration() {
|
||||
public boolean hasMoreElements() { return false; }
|
||||
public Object nextElement() { return null; }
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This method used to be called by various versions of
|
||||
* AppletResourceLoader, even though they didn't do anything with
|
||||
* the result. We leave them and return null for backwards compatability.
|
||||
*/
|
||||
public Hashtable getNameToHash() {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert java.util.jar.Manifest object to a sun.tools.jar.Manifest
|
||||
* object.
|
||||
*/
|
||||
|
||||
public sun.tools.jar.Manifest getManifest() {
|
||||
if (man == null) {
|
||||
try {
|
||||
java.util.jar.Manifest jman = jis.getManifest();
|
||||
if (jman == null)
|
||||
return null;
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
jman.write(baos);
|
||||
byte[] data = baos.toByteArray();
|
||||
man = new sun.tools.jar.Manifest(data);
|
||||
} catch (IOException ioe) {
|
||||
// return null
|
||||
}
|
||||
}
|
||||
return man;
|
||||
}
|
||||
|
||||
static class CertCache {
|
||||
Certificate [] certs;
|
||||
Vector<SystemIdentity> ids;
|
||||
|
||||
boolean equals(Certificate[] certs) {
|
||||
if (this.certs == null) {
|
||||
if (certs!= null)
|
||||
return false;
|
||||
else
|
||||
return true;
|
||||
}
|
||||
|
||||
if (certs == null)
|
||||
return false;
|
||||
|
||||
boolean match;
|
||||
|
||||
for (int i = 0; i < certs.length; i++) {
|
||||
match = false;
|
||||
for (int j = 0; j < this.certs.length; j++) {
|
||||
if (certs[i].equals(this.certs[j])) {
|
||||
match = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!match) return false;
|
||||
}
|
||||
|
||||
for (int i = 0; i < this.certs.length; i++) {
|
||||
match = false;
|
||||
for (int j = 0; j < certs.length; j++) {
|
||||
if (this.certs[i].equals(certs[j])) {
|
||||
match = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!match) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
private ArrayList<CertCache> certCache = null;
|
||||
|
||||
|
||||
/**
|
||||
* Returns the Identity vector for the given array of Certificates
|
||||
*/
|
||||
protected Vector<SystemIdentity> getIds(Certificate[] certs) {
|
||||
if (certs == null)
|
||||
return null;
|
||||
|
||||
if (certCache == null)
|
||||
certCache = new ArrayList<CertCache>();
|
||||
CertCache cc;
|
||||
for (int i = 0; i < certCache.size(); i++) {
|
||||
cc = certCache.get(i);
|
||||
if (cc.equals(certs)) {
|
||||
return cc.ids;
|
||||
}
|
||||
}
|
||||
cc = new CertCache();
|
||||
cc.certs = certs;
|
||||
|
||||
if (certs.length > 0) {
|
||||
for (int i=0; i<certs.length; i++) {
|
||||
try {
|
||||
X509Certificate cert = (X509Certificate) certs[i];
|
||||
Principal tmpName = cert.getSubjectDN();
|
||||
final SystemIdentity id = new SystemIdentity(
|
||||
tmpName.getName(),
|
||||
null);
|
||||
|
||||
byte[] encoded = cert.getEncoded();
|
||||
final java.security.Certificate oldC =
|
||||
new sun.security.x509.X509Cert(encoded);
|
||||
try {
|
||||
AccessController.doPrivileged(
|
||||
new java.security.PrivilegedExceptionAction<Void>() {
|
||||
public Void run()
|
||||
throws java.security.KeyManagementException
|
||||
{
|
||||
id.addCertificate(oldC);
|
||||
return null;
|
||||
}
|
||||
});
|
||||
} catch (java.security.PrivilegedActionException pae) {
|
||||
throw (java.security.KeyManagementException)
|
||||
pae.getException();
|
||||
}
|
||||
if (cc.ids == null)
|
||||
cc.ids = new Vector<SystemIdentity>();
|
||||
cc.ids.addElement(id);
|
||||
} catch (java.security.KeyManagementException kme) {
|
||||
// ignore if we can't create Identity
|
||||
} catch (IOException ioe) {
|
||||
// ignore if we can't parse
|
||||
} catch (java.security.cert.CertificateEncodingException cee) {
|
||||
// ignore if we can't encode
|
||||
}
|
||||
}
|
||||
}
|
||||
certCache.add(cc);
|
||||
return cc.ids;
|
||||
}
|
||||
}
|
||||
@ -30,7 +30,6 @@ import java.lang.reflect.InvocationTargetException;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import com.sun.tracing.ProviderFactory;
|
||||
import com.sun.tracing.Provider;
|
||||
@ -65,13 +64,7 @@ public class MultiplexProviderFactory extends ProviderFactory {
|
||||
providers.add(factory.createProvider(cls));
|
||||
}
|
||||
MultiplexProvider provider = new MultiplexProvider(cls, providers);
|
||||
try {
|
||||
provider.init();
|
||||
} catch (Exception e) {
|
||||
// Probably a permission problem (can't get declared members)
|
||||
Logger.getAnonymousLogger().warning(
|
||||
"Could not initialize tracing provider: " + e.getMessage());
|
||||
}
|
||||
provider.init();
|
||||
return provider.newProxyInstance();
|
||||
}
|
||||
}
|
||||
|
||||
@ -26,7 +26,6 @@
|
||||
package sun.tracing;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import com.sun.tracing.ProviderFactory;
|
||||
import com.sun.tracing.Provider;
|
||||
@ -53,13 +52,7 @@ public class NullProviderFactory extends ProviderFactory {
|
||||
*/
|
||||
public <T extends Provider> T createProvider(Class<T> cls) {
|
||||
NullProvider provider = new NullProvider(cls);
|
||||
try {
|
||||
provider.init();
|
||||
} catch (Exception e) {
|
||||
// Probably a permission problem (can't get declared members)
|
||||
Logger.getAnonymousLogger().warning(
|
||||
"Could not initialize tracing provider: " + e.getMessage());
|
||||
}
|
||||
provider.init();
|
||||
return provider.newProxyInstance();
|
||||
}
|
||||
}
|
||||
|
||||
@ -28,7 +28,6 @@ package sun.tracing;
|
||||
import java.lang.reflect.Method;
|
||||
import java.io.PrintStream;
|
||||
import java.util.HashMap;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import com.sun.tracing.ProviderFactory;
|
||||
import com.sun.tracing.Provider;
|
||||
@ -54,13 +53,7 @@ public class PrintStreamProviderFactory extends ProviderFactory {
|
||||
|
||||
public <T extends Provider> T createProvider(Class<T> cls) {
|
||||
PrintStreamProvider provider = new PrintStreamProvider(cls, stream);
|
||||
try {
|
||||
provider.init();
|
||||
} catch (Exception e) {
|
||||
// Probably a permission problem (can't get declared members)
|
||||
Logger.getAnonymousLogger().warning(
|
||||
"Could not initialize tracing provider: " + e.getMessage());
|
||||
}
|
||||
provider.init();
|
||||
return provider.newProxyInstance();
|
||||
}
|
||||
}
|
||||
|
||||
@ -32,6 +32,8 @@ import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.AnnotatedElement;
|
||||
import java.lang.annotation.Annotation;
|
||||
import java.util.HashMap;
|
||||
import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
|
||||
import com.sun.tracing.Provider;
|
||||
import com.sun.tracing.Probe;
|
||||
@ -99,7 +101,13 @@ public abstract class ProviderSkeleton implements InvocationHandler, Provider {
|
||||
* It is up to the factory implementations to call this after construction.
|
||||
*/
|
||||
public void init() {
|
||||
for (Method m : providerType.getDeclaredMethods()) {
|
||||
Method[] methods = AccessController.doPrivileged(new PrivilegedAction<Method[]>() {
|
||||
public Method[] run() {
|
||||
return providerType.getDeclaredMethods();
|
||||
}
|
||||
});
|
||||
|
||||
for (Method m : methods) {
|
||||
if ( m.getReturnType() != Void.TYPE ) {
|
||||
throw new IllegalArgumentException(
|
||||
"Return value of method is not void");
|
||||
|
||||
@ -29,7 +29,6 @@ import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.logging.Logger;
|
||||
import java.security.Permission;
|
||||
|
||||
import com.sun.tracing.ProviderFactory;
|
||||
@ -80,15 +79,8 @@ public final class DTraceProviderFactory extends ProviderFactory {
|
||||
DTraceProvider jsdt = new DTraceProvider(cls);
|
||||
T proxy = jsdt.newProxyInstance();
|
||||
jsdt.setProxy(proxy);
|
||||
try {
|
||||
jsdt.init();
|
||||
new Activation(jsdt.getModuleName(), new DTraceProvider[] { jsdt });
|
||||
} catch (Exception e) {
|
||||
// Probably a permission problem (can't get declared members)
|
||||
Logger.getAnonymousLogger().warning(
|
||||
"Could not initialize tracing provider: " + e.getMessage());
|
||||
jsdt.dispose();
|
||||
}
|
||||
jsdt.init();
|
||||
new Activation(jsdt.getModuleName(), new DTraceProvider[] { jsdt });
|
||||
return proxy;
|
||||
}
|
||||
|
||||
|
||||
@ -29,7 +29,7 @@
|
||||
#ifdef __NEWVALID /* special setup for Sun test regime */
|
||||
#if defined(i386) || defined(i486) || \
|
||||
defined(intel) || defined(x86) || \
|
||||
defined(i86pc) || defined(_M_IA64)
|
||||
defined(i86pc) || defined(_M_IA64) || defined(ia64)
|
||||
#define _LITTLE_ENDIAN
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 1998-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -51,9 +51,9 @@
|
||||
* two data models and cohabitation of jre/jdk bits with both data
|
||||
* models is supported, then DUAL_MODE is defined. When DUAL_MODE is
|
||||
* defined, the architecture names for the narrow and wide version of
|
||||
* the architecture are defined in LIBARCH64NAME and LIBARCH32NAME. Currently
|
||||
* only Solaris on sparc/sparcv9 and i586/amd64 is DUAL_MODE; linux
|
||||
* i586/amd64 could be defined as DUAL_MODE but that is not the
|
||||
* the architecture are defined in LIBARCH64NAME and LIBARCH32NAME.
|
||||
* Currently only Solaris on sparc/sparcv9 and i586/amd64 is DUAL_MODE;
|
||||
* linux i586/amd64 could be defined as DUAL_MODE but that is not the
|
||||
* current policy.
|
||||
*/
|
||||
|
||||
@ -103,49 +103,56 @@ static char *execname = NULL;
|
||||
* platform independent routine SelectVersion. This may result in
|
||||
* the exec of the specified launcher version.
|
||||
*
|
||||
* Typically, the launcher execs at least once to ensure a suitable
|
||||
* LD_LIBRARY_PATH is in effect for the process. The first exec
|
||||
* screens out all the data model options; leaving the choice of data
|
||||
* model implicit in the binary selected to run. However, in case no
|
||||
* exec is done, the data model options are screened out before the vm
|
||||
* is invoked.
|
||||
* Previously the launcher modified the LD_LIBRARY_PATH appropriately for the
|
||||
* desired data model path, regardless if data models matched or not. The
|
||||
* launcher subsequently exec'ed the desired executable, in order to make the
|
||||
* LD_LIBRARY_PATH path available for the runtime linker. This is no longer the
|
||||
* case, the launcher dlopens the target libjvm.so. All other required
|
||||
* libraries are loaded by the runtime linker, by virtue of the $ORIGIN paths
|
||||
* baked into the shared libraries, by the build infrastructure at compile time.
|
||||
*
|
||||
* incoming argv ------------------------------
|
||||
* | |
|
||||
* \|/ |
|
||||
* CheckJVMType |
|
||||
* (removes -client, -server, etc.) |
|
||||
* \|/
|
||||
* CreateExecutionEnvironment
|
||||
* (removes -d32 and -d64,
|
||||
* determines desired data model,
|
||||
* sets up LD_LIBRARY_PATH,
|
||||
* and exec's)
|
||||
* |
|
||||
* --------------------------------------------
|
||||
* Main
|
||||
* (incoming argv)
|
||||
* |
|
||||
* \|/
|
||||
* exec child 1 incoming argv -----------------
|
||||
* SelectVersion
|
||||
* (selects the JRE version, note: not data model)
|
||||
* |
|
||||
* \|/
|
||||
* CreateExecutionEnvironment
|
||||
* (determines desired data model)
|
||||
* |
|
||||
* |
|
||||
* \|/
|
||||
* Have Desired Model ? --> NO --> Is Dual-Mode ? --> NO --> Exit(with error)
|
||||
* | |
|
||||
* | |
|
||||
* \|/ |
|
||||
* CheckJVMType |
|
||||
* (removes -client, -server, etc.) |
|
||||
* | \|/
|
||||
* | CreateExecutionEnvironment
|
||||
* | (verifies desired data model
|
||||
* | is running and acceptable
|
||||
* | LD_LIBRARY_PATH;
|
||||
* | no-op in child)
|
||||
* | YES
|
||||
* | |
|
||||
* | |
|
||||
* | \|/
|
||||
* | CheckJvmType
|
||||
* | (removes -client, -server etc.)
|
||||
* | |
|
||||
* | |
|
||||
* \|/ \|/
|
||||
* YES (find the desired executable and exec child)
|
||||
* | |
|
||||
* | |
|
||||
* \|/ \|/
|
||||
* CheckJvmType Main
|
||||
* (removes -client, -server, etc.)
|
||||
* |
|
||||
* |
|
||||
* \|/
|
||||
* TranslateDashJArgs...
|
||||
* (Prepare to pass args to vm)
|
||||
* |
|
||||
* |
|
||||
* |
|
||||
* \|/
|
||||
* ParseArguments
|
||||
* (ignores -d32 and -d64,
|
||||
* (removes -d32 and -d64 if any,
|
||||
* processes version options,
|
||||
* creates argument list for vm,
|
||||
* etc.)
|
||||
@ -199,17 +206,13 @@ CreateExecutionEnvironment(int *_argcp,
|
||||
/* Compute/set the name of the executable */
|
||||
SetExecname(*_argvp);
|
||||
|
||||
/* Set the LD_LIBRARY_PATH environment variable, check data model
|
||||
flags, and exec process, if needed */
|
||||
/* Check data model flags, and exec process, if needed */
|
||||
{
|
||||
char *arch = (char *)GetArch(); /* like sparc or sparcv9 */
|
||||
char * jvmtype = NULL;
|
||||
int argc = *_argcp;
|
||||
char **argv = original_argv;
|
||||
|
||||
char *runpath = NULL; /* existing effective LD_LIBRARY_PATH
|
||||
setting */
|
||||
|
||||
int running = CURRENT_DATA_MODEL;
|
||||
|
||||
int wanted = running; /* What data mode is being
|
||||
@ -217,18 +220,8 @@ CreateExecutionEnvironment(int *_argcp,
|
||||
fine unless another model
|
||||
is asked for */
|
||||
|
||||
char* new_runpath = NULL; /* desired new LD_LIBRARY_PATH string */
|
||||
char* newpath = NULL; /* path on new LD_LIBRARY_PATH */
|
||||
char* lastslash = NULL;
|
||||
|
||||
char** newenvp = NULL; /* current environment */
|
||||
|
||||
char** newargv = NULL;
|
||||
int newargc = 0;
|
||||
#ifdef __solaris__
|
||||
char* dmpath = NULL; /* data model specific LD_LIBRARY_PATH,
|
||||
Solaris only */
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Starting in 1.5, all unix platforms accept the -d32 and -d64
|
||||
@ -306,6 +299,11 @@ CreateExecutionEnvironment(int *_argcp,
|
||||
JLI_ReportErrorMessage(CFG_ERROR8, jvmtype, jvmpath);
|
||||
exit(4);
|
||||
}
|
||||
/*
|
||||
* we seem to have everything we need, so without further ado
|
||||
* we return back.
|
||||
*/
|
||||
return;
|
||||
} else { /* do the same speculatively or exit */
|
||||
#ifdef DUAL_MODE
|
||||
if (running != wanted) {
|
||||
@ -335,190 +333,6 @@ CreateExecutionEnvironment(int *_argcp,
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* We will set the LD_LIBRARY_PATH as follows:
|
||||
*
|
||||
* o $JVMPATH (directory portion only)
|
||||
* o $JRE/lib/$LIBARCHNAME
|
||||
* o $JRE/../lib/$LIBARCHNAME
|
||||
*
|
||||
* followed by the user's previous effective LD_LIBRARY_PATH, if
|
||||
* any.
|
||||
*/
|
||||
|
||||
#ifdef __solaris__
|
||||
/*
|
||||
* Starting in Solaris 7, ld.so.1 supports three LD_LIBRARY_PATH
|
||||
* variables:
|
||||
*
|
||||
* 1. LD_LIBRARY_PATH -- used for 32 and 64 bit searches if
|
||||
* data-model specific variables are not set.
|
||||
*
|
||||
* 2. LD_LIBRARY_PATH_64 -- overrides and replaces LD_LIBRARY_PATH
|
||||
* for 64-bit binaries.
|
||||
*
|
||||
* 3. LD_LIBRARY_PATH_32 -- overrides and replaces LD_LIBRARY_PATH
|
||||
* for 32-bit binaries.
|
||||
*
|
||||
* The vm uses LD_LIBRARY_PATH to set the java.library.path system
|
||||
* property. To shield the vm from the complication of multiple
|
||||
* LD_LIBRARY_PATH variables, if the appropriate data model
|
||||
* specific variable is set, we will act as if LD_LIBRARY_PATH had
|
||||
* the value of the data model specific variant and the data model
|
||||
* specific variant will be unset. Note that the variable for the
|
||||
* *wanted* data model must be used (if it is set), not simply the
|
||||
* current running data model.
|
||||
*/
|
||||
|
||||
switch(wanted) {
|
||||
case 0:
|
||||
if(running == 32) {
|
||||
dmpath = getenv("LD_LIBRARY_PATH_32");
|
||||
wanted = 32;
|
||||
}
|
||||
else {
|
||||
dmpath = getenv("LD_LIBRARY_PATH_64");
|
||||
wanted = 64;
|
||||
}
|
||||
break;
|
||||
|
||||
case 32:
|
||||
dmpath = getenv("LD_LIBRARY_PATH_32");
|
||||
break;
|
||||
|
||||
case 64:
|
||||
dmpath = getenv("LD_LIBRARY_PATH_64");
|
||||
break;
|
||||
|
||||
default:
|
||||
JLI_ReportErrorMessage(JRE_ERROR3, __LINE__);
|
||||
exit(1); /* unknown value in wanted */
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* If dmpath is NULL, the relevant data model specific variable is
|
||||
* not set and normal LD_LIBRARY_PATH should be used.
|
||||
*/
|
||||
if( dmpath == NULL) {
|
||||
runpath = getenv("LD_LIBRARY_PATH");
|
||||
}
|
||||
else {
|
||||
runpath = dmpath;
|
||||
}
|
||||
#else
|
||||
/*
|
||||
* If not on Solaris, assume only a single LD_LIBRARY_PATH
|
||||
* variable.
|
||||
*/
|
||||
runpath = getenv("LD_LIBRARY_PATH");
|
||||
#endif /* __solaris__ */
|
||||
|
||||
#ifdef __linux
|
||||
/*
|
||||
* On linux, if a binary is running as sgid or suid, glibc sets
|
||||
* LD_LIBRARY_PATH to the empty string for security purposes. (In
|
||||
* contrast, on Solaris the LD_LIBRARY_PATH variable for a
|
||||
* privileged binary does not lose its settings; but the dynamic
|
||||
* linker does apply more scrutiny to the path.) The launcher uses
|
||||
* the value of LD_LIBRARY_PATH to prevent an exec loop.
|
||||
* Therefore, if we are running sgid or suid, this function's
|
||||
* setting of LD_LIBRARY_PATH will be ineffective and we should
|
||||
* return from the function now. Getting the right libraries to
|
||||
* be found must be handled through other mechanisms.
|
||||
*/
|
||||
if((getgid() != getegid()) || (getuid() != geteuid()) ) {
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* runpath contains current effective LD_LIBRARY_PATH setting */
|
||||
|
||||
jvmpath = JLI_StringDup(jvmpath);
|
||||
new_runpath = JLI_MemAlloc( ((runpath!=NULL)?JLI_StrLen(runpath):0) +
|
||||
2*JLI_StrLen(jrepath) + 2*JLI_StrLen(arch) +
|
||||
JLI_StrLen(jvmpath) + 52);
|
||||
newpath = new_runpath + JLI_StrLen("LD_LIBRARY_PATH=");
|
||||
|
||||
|
||||
/*
|
||||
* Create desired LD_LIBRARY_PATH value for target data model.
|
||||
*/
|
||||
{
|
||||
/* remove the name of the .so from the JVM path */
|
||||
lastslash = JLI_StrRChr(jvmpath, '/');
|
||||
if (lastslash)
|
||||
*lastslash = '\0';
|
||||
|
||||
|
||||
/* jvmpath, ((running != wanted)?((wanted==64)?"/"LIBARCH64NAME:"/.."):""), */
|
||||
|
||||
sprintf(new_runpath, "LD_LIBRARY_PATH="
|
||||
"%s:"
|
||||
"%s/lib/%s:"
|
||||
"%s/../lib/%s",
|
||||
jvmpath,
|
||||
#ifdef DUAL_MODE
|
||||
jrepath, GetArchPath(wanted),
|
||||
jrepath, GetArchPath(wanted)
|
||||
#else
|
||||
jrepath, arch,
|
||||
jrepath, arch
|
||||
#endif
|
||||
);
|
||||
|
||||
|
||||
/*
|
||||
* Check to make sure that the prefix of the current path is the
|
||||
* desired environment variable setting.
|
||||
*/
|
||||
if (runpath != NULL &&
|
||||
JLI_StrNCmp(newpath, runpath, JLI_StrLen(newpath))==0 &&
|
||||
(runpath[JLI_StrLen(newpath)] == 0 || runpath[JLI_StrLen(newpath)] == ':') &&
|
||||
(running == wanted) /* data model does not have to be changed */
|
||||
#ifdef __solaris__
|
||||
&& (dmpath == NULL) /* data model specific variables not set */
|
||||
#endif
|
||||
) {
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Place the desired environment setting onto the prefix of
|
||||
* LD_LIBRARY_PATH. Note that this prevents any possible infinite
|
||||
* loop of execv() because we test for the prefix, above.
|
||||
*/
|
||||
if (runpath != 0) {
|
||||
JLI_StrCat(new_runpath, ":");
|
||||
JLI_StrCat(new_runpath, runpath);
|
||||
}
|
||||
|
||||
if( putenv(new_runpath) != 0) {
|
||||
exit(1); /* problem allocating memory; LD_LIBRARY_PATH not set
|
||||
properly */
|
||||
}
|
||||
|
||||
/*
|
||||
* Unix systems document that they look at LD_LIBRARY_PATH only
|
||||
* once at startup, so we have to re-exec the current executable
|
||||
* to get the changed environment variable to have an effect.
|
||||
*/
|
||||
|
||||
#ifdef __solaris__
|
||||
/*
|
||||
* If dmpath is not NULL, remove the data model specific string
|
||||
* in the environment for the exec'ed child.
|
||||
*/
|
||||
|
||||
if( dmpath != NULL)
|
||||
(void)UnsetEnv((wanted==32)?"LD_LIBRARY_PATH_32":"LD_LIBRARY_PATH_64");
|
||||
#endif
|
||||
|
||||
newenvp = environ;
|
||||
|
||||
{
|
||||
char *newexec = execname;
|
||||
#ifdef DUAL_MODE
|
||||
@ -549,17 +363,16 @@ CreateExecutionEnvironment(int *_argcp,
|
||||
argv[0] = newexec;
|
||||
}
|
||||
#endif
|
||||
|
||||
JLI_TraceLauncher("TRACER_MARKER:About to EXEC\n");
|
||||
(void)fflush(stdout);
|
||||
(void)fflush(stderr);
|
||||
execve(newexec, argv, newenvp);
|
||||
execv(newexec, argv);
|
||||
JLI_ReportErrorMessageSys(JRE_ERROR4, newexec);
|
||||
|
||||
#ifdef DUAL_MODE
|
||||
if (running != wanted) {
|
||||
JLI_ReportErrorMessage(JRE_ERROR5, wanted, running);
|
||||
# ifdef __solaris__
|
||||
|
||||
# ifdef __sparc
|
||||
JLI_ReportErrorMessage(JRE_ERROR6);
|
||||
# else
|
||||
@ -570,13 +383,11 @@ CreateExecutionEnvironment(int *_argcp,
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
exit(1);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* On Solaris VM choosing is done by the launcher (java.c).
|
||||
*/
|
||||
@ -1123,6 +934,7 @@ ExecJRE(char *jre, char **argv)
|
||||
printf(" %s", argv[i]);
|
||||
printf("\n");
|
||||
}
|
||||
JLI_TraceLauncher("TRACER_MARKER:About to EXEC\n");
|
||||
(void)fflush(stdout);
|
||||
(void)fflush(stderr);
|
||||
execv(wanted, argv);
|
||||
|
||||
@ -45,6 +45,7 @@ public abstract class InfoWindow extends Window {
|
||||
|
||||
protected InfoWindow(Frame parent, Color borderColor) {
|
||||
super(parent);
|
||||
setType(Window.Type.POPUP);
|
||||
container = new Container() {
|
||||
@Override
|
||||
public Insets getInsets() {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user