From 4de5a4d99adf55dc93302dd284123dca93f50896 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Mon, 20 Nov 2000 18:25:41 +0000 Subject: [PATCH] Makefile.in: Rebuilt. * Makefile.in: Rebuilt. * Makefile.am (core_java_source_files): Added new files. * java/lang/reflect/ReflectPermission.java: New class. * java/io/FileFilter.java: From Classpath * java/io/FilePermission.java: From Classpath. From-SVN: r37586 --- libjava/ChangeLog | 8 + libjava/Makefile.am | 3 + libjava/Makefile.in | 12 +- libjava/java/io/FileFilter.java | 57 ++++ libjava/java/io/FilePermission.java | 243 ++++++++++++++++++ .../java/lang/reflect/ReflectPermission.java | 50 ++++ 6 files changed, 370 insertions(+), 3 deletions(-) create mode 100644 libjava/java/io/FileFilter.java create mode 100644 libjava/java/io/FilePermission.java create mode 100644 libjava/java/lang/reflect/ReflectPermission.java diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 385d983d8db..97d8c32058c 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,11 @@ +2000-11-18 Tom Tromey + + * Makefile.in: Rebuilt. + * Makefile.am (core_java_source_files): Added new files. + * java/lang/reflect/ReflectPermission.java: New class. + * java/io/FileFilter.java: From Classpath + * java/io/FilePermission.java: From Classpath. + 2000-11-17 Tom Tromey * java/lang/reflect/AccessibleObject.java (isAccessible, diff --git a/libjava/Makefile.am b/libjava/Makefile.am index aed267b07de..5f2f446f9a9 100644 --- a/libjava/Makefile.am +++ b/libjava/Makefile.am @@ -841,6 +841,7 @@ java/lang/reflect/InvocationTargetException.java \ java/lang/reflect/Member.java \ java/lang/reflect/Method.java \ java/lang/reflect/Modifier.java \ +java/lang/reflect/ReflectPermission.java \ java/io/BlockDataException.java \ java/io/BufferedInputStream.java \ java/io/BufferedOutputStream.java \ @@ -859,9 +860,11 @@ java/io/EOFException.java \ java/io/Externalizable.java \ java/io/File.java \ java/io/FileDescriptor.java \ +java/io/FileFilter.java \ java/io/FileInputStream.java \ java/io/FileNotFoundException.java \ java/io/FileOutputStream.java \ +java/io/FilePermission.java \ java/io/FileReader.java \ java/io/FileWriter.java \ java/io/FilenameFilter.java \ diff --git a/libjava/Makefile.in b/libjava/Makefile.in index a13d9881271..2cfb0a5b685 100644 --- a/libjava/Makefile.in +++ b/libjava/Makefile.in @@ -607,6 +607,7 @@ java/lang/reflect/InvocationTargetException.java \ java/lang/reflect/Member.java \ java/lang/reflect/Method.java \ java/lang/reflect/Modifier.java \ +java/lang/reflect/ReflectPermission.java \ java/io/BlockDataException.java \ java/io/BufferedInputStream.java \ java/io/BufferedOutputStream.java \ @@ -625,9 +626,11 @@ java/io/EOFException.java \ java/io/Externalizable.java \ java/io/File.java \ java/io/FileDescriptor.java \ +java/io/FileFilter.java \ java/io/FileInputStream.java \ java/io/FileNotFoundException.java \ java/io/FileOutputStream.java \ +java/io/FilePermission.java \ java/io/FileReader.java \ java/io/FileWriter.java \ java/io/FilenameFilter.java \ @@ -1433,8 +1436,9 @@ DEP_FILES = .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P \ .deps/java/io/DataOutput.P .deps/java/io/DataOutputStream.P \ .deps/java/io/EOFException.P .deps/java/io/Externalizable.P \ .deps/java/io/File.P .deps/java/io/FileDescriptor.P \ -.deps/java/io/FileInputStream.P .deps/java/io/FileNotFoundException.P \ -.deps/java/io/FileOutputStream.P .deps/java/io/FileReader.P \ +.deps/java/io/FileFilter.P .deps/java/io/FileInputStream.P \ +.deps/java/io/FileNotFoundException.P .deps/java/io/FileOutputStream.P \ +.deps/java/io/FilePermission.P .deps/java/io/FileReader.P \ .deps/java/io/FileWriter.P .deps/java/io/FilenameFilter.P \ .deps/java/io/FilterInputStream.P .deps/java/io/FilterOutputStream.P \ .deps/java/io/FilterReader.P .deps/java/io/FilterWriter.P \ @@ -1536,7 +1540,9 @@ DEP_FILES = .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P \ .deps/java/lang/reflect/Field.P \ .deps/java/lang/reflect/InvocationTargetException.P \ .deps/java/lang/reflect/Member.P .deps/java/lang/reflect/Method.P \ -.deps/java/lang/reflect/Modifier.P .deps/java/lang/reflect/natArray.P \ +.deps/java/lang/reflect/Modifier.P \ +.deps/java/lang/reflect/ReflectPermission.P \ +.deps/java/lang/reflect/natArray.P \ .deps/java/lang/reflect/natConstructor.P \ .deps/java/lang/reflect/natField.P .deps/java/lang/reflect/natMethod.P \ .deps/java/lang/s_atan.P .deps/java/lang/s_ceil.P \ diff --git a/libjava/java/io/FileFilter.java b/libjava/java/io/FileFilter.java new file mode 100644 index 00000000000..2f3f3f78347 --- /dev/null +++ b/libjava/java/io/FileFilter.java @@ -0,0 +1,57 @@ +/* FileFilter.java -- Filter a list of pathnames + Copyright (C) 1998 Free Software Foundation, Inc. + +This file is part of GNU Classpath. + +GNU Classpath 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. + +GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the +Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +02111-1307 USA. + +As a special exception, if you link this library with other files to +produce an executable, this library does not by itself cause the +resulting executable to be covered by the GNU General Public License. +This exception does not however invalidate any other reasons why the +executable file might be covered by the GNU General Public License. */ + + +package java.io; + +/** + * This interface has one method which is used for filtering pathnames + * returned in a pathname listing. It is currently used by the + * File.listFiles() method. + *

+ * The method in this interface determines if a particular pathname should + * or should not be included in the pathname listing. + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ +public interface FileFilter +{ + +/** + * This method determines whether or not a given pathname should be included + * in a pathname listing. + * + * @param pathname The pathname to test + * + * @return true if the path should be included in the list, false otherwise. + */ +public abstract boolean +accept(File pathname); + +} // interface FileFilter + diff --git a/libjava/java/io/FilePermission.java b/libjava/java/io/FilePermission.java new file mode 100644 index 00000000000..21bb5569029 --- /dev/null +++ b/libjava/java/io/FilePermission.java @@ -0,0 +1,243 @@ +/* java.lang.FilePermission + Copyright (C) 1998 Free Software Foundation, Inc. + +This file is part of GNU Classpath. + +GNU Classpath 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. + +GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the +Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +02111-1307 USA. + +As a special exception, if you link this library with other files to +produce an executable, this library does not by itself cause the +resulting executable to be covered by the GNU General Public License. +This exception does not however invalidate any other reasons why the +executable file might be covered by the GNU General Public License. */ + + +package java.io; + +import java.security.*; + + +public class FilePermission extends Permission implements Serializable { + private static final String CURRENT_DIRECTORY = System.getProperty("user.dir"); + private boolean usingPerms = false; + private boolean readPerm = false; + private boolean writePerm = false; + private boolean executePerm = false; + private boolean deletePerm = false; + private String actionsString; + + private void cachePerms() { + // While race conditions could occur, they don't matter at all. + + String action; + int i = actionsString.indexOf(','); + int startI = 0; + while(i != -1) { + action = actionsString.substring(startI,i); + if(action.equals("read")) + readPerm = true; + else if(action.equals("write")) + writePerm = true; + else if(action.equals("execute")) + executePerm = true; + else if(action.equals("delete")) + deletePerm = true; + + startI = i+1; + i = actionsString.indexOf(',',startI); + } + + action = actionsString.substring(startI); + if(action.equals("read")) + readPerm = true; + else if(action.equals("write")) + writePerm = true; + else if(action.equals("execute")) + executePerm = true; + else if(action.equals("delete")) + deletePerm = true; + } + + /** Create a new FilePermission. + ** @param pathExpression an expression specifying the paths this + ** permission represents. + ** @param actionsString a comma-separated list of the actions this + ** permission represents. + ** @XXX what to do when the file string is malformed? + **/ + public FilePermission(String pathExpression, String actionsString) + { + super(pathExpression); + this.actionsString = actionsString; + } + + /** Get the actions this FilePermission supports. + ** @return the String representing the actions this FilePermission supports. + **/ + public String getActions() { + return actionsString; + } + + /** Get the hash code for this Object.

