[kaffe] CVS kaffe (robilad): Resynced with GNU Classpath: ALL FILES permission handling

Kaffe CVS cvs-commits at kaffe.org
Tue Apr 19 11:10:26 PDT 2005


PatchSet 5720 
Date: 2005/04/19 18:00:05
Author: robilad
Branch: HEAD
Tag: (none) 
Log:
Resynced with GNU Classpath: ALL FILES permission handling

2005-04-19  Dalibor Topic  <robilad at kaffe.org>

        Resynced with GNU Classpath.

        2005-04-12  Michael Koch  <konqueror at gmx.de>

        * java/io/FilePermission.java
        (serialVersionUID): Made private.
        (ALL_FILES): New constant.
        (implies): Handle '<<ALL FILES>>' case.

Members: 
	ChangeLog:1.3887->1.3888 
	libraries/javalib/java/io/FilePermission.java:INITIAL->1.11 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.3887 kaffe/ChangeLog:1.3888
--- kaffe/ChangeLog:1.3887	Tue Apr 19 17:34:35 2005
+++ kaffe/ChangeLog	Tue Apr 19 18:00:05 2005
@@ -2,6 +2,17 @@
 
         Resynced with GNU Classpath.
 
+	2005-04-12  Michael Koch  <konqueror at gmx.de>
+
+        * java/io/FilePermission.java
+        (serialVersionUID): Made private.
+        (ALL_FILES): New constant.
+        (implies): Handle '<<ALL FILES>>' case.
+
+2005-04-19  Dalibor Topic  <robilad at kaffe.org>
+
+        Resynced with GNU Classpath.
+
 	2005-04-12  Audrius Meskauskas, Lithuania  <AudriusA at Bioinformatics.org>
 
         * javax/swing/text/html/HTMLDocument.java: New file.
===================================================================
Checking out kaffe/libraries/javalib/java/io/FilePermission.java
RCS:  /home/cvs/kaffe/kaffe/libraries/javalib/java/io/FilePermission.java,v
VERS: 1.11
***************
--- /dev/null	Sun Aug  4 19:57:58 2002
+++ kaffe/libraries/javalib/java/io/FilePermission.java	Tue Apr 19 18:10:26 2005
@@ -0,0 +1,292 @@
+/* FilePermission.java --
+   Copyright (C) 1998, 2000, 2003, 2004, 2005  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.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library.  Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module.  An independent module is a module which is not derived from
+or based on this library.  If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so.  If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package java.io;
+
+import java.security.Permission;
+
+public final class FilePermission extends Permission implements Serializable
+{
+  private static final long serialVersionUID = 7930732926638008763L;
+
+  private static final String CURRENT_DIRECTORY = 
+    System.getProperty("user.dir");
+
+  private static final String ALL_FILES = "<<ALL FILES>>";
+
+  private boolean readPerm = false;
+  private boolean writePerm = false;
+  private boolean executePerm = false;
+  private boolean deletePerm = false;
+  private final String actionsString;
+
+  // Checks and caches the actions
+  private void checkPerms() throws IllegalArgumentException
+  {
+    String action;
+    int i = actionsString.indexOf(',');
+    int startI = 0;
+    while (i != -1) 
+      {
+        action = actionsString.substring(startI, i).trim().toLowerCase();
+        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;
+	else
+	  throw new IllegalArgumentException("Unknown action: " + action);
+      
+        startI = i + 1;
+        i = actionsString.indexOf(',', startI);
+      }
+
+    action = actionsString.substring(startI).trim().toLowerCase();
+    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;
+    else
+      throw new IllegalArgumentException("Unknown action: " + action);
+  }
+
+  /**
+   * 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. The actions must be "read", "write",
+   *        "execute" and/or "delete".
+   */
+  public FilePermission(String pathExpression, String actionsString) 
+  {
+    // FIXME: what to do when the file string is malformed?
+    super(pathExpression);
+    if (pathExpression == null)
+      throw new NullPointerException("pathExpression");
+    if (actionsString == null)
+      throw new IllegalArgumentException("actionsString");
+    this.actionsString = actionsString;
+    checkPerms();
+  }
+  
+  /**
+   * 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.<P>
+   * 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;
+
+    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.length() > 0 && f1.charAt(f1.length() - 1) == File.separatorChar) 
+      {
+        if (f2.length() > 0
+	    && f2.charAt(f2.length() - 1) == File.separatorChar) 
+          {
+	    if (! f2.equals(f1))
+	      return false;
+          }
+        else
+          {
+	    if (! f2.equals(f1.substring(0, f1.length() - 1)))
+	      return false;
+          }
+      }
+    else
+      {
+        if (f2.length() > 0
+	    && f2.charAt(f2.length() - 1) == 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:
+   * <OL>
+   * <LI>A and B are both FilePermissions.</LI>
+   * <LI>All possible files in B are included in A 
+   * (possibly more are in A).</LI>
+   * <LI>All actions B supports, A also supports.</LI>
+   * </OL>
+   * @param p the Permission to compare against.
+   * @return whether this Permission implies p
+   */
+  public boolean implies(Permission p) 
+  {
+    if (! (p instanceof FilePermission))
+      return false;
+
+    String f1 = getName();
+
+    if (f1.equals(ALL_FILES))
+      return true;
+    
+    FilePermission fp = (FilePermission) p;
+    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;
+
+    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.
+	    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 '-':
+	// Chop off "/-".
+	sub1 = f1.substring(0, f1.length() - 2);
+	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;
+
+      default:
+	if (f2.charAt(f2.length() - 1) == File.separatorChar)
+	  {
+	    if (! f1.equals(f2.substring(0, f2.length() - 1)))
+	      return false;
+	  }
+	else if (!f1.equals(f2))
+	  return false;
+	break;
+      }
+
+    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;
+  }
+}




More information about the kaffe mailing list