/* FilePermission.java --
   Copyright (C) 1998, 2000, 2003, 2004, 2005, 2006
   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., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 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 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 (f2.equals(ALL_FILES))
      return false;

    try
      {
        f1 = new File(f1).getCanonicalPath();
        f2 = new File(f2).getCanonicalPath();
      }
    catch (IOException ioe)
      {
        return false;
      }

    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 (!f1.equals(f2))
          return false;
        break;
      }

    if (fp.readPerm && ! readPerm)
      return false;
    if (fp.writePerm && ! writePerm)
      return false;
    if (fp.executePerm && ! executePerm)
      return false;
    if (fp.deletePerm && ! deletePerm)
      return false;

    return true;
  }
}
