Actuellement, j'essaie d'écrire le Sandbox pour exécuter du code Java non approuvé. L'idée est d'isoler l'application Java de l'accès au système de fichiers ou aux sockets réseau. La solution que j'ai actuellement est réécrite SecurityManager, qui interdit tout accès à IO ou au réseau.Bac à sable Java. Utilisation de SecurityManager pour rediriger l'accès aux E/S
Maintenant, je veux pas interdire, mais de rediriger les appels vers le système de fichiers, à savoir si l'application veut écrire « /home/user/application.txt » doit être remplacé le chemin vers le fichier avec quelque chose comme "/temp/trusted_folder/application.txt". Donc, fondamentalement, je veux permettre aux applications d'accéder au système de fichiers uniquement dans un dossier particulier et de rediriger tous les autres appels vers ce dossier.
Donc, voici la méthode de la classe FileOutputStream, où SM est demandé, s'il existe une autorisation d'écrire dans le chemin donné.
public FileOutputStream(File file, boolean append)
throws FileNotFoundException
{
String name = (file != null ? file.getPath() : null);
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkWrite(name);
}
if (name == null) {
throw new NullPointerException();
}
fd = new FileDescriptor();
fd.incrementAndGetUseCount();
this.append = append;
if (append) {
openAppend(name);
} else {
open(name);
}
}
De toute évidence, le SM ne dispose pas d'un accès à FileOutputStream et ne peut pas modifier les variables internes dans la méthode (comme nom ou fichier) ou affecter en quelque sorte l'ordre d'exécution, à l'exception de lancer la SecurityException. Je comprends, qu'accéder aux champs internes est une violation des principes orientés objet, je comprends, que les variables locales sont visibles et n'existent qu'à l'intérieur de la méthode, là où elles ont été déclarées. Donc, ma question est la suivante: Existe-t-il des moyens de permettre à Security Manager de remplacer les appels au système de fichiers? Sinon, y a-t-il d'autres approches que je peux utiliser pour faire cela?
J'espère que j'étais assez clair.
merci pour la réponse. La première option que je ne pouvais pas accepter, puisque je ne veux pas me limiter à un seul système d'exploitation, mais la deuxième option semble plutôt sympa. J'ai cherché un remplacement de l'API et j'ai découvert que l'outil JMockit peut mocker des classes et faire des stubs. Donc, fondamentalement, je vais y réfléchir et je pense que c'est ce dont j'ai besoin maintenant. – Sevich