Newsgroup: it.comp.java
Titolo: Problemi di lettura file con applet

Salve a tutti, ho il seguente problema:
come puo' un'applet leggere un file che si trova sul computer che la
esegue.
Mi rendo conto che Java sia stato progettato proprio con l'intenzione di
evitare queste operazioni per motivi di sicurezza, ma penso che un modo
ci deve comunque essere.
Per altro il file che devo leggere (e poi trasmettere tramite socket)
viene selezionato dall'utente tramite FileDialogFrame (Java purtroppo
non credo lo possa riconoscere).
Comunque l'errore che mi appare nella Java Console di Netscape appena
tento di aprire il file e':
  #Security Exception: checkread:Read of `C:\ ... ' not permitted
Ho sentito parlare di applet firmate, che forse possono risolvere questo
problema, ma non ho idea di cosa siano e se sono realmente attinenti al
mio problema.
Ho provato anche a modificare le opzioni di sicurezza di Netscape 4.5,
ma non sono riuscito a modificarle. A me va infatti bene anche
modificare qualche settaggio di Netscape (o al limite di IE), purche'
funzioni tutto.
Grazie.
Marco Casini

 mio problema.
Sono attinenti, si'.
Se ne e' parlato qualche settimana fa. Puoi seguire il thread cercando
i messaggi su dejanews: 
www.dejanews.com
.
Scegli Power Search, e inserisci com newsgroup it.comp.java
Comunque, a questo punto re-invio il file di spiegazioni che avevo
scritto
a suo tempo. Magari chi si occupa delle FAQ puo' includerlo in qualche
modo
(intero o riassunto) cosi' chi si ripresenta con questa domanda puo'
essere
rediretto sulle FAQ?
Ciao,
  Marina
