6664915: SecurityException using javax.print APIs when queuePrintJob permission is granted.
authorprr
Mon, 28 Apr 2008 11:06:18 -0700
changeset 548 caed182cee6e
parent 547 ff9562f275ab
child 549 4273b1234967
6664915: SecurityException using javax.print APIs when queuePrintJob permission is granted. Reviewed-by: tdv, jgodinez
jdk/src/windows/classes/sun/awt/Win32GraphicsEnvironment.java
jdk/test/javax/print/PrintSE/PrintSE.java
jdk/test/javax/print/PrintSE/PrintSE.sh
--- a/jdk/src/windows/classes/sun/awt/Win32GraphicsEnvironment.java	Mon Apr 28 09:59:35 2008 -0700
+++ b/jdk/src/windows/classes/sun/awt/Win32GraphicsEnvironment.java	Mon Apr 28 11:06:18 2008 -0700
@@ -296,7 +296,7 @@
     }
 
     public static void registerJREFontsForPrinting() {
-        String pathName = null;
+        final String pathName;
         synchronized (Win32GraphicsEnvironment.class) {
             GraphicsEnvironment.getLocalGraphicsEnvironment();
             if (fontsForPrinting == null) {
@@ -305,15 +305,21 @@
             pathName = fontsForPrinting;
             fontsForPrinting = null;
         }
-        File f1 = new File(pathName);
-        String[] ls = f1.list(new TTFilter());
-        if (ls == null) {
-          return;
-        }
-        for (int i=0; i <ls.length; i++ ) {
-          File fontFile = new File(f1, ls[i]);
-          registerFontWithPlatform(fontFile.getAbsolutePath());
-        }
+        java.security.AccessController.doPrivileged(
+            new java.security.PrivilegedAction() {
+                public Object run() {
+                    File f1 = new File(pathName);
+                    String[] ls = f1.list(new TTFilter());
+                    if (ls == null) {
+                        return null;
+                    }
+                    for (int i=0; i <ls.length; i++ ) {
+                        File fontFile = new File(f1, ls[i]);
+                        registerFontWithPlatform(fontFile.getAbsolutePath());
+                    }
+                    return null;
+                }
+         });
     }
 
     protected static native void registerFontWithPlatform(String fontName);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/print/PrintSE/PrintSE.java	Mon Apr 28 11:06:18 2008 -0700
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.awt.*;
+import java.awt.print.*;
+import javax.print.*;
+import javax.print.attribute.*;
+
+public class PrintSE implements Printable {
+
+    public static void main(String[] args) throws Exception {
+        GraphicsEnvironment.getLocalGraphicsEnvironment();
+
+        PrintService service = PrintServiceLookup.lookupDefaultPrintService();
+        if (service == null) {
+            System.out.println("No print service found.");
+            return;
+        }
+        SimpleDoc doc =
+             new SimpleDoc(new PrintSE(),
+                           DocFlavor.SERVICE_FORMATTED.PRINTABLE,
+                           new HashDocAttributeSet());
+        DocPrintJob job = service.createPrintJob();
+        job.print(doc, new HashPrintRequestAttributeSet());
+    }
+
+    public int print(Graphics g, PageFormat pf, int pg) {
+       if (pg > 0) return NO_SUCH_PAGE;
+       g.drawString("Test passes.", 100, 100);
+       return PAGE_EXISTS;
+   }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/print/PrintSE/PrintSE.sh	Mon Apr 28 11:06:18 2008 -0700
@@ -0,0 +1,51 @@
+#!/bin/sh
+
+#
+# Copyright 2008 Sun Microsystems, Inc.  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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+
+# @test
+# @bug 6662775
+# @summary Tests queuePrintJob is sufficient permission.
+# @run clean PrintSE
+# @run build PrintSE
+# @run compile PrintSE.java
+# @run shell/timeout=300 PrintSE.sh
+
+echo -------------------------------------------------------------
+echo Launching test for `basename $0 .sh`
+echo -------------------------------------------------------------
+
+createJavaPolicyFile()
+{
+   cat << EOF > ${TESTCLASSES}/print.policy
+grant {
+ permission java.lang.RuntimePermission "queuePrintJob";
+};
+EOF
+}
+
+createJavaPolicyFile
+
+${TESTJAVA}/bin/java -Djava.security.manager -Djava.security.policy=${TESTCLASSES}/print.policy -cp ${TESTCLASSES} PrintSE
+
+exit $?