/* * Copyright (c) 2014, 2015, 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 jdk.testlibrary.OSInfo; 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; /** * @test * @bug 8062561 * @summary File system view returns null default directory * @library ../../../../lib/testlibrary * @modules java.desktop/sun.awt * @build jdk.testlibrary.OSInfo * @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 must be null! (FilePermission has not been granted in our policy file)."); } } 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; } }