------------------------------------------------------
Applet firmati
--------------
Marina Berati, febbraio 1999
Firmare un applet con un certificato e' necessario quando occorre far
uscire l'applet dalla "sandbox": di solito quando si vuole
scrivere/leggere file dal disco della macchina client, e quando
ci si vuole connettere (aprendo client o server socket) ad un
indirizzo che NON e' quello da cui l'applet e' stato scaricato.
Le questioni da affrontare sono due: come scrivere il codice in
modo che l'applet possa uscire dalla sandbox e come firmare l'applet
cosi' ottenuto.
Se si vuole fare solo un test:
------------------------------
Una breve premessa: per chi volesse uscire dalla sandbox solo per test,
senza firmare l'applet, e' possibile configurare il browser in modo
opportuno.Con IE4 lo si fa da menu, si possono definire i permessi degli
applet
nonfirmati con una granularita' molto fine. Con Netscape occorre invece
aggiungere (a browser chiuso) la seguente linea al file prefs.js
o preferencies.js che sia:
user_pref("signed.applets.codebase_principal_support", true)
Attenzione, perche' in questo modo tutti gli applet che vengono seguiti
sono considerati "sicuri", da qualunque posto provengano, e quindi
conviene fare questa configurazione solo per un utente di "test", che
non
esca su Internet.
Come scrivere l'applet
----------------------
All'interno dei metodi in cui si deve uscire dalla sandbox occorre
eseguire
delle opportune chiamate al PrivilegeManager. Il problema e' che queste
chiamate sono diverse, a seconda che l'applet debba girare con Netscape
Communicator o MS Internet Explorer.
MS IE 4.0 ha la possibilita' di definire, nelle preferenze, il livello
di sicurezza degli applet: se gli applet firmati si definiscono come
"trusted", non c'e' bisogno di alcuna chiamata al PrivilegeManager, e si
puo' poi firmare l'applet allo stesso modo sia per MS IE che per
Netscape.
Pero' questo NON e' il default del browser, e se non si puo'/vuole
cambiare
questo settaggio occorre eseguire le opportune chiamate al
PrivilegeManager
di IE, ed occorre poi firmare l'applet in un modo DIVERSO da quanto
si farebbe per Netscape.
Non ho esperienza di questo secondo caso, ma c'e' un articolo su questo
argomento nel numero di febbraio 1999 del Doctor Dobb's Journal
(
http://www.ddj.com
).
Da qui in poi faro' l'ipotesi che MS IE sia configurato opportunamente
per dare liberta' massima agli applet firmati.
Nei metodi che eseguono operazioni normalmente vietate per un applet,
occorre eseguire preventivamente la seguente chiamata:
try
{
        if (Class.forName("netscape.security.PrivilegeManager")!=null)
        {
 
netscape.security.PrivilegeManager.enablePrivilege("UniversalConnect");
        }
}
catch (Throwable te) {}
In questo modo, se si utilizza MS IE, non viene eseguita la chiamata al
PrivilegeManager, e tutto funziona correttamente.
I privilegi restano validi fino al termine del metodo in cui il
Privilegemanager e' stato invocato.
Ci sono diversi tipi di privilegi che possono essere richiesti:
"UniversalConnect" indica che si vuole potersi connettere a qualsiasi
macchina, non solo a quella da cui l'applet e' stato scaricato.
Le altre "parole chiave" sono disponibili su:
http://developer.netscape.com/docs/manuals/signedobj/javadoc/netscape_security_Target.html
La documentazione del package netscape.security si trova su:
http://developer.netscape.com/docs/manuals/signedobj/javadoc/Package-netscape_security.html
Altre informazioni su "Object Signing and Java" sul sito di Netscape:
http://developer.netscape.com/docs/manuals/java.html
Ovviamente, per compilare correttamente l'applet che fa uso dello
spezzone
di codice sopra indicato, occorre aggiungere al CLASSPATH del proprio
ambiente di sviluppo il path completo del file delle classe di
Netscape Communicator (sotto Unix:
$MOZILLA_HOME/java/classes/java40.jar).
Come firmare l'applet
---------------------
Il metodo che noi abbiamo usato per firmare l'applet utilizza il
tool "signtool" di Netscape, assieme al browser Netscape Communicator.
I file cosi' firmati funzionano poi anche su Internet Explorer
(nell'ipotesi di assegnare i privilegi massimi agli applet firmati dal
menu di editing delle preferenze di MS IE).
Info su signtool (e download) su:
http://developer.netscape.com/docs/manuals/signedobj/signtool/index.htm
Supponiamo di avere gia' a disposizione un certificato, che non e' altro
che un file binario che ha estensione .p12, sia esso cert.p12.
Procurarsi questo file e' forse la parte piu' macchinosa della faccenda:
signtool permette di creare dei certificati di test, pero' ovviamente
non si puo' mettere in rete un applet firmato in questo modo, perche'
nessun browser lo prenderebbe per buono.
Perche' il certificato sia utilizzabile "nel mondo reale", occorre che
esso sia fornito da una Certifcation Authority riconosciuta dai browser,
come ad esempio Verisign, Thawte, etc. La lista dei "signers"
riconosciuti dal browser puo' essere vista premendo il bottone
"Security" di Netscape Communicator (con Explorer non lo so),
e poi selezionando "signers".
Per avere un certificato del genere occorre quindi pagare dei soldi
e fornire alla CA un bel po' di informazioni su di se' (perche',
ovviamente, la CA si prende la responsabilita' di certificare che
i suoi clienti sono affidabili!).
In alternativa, si puo' utilizzare un certificato emesso da una CA
non presente di default nel browser, e chiedere poi all'utente di
andare sul sito di quella CA e accettarla come CA di fiducia (andra'
cosi' inserita nella lista dei "signers" di cui sopra).
Per esempio, andando sul sito di Tin http//
security.tin.it
e cliccando su "installazione", si accetta TIN come Certification
Authority, e quindi tutti gli applet firmati con un certificato emesso
da TIN sono "trusted" dal browser.
Per avere uno di questi certificati, si puo' fare la richiesta,
sempre a partire dalla stessa pagina, pero' occorre essere utenti TIN.
Nel caso di una ditta che voglia utilizzare un applet firmato al
suo interno, puo' essere utile invece installare un Certificate Server
(ad esempio Netscape Certificate Server), in modo che la ditta
stessa diventi una CA e possa emettere certificati.
Naturalmente, tutti gli utenti dell'applicazione dovranno come
primo passo andare in una apposita pagina ed accettare come
"trusted" questa certfication authority.
Non e' comunque semplicissimo installare e mantenere un Certificate
Server, percio' in molti casi e' piu' conveniente comprare un
certificato da una CA "vera".
Supponiamo ora di avereuno di questi certificati: si tratta di
un file cert.p12, assieme ad una password ad esso associata.
A questo punto siamo pronti a firmare il nostro applet.
Come detto sopra, per firmare l'applet occorrono Netscape Communicator
e signtool (ci saranno altri modi, ma io conosco questo).
Si deve cliccare sul bottone Security del browser e poi selezionare
la voce "Yours" di certificates, per inserire nel database dei
certificati del browser il nuovo certificato cert.p12. Da li', si
preme il bottone "Import a Certificate". Viene richiesta una password
(facoltativa), che NON e' la password del certificato, ma una password
che Netscape usa per proteggere le operazioni su tutti i certificati,
cioe' le operazioni di modifica del database.
Fornita la password (da non dimenticare!), si apre una finestra di
file manager per selezionare il file. Si seleziona cert.p12 e
si da' OK. Viene richiesta una password, e stavolta si tratta
della password del certificato stesso.
A questo punto il nostro certificato e' stato inserito nel DB di
Netscape, e il browser puo' essere anche chiuso, non ci servira'
piu'.
Ora, per firmare l'applet, useremo signtool, che e' una applicazione
a linea di comando di facile installazione.
Signtool si occupa di creare l'archivio della classi, cioe' il Jar file
e poi firmarlo con un certificato dato.
Esempio:
siano A.class, B.class, e MyApplet.class le classi utilizzate
dall'applet
che si vuole firmare.
Creiamo un directory /home/user1/classes/signDir dove copiamo tutte
queste classi (ovviamente conviene automatizzare la procedura con
un opportuno script!).
A questo punto, invochiamo signtool, in questo modo:
signtool -k "nome_del_certificato" -p"password_del_certificato" -Z
archivio.jar signDir
 
Ora, in archivio.jar abbiamo l'applet firmato.
NB: se non si specifica la password con l'opzione -p, essa viene
richiesta
da linea di comando.
 
 
Ora quest'applet potra' essere esguita fuori dalla sandbox in tutti
i browser che riconoscono TIN come CA. Attenzione: non e' necessario,
anzi, non deve essere fatto, installare il certificato cert.p12 sui
browser che useranno l'applet. Questo deve essere fatto solo sul
browser dell'utente che firmera' l'applet con signtool, perche' serve
solo ad aggiungere il certificato al DB di Netscape. signtool infatti
usa questo DB per prelevare i certificati che gli servono.
 
La pagina html che contiene l'applet sara' del tipo:
<html>
<body>
<applet
archive="
http://indirizzo.della.macchina/dir_dove_si_trova_il_jar_file/archivio.jar
"
code="MyApplet" height=300 width=350>
</applet>
<p>
</body>
</html>

Grazie Marina per la tua risposta; visto che firmare le applet non e'
proprio una cosa banale (non credo che mi convenga spendere per questo)
ho pensato di provare subito quello che te chiami TEST.
Purtroppo nonostante abbia modificato il file PREFS.JS come descritto, 
continua a comparirmi l'errore di sicurezza. Come mai? 
Per ora mi andrebbe bene anche "rischiare" (modificando PREFS.JS)
purche' riesca a vedere la mia applet funzionare.
Se te o qualcun altro mi puo' delucidare mi farebbe felice.
Grazie
Marco

 
Se hai editato quel file, immagino tu stia usando Netscape. Giusto?
1) controlla che i cambiamenti li abbia presi; cioe', riapri
il file e controlla che ci sia davvero la linea che hai scritto,
e che non ci siano errori di battitura.
2) non ricordo piu' se le chiamate al SecurityManager (quelle descritte
nel messaggio che ho inviato ieri) vadano fatte lo stesso. Mi pare
di no, ma posso sabgliarmi.
Se il punto 1) e' ok, fai questa prova, e dicci i risultati.
Ciao,
  Marina