// Copyright (C) 2006 Red Hat, Inc.
// Written by Gary Benson <gbenson@redhat.com>
// This file is part of Mauve.
// Mauve is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2, or (at your option)
// any later version.
// Mauve 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 for more details.
// You should have received a copy of the GNU General Public License
// along with Mauve; see the file COPYING. If not, write to
// the Free Software Foundation, 59 Temple Place - Suite 330,
// Boston, MA 02111-1307, USA.
package gnu.testlet.wonka.io.FilePermission;
import java.io.File;
import java.io.FilePermission;
import java.util.LinkedList;
import gnu.testlet.Testlet;
import gnu.testlet.TestHarness;
public class traversal implements Testlet
{
public void test (TestHarness harness)
{
try {
harness.checkPoint("setup");
String[] items_to_access = new String[] {
"file", // a file in the directory
"rlink", // a relative link to a file outside the directory
"alink"}; // an absolute link to a file outside the directory
String[] ways_to_access = new String[] {
"dir", // via the directory
"rlink", // via a relative link to the directory
"alink"}; // via an absolute link to the directory
String[] item_states = new String[] {
"present", // the file exists
"absent"}; // the file does not exist
LinkedList cleanup = new LinkedList();
try {
File tempdir = new File(harness.getTempDirectory(), "mauve-testdir");
harness.check(tempdir.isDirectory() || tempdir.mkdir());
cleanup.add(tempdir);
File testdir = new File(tempdir, "dir");
harness.check(testdir.isDirectory() || testdir.mkdir());
cleanup.add(testdir);
File link = new File(tempdir, "rlink");
harness.check(Runtime.getRuntime().exec(new String[] {
"ln", "-s", testdir.getName(), link.getPath()
}).waitFor() == 0);
cleanup.add(link);
link = new File(tempdir, "alink");
harness.check(Runtime.getRuntime().exec(new String[] {
"ln", "-s", testdir.getPath(), link.getPath()
}).waitFor() == 0);
cleanup.add(link);
File[] dirs = new File[] {testdir, tempdir};
for (int i = 0; i < dirs.length; i++) {
File file = new File(dirs[i], "file-present");
harness.check(file.isFile() || file.createNewFile());
cleanup.add(file);
file = new File(dirs[i], "file-absent");
harness.check(!file.exists());
}
for (int i = 0; i < item_states.length; i++) {
File file = new File(tempdir, "file-" + item_states[i]);
link = new File(testdir, "rlink-" + item_states[i]);
harness.check(Runtime.getRuntime().exec(new String[] {
"ln", "-s", new File("..",file.getName()).getPath(), link.getPath()
}).waitFor() == 0);
cleanup.add(link);
link = new File(testdir, "alink-" + item_states[i]);
harness.check(Runtime.getRuntime().exec(new String[] {
"ln", "-s", file.getPath(), link.getPath()
}).waitFor() == 0);
cleanup.add(link);
}
harness.checkPoint("test");
for (int i = 0; i < items_to_access.length; i++) {
String item_to_access = items_to_access[i];
for (int j = 0; j < ways_to_access.length; j++) {
String how_to_access = ways_to_access[j];
for (int k = 0; k < ways_to_access.length; k++) {
String how_permitted = ways_to_access[k];
for (int l = 0; l < item_states.length; l++) {
String item_state = item_states[l];
String item = item_to_access + "-" + item_state;
FilePermission a = new FilePermission(new File(
new File(tempdir, how_permitted), item).getPath(), "read");
FilePermission b = new FilePermission(new File(
new File(tempdir, how_to_access), item).getPath(), "read");
harness.debug("\na = " + a);
harness.debug("b = " + b);
harness.check(a.implies(b));
}
}
}
}
}
finally {
for (int i = cleanup.size() - 1; i >= 0; i--)
((File) cleanup.get(i)).delete();
}
}
catch (Throwable ex) {
harness.debug(ex);
harness.check(false, "Unexpected exception");
}
}
}