+ ** FilePermission's hash code is calculated as the exclusive or of the target + ** String's hash code and the action String's hash code. + ** @specnote Sun did not specify how to calculate the hash code; I made this up. + ** @return the hash code for this Object. + **/ + public int hashCode() { + return getName().hashCode() ^ actionsString.hashCode(); + } + + /** Check two FilePermissions for semantic equality. + ** Two FilePermissions are exactly equivalent if they have identical path + ** expressions and have exactly the same access permissions. + ** @param o the Object to compare to. + ** @return whether the Objects are semantically equivalent. + **/ + public boolean equals(Object o) { + if(!(o instanceof FilePermission)) + return false; + FilePermission p = (FilePermission)o; + if(!usingPerms) + cachePerms(); + if(!p.usingPerms) + p.cachePerms(); + + String f1 = getName(); + String f2 = p.getName(); + + /* Compare names, taking into account if they refer to a + * directory and one has a separator and the other does not. + */ + if(f1.charAt(f1.length()) == File.separatorChar) { + if(f2.charAt(f2.length()) == File.separatorChar) { + if(!f2.equals(f1)) + return false; + } else { + if(!f2.equals(f1.substring(0,f1.length()-1))) + return false; + } + } else { + if(f2.charAt(f2.length()) == File.separatorChar) { + if(!f1.equals(f2.substring(0,f2.length()-1))) + return false; + } else { + if(!f1.equals(f2)) + return false; + } + } + return readPerm == p.readPerm && writePerm == p.writePerm && executePerm == p.executePerm && deletePerm == p.deletePerm; + } + + /** Check to see if this permission implies another. + ** Permission A implies permission B if these things are all true: + **

    + **
  1. A and B are both FilePermissions.
  2. + **
  3. All possible files in B are included in A (possibly more are in A).
  4. + **
  5. All actions B supports, A also supports.
  6. + **
