Этот апплет работает в JRE Iced Tea? - PullRequest
3 голосов
/ 18 марта 2011

Я упомянул небольшое демо.в Настройка политик для апплета, встроенного в HTML , и пользователь JRE Iced Tea прокомментировал эту демонстрацию.не удалось для них.Они отказались разрешить апплету (тем самым ограничив его песочницей) и были предполагается , чтобы увидеть зеленую страницу «этот апплет в песочнице».Вместо этого апплет полностью потерпел неудачу, и они увидели «серое пространство», где апплет должен был быть.IE Sun / Oracle JRE разрешит это без проблем, создавая исключение безопасности только тогда, когда апплет попытается создать JFileChooser.ОТО JRE Iced Tea не позволяет создавать File.

Таким образом, этот код должен решить эту проблему.Он перемещает создание / добавление JEditorPane и установку 1-го сообщения «все остальное терпит неудачу», затем зеленую страницу «песочница» перед вызовом new File(..).

Мой вопросявляется.Работает ли этот код как рекламируется для пользователей с JRE Iced Tea?

Чтобы проверить его:

  1. Посетите апплет по адресу pscode.org / test / docload /applet-latest.html
  2. Отказаться от кода с цифровой подписью. Это очень важно для создания правильных условий для тестирования апплета.
  3. Наблюдать / сообщать, загружает ли апплет зеленый цвет 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",
            "<html><body><h1>Testing</h1><p>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()");
    }
}

Ответы [ 2 ]

3 голосов
/ 18 марта 2011

Вот вывод для 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.<init>(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.<init>(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

Итак, похоже, ваш код апплета даже не загружается, если я нажимаю Отмена в диалоговом окне.

confirmation dialog

Я думаю, что вы ничего не можете сделать здесь со стороны Java - возможно, поможет использование другой процедуры подписи или запуск апплета с помощью JNLP. Или отправьте сообщение об ошибке на IcedTea.


Чтобы продемонстрировать это, я создал очень простой апплет, исключив все критически важные из вашего апплета:

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 есть те же кнопки, но в действительности они означают нечто иное, чем запрашиваемое.)

1 голос
/ 22 апреля 2011

Для справки, я могу подтвердить результаты @ Paŭlo Ebermann, используя IcedTea 1.9.7 в Ubuntu 10.04:

$ java -version
java version "1.6.0_20"
OpenJDK Runtime Environment (IcedTea6 1.9.7) (6b20-1.9.7-0ubuntu1~10.04.1)
OpenJDK Client VM (build 19.0-b09, mixed mode, sharing)

appletviewer показывает ожидаемое песочница и текущий диагностический выводFirefox в Ubuntu предлагает только Run (доверенный) или Cancel (ничего).

$ appletviewer http://pscode.org/test/docload/applet-latest.html
Warning: Can't read AppletViewer properties file: … Using defaults.
init()
init(): entering 'try'
init(): instantiate file
init(): file instantiated, create file chooser
java.security.AccessControlException: access denied (java.util.PropertyPermission user.home read)
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:393)
    at java.security.AccessController.checkPermission(AccessController.java:553)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
    at java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1302)
    at java.lang.System.getProperty(System.java:669)
    at javax.swing.filechooser.FileSystemView.getHomeDirectory(FileSystemView.java:397)
    at javax.swing.plaf.metal.MetalFileChooserUI.installComponents(MetalFileChooserUI.java:282)
    at javax.swing.plaf.basic.BasicFileChooserUI.installUI(BasicFileChooserUI.java:153)
    at javax.swing.plaf.metal.MetalFileChooserUI.installUI(MetalFileChooserUI.java:155)
    at javax.swing.JComponent.setUI(JComponent.java:651)
    at javax.swing.JFileChooser.updateUI(JFileChooser.java:1781)
    at javax.swing.JFileChooser.setup(JFileChooser.java:374)
    at javax.swing.JFileChooser.(JFileChooser.java:347)
    at javax.swing.JFileChooser.(JFileChooser.java:330)
    at org.pscode.eg.docload.DocumentLoader.init(DocumentLoader.java:57)
    at sun.applet.AppletPanel.run(AppletPanel.java:436)
    at java.lang.Thread.run(Thread.java:636)
start()
stop()
destroy()

В Mac OS X Safari 5.05 дает ожидаемые результаты;и appletviewer производит сопоставимый, но не идентичный выход.

$ java -version
java version "1.6.0_24"
Java(TM) SE Runtime Environment (build 1.6.0_24-b07-334-9M3326)
Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02-334, mixed mode)

$ appletviewer http://pscode.org/test/docload/applet-latest.html
init()
init(): entering 'try'
init(): instantiate file
init(): file instantiated, create file chooser
java.security.AccessControlException: access denied (java.io.FilePermission . read)
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)
    at java.security.AccessController.checkPermission(AccessController.java:546)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
    at java.lang.SecurityManager.checkRead(SecurityManager.java:871)
    at java.io.File.exists(File.java:731)
    at javax.swing.JFileChooser.setCurrentDirectory(JFileChooser.java:548)
    at javax.swing.JFileChooser.(JFileChooser.java:334)
    at javax.swing.JFileChooser.(JFileChooser.java:316)
    at org.pscode.eg.docload.DocumentLoader.init(DocumentLoader.java:57)
    at sun.applet.AppletPanel.run(AppletPanel.java:424)
    at java.lang.Thread.run(Thread.java:680)
start()
stop()
destroy()
...