Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/test/java/io/File/CheckPermission.java
38812 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* @author Dan Xu28*/2930import java.io.File;31import java.io.FilenameFilter;32import java.io.FileFilter;33import java.io.IOException;34import java.security.Permission;35import java.util.ArrayList;36import java.util.EnumMap;37import java.util.EnumSet;38import java.util.HashSet;39import java.util.List;40import java.util.Map;41import java.util.Set;4243public class CheckPermission {4445private static final String CHECK_PERMISSION_TEST = "CheckPermissionTest";4647public enum FileOperation {48READ, WRITE, DELETE, EXEC49}5051static class Checks {52private List<Permission> permissionsChecked = new ArrayList<>();53private Set<String> propertiesChecked = new HashSet<>();5455private Map<FileOperation, List<String>> fileOperationChecked =56new EnumMap<>(FileOperation.class);5758List<Permission> permissionsChecked() {59return permissionsChecked;60}6162Set<String> propertiesChecked() {63return propertiesChecked;64}6566List<String> fileOperationChecked(FileOperation op) {67return fileOperationChecked.get(op);68}6970void addFileOperation(FileOperation op, String file) {71List<String> opList = fileOperationChecked.get(op);72if (opList == null) {73opList = new ArrayList<>();74fileOperationChecked.put(op, opList);75}76opList.add(file);77}78}7980static ThreadLocal<Checks> myChecks = new ThreadLocal<>();8182static void prepare() {83myChecks.set(new Checks());84}8586static class LoggingSecurityManager extends SecurityManager {87static void install() {88System.setSecurityManager(new LoggingSecurityManager());89}9091private void checkFileOperation(FileOperation op, String file) {92Checks checks = myChecks.get();93if (checks != null)94checks.addFileOperation(op, file);95}9697@Override98public void checkRead(String file) {99checkFileOperation(FileOperation.READ, file);100}101102@Override103public void checkWrite(String file) {104checkFileOperation(FileOperation.WRITE, file);105}106107@Override108public void checkDelete(String file) {109checkFileOperation(FileOperation.DELETE, file);110}111112@Override113public void checkExec(String file) {114checkFileOperation(FileOperation.EXEC, file);115}116117@Override118public void checkPermission(Permission perm) {119Checks checks = myChecks.get();120if (checks != null)121checks.permissionsChecked().add(perm);122}123124@Override125public void checkPropertyAccess(String key) {126Checks checks = myChecks.get();127if (checks != null)128checks.propertiesChecked().add(key);129}130}131132static void assertCheckPermission(Class<? extends Permission> type,133String name)134{135for (Permission perm : myChecks.get().permissionsChecked()) {136if (type.isInstance(perm) && perm.getName().equals(name))137return;138}139throw new RuntimeException(type.getName() + "(\"" + name140+ "\") not checked");141}142143static void assertCheckPropertyAccess(String key) {144if (!myChecks.get().propertiesChecked().contains(key))145throw new RuntimeException("Property " + key + " not checked");146}147148static void assertChecked(File file, List<String> list) {149if (list != null && !list.isEmpty()) {150for (String path : list) {151if (path.equals(file.getPath()))152return;153}154}155throw new RuntimeException("Access not checked");156}157158static void assertNotChecked(File file, List<String> list) {159if (list != null && !list.isEmpty()) {160for (String path : list) {161if (path.equals(file.getPath()))162throw new RuntimeException("Access checked");163}164}165}166167static void assertCheckOperation(File file, Set<FileOperation> ops) {168for (FileOperation op : ops)169assertChecked(file, myChecks.get().fileOperationChecked(op));170}171172static void assertNotCheckOperation(File file, Set<FileOperation> ops) {173for (FileOperation op : ops)174assertNotChecked(file, myChecks.get().fileOperationChecked(op));175}176177static void assertOnlyCheckOperation(File file,178EnumSet<FileOperation> ops)179{180assertCheckOperation(file, ops);181assertNotCheckOperation(file, EnumSet.complementOf(ops));182}183184static File testFile, another;185186static void setup() {187testFile = new File(CHECK_PERMISSION_TEST + System.currentTimeMillis());188if (testFile.exists()) {189testFile.delete();190}191192another = new File(CHECK_PERMISSION_TEST + "Another"193+ System.currentTimeMillis());194if (another.exists()) {195another.delete();196}197198LoggingSecurityManager.install();199}200201public static void main(String[] args) throws IOException {202setup();203204prepare();205testFile.canRead();206assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));207208prepare();209testFile.canWrite();210assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE));211212prepare();213testFile.exists();214assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));215216prepare();217testFile.isDirectory();218assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));219220prepare();221testFile.isFile();222assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));223224prepare();225testFile.isHidden();226assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));227228prepare();229testFile.lastModified();230assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));231232prepare();233testFile.length();234assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));235236prepare();237testFile.createNewFile();238assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE));239240prepare();241testFile.list();242assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));243244prepare();245testFile.list(new FilenameFilter() {246@Override247public boolean accept(File dir, String name) {248return false;249}250});251assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));252253prepare();254testFile.listFiles();255assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));256257prepare();258testFile.listFiles(new FilenameFilter() {259@Override260public boolean accept(File dir, String name) {261return false;262}263});264assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));265266prepare();267testFile.listFiles(new FileFilter() {268@Override269public boolean accept(File file) {270return false;271}272});273assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));274275prepare();276testFile.mkdir();277assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE));278279if (testFile.exists()) {280prepare();281testFile.mkdirs();282assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));283}284285if (!another.exists()) {286prepare();287another.mkdirs();288assertOnlyCheckOperation(another,289EnumSet.of(FileOperation.READ, FileOperation.WRITE));290}291292prepare();293another.delete();294assertOnlyCheckOperation(another, EnumSet.of(FileOperation.DELETE));295296prepare();297boolean renRst = testFile.renameTo(another);298assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE));299assertOnlyCheckOperation(another, EnumSet.of(FileOperation.WRITE));300301if (renRst) {302if (testFile.exists())303throw new RuntimeException(testFile + " is already renamed to "304+ another);305testFile = another;306}307308prepare();309testFile.setLastModified(0);310assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE));311312prepare();313testFile.setReadOnly();314assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE));315316prepare();317testFile.setWritable(true, true);318assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE));319320prepare();321testFile.setWritable(true);322assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE));323324prepare();325testFile.setReadable(true, true);326assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE));327328prepare();329testFile.setReadable(true);330assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE));331332prepare();333testFile.setExecutable(true, true);334assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE));335336prepare();337testFile.setExecutable(true);338assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE));339340prepare();341testFile.canExecute();342assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.EXEC));343344prepare();345testFile.getTotalSpace();346assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));347assertCheckPermission(RuntimePermission.class,348"getFileSystemAttributes");349350prepare();351testFile.getFreeSpace();352assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));353assertCheckPermission(RuntimePermission.class,354"getFileSystemAttributes");355356prepare();357testFile.getUsableSpace();358assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));359assertCheckPermission(RuntimePermission.class,360"getFileSystemAttributes");361362prepare();363File tmpFile = File.createTempFile(CHECK_PERMISSION_TEST, null);364assertOnlyCheckOperation(tmpFile, EnumSet.of(FileOperation.WRITE));365tmpFile.delete();366assertCheckOperation(tmpFile, EnumSet.of(FileOperation.DELETE));367368prepare();369tmpFile = File.createTempFile(CHECK_PERMISSION_TEST, null, null);370assertOnlyCheckOperation(tmpFile, EnumSet.of(FileOperation.WRITE));371tmpFile.delete();372assertCheckOperation(tmpFile, EnumSet.of(FileOperation.DELETE));373374prepare();375testFile.deleteOnExit();376assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.DELETE));377}378}379380381