blob: add04f9a754f56a03dd5be88e3a9bfb47991eaac [file] [log] [blame]
/*
* Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 6203047
* @summary Inconsistency in FilePermission
*/
import java.io.*;
public class CanonPath {
private static boolean windows;
private static final String WIN_FOOBAR = "\\foo\\bar\\";
private static final String UNIX_FOOBAR = "/foo/bar/";
private static final String WIN_FOO = "\\foo.txt";
private static final String UNIX_FOO = "/foo.txt";
private static final String WIN_BAR = "bar\\bar.txt";
private static final String UNIX_BAR = "bar/bar.txt";
private static final String WIN_SLASH = "\\";
private static final String UNIX_SLASH = "/";
private static void printCanonPath(String label, String path)
throws Exception {
File f = new File(path);
System.out.println(label + " path = " + f.getCanonicalPath());
}
public static void main(String[] args) throws Exception {
if (System.getProperty("os.name").startsWith("Windows")) {
windows = true;
System.out.println("Testing on Windows");
} else {
System.out.println("Testing on Unix");
}
System.out.println();
System.out.println("\\\\foo\\\\bar\\\\- versus /foo/bar/-");
FilePermission w = new FilePermission(WIN_FOOBAR + "-", "read");
FilePermission u = new FilePermission(UNIX_FOOBAR + "-", "read");
printCanonPath("WIN_FOOBAR", WIN_FOOBAR);
printCanonPath("UNIX_FOOBAR", UNIX_FOOBAR);
if (windows) {
if (!w.implies(u) || !u.implies(w)) {
throw new Exception("FOOBAR test failed");
}
} else {
if (w.implies(u) || u.implies(w)) {
throw new Exception("FOOBAR test failed");
}
}
System.out.println();
System.out.println("\\\\foo.txt versus /foo.txt");
w = new FilePermission(WIN_FOO, "read");
u = new FilePermission(UNIX_FOO, "read");
printCanonPath("WIN_FOO", WIN_FOO);
printCanonPath("UNIX_FOO", UNIX_FOO);
if (windows) {
if (!w.implies(u) || !u.implies(w)) {
throw new Exception("FOO test failed");
}
} else {
if (w.implies(u) || u.implies(w)) {
throw new Exception("FOO test failed");
}
}
System.out.println();
System.out.println("bar\\\\bar.txt versus bar/bar.txt");
w = new FilePermission(WIN_BAR, "read");
u = new FilePermission(UNIX_BAR, "read");
printCanonPath("WIN_BAR", WIN_BAR);
printCanonPath("UNIX_BAR", UNIX_BAR);
if (windows) {
if (!w.implies(u) || !u.implies(w)) {
throw new Exception("BAR test failed");
}
} else {
if (w.implies(u) || u.implies(w)) {
throw new Exception("BAR test failed");
}
}
System.out.println();
System.out.println("\\\\ versus /");
w = new FilePermission(WIN_SLASH, "read");
u = new FilePermission(UNIX_SLASH, "read");
printCanonPath("WIN_SLASH", WIN_SLASH);
printCanonPath("UNIX_SLASH", UNIX_SLASH);
if (windows) {
if (!w.implies(u) || !u.implies(w)) {
throw new Exception("SLASH test failed");
}
} else {
if (w.implies(u) || u.implies(w)) {
throw new Exception("SLASH test failed");
}
}
System.out.println();
System.out.println("\\\\- versus /-");
w = new FilePermission(WIN_SLASH + "-", "read");
u = new FilePermission(UNIX_SLASH + "-", "read");
printCanonPath("WIN_SLASH", WIN_SLASH);
printCanonPath("UNIX_SLASH", UNIX_SLASH);
if (windows) {
if (!w.implies(u) || !u.implies(w)) {
throw new Exception("SLASH/- test failed");
}
} else {
// XXX
//
// on unix, /- implies everything
if (w.implies(u) || !u.implies(w)) {
throw new Exception("SLASH/- test failed");
}
}
System.out.println();
System.out.println("- versus -");
w = new FilePermission("-", "read");
u = new FilePermission("-", "read");
printCanonPath("WIN_DASH", "");
printCanonPath("UNIX_DASH", "");
if (windows) {
if (!w.implies(u) || !u.implies(w)) {
throw new Exception("- test failed");
}
} else {
if (!w.implies(u) || !u.implies(w)) {
throw new Exception("- test failed");
}
}
System.out.println();
System.out.println("- versus *");
w = new FilePermission("-", "read");
u = new FilePermission("*", "read");
printCanonPath("WIN_DASH", "");
printCanonPath("UNIX_STAR", "");
if (windows) {
// XXX
//
// - implies *, but not the other way around
if (!w.implies(u) || u.implies(w)) {
throw new Exception("- test failed");
}
} else {
// XXX
//
// - implies *, but not the other way around
if (!w.implies(u) || u.implies(w)) {
throw new Exception("- test failed");
}
}
System.out.println();
System.out.println("\\\\* versus /*");
w = new FilePermission(WIN_SLASH + "*", "read");
u = new FilePermission(UNIX_SLASH + "*", "read");
printCanonPath("WIN_SLASH", WIN_SLASH);
printCanonPath("UNIX_SLASH", UNIX_SLASH);
if (windows) {
if (!w.implies(u) || !u.implies(w)) {
throw new Exception("SLASH/* test failed");
}
} else {
if (w.implies(u) || u.implies(w)) {
throw new Exception("SLASH/* test failed");
}
}
System.out.println();
System.out.println("\\\\foo\\\\bar\\\\- versus /foo/bar/foobar/w.txt");
w = new FilePermission(WIN_FOOBAR + "-", "read");
u = new FilePermission("/foo/bar/foobar/w.txt", "read");
printCanonPath("FOOBAR", WIN_FOOBAR);
printCanonPath("W.TXT", "/foo/bar/foobar/w.txt");
if (windows) {
if (!w.implies(u) || u.implies(w)) {
throw new Exception("w.txt (-) test failed");
}
} else {
if (w.implies(u) || u.implies(w)) {
throw new Exception("w.txt (-) test failed");
}
}
System.out.println();
System.out.println("\\\\foo\\\\bar\\\\* versus /foo/bar/w.txt");
w = new FilePermission(WIN_FOOBAR + "*", "read");
u = new FilePermission("/foo/bar/w.txt", "read");
printCanonPath("FOOBAR", WIN_FOOBAR);
printCanonPath("W.TXT", "/foo/bar/w.txt");
if (windows) {
if (!w.implies(u) || u.implies(w)) {
throw new Exception("w.txt (*) test failed");
}
} else {
if (w.implies(u) || u.implies(w)) {
throw new Exception("w.txt (*) test failed");
}
}
// make sure "/" does not imply "/-" nor "/*"
System.out.println();
System.out.println("/ versus /- and /*");
File file = new File(UNIX_SLASH);
FilePermission recursive = new FilePermission
(file.getCanonicalPath() +
File.separatorChar +
"-",
"read");
FilePermission wild = new FilePermission
(file.getCanonicalPath() +
File.separatorChar +
"*",
"read");
FilePermission standard = new FilePermission
(file.getCanonicalPath(),
"read");
if (standard.implies(recursive) || standard.implies(wild)) {
throw new Exception("standard vs directory test failed");
}
}
}