+ ** @param p the Permission to compare against. + ** @return whether this Permission implies p + **/ + public boolean implies(Permission p) { + FilePermission fp; + if(!(p instanceof FilePermission)) + return false; + fp = (FilePermission)p; + + String f1 = getName(); + String f2 = fp.getName(); + if(f1.charAt(0) != File.separatorChar) { + f1 = CURRENT_DIRECTORY + f1; + } + if(f2.charAt(0) != File.separatorChar) { + f2 = CURRENT_DIRECTORY + f2; + } + + String sub1, sub2a, sub2b; + switch(f1.charAt(f1.length() - 1)) { + case '*': + sub1 = f1.substring(0,f1.length() - 1); // chop off "*" + if(f2.length() <= sub1.length()) { + /* If it's smaller, there is no way it could be part of this directory. + * If it's the same (or length - 1), it could be the same directory but + * specifies access to the directory rather than the files in it. + */ + return false; + } else if(f2.charAt(sub1.length() - 1) == File.separatorChar) { + /* Make sure the part before the "/" is the same */ + if(!f2.substring(0,sub1.length()).equals(sub1)) + return false; + /* Make sure there are no subdirectories specified underneath this one */ + String sub2 = f2.substring(sub1.length()+1); + if(f2.substring(sub1.length()+1).indexOf(File.separatorChar) != -1) + return false; + } else { + /* Obviously not equal: f2 is either not a directory or is not + * the same directory (its name continues further than we want) + */ + return false; + } + break; + case '-': + sub1 = f1.substring(0,f1.length() - 2); // chop off "/-" + if(f2.length() < sub1.length()) { + /* If it's smaller, there is no way it could be part of this directory. */ + return false; + } else if(f2.length() > sub1.length() && f2.charAt(sub1.length()) != File.separatorChar) { + return false; + } else if(!f2.substring(0,sub1.length()).equals(sub1)) + return false; + break; +/* Looks redundant with default case and won't compile anyway - arenn + case File.separatorChar: + if(f2.charAt(f2.length()) == File.separatorChar) { + if(!f2.equals(f1)) + return false; + } else { + if(!f2.equals(f1.substring(0,f1.length()-1))) + return false; + } + break; +*/ + default: + if(f2.charAt(f2.length()) == File.separatorChar) { + if(!f1.equals(f2.substring(0,f2.length()-1))) + return false; + } else { + if(!f1.equals(f2)) + return false; + } + break; + } + + if(!usingPerms) + cachePerms(); + if(!fp.usingPerms) + fp.cachePerms(); + + if(readPerm && !fp.readPerm) + return false; + if(writePerm && !fp.writePerm) + return false; + if(executePerm && !fp.executePerm) + return false; + if(deletePerm && !fp.deletePerm) + return false; + + return true; + } +} diff --git a/libjava/java/lang/reflect/ReflectPermission.java b/libjava/java/lang/reflect/ReflectPermission.java new file mode 100644 index 00000000000..5e869860afa --- /dev/null +++ b/libjava/java/lang/reflect/ReflectPermission.java @@ -0,0 +1,50 @@ +// ReflectPermission.java - Process modifier values. + +/* Copyright (C) 2000 Free Software Foundation + + This file is part of libgcj. + +This software is copyrighted work licensed under the terms of the +Libgcj License. Please consult the file "LIBGCJ_LICENSE" for +details. */ + +/** + * @author Tom Tromey + * @date November 18, 2000 + */ + +/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 + * "The Java Language Specification", ISBN 0-201-63451-1 + * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. + * Status: Believed complete and correct to version 1.2. + */ + +package java.lang.reflect; + +import java.security.BasicPermission; + +/** + * This class implements permissions for reflection. This is a named + * permission, and the only defined name is suppressAccessChecks. + */ +public final class ReflectPermission extends BasicPermission +{ + /** + * Construct a ReflectPermission with the given name. + * @param name The permission name + */ + public ReflectPermission (String name) + { + super (name); + } + + /** + * Construct a ReflectPermission with the given name. + * @param name The permission name + * @param actions The actions; this is ignored and should be null. + */ + public ReflectPermission (String name, String actions) + { + super (name, actions); + } +}