changeset 7830:59e7d20cef24

8062561: Test bug8055304 fails if file system default directory has read access Reviewed-by: serb
author alexsch
date Wed, 05 Nov 2014 16:00:40 +0400
parents c7f1fa3c5825
children 208ca35139b7 8268d82995af
files src/share/classes/sun/swing/FilePane.java src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java test/javax/swing/JFileChooser/8062561/bug8062561.java test/javax/swing/JFileChooser/8062561/security.policy test/javax/swing/JFileChooser/8062561/security2.policy
diffstat 5 files changed, 225 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/classes/sun/swing/FilePane.java	Wed Nov 05 13:01:23 2014 +0300
+++ b/src/share/classes/sun/swing/FilePane.java	Wed Nov 05 16:00:40 2014 +0400
@@ -1979,6 +1979,7 @@
             return false;
         }
 
+        try {
         if (f instanceof ShellFolder) {
             return ((ShellFolder) f).isFileSystem();
         } else {
@@ -1994,6 +1995,9 @@
                 return true;
             }
         }
+        } catch (SecurityException e) {
+            return false;
+        }
     }
 
     /**
--- a/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java	Wed Nov 05 13:01:23 2014 +0300
+++ b/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java	Wed Nov 05 16:00:40 2014 +0400
@@ -279,7 +279,7 @@
 
                 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;
@@ -287,7 +287,7 @@
                         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<File> thirdLevelFoldersList = Arrays.asList(thirdLevelFolders);
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/javax/swing/JFileChooser/8062561/bug8062561.java	Wed Nov 05 16:00:40 2014 +0400
@@ -0,0 +1,213 @@
+/*
+ * 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;
+
+/**
+ * @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];
+
+        if ("GENERATE_POLICY".equals(test)) {
+            generatePolicyFile();
+        } else if ("CHECK_DEFAULT_DIR".equals(test)) {
+            checkDefaultDirectory();
+        } else if ("CHECK_FILE_CHOOSER".equals(test)) {
+            checkFileChooser();
+        } else {
+            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 >= 5000) {
+                System.exit(1);
+            }
+            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!");
+        }
+
+        String osName = System.getProperty("os.name");
+        System.out.println("os name: " + osName);
+        if (!osName.startsWith("Windows")) {
+            return;
+        }
+        System.out.println("after OS Check!");
+
+        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();
+        }
+
+        PrintWriter writer = new PrintWriter(policyFile, "UTF-8");
+        writer.println("grant {");
+        String documents = defaultDirectory.getCanonicalPath();
+        documents = documents.replace('\\', '/');
+        // user.dir permission
+        writer.print("  permission java.util.PropertyPermission");
+        writer.print(" \"user.dir\",");
+        writer.println(" \"read\";");
+        // 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("};");
+        writer.close();
+
+        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);
+        int processExit = 0;
+
+        Process process = Runtime.getRuntime().exec(command);
+
+        try {
+            processExit = process.waitFor();
+        } 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 != 0) {
+            System.out.println("process exit: " + 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;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/javax/swing/JFileChooser/8062561/security.policy	Wed Nov 05 16:00:40 2014 +0400
@@ -0,0 +1,5 @@
+grant {
+
+    permission java.util.PropertyPermission  "user.home", "read";
+    permission java.util.PropertyPermission  "user.dir",  "read";
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/javax/swing/JFileChooser/8062561/security2.policy	Wed Nov 05 16:00:40 2014 +0400
@@ -0,0 +1,1 @@
+// Autogenerated file
\ No newline at end of file