Actualmente estoy intentando escribir Sandbox para ejecutar código Java no confiable. La idea es aislar la aplicación Java del acceso al sistema de archivos o los sockets de red. La solución que tengo en este momento es reescribir SecurityManager, que prohíbe cualquier acceso a IO o red.Caja de arena de Java. Uso de SecurityManager para redirigir el acceso de E/S
Ahora quiero no lo quiera, pero para redirigir las llamadas al sistema de archivos, es decir, si la aplicación quiere escribir a "/home/user/application.txt" la ruta del archivo debe ser reemplazado con algo como "/temp/trusted_folder/application.txt". Así que, básicamente, quiero permitir que las aplicaciones accedan al sistema de archivos solo en una carpeta particular y redireccionar todas las demás llamadas a esta carpeta.
Así que aquí está el método de la clase FileOutputStream, donde se pregunta a SM, si hay un permiso para escribir en la ruta determinada.
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);
}
}
Obviamente, el SM no tiene un acceso a FileOutputStream y no puede cambiar las variables internas en el método (como el nombre de o archivo) o de alguna manera afectar el orden de ejecución, excepto lanzando el SecurityException. Entiendo, que el acceso a los campos internos es una violación de los principios orientados a objetos, entiendo, que las variables locales son visibles y existen solo dentro del método, donde fueron declaradas.
Así que mi pregunta es: ¿hay alguna forma de permitir que Security Manager reemplace las llamadas al sistema de archivos? Si no, ¿hay algún otro enfoque que pueda usar para hacer esto?
Espero haber sido lo suficientemente claro.
gracias por la respuesta. La primera opción que no pude aceptar, ya que no quiero restringirme a un sistema operativo, pero la segunda opción se ve bastante bien. Busqué un reemplazo de API y descubrí que la herramienta JMockit puede simular clases y hacer stubs. Así que, básicamente, investigaré y creo que esto es lo que necesito ahora. – Sevich