提交 fe373f32 编写于 作者: L lana

Merge

# #
# Copyright (c) 1996, 2010, Oracle and/or its affiliates. All rights reserved. # Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
# #
# This code is free software; you can redistribute it and/or modify it # This code is free software; you can redistribute it and/or modify it
...@@ -34,6 +34,7 @@ FILES_java = \ ...@@ -34,6 +34,7 @@ FILES_java = \
sun/net/ProgressListener.java \ sun/net/ProgressListener.java \
sun/net/ProgressMeteringPolicy.java \ sun/net/ProgressMeteringPolicy.java \
sun/net/SocksProxy.java \ sun/net/SocksProxy.java \
sun/net/ResourceManager.java \
sun/net/TelnetInputStream.java \ sun/net/TelnetInputStream.java \
sun/net/TelnetOutputStream.java \ sun/net/TelnetOutputStream.java \
sun/net/TelnetProtocolException.java \ sun/net/TelnetProtocolException.java \
...@@ -100,6 +101,7 @@ FILES_java = \ ...@@ -100,6 +101,7 @@ FILES_java = \
sun/net/www/protocol/http/NegotiateAuthentication.java \ sun/net/www/protocol/http/NegotiateAuthentication.java \
sun/net/www/protocol/http/Negotiator.java \ sun/net/www/protocol/http/Negotiator.java \
sun/net/www/protocol/http/ntlm/NTLMAuthentication.java \ sun/net/www/protocol/http/ntlm/NTLMAuthentication.java \
sun/net/www/protocol/http/ntlm/NTLMAuthenticationCallback.java \
sun/net/www/protocol/http/spnego/NegotiatorImpl.java \ sun/net/www/protocol/http/spnego/NegotiatorImpl.java \
sun/net/www/protocol/http/spnego/NegotiateCallbackHandler.java \ sun/net/www/protocol/http/spnego/NegotiateCallbackHandler.java \
sun/net/www/protocol/http/logging/HttpLogFormatter.java \ sun/net/www/protocol/http/logging/HttpLogFormatter.java \
......
...@@ -210,6 +210,8 @@ public final class Transform extends SignatureElementProxy { ...@@ -210,6 +210,8 @@ public final class Transform extends SignatureElementProxy {
public static void init() { public static void init() {
if (!alreadyInitialized) { if (!alreadyInitialized) {
transformClassHash = new HashMap(10); transformClassHash = new HashMap(10);
// make sure builtin algorithms are all registered first
com.sun.org.apache.xml.internal.security.Init.init();
alreadyInitialized = true; alreadyInitialized = true;
} }
} }
...@@ -236,12 +238,7 @@ public final class Transform extends SignatureElementProxy { ...@@ -236,12 +238,7 @@ public final class Transform extends SignatureElementProxy {
"algorithm.alreadyRegistered", exArgs); "algorithm.alreadyRegistered", exArgs);
} }
ClassLoader cl = (ClassLoader) AccessController.doPrivileged( ClassLoader cl = Thread.currentThread().getContextClassLoader();
new PrivilegedAction() {
public Object run() {
return Thread.currentThread().getContextClassLoader();
}
});
try { try {
transformClassHash.put transformClassHash.put
......
...@@ -33,6 +33,11 @@ import java.lang.reflect.Field; ...@@ -33,6 +33,11 @@ import java.lang.reflect.Field;
import sun.awt.AWTAccessor; import sun.awt.AWTAccessor;
import sun.util.logging.PlatformLogger; import sun.util.logging.PlatformLogger;
import java.security.AccessControlContext;
import java.security.AccessController;
import java.io.ObjectInputStream;
import java.io.IOException;
/** /**
* The root event class for all AWT events. * The root event class for all AWT events.
* This class and its subclasses supercede the original * This class and its subclasses supercede the original
...@@ -97,6 +102,22 @@ public abstract class AWTEvent extends EventObject { ...@@ -97,6 +102,22 @@ public abstract class AWTEvent extends EventObject {
*/ */
protected boolean consumed = false; protected boolean consumed = false;
/*
* The event's AccessControlContext.
*/
private transient volatile AccessControlContext acc =
AccessController.getContext();
/*
* Returns the acc this event was constructed with.
*/
final AccessControlContext getAccessControlContext() {
if (acc == null) {
throw new SecurityException("AWTEvent is missing AccessControlContext");
}
return acc;
}
transient boolean focusManagerIsDispatching = false; transient boolean focusManagerIsDispatching = false;
transient boolean isPosted; transient boolean isPosted;
...@@ -247,6 +268,10 @@ public abstract class AWTEvent extends EventObject { ...@@ -247,6 +268,10 @@ public abstract class AWTEvent extends EventObject {
public boolean isSystemGenerated(AWTEvent ev) { public boolean isSystemGenerated(AWTEvent ev) {
return ev.isSystemGenerated; return ev.isSystemGenerated;
} }
public AccessControlContext getAccessControlContext(AWTEvent ev) {
return ev.getAccessControlContext();
}
}); });
} }
......
...@@ -59,6 +59,7 @@ import java.lang.reflect.InvocationTargetException; ...@@ -59,6 +59,7 @@ import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.security.AccessController; import java.security.AccessController;
import java.security.PrivilegedAction; import java.security.PrivilegedAction;
import java.security.AccessControlContext;
import javax.accessibility.*; import javax.accessibility.*;
import java.applet.Applet; import java.applet.Applet;
...@@ -471,6 +472,12 @@ public abstract class Component implements ImageObserver, MenuContainer, ...@@ -471,6 +472,12 @@ public abstract class Component implements ImageObserver, MenuContainer,
static final Object LOCK = new AWTTreeLock(); static final Object LOCK = new AWTTreeLock();
static class AWTTreeLock {} static class AWTTreeLock {}
/*
* The component's AccessControlContext.
*/
private transient volatile AccessControlContext acc =
AccessController.getContext();
/** /**
* Minimum size. * Minimum size.
* (This field perhaps should have been transient). * (This field perhaps should have been transient).
...@@ -671,6 +678,16 @@ public abstract class Component implements ImageObserver, MenuContainer, ...@@ -671,6 +678,16 @@ public abstract class Component implements ImageObserver, MenuContainer,
return objectLock; return objectLock;
} }
/*
* Returns the acc this component was constructed with.
*/
final AccessControlContext getAccessControlContext() {
if (acc == null) {
throw new SecurityException("Component is missing AccessControlContext");
}
return acc;
}
boolean isPacked = false; boolean isPacked = false;
/** /**
...@@ -950,6 +967,10 @@ public abstract class Component implements ImageObserver, MenuContainer, ...@@ -950,6 +967,10 @@ public abstract class Component implements ImageObserver, MenuContainer,
public void processEvent(Component comp, AWTEvent e) { public void processEvent(Component comp, AWTEvent e) {
comp.processEvent(e); comp.processEvent(e);
} }
public AccessControlContext getAccessControlContext(Component comp) {
return comp.getAccessControlContext();
}
}); });
} }
...@@ -8613,6 +8634,8 @@ public abstract class Component implements ImageObserver, MenuContainer, ...@@ -8613,6 +8634,8 @@ public abstract class Component implements ImageObserver, MenuContainer,
{ {
objectLock = new Object(); objectLock = new Object();
acc = AccessController.getContext();
s.defaultReadObject(); s.defaultReadObject();
appContext = AppContext.getAppContext(); appContext = AppContext.getAppContext();
......
...@@ -48,6 +48,12 @@ import sun.awt.AWTAccessor; ...@@ -48,6 +48,12 @@ import sun.awt.AWTAccessor;
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Lock;
import java.security.AccessControlContext;
import java.security.ProtectionDomain;
import sun.misc.SharedSecrets;
import sun.misc.JavaSecurityAccess;
/** /**
* <code>EventQueue</code> is a platform-independent class * <code>EventQueue</code> is a platform-independent class
* that queues events, both from the underlying peer classes * that queues events, both from the underlying peer classes
...@@ -612,6 +618,9 @@ public class EventQueue { ...@@ -612,6 +618,9 @@ public class EventQueue {
return null; return null;
} }
private static final JavaSecurityAccess javaSecurityAccess =
SharedSecrets.getJavaSecurityAccess();
/** /**
* Dispatches an event. The manner in which the event is * Dispatches an event. The manner in which the event is
* dispatched depends upon the type of the event and the * dispatched depends upon the type of the event and the
...@@ -650,13 +659,49 @@ public class EventQueue { ...@@ -650,13 +659,49 @@ public class EventQueue {
* @throws NullPointerException if <code>event</code> is <code>null</code> * @throws NullPointerException if <code>event</code> is <code>null</code>
* @since 1.2 * @since 1.2
*/ */
protected void dispatchEvent(AWTEvent event) { protected void dispatchEvent(final AWTEvent event) {
final Object src = event.getSource();
final PrivilegedAction<Void> action = new PrivilegedAction<Void>() {
public Void run() {
dispatchEventImpl(event, src);
return null;
}
};
final AccessControlContext stack = AccessController.getContext();
final AccessControlContext srcAcc = getAccessControlContextFrom(src);
final AccessControlContext eventAcc = event.getAccessControlContext();
if (srcAcc == null) {
javaSecurityAccess.doIntersectionPrivilege(action, stack, eventAcc);
} else {
javaSecurityAccess.doIntersectionPrivilege(
new PrivilegedAction<Void>() {
public Void run() {
javaSecurityAccess.doIntersectionPrivilege(action, eventAcc);
return null;
}
}, stack, srcAcc);
}
}
private static AccessControlContext getAccessControlContextFrom(Object src) {
return src instanceof Component ?
((Component)src).getAccessControlContext() :
src instanceof MenuComponent ?
((MenuComponent)src).getAccessControlContext() :
src instanceof TrayIcon ?
((TrayIcon)src).getAccessControlContext() :
null;
}
/**
* Called from dispatchEvent() under a correct AccessControlContext
*/
private void dispatchEventImpl(final AWTEvent event, final Object src) {
event.isPosted = true; event.isPosted = true;
Object src = event.getSource();
if (event instanceof ActiveEvent) { if (event instanceof ActiveEvent) {
// This could become the sole method of dispatching in time. // This could become the sole method of dispatching in time.
setCurrentEventAndMostRecentTimeImpl(event); setCurrentEventAndMostRecentTimeImpl(event);
((ActiveEvent)event).dispatch(); ((ActiveEvent)event).dispatch();
} else if (src instanceof Component) { } else if (src instanceof Component) {
((Component)src).dispatchEvent(event); ((Component)src).dispatchEvent(event);
......
...@@ -33,6 +33,9 @@ import sun.awt.SunToolkit; ...@@ -33,6 +33,9 @@ import sun.awt.SunToolkit;
import sun.awt.AWTAccessor; import sun.awt.AWTAccessor;
import javax.accessibility.*; import javax.accessibility.*;
import java.security.AccessControlContext;
import java.security.AccessController;
/** /**
* The abstract class <code>MenuComponent</code> is the superclass * The abstract class <code>MenuComponent</code> is the superclass
* of all menu-related components. In this respect, the class * of all menu-related components. In this respect, the class
...@@ -99,6 +102,23 @@ public abstract class MenuComponent implements java.io.Serializable { ...@@ -99,6 +102,23 @@ public abstract class MenuComponent implements java.io.Serializable {
*/ */
boolean newEventsOnly = false; boolean newEventsOnly = false;
/*
* The menu's AccessControlContext.
*/
private transient volatile AccessControlContext acc =
AccessController.getContext();
/*
* Returns the acc this menu component was constructed with.
*/
final AccessControlContext getAccessControlContext() {
if (acc == null) {
throw new SecurityException(
"MenuComponent is missing AccessControlContext");
}
return acc;
}
/* /*
* Internal constants for serialization. * Internal constants for serialization.
*/ */
...@@ -402,6 +422,9 @@ public abstract class MenuComponent implements java.io.Serializable { ...@@ -402,6 +422,9 @@ public abstract class MenuComponent implements java.io.Serializable {
throws ClassNotFoundException, IOException, HeadlessException throws ClassNotFoundException, IOException, HeadlessException
{ {
GraphicsEnvironment.checkHeadless(); GraphicsEnvironment.checkHeadless();
acc = AccessController.getContext();
s.defaultReadObject(); s.defaultReadObject();
appContext = AppContext.getAppContext(); appContext = AppContext.getAppContext();
......
...@@ -40,6 +40,8 @@ import sun.awt.AppContext; ...@@ -40,6 +40,8 @@ import sun.awt.AppContext;
import sun.awt.SunToolkit; import sun.awt.SunToolkit;
import sun.awt.HeadlessToolkit; import sun.awt.HeadlessToolkit;
import java.util.EventObject; import java.util.EventObject;
import java.security.AccessControlContext;
import java.security.AccessController;
/** /**
* A <code>TrayIcon</code> object represents a tray icon that can be * A <code>TrayIcon</code> object represents a tray icon that can be
...@@ -90,6 +92,7 @@ import java.util.EventObject; ...@@ -90,6 +92,7 @@ import java.util.EventObject;
* @author Anton Tarasov * @author Anton Tarasov
*/ */
public class TrayIcon { public class TrayIcon {
private Image image; private Image image;
private String tooltip; private String tooltip;
private PopupMenu popup; private PopupMenu popup;
...@@ -103,6 +106,24 @@ public class TrayIcon { ...@@ -103,6 +106,24 @@ public class TrayIcon {
transient MouseMotionListener mouseMotionListener; transient MouseMotionListener mouseMotionListener;
transient ActionListener actionListener; transient ActionListener actionListener;
/*
* The tray icon's AccessControlContext.
*
* Unlike the acc in Component, this field is made final
* because TrayIcon is not serializable.
*/
private final AccessControlContext acc = AccessController.getContext();
/*
* Returns the acc this tray icon was constructed with.
*/
final AccessControlContext getAccessControlContext() {
if (acc == null) {
throw new SecurityException("TrayIcon is missing AccessControlContext");
}
return acc;
}
static { static {
Toolkit.loadLibraries(); Toolkit.loadLibraries();
if (!GraphicsEnvironment.isHeadless()) { if (!GraphicsEnvironment.isHeadless()) {
......
...@@ -28,6 +28,7 @@ import java.io.FileDescriptor; ...@@ -28,6 +28,7 @@ import java.io.FileDescriptor;
import java.io.IOException; import java.io.IOException;
import java.io.InterruptedIOException; import java.io.InterruptedIOException;
import java.util.Enumeration; import java.util.Enumeration;
import sun.net.ResourceManager;
/** /**
* Abstract datagram and multicast socket implementation base class. * Abstract datagram and multicast socket implementation base class.
...@@ -66,7 +67,14 @@ abstract class AbstractPlainDatagramSocketImpl extends DatagramSocketImpl ...@@ -66,7 +67,14 @@ abstract class AbstractPlainDatagramSocketImpl extends DatagramSocketImpl
*/ */
protected synchronized void create() throws SocketException { protected synchronized void create() throws SocketException {
fd = new FileDescriptor(); fd = new FileDescriptor();
datagramSocketCreate(); ResourceManager.beforeUdpCreate();
try {
datagramSocketCreate();
} catch (SocketException ioe) {
ResourceManager.afterUdpClose();
fd = null;
throw ioe;
}
} }
/** /**
...@@ -211,6 +219,7 @@ abstract class AbstractPlainDatagramSocketImpl extends DatagramSocketImpl ...@@ -211,6 +219,7 @@ abstract class AbstractPlainDatagramSocketImpl extends DatagramSocketImpl
protected void close() { protected void close() {
if (fd != null) { if (fd != null) {
datagramSocketClose(); datagramSocketClose();
ResourceManager.afterUdpClose();
fd = null; fd = null;
} }
} }
......
...@@ -32,6 +32,7 @@ import java.io.FileDescriptor; ...@@ -32,6 +32,7 @@ import java.io.FileDescriptor;
import sun.net.ConnectionResetException; import sun.net.ConnectionResetException;
import sun.net.NetHooks; import sun.net.NetHooks;
import sun.net.ResourceManager;
/** /**
* Default Socket Implementation. This implementation does * Default Socket Implementation. This implementation does
...@@ -68,6 +69,10 @@ abstract class AbstractPlainSocketImpl extends SocketImpl ...@@ -68,6 +69,10 @@ abstract class AbstractPlainSocketImpl extends SocketImpl
private int resetState; private int resetState;
private final Object resetLock = new Object(); private final Object resetLock = new Object();
/* whether this Socket is a stream (TCP) socket or not (UDP)
*/
private boolean stream;
/** /**
* Load net library into runtime. * Load net library into runtime.
*/ */
...@@ -82,7 +87,19 @@ abstract class AbstractPlainSocketImpl extends SocketImpl ...@@ -82,7 +87,19 @@ abstract class AbstractPlainSocketImpl extends SocketImpl
*/ */
protected synchronized void create(boolean stream) throws IOException { protected synchronized void create(boolean stream) throws IOException {
fd = new FileDescriptor(); fd = new FileDescriptor();
socketCreate(stream); this.stream = stream;
if (!stream) {
ResourceManager.beforeUdpCreate();
try {
socketCreate(false);
} catch (IOException ioe) {
ResourceManager.afterUdpClose();
fd = null;
throw ioe;
}
} else {
socketCreate(true);
}
if (socket != null) if (socket != null)
socket.setCreated(); socket.setCreated();
if (serverSocket != null) if (serverSocket != null)
...@@ -479,6 +496,9 @@ abstract class AbstractPlainSocketImpl extends SocketImpl ...@@ -479,6 +496,9 @@ abstract class AbstractPlainSocketImpl extends SocketImpl
protected void close() throws IOException { protected void close() throws IOException {
synchronized(fdLock) { synchronized(fdLock) {
if (fd != null) { if (fd != null) {
if (!stream) {
ResourceManager.afterUdpClose();
}
if (fdUseCount == 0) { if (fdUseCount == 0) {
if (closePending) { if (closePending) {
return; return;
......
...@@ -29,6 +29,9 @@ import java.util.ArrayList; ...@@ -29,6 +29,9 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import sun.security.util.Debug; import sun.security.util.Debug;
import sun.security.util.SecurityConstants; import sun.security.util.SecurityConstants;
import sun.misc.JavaSecurityAccess;
import sun.misc.SharedSecrets;
/** /**
* An AccessControlContext is used to make system resource access decisions * An AccessControlContext is used to make system resource access decisions
...@@ -196,6 +199,24 @@ public final class AccessControlContext { ...@@ -196,6 +199,24 @@ public final class AccessControlContext {
this.isPrivileged = isPrivileged; this.isPrivileged = isPrivileged;
} }
/**
* Constructor for JavaSecurityAccess.doIntersectionPrivilege()
*/
AccessControlContext(ProtectionDomain[] context,
AccessControlContext privilegedContext)
{
this.context = context;
this.privilegedContext = privilegedContext;
this.isPrivileged = true;
}
/**
* Returns this context's context.
*/
ProtectionDomain[] getContext() {
return context;
}
/** /**
* Returns true if this context is privileged. * Returns true if this context is privileged.
*/ */
......
...@@ -36,6 +36,8 @@ import static sun.misc.JavaSecurityProtectionDomainAccess.ProtectionDomainCache; ...@@ -36,6 +36,8 @@ import static sun.misc.JavaSecurityProtectionDomainAccess.ProtectionDomainCache;
import sun.misc.SharedSecrets; import sun.misc.SharedSecrets;
import sun.security.util.Debug; import sun.security.util.Debug;
import sun.security.util.SecurityConstants; import sun.security.util.SecurityConstants;
import sun.misc.JavaSecurityAccess;
import sun.misc.SharedSecrets;
/** /**
* *
...@@ -59,6 +61,36 @@ import sun.security.util.SecurityConstants; ...@@ -59,6 +61,36 @@ import sun.security.util.SecurityConstants;
public class ProtectionDomain { public class ProtectionDomain {
static {
// Set up JavaSecurityAccess in SharedSecrets
SharedSecrets.setJavaSecurityAccess(
new JavaSecurityAccess() {
public <T> T doIntersectionPrivilege(
PrivilegedAction<T> action,
final AccessControlContext stack,
final AccessControlContext context)
{
if (action == null) {
throw new NullPointerException();
}
return AccessController.doPrivileged(
action,
new AccessControlContext(
stack.getContext(), context).optimize()
);
}
public <T> T doIntersectionPrivilege(
PrivilegedAction<T> action,
AccessControlContext context)
{
return doIntersectionPrivilege(action,
AccessController.getContext(), context);
}
}
);
}
/* CodeSource */ /* CodeSource */
private CodeSource codesource ; private CodeSource codesource ;
......
...@@ -35,6 +35,10 @@ import java.util.concurrent.locks.*; ...@@ -35,6 +35,10 @@ import java.util.concurrent.locks.*;
import java.awt.*; import java.awt.*;
import java.awt.event.*; import java.awt.event.*;
import java.io.Serializable; import java.io.Serializable;
import java.io.*;
import java.security.AccessControlContext;
import java.security.AccessController;
import java.security.PrivilegedAction;
import javax.swing.event.EventListenerList; import javax.swing.event.EventListenerList;
...@@ -208,6 +212,22 @@ public class Timer implements Serializable ...@@ -208,6 +212,22 @@ public class Timer implements Serializable
} }
} }
/*
* The timer's AccessControlContext.
*/
private transient volatile AccessControlContext acc =
AccessController.getContext();
/**
* Returns the acc this timer was constructed with.
*/
final AccessControlContext getAccessControlContext() {
if (acc == null) {
throw new SecurityException(
"Timer is missing AccessControlContext");
}
return acc;
}
/** /**
* DoPostEvent is a runnable class that fires actionEvents to * DoPostEvent is a runnable class that fires actionEvents to
...@@ -587,8 +607,13 @@ public class Timer implements Serializable ...@@ -587,8 +607,13 @@ public class Timer implements Serializable
void post() { void post() {
if (notify.compareAndSet(false, true) || !coalesce) { if (notify.compareAndSet(false, true) || !coalesce) {
SwingUtilities.invokeLater(doPostEvent); AccessController.doPrivileged(new PrivilegedAction<Void>() {
public Void run() {
SwingUtilities.invokeLater(doPostEvent);
return null;
}
}, getAccessControlContext());
} }
} }
...@@ -596,6 +621,13 @@ public class Timer implements Serializable ...@@ -596,6 +621,13 @@ public class Timer implements Serializable
return lock; return lock;
} }
private void readObject(ObjectInputStream in)
throws ClassNotFoundException, IOException
{
this.acc = AccessController.getContext();
in.defaultReadObject();
}
/* /*
* We have to use readResolve because we can not initialize final * We have to use readResolve because we can not initialize final
* fields for deserialized object otherwise * fields for deserialized object otherwise
......
...@@ -42,6 +42,16 @@ import sun.awt.AppContext; ...@@ -42,6 +42,16 @@ import sun.awt.AppContext;
import sun.swing.*; import sun.swing.*;
import sun.awt.SunToolkit; import sun.awt.SunToolkit;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.security.AccessControlContext;
import java.security.ProtectionDomain;
import sun.misc.SharedSecrets;
import sun.misc.JavaSecurityAccess;
import sun.awt.AWTAccessor;
/** /**
* This class is used to handle the transfer of a <code>Transferable</code> * This class is used to handle the transfer of a <code>Transferable</code>
* to and from Swing components. The <code>Transferable</code> is used to * to and from Swing components. The <code>Transferable</code> is used to
...@@ -1686,7 +1696,37 @@ public class TransferHandler implements Serializable { ...@@ -1686,7 +1696,37 @@ public class TransferHandler implements Serializable {
return true; return true;
} }
public void actionPerformed(ActionEvent e) { private static final JavaSecurityAccess javaSecurityAccess =
SharedSecrets.getJavaSecurityAccess();
public void actionPerformed(final ActionEvent e) {
final Object src = e.getSource();
final PrivilegedAction<Void> action = new PrivilegedAction<Void>() {
public Void run() {
actionPerformedImpl(e);
return null;
}
};
final AccessControlContext stack = AccessController.getContext();
final AccessControlContext srcAcc = AWTAccessor.getComponentAccessor().getAccessControlContext((Component)src);
final AccessControlContext eventAcc = AWTAccessor.getAWTEventAccessor().getAccessControlContext(e);
if (srcAcc == null) {
javaSecurityAccess.doIntersectionPrivilege(action, stack, eventAcc);
} else {
javaSecurityAccess.doIntersectionPrivilege(
new PrivilegedAction<Void>() {
public Void run() {
javaSecurityAccess.doIntersectionPrivilege(action, eventAcc);
return null;
}
}, stack, srcAcc);
}
}
private void actionPerformedImpl(ActionEvent e) {
Object src = e.getSource(); Object src = e.getSource();
if (src instanceof JComponent) { if (src instanceof JComponent) {
JComponent c = (JComponent) src; JComponent c = (JComponent) src;
......
...@@ -33,6 +33,9 @@ import java.awt.image.BufferedImage; ...@@ -33,6 +33,9 @@ import java.awt.image.BufferedImage;
import sun.misc.Unsafe; import sun.misc.Unsafe;
import java.awt.peer.ComponentPeer; import java.awt.peer.ComponentPeer;
import java.security.AccessController;
import java.security.AccessControlContext;
/** /**
* The AWTAccessor utility class. * The AWTAccessor utility class.
* The main purpose of this class is to enable accessing * The main purpose of this class is to enable accessing
...@@ -221,6 +224,13 @@ public final class AWTAccessor { ...@@ -221,6 +224,13 @@ public final class AWTAccessor {
* Processes events occurring on this component. * Processes events occurring on this component.
*/ */
void processEvent(Component comp, AWTEvent e); void processEvent(Component comp, AWTEvent e);
/*
* Returns the acc this component was constructed with.
*/
AccessControlContext getAccessControlContext(Component comp);
} }
/* /*
...@@ -323,6 +333,13 @@ public final class AWTAccessor { ...@@ -323,6 +333,13 @@ public final class AWTAccessor {
* Indicates whether this AWTEvent was generated by the system. * Indicates whether this AWTEvent was generated by the system.
*/ */
boolean isSystemGenerated(AWTEvent ev); boolean isSystemGenerated(AWTEvent ev);
/*
* Returns the acc this event was constructed with.
*/
AccessControlContext getAccessControlContext(AWTEvent ev);
} }
public interface InputEventAccessor { public interface InputEventAccessor {
......
...@@ -32,22 +32,13 @@ import java.awt.geom.Point2D; ...@@ -32,22 +32,13 @@ import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D; import java.awt.geom.Rectangle2D;
import java.io.File; import java.io.File;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import sun.java2d.Disposer; import sun.java2d.Disposer;
import sun.java2d.DisposerRecord; import sun.java2d.DisposerRecord;
import java.lang.ref.WeakReference;
import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.io.RandomAccessFile; import java.security.AccessController;
import java.io.UnsupportedEncodingException; import java.security.PrivilegedActionException;
import java.nio.ByteOrder; import java.security.PrivilegedExceptionAction;
import java.nio.MappedByteBuffer;
import java.nio.BufferUnderflowException;
import java.nio.channels.ClosedChannelException;
import java.util.HashSet;
import java.util.HashMap;
import java.awt.Font;
public abstract class FileFont extends PhysicalFont { public abstract class FileFont extends PhysicalFont {
...@@ -286,4 +277,49 @@ public abstract class FileFont extends PhysicalFont { ...@@ -286,4 +277,49 @@ public abstract class FileFont extends PhysicalFont {
}); });
} }
} }
protected String getPublicFileName() {
SecurityManager sm = System.getSecurityManager();
if (sm == null) {
return platName;
}
boolean canReadProperty = true;
try {
sm.checkPropertyAccess("java.io.tmpdir");
} catch (SecurityException e) {
canReadProperty = false;
}
if (canReadProperty) {
return platName;
}
final File f = new File(platName);
Boolean isTmpFile = Boolean.FALSE;
try {
isTmpFile = AccessController.doPrivileged(
new PrivilegedExceptionAction<Boolean>() {
public Boolean run() {
File tmp = new File(System.getProperty("java.io.tmpdir"));
try {
String tpath = tmp.getCanonicalPath();
String fpath = f.getCanonicalPath();
return (fpath == null) || fpath.startsWith(tpath);
} catch (IOException e) {
return Boolean.TRUE;
}
}
}
);
} catch (PrivilegedActionException e) {
// unable to verify whether value of java.io.tempdir will be
// exposed, so return only a name of the font file.
isTmpFile = Boolean.TRUE;
}
return isTmpFile ? "temp file" : platName;
}
} }
...@@ -519,7 +519,8 @@ public class TrueTypeFont extends FileFont { ...@@ -519,7 +519,8 @@ public class TrueTypeFont extends FileFont {
break; break;
default: default:
throw new FontFormatException("Unsupported sfnt " + platName); throw new FontFormatException("Unsupported sfnt " +
getPublicFileName());
} }
/* Now have the offset of this TT font (possibly within a TTC) /* Now have the offset of this TT font (possibly within a TTC)
...@@ -1680,7 +1681,6 @@ public class TrueTypeFont extends FileFont { ...@@ -1680,7 +1681,6 @@ public class TrueTypeFont extends FileFont {
@Override @Override
public String toString() { public String toString() {
return "** TrueType Font: Family="+familyName+ " Name="+fullName+ return "** TrueType Font: Family="+familyName+ " Name="+fullName+
" style="+style+" fileName="+platName; " style="+style+" fileName="+getPublicFileName();
} }
} }
...@@ -677,6 +677,6 @@ public class Type1Font extends FileFont { ...@@ -677,6 +677,6 @@ public class Type1Font extends FileFont {
public String toString() { public String toString() {
return "** Type1 Font: Family="+familyName+ " Name="+fullName+ return "** Type1 Font: Family="+familyName+ " Name="+fullName+
" style="+style+" fileName="+platName; " style="+style+" fileName="+getPublicFileName();
} }
} }
/*
* Copyright (c) 2010, Oracle and/or its affiliates. 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. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package sun.misc;
import java.security.AccessControlContext;
import java.security.PrivilegedAction;
public interface JavaSecurityAccess {
<T> T doIntersectionPrivilege(PrivilegedAction<T> action,
AccessControlContext stack,
AccessControlContext context);
<T> T doIntersectionPrivilege(PrivilegedAction<T> action,
AccessControlContext context);
}
...@@ -30,6 +30,8 @@ import java.io.Console; ...@@ -30,6 +30,8 @@ import java.io.Console;
import java.io.FileDescriptor; import java.io.FileDescriptor;
import java.security.ProtectionDomain; import java.security.ProtectionDomain;
import java.security.AccessController;
/** A repository of "shared secrets", which are a mechanism for /** A repository of "shared secrets", which are a mechanism for
calling implementation-private methods in another package without calling implementation-private methods in another package without
using reflection. A package-private class implements a public using reflection. A package-private class implements a public
...@@ -48,6 +50,7 @@ public class SharedSecrets { ...@@ -48,6 +50,7 @@ public class SharedSecrets {
private static JavaNioAccess javaNioAccess; private static JavaNioAccess javaNioAccess;
private static JavaIOFileDescriptorAccess javaIOFileDescriptorAccess; private static JavaIOFileDescriptorAccess javaIOFileDescriptorAccess;
private static JavaSecurityProtectionDomainAccess javaSecurityProtectionDomainAccess; private static JavaSecurityProtectionDomainAccess javaSecurityProtectionDomainAccess;
private static JavaSecurityAccess javaSecurityAccess;
public static JavaUtilJarAccess javaUtilJarAccess() { public static JavaUtilJarAccess javaUtilJarAccess() {
if (javaUtilJarAccess == null) { if (javaUtilJarAccess == null) {
...@@ -125,4 +128,15 @@ public class SharedSecrets { ...@@ -125,4 +128,15 @@ public class SharedSecrets {
unsafe.ensureClassInitialized(ProtectionDomain.class); unsafe.ensureClassInitialized(ProtectionDomain.class);
return javaSecurityProtectionDomainAccess; return javaSecurityProtectionDomainAccess;
} }
public static void setJavaSecurityAccess(JavaSecurityAccess jsa) {
javaSecurityAccess = jsa;
}
public static JavaSecurityAccess getJavaSecurityAccess() {
if (javaSecurityAccess == null) {
unsafe.ensureClassInitialized(AccessController.class);
}
return javaSecurityAccess;
}
} }
/*
* Copyright (c) 2011, Oracle and/or its affiliates. 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. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package sun.net;
import java.net.SocketException;
import java.util.concurrent.atomic.AtomicInteger;
import sun.security.action.GetPropertyAction;
/**
* Manages count of total number of UDP sockets and ensures
* that exception is thrown if we try to create more than the
* configured limit.
*
* This functionality could be put in NetHooks some time in future.
*/
public class ResourceManager {
/* default maximum number of udp sockets per VM
* when a security manager is enabled.
* The default is 1024 which is high enough to be useful
* but low enough to be well below the maximum number
* of port numbers actually available on all OSes for
* such sockets (5000 on some versions of windows)
*/
private static final int DEFAULT_MAX_SOCKETS = 1024;
private static final int maxSockets;
private static final AtomicInteger numSockets;
static {
String prop = java.security.AccessController.doPrivileged(
new GetPropertyAction("sun.net.maxDatagramSockets")
);
int defmax = DEFAULT_MAX_SOCKETS;
try {
if (prop != null) {
defmax = Integer.parseInt(prop);
}
} catch (NumberFormatException e) {}
maxSockets = defmax;
numSockets = new AtomicInteger(0);
}
public static void beforeUdpCreate() throws SocketException {
if (System.getSecurityManager() != null) {
if (numSockets.incrementAndGet() > maxSockets) {
numSockets.decrementAndGet();
throw new SocketException("maximum number of DatagramSockets reached");
}
}
}
public static void afterUdpClose() {
if (System.getSecurityManager() != null) {
numSockets.decrementAndGet();
}
}
}
...@@ -2173,6 +2173,13 @@ public class HttpURLConnection extends java.net.HttpURLConnection { ...@@ -2173,6 +2173,13 @@ public class HttpURLConnection extends java.net.HttpURLConnection {
if (tryTransparentNTLMServer) { if (tryTransparentNTLMServer) {
tryTransparentNTLMServer = tryTransparentNTLMServer =
NTLMAuthenticationProxy.proxy.supportsTransparentAuth; NTLMAuthenticationProxy.proxy.supportsTransparentAuth;
/* If the platform supports transparent authentication
* then check if we are in a secure environment
* whether, or not, we should try transparent authentication.*/
if (tryTransparentNTLMServer) {
tryTransparentNTLMServer =
NTLMAuthenticationProxy.proxy.isTrustedSite(url);
}
} }
a = null; a = null;
if (tryTransparentNTLMServer) { if (tryTransparentNTLMServer) {
......
...@@ -36,12 +36,14 @@ import sun.util.logging.PlatformLogger; ...@@ -36,12 +36,14 @@ import sun.util.logging.PlatformLogger;
*/ */
class NTLMAuthenticationProxy { class NTLMAuthenticationProxy {
private static Method supportsTA; private static Method supportsTA;
private static Method isTrustedSite;
private static final String clazzStr = "sun.net.www.protocol.http.ntlm.NTLMAuthentication"; private static final String clazzStr = "sun.net.www.protocol.http.ntlm.NTLMAuthentication";
private static final String supportsTAStr = "supportsTransparentAuth"; private static final String supportsTAStr = "supportsTransparentAuth";
private static final String isTrustedSiteStr = "isTrustedSite";
static final NTLMAuthenticationProxy proxy = tryLoadNTLMAuthentication(); static final NTLMAuthenticationProxy proxy = tryLoadNTLMAuthentication();
static final boolean supported = proxy != null ? true : false; static final boolean supported = proxy != null ? true : false;
static final boolean supportsTransparentAuth = supported ? supportsTransparentAuth(supportsTA) : false; static final boolean supportsTransparentAuth = supported ? supportsTransparentAuth() : false;
private final Constructor<? extends AuthenticationInfo> threeArgCtr; private final Constructor<? extends AuthenticationInfo> threeArgCtr;
private final Constructor<? extends AuthenticationInfo> fiveArgCtr; private final Constructor<? extends AuthenticationInfo> fiveArgCtr;
...@@ -82,9 +84,22 @@ class NTLMAuthenticationProxy { ...@@ -82,9 +84,22 @@ class NTLMAuthenticationProxy {
* authentication (try with the current users credentials before * authentication (try with the current users credentials before
* prompting for username and password, etc). * prompting for username and password, etc).
*/ */
private static boolean supportsTransparentAuth(Method method) { private static boolean supportsTransparentAuth() {
try { try {
return (Boolean)method.invoke(null); return (Boolean)supportsTA.invoke(null);
} catch (ReflectiveOperationException roe) {
finest(roe);
}
return false;
}
/* Transparent authentication should only be tried with a trusted
* site ( when running in a secure environment ).
*/
public static boolean isTrustedSite(URL url) {
try {
return (Boolean)isTrustedSite.invoke(null, url);
} catch (ReflectiveOperationException roe) { } catch (ReflectiveOperationException roe) {
finest(roe); finest(roe);
} }
...@@ -112,6 +127,7 @@ class NTLMAuthenticationProxy { ...@@ -112,6 +127,7 @@ class NTLMAuthenticationProxy {
int.class, int.class,
PasswordAuthentication.class); PasswordAuthentication.class);
supportsTA = cl.getDeclaredMethod(supportsTAStr); supportsTA = cl.getDeclaredMethod(supportsTAStr);
isTrustedSite = cl.getDeclaredMethod(isTrustedSiteStr, java.net.URL.class);
return new NTLMAuthenticationProxy(threeArg, return new NTLMAuthenticationProxy(threeArg,
fiveArg); fiveArg);
} }
......
/*
* Copyright (c) 2011, Oracle and/or its affiliates. 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. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package sun.net.www.protocol.http.ntlm;
import java.net.URL;
/**
* This class is used to call back to deployment to determine if a given
* URL is trusted. Transparent authentication (try with logged in users
* credentials without prompting) should only be tried with trusted sites.
*/
public abstract class NTLMAuthenticationCallback {
private static volatile NTLMAuthenticationCallback callback =
new DefaultNTLMAuthenticationCallback();
public static void setNTLMAuthenticationCallback(
NTLMAuthenticationCallback callback) {
NTLMAuthenticationCallback.callback = callback;
}
public static NTLMAuthenticationCallback getNTLMAuthenticationCallback() {
return callback;
}
/**
* Returns true if the given site is trusted, i.e. we can try
* transparent Authentication.
*/
public abstract boolean isTrustedSite(URL url);
static class DefaultNTLMAuthenticationCallback extends NTLMAuthenticationCallback {
@Override
public boolean isTrustedSite(URL url) { return true; }
}
}
...@@ -32,6 +32,7 @@ import java.nio.ByteBuffer; ...@@ -32,6 +32,7 @@ import java.nio.ByteBuffer;
import java.nio.channels.*; import java.nio.channels.*;
import java.nio.channels.spi.*; import java.nio.channels.spi.*;
import java.util.*; import java.util.*;
import sun.net.ResourceManager;
/** /**
...@@ -101,14 +102,22 @@ class DatagramChannelImpl ...@@ -101,14 +102,22 @@ class DatagramChannelImpl
throws IOException throws IOException
{ {
super(sp); super(sp);
this.family = Net.isIPv6Available() ? ResourceManager.beforeUdpCreate();
StandardProtocolFamily.INET6 : StandardProtocolFamily.INET; try {
this.fd = Net.socket(family, false); this.family = Net.isIPv6Available() ?
this.fdVal = IOUtil.fdVal(fd); StandardProtocolFamily.INET6 : StandardProtocolFamily.INET;
this.state = ST_UNCONNECTED; this.fd = Net.socket(family, false);
this.fdVal = IOUtil.fdVal(fd);
this.state = ST_UNCONNECTED;
} catch (IOException ioe) {
ResourceManager.afterUdpClose();
throw ioe;
}
} }
public DatagramChannelImpl(SelectorProvider sp, ProtocolFamily family) { public DatagramChannelImpl(SelectorProvider sp, ProtocolFamily family)
throws IOException
{
super(sp); super(sp);
if ((family != StandardProtocolFamily.INET) && if ((family != StandardProtocolFamily.INET) &&
(family != StandardProtocolFamily.INET6)) (family != StandardProtocolFamily.INET6))
...@@ -957,6 +966,7 @@ class DatagramChannelImpl ...@@ -957,6 +966,7 @@ class DatagramChannelImpl
protected void implCloseSelectableChannel() throws IOException { protected void implCloseSelectableChannel() throws IOException {
synchronized (stateLock) { synchronized (stateLock) {
nd.preClose(fd); nd.preClose(fd);
ResourceManager.afterUdpClose();
// if member of mulitcast group then invalidate all keys // if member of mulitcast group then invalidate all keys
if (registry != null) if (registry != null)
......
...@@ -312,11 +312,12 @@ class Net { // package-private ...@@ -312,11 +312,12 @@ class Net { // package-private
private static native boolean canJoin6WithIPv4Group0(); private static native boolean canJoin6WithIPv4Group0();
static FileDescriptor socket(boolean stream) { static FileDescriptor socket(boolean stream) throws IOException {
return socket(UNSPEC, stream); return socket(UNSPEC, stream);
} }
static FileDescriptor socket(ProtocolFamily family, boolean stream) { static FileDescriptor socket(ProtocolFamily family, boolean stream)
throws IOException {
boolean preferIPv6 = isIPv6Available() && boolean preferIPv6 = isIPv6Available() &&
(family != StandardProtocolFamily.INET); (family != StandardProtocolFamily.INET);
return IOUtil.newFD(socket0(preferIPv6, stream, false)); return IOUtil.newFD(socket0(preferIPv6, stream, false));
......
...@@ -68,6 +68,9 @@ import sun.net.www.protocol.http.HttpURLConnection; ...@@ -68,6 +68,9 @@ import sun.net.www.protocol.http.HttpURLConnection;
public class NTLMAuthentication extends AuthenticationInfo { public class NTLMAuthentication extends AuthenticationInfo {
private static final long serialVersionUID = 170L; private static final long serialVersionUID = 170L;
private static final NTLMAuthenticationCallback NTLMAuthCallback =
NTLMAuthenticationCallback.getNTLMAuthenticationCallback();
private String hostname; private String hostname;
private static String defaultDomain; /* Domain to use if not specified by user */ private static String defaultDomain; /* Domain to use if not specified by user */
...@@ -81,6 +84,14 @@ public class NTLMAuthentication extends AuthenticationInfo { ...@@ -81,6 +84,14 @@ public class NTLMAuthentication extends AuthenticationInfo {
return false; return false;
} }
/**
* Returns true if the given site is trusted, i.e. we can try
* transparent Authentication.
*/
public static boolean isTrustedSite(URL url) {
return NTLMAuthCallback.isTrustedSite(url);
}
private void init0() { private void init0() {
hostname = java.security.AccessController.doPrivileged( hostname = java.security.AccessController.doPrivileged(
......
...@@ -45,6 +45,9 @@ public class NTLMAuthentication extends AuthenticationInfo { ...@@ -45,6 +45,9 @@ public class NTLMAuthentication extends AuthenticationInfo {
private static final long serialVersionUID = 100L; private static final long serialVersionUID = 100L;
private static final NTLMAuthenticationCallback NTLMAuthCallback =
NTLMAuthenticationCallback.getNTLMAuthenticationCallback();
private String hostname; private String hostname;
private static String defaultDomain; /* Domain to use if not specified by user */ private static String defaultDomain; /* Domain to use if not specified by user */
...@@ -142,6 +145,14 @@ public class NTLMAuthentication extends AuthenticationInfo { ...@@ -142,6 +145,14 @@ public class NTLMAuthentication extends AuthenticationInfo {
return true; return true;
} }
/**
* Returns true if the given site is trusted, i.e. we can try
* transparent Authentication.
*/
public static boolean isTrustedSite(URL url) {
return NTLMAuthCallback.isTrustedSite(url);
}
/** /**
* Not supported. Must use the setHeaders() method * Not supported. Must use the setHeaders() method
*/ */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册