Estoy tratando de resolver rutas canónicas para todos los archivos en un árbol de carpetas, pero por alguna razón no los resolverá (y de forma intermitente el código de seguridad JVM resolverá el enlace simbólico de manera adecuada dentro la FilePermission y causa un error de seguridad).java no resolverá enlaces simbólicos intermitentemente en Linux
Env:
$ java -version
java version "1.6.0_23"
OpenJDK Runtime Environment (IcedTea6 1.11pre) (6b23~pre11-0ubuntu1.11.10.2)
OpenJDK 64-Bit Server VM (build 20.0-b11, mixed mode)
Un enlace simbólico conocido en el sistema es /usr/share/java/gnome-java-bridge.jar:
$ ls -l /usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar
lrwxrwxrwx 1 root root 50 2012-02-24 13:39 /usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar -> ../../../../../../share/java/gnome-java-bridge.jar
El siguiente código debe resolver este enlace simbólico conocida :
String symlinkedFilePath =
"/usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar";
File symlinkedFile = new File(symlinkedFilePath);
System.out.println(symlinkedFile.getAbsolutePath());
System.out.println(symlinkedFile.getCanonicalPath());
pero produce:
/usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar
/usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar
un ensayo adicional, usando el siguiente código, a veces volverá cierto para la comprobación de permisos, pero a veces se devuelve falso:
String symlinkedFilePath =
"/usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar";
File symlinkedFile = new File(symlinkedFilePath);
FilePermission recursivePermission = new FilePermission(
symlinkedFile.getParentFile().getParent() + "/-", "read");
FilePermission filePermission = new FilePermission(
symlinkedFile.getAbsolutePath(), "read");
System.out.println(recursivePermission);
System.out.println(filePermission);
System.out.println(
"Can read symlink: " + recursivePermission.implies(filePermission));
El resultado típico es:
(java.io.FilePermission /usr/lib/jvm/java-6-openjdk/jre/lib/- read)
(java.io.FilePermission /usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar read)
Can read symlink: true
pero cuando depuración, si paso por la creación de FilePermission en el archivo de destino, internamente la ruta se resuelve en el enlace simbólico, y la salida da como resultado:
(java.io.FilePermission /usr/lib/jvm/java-6-openjdk/jre/lib/- read)
(java.io.FilePermission /usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar read)
Can read symlink: false
El problema es que, en el contexto de la aplicación en la que se realiza la verificación de permisos, el enlace simbólico siempre se resuelve mediante el objeto FilePermission, pero nunca mediante mis propias llamadas a file.getCanonicalPath() como se demostró anteriormente.
¿Tiene sentido para alguien?
Es posible que desee presentar un informe de error; No puedo reproducir el problema inicial de 'getCanonicalPath()' con openjdk o sun jdk en mi sistema Ubuntu 11.04. – sarnold
sarnold, ¿está utilizando la versión exacta de OpenJDK? Me pregunto si tal vez es un problema en el lanzamiento específico. Además, descubrí que puedo obtener las rutas canónicas para resolver el 100% del tiempo si configuro -Dsun.io.useCanonCaches = false o -Dsun.io.useCanonPrefixCache = false, pero eso parece extraño. – Ray
Lo siento, no pensé incluir números de versión; 'java -version' informa' OpenJDK Runtime Environment (IcedTea6 1.10.6) (6b22-1.10.6-0ubuntu1) '' OpenJDK 64-Bit Server VM (compilación 20.0-b11, modo mixto) '. – sarnold