这个小程序是否适用于冰茶JRE?

我提到了一个小型演示。 在为HTML中嵌入的Applet设置策略和冰茶JRE用户评论该演示。 他们失败了。 他们拒绝了对applet的许可 (因此将其限制在沙盒中)并且应该看到绿色的“这个applet是沙盒子”页面。 相反,小程序完全失败了,他们看到了小程序应该在的“灰色空间”。

我想说它正在尝试实例化一个与众不同的File对象。 IE Sun / Oracle JRE将允许它没有问题,只在applet尝试创建JFileChooser时抛出安全exception。 OTOH冰茶JRE不允许创建File

因此,此代码应该解决该问题。 它会移动创建/添加JEditorPane并在new File(..)调用之前安装第一个“所有其他失败”消息,然后是绿色的“沙盒”页面。

我的问题是。 对于使用Iced Tea JRE的用户,此代码是否“广告化”?

测试它:

  1. 访问pscode.org/test/docload/applet-latest.html上的applet
  2. 拒绝经过数字签名的代码。 这对于创建测试applet的正确条件非常重要。
  3. 观察/报告applet是否加载了绿色的sandbox.html 。 沙箱文档将代表修复错误的“成功”。

同样令人感兴趣的是(可能很少)是可信小程序防御加载演示的主页,它链接到小应用程序页面,小程序中显示的每个HTML文件,以及包含源代码的ZIP存档代码和HTML,以及Ant build.xml,这样你就可以“在家里,孩子们”这样做。

