Applet Assinada quase la

2 respostas
afamorim

O negocio é o seguinte.

preciso fazer uma apllet assinada.
ja crieie a applet ja compactei em um jar, ja assinei a mesma.

ele chega a perguntar no browser se a applet feita por fernando é confiavel.

o codigo da applet é esse:

import java.applet.Applet;
import java.awt.Graphics;

public class ControleArquivo extends Applet {
	
	private String xmlPath;
	
	public void init(){
		String usuario = System.getProperty("user.name");
		String usuarioHome = System.getProperty("user.home");
		
		System.out.println("Usuario Home " + usuarioHome);
		System.out.println("Usuario " + usuario);
		System.out.println("Ta saindo");
	}
	
	public String getUsuario(){
		String usuario = System.getProperty("user.name");
		return usuario;
	}
}

depois aparece esse erro no java console.

java.security.PrivilegedActionException: java.lang.reflect.InvocationTargetException
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.plugin.liveconnect.SecureInvocation$2.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.plugin.liveconnect.SecureInvocation.CallMethod(Unknown Source)
	at sun.plugin.liveconnect.SecureInvocation.access$300(Unknown Source)
	at sun.plugin.liveconnect.SecureInvocation$CallMethodThread.run(Unknown Source)
Caused by: java.lang.reflect.InvocationTargetException
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at sun.plugin.javascript.invoke.JSInvoke.invoke(Unknown Source)
	at sun.reflect.GeneratedMethodAccessor6.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at sun.plugin.javascript.JSClassLoader.invoke(Unknown Source)
	at sun.plugin.liveconnect.PrivilegedCallMethodAction.run(Unknown Source)
	... 6 more
Caused by: java.security.AccessControlException: access denied (java.util.PropertyPermission user.name read)
	at java.security.AccessControlContext.checkPermission(Unknown Source)
	at java.security.AccessController.checkPermission(Unknown Source)
	at java.lang.SecurityManager.checkPermission(Unknown Source)
	at java.lang.SecurityManager.checkPropertyAccess(Unknown Source)
	at java.lang.System.getProperty(Unknown Source)
	at ControleArquivo.getUsuario(ControleArquivo.java:18)
	... 16 more

no meu jsp ta assim

<applet code="ControleArquivo.class" archive="ControleArquivo.jar" width="1" height="1" name="controleArquivo">
</applet>
<script>
alert(document.controleArquivo.getUsuario());
</script>

alguma dica???

o mais curioso é que antes de dar o exception o init imprime as variaveis com:
Usuario Home C:\Documents and Settings\Fernando
Usuario Fernando
Ta saindo

2 Respostas

E

Olá Fernando! Estou com o mesmo problema! Vc conseguiu alguma solução?

Value!

T
/**
 * Isto não é uma applet, mas demonstra a solução para os problemas de acesso.
 */


import java.security.Permission;

class MySecurityManager extends SecurityManager {
    public void checkPermission(Permission perm, Object context) {
    }    
    public void checkPermission(Permission perm) {
    }
    private static SecurityManager instance = new MySecurityManager();
    public static SecurityManager getInstance() {
        return instance;
    }
}

class TesteGetUsuario {
    
    /**
     * getUsuario roda no contexto de segurança do JavaScript, que é muito baixo.
     * A thread roda no contexto de segurança da nova thread, que é o da applet.
     * Note que tenho de usar uma variável "final" para ser acessível a partir
     * da anonymous inner class. Como não posso usar "final String s" senão não
     * conseguimos alterar a string, usamos um truque sujo.
     */
    public String getUsuario () {
        final String[] s = new String[1];
        Thread thr = new Thread(new Runnable() {
            public void run() {
                // Setando o contexto de segurança (não posso fazer isso diretamente 
                // na thread do JavaScript
                if (System.getSecurityManager() == null) {
                    System.setSecurityManager (MySecurityManager.getInstance());
                }
                // Pegando os dados que eu quero
                s[0] = System.getProperty ("user.name");
            }
        });
        thr.start(); 
        try {
            thr.join();
        } catch (InterruptedException ex) {}
        return s[0];
    }
    
    public static void main(String[] args) {
        TesteGetUsuario tgu = new TesteGetUsuario();
        System.out.println (tgu.getUsuario());
    }
}
Criado 27 de abril de 2006
Ultima resposta 26 de mai. de 2006
Respostas 2
Participantes 3