Path: blob/master/test/jdk/java/io/File/CheckPermission.java
41149 views
/*1* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223/* @test24* @bug 801721225* @summary Examine methods in File.java that access the file system do the26* right permission check when a security manager exists.27* @run main/othervm -Djava.security.manager=allow CheckPermission28* @author Dan Xu29*/3031import java.io.File;32import java.io.FilenameFilter;33import java.io.FileFilter;34import java.io.IOException;35import java.security.Permission;36import java.util.ArrayList;37import java.util.EnumMap;38import java.util.EnumSet;39import java.util.HashSet;40import java.util.List;41import java.util.Map;42import java.util.Set;4344public class CheckPermission {4546private static final String CHECK_PERMISSION_TEST = "CheckPermissionTest";4748public enum FileOperation {49READ, WRITE, DELETE, EXEC50}5152static class Checks {53private List<Permission> permissionsChecked = new ArrayList<>();54private Set<String> propertiesChecked = new HashSet<>();5556private Map<FileOperation, List<String>> fileOperationChecked =57new EnumMap<>(FileOperation.class);5859List<Permission> permissionsChecked() {60return permissionsChecked;61}6263Set<String> propertiesChecked() {64return propertiesChecked;65}6667List<String> fileOperationChecked(FileOperation op) {68return fileOperationChecked.get(op);69}7071void addFileOperation(FileOperation op, String file) {72List<String> opList = fileOperationChecked.get(op);73if (opList == null) {74opList = new ArrayList<>();75fileOperationChecked.put(op, opList);76}77opList.add(file);78}79}8081static ThreadLocal<Checks> myChecks = new ThreadLocal<>();8283static void prepare() {84myChecks.set(new Checks());85}8687static class LoggingSecurityManager extends SecurityManager {88static void install() {89System.setSecurityManager(new LoggingSecurityManager());90}9192private void checkFileOperation(FileOperation op, String file) {93Checks checks = myChecks.get();94if (checks != null)95checks.addFileOperation(op, file);96}9798@Override99public void checkRead(String file) {100checkFileOperation(FileOperation.READ, file);101}102103@Override104public void checkWrite(String file) {105checkFileOperation(FileOperation.WRITE, file);106}107108@Override109public void checkDelete(String file) {110checkFileOperation(FileOperation.DELETE, file);111}112113@Override114public void checkExec(String file) {115checkFileOperation(FileOperation.EXEC, file);116}117118@Override119public void checkPermission(Permission perm) {120Checks checks = myChecks.get();121if (checks != null)122checks.permissionsChecked().add(perm);123}124125@Override126public void checkPropertyAccess(String key) {127Checks checks = myChecks.get();128if (checks != null)129checks.propertiesChecked().add(key);130}131}132133static void assertCheckPermission(Class<? extends Permission> type,134String name)135{136for (Permission perm : myChecks.get().permissionsChecked()) {137if (type.isInstance(perm) && perm.getName().equals(name))138return;139}140throw new RuntimeException(type.getName() + "(\"" + name141+ "\") not checked");142}143144static void assertCheckPropertyAccess(String key) {145if (!myChecks.get().propertiesChecked().contains(key))146throw new RuntimeException("Property " + key + " not checked");147}148149static void assertChecked(File file, List<String> list) {150if (list != null && !list.isEmpty()) {151for (String path : list) {152if (path.equals(file.getPath()))153return;154}155}156throw new RuntimeException("Access not checked");157}158159static void assertNotChecked(File file, List<String> list) {160if (list != null && !list.isEmpty()) {161for (String path : list) {162if (path.equals(file.getPath()))163throw new RuntimeException("Access checked");164}165}166}167168static void assertCheckOperation(File file, Set<FileOperation> ops) {169for (FileOperation op : ops)170assertChecked(file, myChecks.get().fileOperationChecked(op));171}172173static void assertNotCheckOperation(File file, Set<FileOperation> ops) {174for (FileOperation op : ops)175assertNotChecked(file, myChecks.get().fileOperationChecked(op));176}177178static void assertOnlyCheckOperation(File file,179EnumSet<FileOperation> ops)180{181assertCheckOperation(file, ops);182assertNotCheckOperation(file, EnumSet.complementOf(ops));183}184185static File testFile, another;186187static void setup() {188testFile = new File(CHECK_PERMISSION_TEST + System.currentTimeMillis());189if (testFile.exists()) {190testFile.delete();191}192193another = new File(CHECK_PERMISSION_TEST + "Another"194+ System.currentTimeMillis());195if (another.exists()) {196another.delete();197}198199LoggingSecurityManager.install();200}201202public static void main(String[] args) throws IOException {203setup();204205prepare();206testFile.canRead();207assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));208209prepare();210testFile.canWrite();211assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE));212213prepare();214testFile.exists();215assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));216217prepare();218testFile.isDirectory();219assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));220221prepare();222testFile.isFile();223assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));224225prepare();226testFile.isHidden();227assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));228229prepare();230testFile.lastModified();231assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));232233prepare();234testFile.length();235assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));236237prepare();238testFile.createNewFile();239assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE));240241prepare();242testFile.list();243assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));244245prepare();246testFile.list(new FilenameFilter() {247@Override248public boolean accept(File dir, String name) {249return false;250}251});252assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));253254prepare();255testFile.listFiles();256assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));257258prepare();259testFile.listFiles(new FilenameFilter() {260@Override261public boolean accept(File dir, String name) {262return false;263}264});265assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));266267prepare();268testFile.listFiles(new FileFilter() {269@Override270public boolean accept(File file) {271return false;272}273});274assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));275276prepare();277testFile.mkdir();278assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE));279280if (testFile.exists()) {281prepare();282testFile.mkdirs();283assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));284}285286if (!another.exists()) {287prepare();288another.mkdirs();289assertOnlyCheckOperation(another,290EnumSet.of(FileOperation.READ, FileOperation.WRITE));291}292293prepare();294another.delete();295assertOnlyCheckOperation(another, EnumSet.of(FileOperation.DELETE));296297prepare();298boolean renRst = testFile.renameTo(another);299assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE));300assertOnlyCheckOperation(another, EnumSet.of(FileOperation.WRITE));301302if (renRst) {303if (testFile.exists())304throw new RuntimeException(testFile + " is already renamed to "305+ another);306testFile = another;307}308309prepare();310testFile.setLastModified(0);311assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE));312313prepare();314testFile.setReadOnly();315assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE));316317prepare();318testFile.setWritable(true, true);319assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE));320321prepare();322testFile.setWritable(true);323assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE));324325prepare();326testFile.setReadable(true, true);327assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE));328329prepare();330testFile.setReadable(true);331assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE));332333prepare();334testFile.setExecutable(true, true);335assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE));336337prepare();338testFile.setExecutable(true);339assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE));340341prepare();342testFile.canExecute();343assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.EXEC));344345prepare();346testFile.getTotalSpace();347assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));348assertCheckPermission(RuntimePermission.class,349"getFileSystemAttributes");350351prepare();352testFile.getFreeSpace();353assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));354assertCheckPermission(RuntimePermission.class,355"getFileSystemAttributes");356357prepare();358testFile.getUsableSpace();359assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));360assertCheckPermission(RuntimePermission.class,361"getFileSystemAttributes");362363prepare();364File tmpFile = File.createTempFile(CHECK_PERMISSION_TEST, null);365assertOnlyCheckOperation(tmpFile, EnumSet.of(FileOperation.WRITE));366tmpFile.delete();367assertCheckOperation(tmpFile, EnumSet.of(FileOperation.DELETE));368369prepare();370tmpFile = File.createTempFile(CHECK_PERMISSION_TEST, null, null);371assertOnlyCheckOperation(tmpFile, EnumSet.of(FileOperation.WRITE));372tmpFile.delete();373assertCheckOperation(tmpFile, EnumSet.of(FileOperation.DELETE));374375prepare();376testFile.deleteOnExit();377assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.DELETE));378}379}380381382