-
Bug
-
Resolution: Duplicate
-
P1
-
None
-
6u20
-
x86
-
windows_xp
FULL PRODUCT VERSION :
java version "1.6.0_20"
Java(TM) SE Runtime Environment (build 1.6.0_20-b02)
Java HotSpot(TM) Client VM (build 16.3-b01, mixed mode, sharing)
ADDITIONAL OS VERSION INFORMATION :
Microsoft Windows XP [Version 5.1.2600]
A DESCRIPTION OF THE PROBLEM :
Drag and drop used from an unsigned applet fails under Java 6 update 20. The drop handler throws (java.security.AccessControlException: access denied (java.awt.AWTPermission accessClipboard)) on any attempt to call Transferable.getTransferData. Copy-paste works correctly, but a mouse-initiated drag (e.g. list, tree, etc) does not function correctly. This issue occurs under Windows XP, Vista, 7, and likely all other platforms (possibly part of a recent security patch in the plugin or JRE). This issue occurs only when using 1.6.0_20 and worked correctly under 1.6.0_19. The issue does not seem bound to a specific component type as components such as JTree, JList, etc, all will expose the incorrect behavior when they are the drag source.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Create a simple drag source and drop target (e.g. list -> textbox) and create simple handlers. Enable dragging from the source. Implement a drop handler that accesses the Transferable and attempts to get the data using a valid flavor. Place these graphical components into an applet and host the applet via HTML as an unsigned applet.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The drop succeeds, running any code after the call to Transferable.getTransferData.
ACTUAL -
The call to Transferable.getTransferData throws java.security.AccessControlException: access denied (java.awt.AWTPermission accessClipboard).
ERROR MESSAGES/STACK TRACES THAT OCCUR :
Exception in thread "AWT-EventQueue-2" java.security.AccessControlException: access denied (java.awt.AWTPermission accessClipboard)
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkSystemClipboardAccess(Unknown Source)
at sun.awt.dnd.SunDropTargetContextPeer.getTransferData(Unknown Source)
at sun.awt.datatransfer.TransferableProxy.getTransferData(Unknown Source)
at java.awt.dnd.DropTargetContext$TransferableProxy.getTransferData(Unknown Source)
at com.AppletPie$1$2.importData(AppletPie.java:47)
at javax.swing.TransferHandler$DropHandler.drop(Unknown Source)
at java.awt.dnd.DropTarget.drop(Unknown Source)
at javax.swing.TransferHandler$SwingDropTarget.drop(Unknown Source)
at sun.awt.dnd.SunDropTargetContextPeer.processDropMessage(Unknown Source)
at sun.awt.dnd.SunDropTargetContextPeer$EventDispatcher.dispatchDropEvent(Unknown Source)
at sun.awt.dnd.SunDropTargetContextPeer$EventDispatcher.dispatchEvent(Unknown Source)
at sun.awt.dnd.SunDropTargetEvent.dispatch(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processDropTargetEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.datatransfer.*;
import javax.swing.*;
import javax.swing.TransferHandler;
import javax.swing.TransferHandler.TransferSupport;
public class AppletPie
extends JApplet
{
public void init() {
Runnable runnable = new Runnable()
{
public void run() {
Container cp = getContentPane();
cp.setLayout(new GridLayout(1, 2));
// source of drag irrelevant
final JList list = new JList(new String[] {"one", "two", "three"});
cp.add(new JScrollPane(list));
list.setDragEnabled(true);
final JTextArea textArea = new JTextArea("Some text");
cp.add(new JScrollPane(textArea));
list.setTransferHandler(new TransferHandler()
{
protected Transferable createTransferable(JComponent c) {
// other drag sources cause same issue
return new StringSelection(String.valueOf(list.getSelectedValue()));
}
public int getSourceActions(JComponent c) {
return COPY;
}
});
textArea.setTransferHandler(new TransferHandler()
{
public boolean canImport(TransferSupport support) {
return support.isDataFlavorSupported(DataFlavor.stringFlavor);
}
public boolean importData(TransferSupport support) {
try {
// java.security.AccessControlException: access denied (java.awt.AWTPermission accessClipboard)
String path = (String) support.getTransferable().getTransferData(DataFlavor.stringFlavor);
textArea.setText(String.valueOf(path));
return true;
} catch (Exception ex) {
ex.printStackTrace();
}
return false;
}
});
}
};
if (SwingUtilities.isEventDispatchThread()) {
runnable.run();
} else {
try {
SwingUtilities.invokeAndWait(runnable);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
Add permission to policy file: permission java.awt.AWTPermission "accessClipboard";
This is not a good workaround as it opens a security hole.
Release Regression From : 6u19
The above release value was the last known release where this
bug was not reproducible. Since then there has been a regression.
java version "1.6.0_20"
Java(TM) SE Runtime Environment (build 1.6.0_20-b02)
Java HotSpot(TM) Client VM (build 16.3-b01, mixed mode, sharing)
ADDITIONAL OS VERSION INFORMATION :
Microsoft Windows XP [Version 5.1.2600]
A DESCRIPTION OF THE PROBLEM :
Drag and drop used from an unsigned applet fails under Java 6 update 20. The drop handler throws (java.security.AccessControlException: access denied (java.awt.AWTPermission accessClipboard)) on any attempt to call Transferable.getTransferData. Copy-paste works correctly, but a mouse-initiated drag (e.g. list, tree, etc) does not function correctly. This issue occurs under Windows XP, Vista, 7, and likely all other platforms (possibly part of a recent security patch in the plugin or JRE). This issue occurs only when using 1.6.0_20 and worked correctly under 1.6.0_19. The issue does not seem bound to a specific component type as components such as JTree, JList, etc, all will expose the incorrect behavior when they are the drag source.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Create a simple drag source and drop target (e.g. list -> textbox) and create simple handlers. Enable dragging from the source. Implement a drop handler that accesses the Transferable and attempts to get the data using a valid flavor. Place these graphical components into an applet and host the applet via HTML as an unsigned applet.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The drop succeeds, running any code after the call to Transferable.getTransferData.
ACTUAL -
The call to Transferable.getTransferData throws java.security.AccessControlException: access denied (java.awt.AWTPermission accessClipboard).
ERROR MESSAGES/STACK TRACES THAT OCCUR :
Exception in thread "AWT-EventQueue-2" java.security.AccessControlException: access denied (java.awt.AWTPermission accessClipboard)
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkSystemClipboardAccess(Unknown Source)
at sun.awt.dnd.SunDropTargetContextPeer.getTransferData(Unknown Source)
at sun.awt.datatransfer.TransferableProxy.getTransferData(Unknown Source)
at java.awt.dnd.DropTargetContext$TransferableProxy.getTransferData(Unknown Source)
at com.AppletPie$1$2.importData(AppletPie.java:47)
at javax.swing.TransferHandler$DropHandler.drop(Unknown Source)
at java.awt.dnd.DropTarget.drop(Unknown Source)
at javax.swing.TransferHandler$SwingDropTarget.drop(Unknown Source)
at sun.awt.dnd.SunDropTargetContextPeer.processDropMessage(Unknown Source)
at sun.awt.dnd.SunDropTargetContextPeer$EventDispatcher.dispatchDropEvent(Unknown Source)
at sun.awt.dnd.SunDropTargetContextPeer$EventDispatcher.dispatchEvent(Unknown Source)
at sun.awt.dnd.SunDropTargetEvent.dispatch(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processDropTargetEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.datatransfer.*;
import javax.swing.*;
import javax.swing.TransferHandler;
import javax.swing.TransferHandler.TransferSupport;
public class AppletPie
extends JApplet
{
public void init() {
Runnable runnable = new Runnable()
{
public void run() {
Container cp = getContentPane();
cp.setLayout(new GridLayout(1, 2));
// source of drag irrelevant
final JList list = new JList(new String[] {"one", "two", "three"});
cp.add(new JScrollPane(list));
list.setDragEnabled(true);
final JTextArea textArea = new JTextArea("Some text");
cp.add(new JScrollPane(textArea));
list.setTransferHandler(new TransferHandler()
{
protected Transferable createTransferable(JComponent c) {
// other drag sources cause same issue
return new StringSelection(String.valueOf(list.getSelectedValue()));
}
public int getSourceActions(JComponent c) {
return COPY;
}
});
textArea.setTransferHandler(new TransferHandler()
{
public boolean canImport(TransferSupport support) {
return support.isDataFlavorSupported(DataFlavor.stringFlavor);
}
public boolean importData(TransferSupport support) {
try {
// java.security.AccessControlException: access denied (java.awt.AWTPermission accessClipboard)
String path = (String) support.getTransferable().getTransferData(DataFlavor.stringFlavor);
textArea.setText(String.valueOf(path));
return true;
} catch (Exception ex) {
ex.printStackTrace();
}
return false;
}
});
}
};
if (SwingUtilities.isEventDispatchThread()) {
runnable.run();
} else {
try {
SwingUtilities.invokeAndWait(runnable);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
Add permission to policy file: permission java.awt.AWTPermission "accessClipboard";
This is not a good workaround as it opens a security hole.
Release Regression From : 6u19
The above release value was the last known release where this
bug was not reproducible. Since then there has been a regression.
- duplicates
-
JDK-6945178 SecurityException upon drag-and-drop
-
- Resolved
-