# Applet und File-Object?



## Susi (9. Jul 2008)

Kann es sein, das ich in einem Applet, egal ob signiert oder nicht, nicht mittels File auf lokale Dateien zugreifen kann?!?!

Hier mal das Applet:


```
import java.awt.*;
import java.io.File;

public class FileExists extends java.applet.Applet
{

   public void fileExists(){
	   File f = new File("c:/tmp/log.txt");
		if (!f.exists()){
			System.out.println("FILE NOT FOUND");
		}else{
			System.out.println("FILE FOUND");
		}
   }
   
   public void init()
   {
      fileExists();
   }
}
```

Obwohl ich das Applet signiert habe, bekomme ich eine Exception:



> Caused by: java.security.AccessControlException: access denied (java.io.FilePermission c:\tmp\log.txt read)



Wäre nett wenn das mal jemand verifizieren könnte. 

Im Internet finde ich zu dem Problem keine Informationen


----------



## L-ectron-X (10. Jul 2008)

Doch, das geht, Dein Code ist auch in Ordnung. Du hast wahrscheinlich einen Fehler beim Signieren gemacht.
Ich habe mal ein entsprechendes Beispiel-Applet geschrieben, das nach deiner Datei _c:\tmp\log.txt_ sieht.
Das Applet ist signiert und läuft ab Java 1.4.2.


```
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 <head>
  <title>FileExistsApplet-Applet</title>
 </head>
 <body>
  <h1>FileExistsApplet-Applet</h1>
  <applet archive="FileExistsApplet.jar" code="FileExistsApplet.class" width="0" height="0">
  </applet>
 </body>
</html>
```

Der Quellcode ist im Jar-File. (also nur entpacken)

Zum Thema Signieren gibts in der FAQ ein kleines Batch-Tool.


----------



## Susi (10. Jul 2008)

So da bin ich wieder,

klappt mit deinem Applet wunderbar. Ich weiß nur nicht warum meins nicht funktioniert. Ich habe das Batchtool aus den FAQs genutzt.

Hier nochmal der Ablauf vielleicht ist ja doch ein Fehler drin:


```
C:\Programme\Java\jdk1.6.0\bin\keytool -genkey -alias Signer -dname "cn=filer, c=de" 
C:\Programme\Java\jdk1.6.0\bin\keytool -selfcert -validity 3650 -alias Signer -dname "cn=filer, c=de" 
C:\Programme\Java\jdk1.6.0\bin\jarsigner lc.jar Signer 
C:\Programme\Java\jdk1.6.0\bin\jarsigner -verify -verbose -certs lc.jar Signer
```

Er meldet auch jar signd.

Jemand eine Idee


----------



## Susi (10. Jul 2008)

So jetzt habe ich das Problem eingekreist, aber noch keine Lösung.

Wenn ich das Applet erneut signiere und es ausführe klappt es perfekt und ich erhalte in der Konsole ein "FILE NOT FOUND"

Wenn ich jedoch von einer HTML Seite auf der das Applet eingebunden ist mittels LiveConnect die Funktion fileExists aufrufe, dann bekomme ich ein 


```
<input type="button" name="FileExists" value="FileExists"
      onclick="document.myApplet.fileExists();">
```




> 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)
> ...



Scheint also etwas mit LiveConnect zu tun zu haben. Da das Applet Signiert ist sollte es doch funktionieren oder irre ich mich da?


----------



## L-ectron-X (10. Jul 2008)

Ich kann da jetzt nur mutmaßen. Der Browser/VM lässt das Applet aus seiner Sandbox, wenn das Zertifikat akzeptiert wurde und es kann schalten und walten wie eine Applikation. Wenn es nicht akzeptiert wurde, wird eine AccessControlException geworfen. So weit zum Java-Teil.

Im JavaScript-Teil, sagst du, greifst du direkt auf die Methode zu. Für mich klingt das so, als würdest du damit die Java-Sicherheitsmechanismen umgehen wollen. Und warscheinlich für die VM auch, denn die quittiert den direkten Aufruf einer unsicheren Methode mit der AccessControlException.

Also meiner Meinung nach müsstest du das Applet starten und dann auf eine sichere Methode zugreifen, um den ermittelten Wert auszulesen.


----------



## Gast (10. Jul 2008)

Naja,

ich hätte jetzt vermutet das das Applet entweder in der Sandbox oder eben nicht läuft und das ist abhängig von der Signatur des Applets. Warum ein signiertes Applet dennoch in de Sandbox läuft nur weil eine Funktion von außen aufgerufen wird ist mir schleierhaft.

Und umgehen möchte ich damit sicherlich nichts. Der Nutzer muss schon der Signatur zustimmen.


----------



## L-ectron-X (10. Jul 2008)

Wie gesagt, ich mutmaße nur.

Ich nehme an, das hier der Sicherheitsmechanismus von Java greift. Der Benutzer hat ja nur dem Applet erlaubt, sich auf seinem System zu bewegen. Jetzt kommt irgendwer von "draußen" und ruft ungefragt kritische Operationen auf. Meinst du nicht, das sowas geblockt werden sollte?


----------



## Gast (10. Jul 2008)

Ich könnte mir jetzt nichts wildes vorstellen. 

Zumal ich ja von außen nur Zugriff auf die public Methoden/Variablen des Applets habe, sprich ich selbst von außen nichts anderes machen könnte als das was das Applet nicht sowieso macht.

Und wenn es ein "böses" Applet ist, dann liegt es nicht am Zugriff von außen auf das Applet.


----------



## L-ectron-X (10. Jul 2008)

Alles gute Argumente...
Kann es sein, dass du vielleicht den Zugriff vor dem Akzeptieren des Zertifikats versuchst?


----------



## Guest (10. Jul 2008)

Nein, definitiv nicht. Ich warte bis das Applet geladen hat und ich die Ausgabe in der Konsole "Alles OK" bekomme. Hab diese noch eingebaut um eben genau das auszuschließen.


----------

