OVH Cloud OVH Cloud

Problème applet : AccessControlExeption

7 réponses
Avatar
BOURGAREL Rémi
Bonjour,

Voila, j'ai dévellopé un applet en JAVA permettant aux visiteurs du site web
de s'enregistrer avec leurs micro, puis de sauvegarder leur travail sur leur
disque.
L'applet fonctionne correctement lorsque je lance la page depuis mon disque
dur.Mais lorsque je le lance depuis un serveur distant, la console java
m'affiche : "java.security.AccessControlException: access denied
(javax.sound.sampled.AudioPermission record)".

Je me suis un peu renseigné, et j'ai fait signer mon applet :
"jarsigner magneto.jar mon_pseudo", en ayant auparavant généré une clé
(keytool).

J'ai également ajouter une permissin sur le policytool (allpermission), et
ça n'a rien changé.

Donc la je ne sais absolument pas quoi faire pour que mon applet fonctionne
!

Merci de m'avoir lu :)

7 réponses

Avatar
David JOURAND
Bonjour,

Je me suis un peu renseigné, et j'ai fait signer mon applet :
"jarsigner magneto.jar mon_pseudo", en ayant auparavant généré une clé
(keytool).


Indispensable.


J'ai également ajouter une permissin sur le policytool (allpermission), et
ça n'a rien changé.


Cela ne sert à rien, car vous ne pourrez pas modifier la configuration de
tous vos utilisateurs.


Donc la je ne sais absolument pas quoi faire pour que mon applet
fonctionne !


L'action soumise à controle d'accès (celle levant l'exception dans
votre cas) doit être réalisée dans la méthode run d'une classe
implémentant java.security.PrivilegedAction

--
David Jourand

Avatar
BOURGAREL Rémi
J'ai fait ce que vous m'avez conseillé,ça n'a pas marché :

j'ai crée une classe implémentant java.security.PrivilegedAction, avec la
méthode Object run() qui execute ma méthode.Le problème viens de l'appel de
la méthode targetDataLine.open(audioFormat);.

Merci :)
Avatar
David JOURAND
j'ai crée une classe implémentant java.security.PrivilegedAction, avec la
méthode Object run() qui execute ma méthode.Le problème viens de l'appel de
la méthode targetDataLine.open(audioFormat);.


Sans un peu de code, il est difficile de vous comprendre... Donnez ici les
principaux éléments de votre code afin que l'on puisse l'étudier.

--
David Jourand

Avatar
BOURGAREL Rémi
Alors voila le code avant modification :

private void getMicro(){
//cherche tout ce qu'il faut pour l'enregistrmenet
System.out.println("debut getMicro.");
audioFormat = getAudioFormat();
System.out.println("getAudioFormat fini.");
DataLine.Info dataLineInfo = new
DataLine.Info(TargetDataLine.class,audioFormat);
System.out.println("new Dataline.info fini.");
targetDataLine = (TargetDataLine)
AudioSystem.getLine(dataLineInfo);
System.out.println("AudioSystem.getLine(dataLineinfo) fini.");
----------------s'arrète ici ----------------
targetDataLine.open(audioFormat);
System.out.println("targetdataline ouvert.");
targetDataLine.start();
System.out.println("targetdataline démarré .");
//crée un thread pour la capture, jusqu'a que le obuton "stop" soit
enfoncé
Thread captureThread = new Thread(new CaptureThread());
System.out.println("capture thread crée.");
captureThread.start();
System.out.println("capture thread démarré.");
} catch (Exception e) {
System.out.println(e);
System.exit(0);
}//fin catch
}//fin méthode getMicro

Une fois la modification apportée :

class Open implements java.security.PrivilegedAction {
public Object run(){
try{
//cherche tout ce qu'il faut pour l'enregistrmenet
System.out.println("debut getMicro.");
audioFormat = getAudioFormat();
System.out.println("getAudioFormat fini.");
DataLine.Info dataLineInfo = new
DataLine.Info(TargetDataLine.class,audioFormat);
System.out.println("new Dataline.info fini.");
targetDataLine = (TargetDataLine)
AudioSystem.getLine(dataLineInfo);
System.out.println("AudioSystem.getLine(dataLineinfo) fini.");
----------------s'arrète ici ----------------
targetDataLine.open(audioFormat);
System.out.println("targetdataline ouvert.");
targetDataLine.start();
System.out.println("targetdataline démarré .");
//crée un thread pour la capture, jusqu'a que le obuton "stop" soit
enfoncé
Thread captureThread = new Thread(new CaptureThread());
System.out.println("capture thread crée.");
captureThread.start();
System.out.println("capture thread démarré.");
} catch (Exception e) {
System.out.println(e);
System.exit(0);
}//fin catch
return null;
}
}
private void getMicro(){

Open openTarget = new Open();
openTarget.run();

}//end captureAudio method


La methode getMicro est appellée quand on clique sur un bouton, voici le
code du actionlistener :

public void actionPerformed(ActionEvent e){
info.setText("Initialisation, patientez ...");
getMicro();
info.setText("Enregistrement en cours ...");
}

La plupart du code pour l'enregistrement n'est pas de moi.

Voila, en espérant que je ne suis pas un cas desespéré :)

Merci encore :)
Avatar
David JOURAND
Le Wed, 31 May 2006 10:07:14 +0200, BOURGAREL Rémi a écrit :

Essayez de ne mettre que cet appel dans la méthode run de l'objet
implémentant java.security.PrivilegedAction :


public class PrivilegedAudioOpener implements PrivilegedAction {
private YYY audioFormat = null;
private XXX targetDataLine = null

public PrivilegedAudioOpener(YYY audioFormat, XXX targetDataLine) {
this.audioFormat = audioFormat;
this.targetDataLine = targetDataLine;
}

public Object run() {
targetDataLine.open(audioFormat);
return null
}
}

Et remplacez, dans le code original, l'appel :

targetDataLine.open(audioFormat);


par :

PrivilegedAudioOpener audioOpener = new
PrivilegedAudioOpener(audioFormat, targetDataLine);
AccessController.doPrivileged(audioOpener));


Lire la documentation (API sun) vous aurait permis d'avancer seul : "A
computation to be performed with privileges enabled. The computation is
performed by invoking AccessController.doPrivileged on the
PrivilegedAction object."

--
David Jourand

Avatar
BOURGAREL Rémi
Merci beaucoup, votre aide a réglé mon problème, et je l'ai compris :D. Sauf
qu'il en subsiste un, dont je pense connaitre la cause, mais il me faudrait
une confirmation :

sur mon poste (jree 1.4.2) l'applet marche comme il faut, mais sur un autre
poste (jree 1.3 et quelques), la levée d'exeption persiste.Je pense que cela
viens de la version du JREE, mais je n'en suis pas sur, et si c'est le cas,
connaissez vous un remède a ce problème a part mettre a jour le jree ?
Avatar
David JOURAND
sur mon poste (jree 1.4.2) l'applet marche comme il faut, mais sur un autre
poste (jree 1.3 et quelques), la levée d'exeption persiste.Je pense que cela
viens de la version du JREE, mais je n'en suis pas sur, et si c'est le cas,
connaissez vous un remède a ce problème a part mettre a jour le jree ?


Est-ce la même exception qui est levée ? Sinon, il est possible de
générer du code pour une version antérieure via l'option -target de
javac. Qualifiez mieux votre problème et faites un nouveau post dans ce
NG en mettant un sujet adapté.

--
David Jourand