From 83dfb29e2c22712557ab462fafd5cedee6cfb39a Mon Sep 17 00:00:00 2001 From: alexsch Date: Fri, 31 Oct 2014 20:17:02 +0400 Subject: [PATCH] 8062561: Test bug8055304 fails if file system default directory has read access Reviewed-by: serb --- src/share/classes/sun/swing/FilePane.java | 28 ++- .../awt/shell/Win32ShellFolderManager2.java | 4 +- .../JFileChooser/8062561/bug8062561.java | 210 ++++++++++++++++++ .../JFileChooser/8062561/security.policy | 4 + .../JFileChooser/8062561/security2.policy | 1 + 5 files changed, 233 insertions(+), 14 deletions(-) create mode 100644 test/javax/swing/JFileChooser/8062561/bug8062561.java create mode 100644 test/javax/swing/JFileChooser/8062561/security.policy create mode 100644 test/javax/swing/JFileChooser/8062561/security2.policy diff --git a/src/share/classes/sun/swing/FilePane.java b/src/share/classes/sun/swing/FilePane.java index 6cf3c4d19..9ae60b534 100644 --- a/src/share/classes/sun/swing/FilePane.java +++ b/src/share/classes/sun/swing/FilePane.java @@ -1979,20 +1979,24 @@ public class FilePane extends JPanel implements PropertyChangeListener { return false; } - if (f instanceof ShellFolder) { - return f.canWrite(); - } else { - if (usesShellFolder(getFileChooser())) { - try { - return ShellFolder.getShellFolder(f).canWrite(); - } catch (FileNotFoundException ex) { - // File doesn't exist - return false; - } - } else { - // Ordinary file + try { + if (f instanceof ShellFolder) { return f.canWrite(); + } else { + if (usesShellFolder(getFileChooser())) { + try { + return ShellFolder.getShellFolder(f).canWrite(); + } catch (FileNotFoundException ex) { + // File doesn't exist + return false; + } + } else { + // Ordinary file + return f.canWrite(); + } } + } catch (SecurityException e) { + return false; } } diff --git a/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java b/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java index 4d7da2de2..0a0c3fb6a 100644 --- a/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java +++ b/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java @@ -278,7 +278,7 @@ public class Win32ShellFolderManager2 extends ShellFolderManager { folders.add(desktop); // Add all second level folders - File[] secondLevelFolders = desktop.listFiles(); + File[] secondLevelFolders = checkFiles(desktop.listFiles()); Arrays.sort(secondLevelFolders); for (File secondLevelFolder : secondLevelFolders) { Win32ShellFolder2 folder = (Win32ShellFolder2) secondLevelFolder; @@ -286,7 +286,7 @@ public class Win32ShellFolderManager2 extends ShellFolderManager { folders.add(folder); // Add third level for "My Computer" if (folder.equals(drives)) { - File[] thirdLevelFolders = folder.listFiles(); + File[] thirdLevelFolders = checkFiles(folder.listFiles()); if (thirdLevelFolders != null && thirdLevelFolders.length > 0) { List thirdLevelFoldersList = Arrays.asList(thirdLevelFolders); diff --git a/test/javax/swing/JFileChooser/8062561/bug8062561.java b/test/javax/swing/JFileChooser/8062561/bug8062561.java new file mode 100644 index 000000000..3802de38b --- /dev/null +++ b/test/javax/swing/JFileChooser/8062561/bug8062561.java @@ -0,0 +1,210 @@ +/* + * Copyright (c) 2014, 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. + * + * 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. + */ + +import java.awt.Robot; +import java.awt.event.KeyEvent; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintWriter; +import java.util.concurrent.TimeUnit; +import javax.swing.JFileChooser; +import javax.swing.SwingUtilities; +import javax.swing.filechooser.FileSystemView; +import sun.awt.OSInfo; + +/** + * @test + * @bug 8062561 + * @summary File system view returns null default directory + * @run main/othervm bug8062561 GENERATE_POLICY + * @run main/othervm/policy=security.policy bug8062561 CHECK_DEFAULT_DIR run + */ +public class bug8062561 { + + private static final String POLICY_FILE = "security2.policy"; + private static volatile boolean fileChooserIsShown = false; + + public static void main(String[] args) throws Exception { + + String test = args[0]; + + switch (test) { + case "GENERATE_POLICY": + generatePolicyFile(); + break; + case "CHECK_DEFAULT_DIR": + checkDefaultDirectory(); + break; + case "CHECK_FILE_CHOOSER": + checkFileChooser(); + break; + default: + throw new RuntimeException("Wrong argument!"); + } + } + + private static void checkDefaultDirectory() { + if (System.getSecurityManager() == null) { + throw new RuntimeException("Security manager is not set!"); + } + + File defaultDirectory = FileSystemView.getFileSystemView(). + getDefaultDirectory(); + if (defaultDirectory != null) { + throw new RuntimeException("File system default directory is null!"); + } + } + private static volatile JFileChooser fileChooser; + + private static void checkFileChooser() throws Exception { + if (System.getSecurityManager() == null) { + throw new RuntimeException("Security manager is not set!"); + } + + Robot robot = new Robot(); + robot.setAutoDelay(50); + + SwingUtilities.invokeLater(new Runnable() { + + public void run() { + fileChooser = new JFileChooser(); + fileChooser.showOpenDialog(null); + fileChooserIsShown = true; + System.out.println("Start file chooser: " + fileChooserIsShown); + } + }); + + long time = System.currentTimeMillis(); + while (fileChooser == null) { + if (System.currentTimeMillis() - time >= 10000) { + throw new RuntimeException("FileChoser is not shown!"); + } + Thread.sleep(500); + } + + Thread.sleep(500); + robot.keyPress(KeyEvent.VK_ESCAPE); + robot.keyRelease(KeyEvent.VK_ESCAPE); + System.exit(0); + } + + private static void generatePolicyFile() throws Exception { + if (System.getSecurityManager() != null) { + throw new RuntimeException("Security manager should be null!"); + } + + if (!OSInfo.getOSType().equals(OSInfo.OSType.WINDOWS)) { + return; + } + + File defaultDirectory = FileSystemView.getFileSystemView(). + getDefaultDirectory(); + + if (defaultDirectory == null) { + throw new RuntimeException("Default directory is null!"); + } + + File policyFile = new File(POLICY_FILE); + if (!policyFile.exists()) { + policyFile.createNewFile(); + } + + try (PrintWriter writer = new PrintWriter(policyFile, "UTF-8")) { + writer.println("grant {"); + String documents = defaultDirectory.getCanonicalPath(); + documents = documents.replace('\\', '/'); + // Documents permission + writer.print(" permission java.io.FilePermission"); + writer.print(" \"" + documents + "\","); + writer.println(" \"read\";"); + // Desktop permission + writer.print(" permission java.io.FilePermission"); + writer.print(" \"" + documents.replace("Documents", "Desktop") + "\","); + writer.println(" \"read\";"); + // robot permission // "java.awt.AWTPermission" "createRobot" + writer.print(" permission java.awt.AWTPermission"); + writer.println(" \"createRobot\";"); + writer.println("};"); + } + + performTest(); + } + + private static void performTest() throws Exception { + String javaPath = System.getProperty("java.home", ""); + String command = javaPath + File.separator + "bin" + File.separator + "java" + + " -Djava.security.manager -Djava.security.policy=" + POLICY_FILE + + " bug8062561 CHECK_FILE_CHOOSER"; + System.out.println(command); + boolean processExit = false; + + Process process = Runtime.getRuntime().exec(command); + + try { + processExit = process.waitFor(20, TimeUnit.SECONDS); + } catch (IllegalThreadStateException e) { + throw new RuntimeException(e); + } + System.out.println("[RESULT] : " + + "The sub process has cleanly exited : PASS"); + + InputStream errorStream = process.getErrorStream(); + System.out.println("========= Child process stderr ========"); + boolean exception = dumpStream(errorStream); + if (exception) { + throw new RuntimeException("[RESULT] :" + + " Exception in child process : FAIL"); + } + System.out.println("======================================="); + + InputStream processInputStream = process.getInputStream(); + System.out.println("========= Child process output ========"); + dumpStream(processInputStream); + System.out.println("======================================="); + + if (!processExit) { + process.destroy(); + throw new RuntimeException("[RESULT] : " + + "The sub process has not exited : FAIL"); + } + } + + public static boolean dumpStream(InputStream in) throws IOException { + String tempString; + int count = in.available(); + boolean exception = false; + while (count > 0) { + byte[] b = new byte[count]; + in.read(b); + tempString = new String(b); + if (!exception) { + exception = tempString.indexOf("Exception") != -1; + } + System.out.println(tempString); + count = in.available(); + } + + return exception; + } +} diff --git a/test/javax/swing/JFileChooser/8062561/security.policy b/test/javax/swing/JFileChooser/8062561/security.policy new file mode 100644 index 000000000..50d3e102f --- /dev/null +++ b/test/javax/swing/JFileChooser/8062561/security.policy @@ -0,0 +1,4 @@ +grant { + + permission java.util.PropertyPermission "user.home", "read"; +}; diff --git a/test/javax/swing/JFileChooser/8062561/security2.policy b/test/javax/swing/JFileChooser/8062561/security2.policy new file mode 100644 index 000000000..30de1d078 --- /dev/null +++ b/test/javax/swing/JFileChooser/8062561/security2.policy @@ -0,0 +1 @@ +// Autogenerated file \ No newline at end of file -- GitLab