这是新代码。

 package org.pscode.eg.docload; import java.awt.BorderLayout; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import javax.swing.JApplet; import javax.swing.JButton; import javax.swing.JEditorPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JFileChooser; import java.net.URL; import java.net.MalformedURLException; import java.io.File; import java.io.IOException; import java.security.AccessControlException; /** An applet to display documents that are JEditorPane compatible. This applet loads in a defensive way in terms of the security environment, in case the user has refused to accept the digitally signed code. */ public class DocumentLoader extends JApplet { JEditorPane document; @Override public void init() { System.out.println("init()"); JPanel main = new JPanel(); main.setLayout( new BorderLayout() ); getContentPane().add(main); document = new JEditorPane("text/html", "

Testing

Testing security environment.."); main.add( new JScrollPane(document), BorderLayout.CENTER ); System.out.println("init(): entering 'try'"); try { // set up the green 'sandboxed URL', as a precaution.. URL sandboxed = new URL(getDocumentBase(), "sandbox.html"); document.setPage( sandboxed ); // It might seem odd that a sandboxed applet can /instantiate/ // a File object, but until it goes to do anything with it, the // JVM considers it 'OK'. Until we go to do anything with a // 'File' object, it is really just a filename. System.out.println("init(): instantiate file"); File f = new File("."); System.out.println("init(): file instantiated, create file chooser"); // Everything above here is possible for a sandboxed applet // *test* if this applet is sandboxed final JFileChooser jfc = new JFileChooser(f); // invokes security check jfc.setFileSelectionMode(JFileChooser.FILES_ONLY); jfc.setMultiSelectionEnabled(false); System.out.println( "init(): file chooser created, " + "create/add 'Load Document' button"); JButton button = new JButton("Load Document"); button.addActionListener( new ActionListener(){ public void actionPerformed(ActionEvent ae) { int result = jfc.showOpenDialog( DocumentLoader.this); if ( result==JFileChooser.APPROVE_OPTION ) { File temp = jfc.getSelectedFile(); try { URL page = temp.toURI().toURL(); document.setPage( page ); } catch(Exception e) { e.printStackTrace(); } } } } ); main.add( button, BorderLayout.SOUTH ); // the applet is trusted, change to the red 'welcome page' URL trusted = new URL(getDocumentBase(), "trusted.html"); document.setPage(trusted); } catch (MalformedURLException murle) { murle.printStackTrace(); document.setText( murle.toString() ); } catch (IOException ioe) { ioe.printStackTrace(); document.setText( ioe.toString() ); } catch (AccessControlException ace) { ace.printStackTrace(); // document should already be showing sandbox.html } } @Override public void start() { System.out.println("start()"); } @Override public void stop() { System.out.println("stop()"); } @Override public void destroy() { System.out.println("destroy()"); } }

这是java.stderr上的输出(相当于Java控制台的一半 – 另一半是java.stdout ,在你的情况下是空的):

 net.sourceforge.jnlp.LaunchException: Fatal: Initialization Error: Could not initialize applet. at net.sourceforge.jnlp.Launcher.createApplet(Launcher.java:604) at net.sourceforge.jnlp.Launcher.getApplet(Launcher.java:548) at net.sourceforge.jnlp.Launcher$TgThread.run(Launcher.java:729) Caused by: net.sourceforge.jnlp.LaunchException: Fatal: Launch Error: Jars not verified. at net.sourceforge.jnlp.runtime.JNLPClassLoader.checkTrustWithUser(JNLPClassLoader.java:467) at net.sourceforge.jnlp.runtime.JNLPClassLoader.initializeResources(JNLPClassLoader.java:410) at net.sourceforge.jnlp.runtime.JNLPClassLoader.(JNLPClassLoader.java:168) at net.sourceforge.jnlp.runtime.JNLPClassLoader.getInstance(JNLPClassLoader.java:249) at net.sourceforge.jnlp.Launcher.createApplet(Launcher.java:575) ... 2 more Caused by: net.sourceforge.jnlp.LaunchException: Fatal: Launch Error: Jars not verified. at net.sourceforge.jnlp.runtime.JNLPClassLoader.checkTrustWithUser(JNLPClassLoader.java:467) at net.sourceforge.jnlp.runtime.JNLPClassLoader.initializeResources(JNLPClassLoader.java:410) at net.sourceforge.jnlp.runtime.JNLPClassLoader.(JNLPClassLoader.java:168) at net.sourceforge.jnlp.runtime.JNLPClassLoader.getInstance(JNLPClassLoader.java:249) at net.sourceforge.jnlp.Launcher.createApplet(Launcher.java:575) at net.sourceforge.jnlp.Launcher.getApplet(Launcher.java:548) at net.sourceforge.jnlp.Launcher$TgThread.run(Launcher.java:729) java.lang.NullPointerException at net.sourceforge.jnlp.NetxPanel.runLoader(NetxPanel.java:99) at sun.applet.AppletPanel.run(AppletPanel.java:380) at java.lang.Thread.run(Thread.java:636) java.lang.NullPointerException at sun.applet.AppletPanel.run(AppletPanel.java:430) at java.lang.Thread.run(Thread.java:636) java.lang.Exception: Applet initialization timeout at sun.applet.PluginAppletViewer.handleMessage(PluginAppletViewer.java:637) at sun.applet.PluginStreamHandler.handleMessage(PluginStreamHandler.java:270) at sun.applet.PluginMessageHandlerWorker.run(PluginMessageHandlerWorker.java:82) java.lang.RuntimeException: Failed to handle message: handle 60822154 for instance 2 at sun.applet.PluginAppletViewer.handleMessage(PluginAppletViewer.java:660) at sun.applet.PluginStreamHandler.handleMessage(PluginStreamHandler.java:270) at sun.applet.PluginMessageHandlerWorker.run(PluginMessageHandlerWorker.java:82) Caused by: java.lang.Exception: Applet initialization timeout at sun.applet.PluginAppletViewer.handleMessage(PluginAppletViewer.java:637) ... 2 more 

因此,如果我在对话框中按“ 取消” ,看起来您的applet代码甚至都没有加载。

确认对话框

我认为你无法从Java端做到这一点 – 也许使用其他签名程序或JNLP启动applet会有所帮助。 或者提交有关IcedTea的错误报告。


为了certificate这一点,我通过省略applet中的所有关键内容创建了一个真正简单的applet:

 package org.pscode.eg.docload; import java.awt.FlowLayout; import javax.swing.*; public class Example extends JApplet { JLabel label; public void init() { System.out.println("init()"); SwingUtilities.invokeLater(new Runnable(){public void run() { label = new JLabel("inited."); getContentPane().setLayout(new FlowLayout()); getContentPane().add(label); }}); } @Override public void start() { System.out.println("start()"); label.setText("started."); } @Override public void stop() { System.out.println("stop()"); label.setText("stopped."); } @Override public void destroy() { System.out.println("destroy()"); label.setText("destroyed."); } } 

我编译了这个并修改了你的HTML文件而不是使用它,它给出了完全相同的症状。

似乎IcedTea重新定义了当用户按下取消时要做什么。 公平地说,对话框中的按钮是“运行”和“取消”,而不是“以所有权限运行”和“运行沙盒”。

(在Sun的对话框中有相同的按钮,但实际上它们意味着别的东西而不是问。)

作为参考,我可以在Ubuntu 10.04上使用IcedTea 1.9.7确认@PaŭloEbermann的结果:

 $ java -version
 java版“1.6.0_20”
 OpenJDK运行时环境(IcedTea6 1.9.7)(6b20-1.9.7-0ubuntu1~10.04.1)
 OpenJDK客户端虚拟机(build 19.0-b09,混合模式,共享)

appletviewer显示预期的沙箱和fllowing诊断输出。 Ubuntu上的Firefox仅提供Run (可信)或Cancel (无)。

 $ appletviewer http://pscode.org/test/docload/applet-latest.html
警告:无法读取AppletViewer属性文件:...使用默认值。
在里面()
 init():输入'try'
 init():实例化文件
 init():文件实例化,创建文件选择器
 java.security.AccessControlException:拒绝访问(java.util.PropertyPermission user.home read)
     at java.security.AccessControlContext.checkPermission(AccessControlContext.java:393)
    在java.security.AccessController.checkPermission(AccessController.java:553)
    在java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
    在java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1302)
    在java.lang.System.getProperty(System.java:669)
    在javax.swing.filechooser.FileSystemView.getHomeDirectory(FileSystemView.java:397)
    在javax.swing.plaf.metal.MetalFileChooserUI.installComponents(MetalFileChooserUI.java:282)
    在javax.swing.plaf.basic.BasicFileChooserUI.installUI(BasicFileChooserUI.java:153)
    在javax.swing.plaf.metal.MetalFileChooserUI.installUI(MetalFileChooserUI.java:155)
    在javax.swing.JComponent.setUI(JComponent.java:651)
    在javax.swing.JFileChooser.updateUI(JFileChooser.java:1781)
    在javax.swing.JFileChooser.setup(JFileChooser.java:374)
    在javax.swing.JFileChooser。(JFileChooser.java:347)
    在javax.swing.JFileChooser。(JFileChooser.java:330)
    在org.pscode.eg.docload.DocumentLoader.init(DocumentLoader.java:57)
    在sun.applet.AppletPanel.run(AppletPanel.java:436)
    在java.lang.Thread.run(Thread.java:636)
开始()
停止()
破坏()

在Mac OS X上,Safari 5.05产生预期的结果; 和appletviewer产生可比较但不完全相同的输出。

 $ java -version
 java版“1.6.0_24”
 Java(TM)SE运行时环境(版本1.6.0_24-b07-334-9M3326)
 Java HotSpot(TM)64位服务器VM(内置19.1-b02-334,混合模式)

 $ appletviewer http://pscode.org/test/docload/applet-latest.html
在里面()
 init():输入'try'
 init():实例化文件
 init():文件实例化,创建文件选择器
 java.security.AccessControlException:拒绝访问(java.io.FilePermission.read)
     at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)
    在java.security.AccessController.checkPermission(AccessController.java:546)
    在java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
    在java.lang.SecurityManager.checkRead(SecurityManager.java:871)
    在java.io.File.exists(File.java:731)
    在javax.swing.JFileChooser.setCurrentDirectory(JFileChooser.java:548)
    在javax.swing.JFileChooser。(JFileChooser.java:334)
    在javax.swing.JFileChooser。(JFileChooser.java:316)
    在org.pscode.eg.docload.DocumentLoader.init(DocumentLoader.java:57)
    在sun.applet.AppletPanel.run(AppletPanel.java:424)
    在java.lang.Thread.run(Thread.java:680)
开始()
停止()
破坏()
Interesting Posts