      1 /*
      2  * Copyright (c) 1998, 2021, Oracle and/or its affiliates. All rights reserved.
      3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      4  *
      5  * This code is free software; you can redistribute it and/or modify it
      6  * under the terms of the GNU General Public License version 2 only, as
      7  * published by the Free Software Foundation.  Oracle designates this
      8  * particular file as subject to the "Classpath" exception as provided
      9  * by Oracle in the LICENSE file that accompanied this code.
     10  *
     11  * This code is distributed in the hope that it will be useful, but WITHOUT
     12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
     13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     14  * version 2 for more details (a copy is included in the LICENSE file that
     15  * accompanied this code).
     16  *
     17  * You should have received a copy of the GNU General Public License version
     18  * 2 along with this work; if not, write to the Free Software Foundation,
     19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
     20  *
     21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
     22  * or visit www.oracle.com if you need additional information or have any
     23  * questions.
     24  */
     25
     26 package java.security;
     27
     28 import java.security.*;
     29 import java.util.Enumeration;
     30 import java.util.Hashtable;
     31 import java.util.StringTokenizer;
     32 import sun.security.util.SecurityConstants;
     33
     34 /**
     35  * The AllPermission is a permission that implies all other permissions.
     36  * <p>
     37  * <b>Note:</b> Granting AllPermission should be done with extreme care,
     38  * as it implies all other permissions. Thus, it grants code the ability
     39  * to run with security
     40  * disabled.  Extreme caution should be taken before granting such
     41  * a permission to code.  This permission should be used only during testing,
     42  * or in extremely rare cases where an application or applet is
     43  * completely trusted and adding the necessary permissions to the policy
     44  * is prohibitively cumbersome.
     45  *
     46  * @see java.security.Permission
     47  * @see java.security.AccessController
     48  * @see java.security.Permissions
     49  * @see java.security.PermissionCollection
     50  * @see java.lang.SecurityManager
     51  *
     52  *
     53  * @author Roland Schemers
     54  * @since 1.2
     55  *
     56  * @serial exclude
     57  */
     58
     59 public final class AllPermission extends Permission {
     60
     61     @java.io.Serial
     62     private static final long serialVersionUID = -2916474571451318075L;
     63
     64     /**
     65      * Creates a new AllPermission object.
     66      */
     67     public AllPermission() {
     68         super("<all permissions>");
     69     }
     70
     71
     72     /**
     73      * Creates a new AllPermission object. This
     74      * constructor exists for use by the {@code Policy} object
     75      * to instantiate new Permission objects.
     76      *
     77      * @param name ignored
     78      * @param actions ignored.
     79      */
     80     public AllPermission(String name, String actions) {
     81         this();
     82     }
     83
     84     /**
     85      * Checks if the specified permission is "implied" by
     86      * this object. This method always returns true.
     87      *
     88      * @param p the permission to check against.
     89      *
     90      * @return return
     91      */
     92     public boolean implies(Permission p) {
     93          return true;
     94     }
     95
     96     /**
     97      * Checks two AllPermission objects for equality. Two AllPermission
     98      * objects are always equal.
     99      *
    100      * @param obj the object we are testing for equality with this object.
    101      * @return true if {@code obj} is an AllPermission, false otherwise.
    102      */
    103     public boolean equals(Object obj) {
    104         return (obj instanceof AllPermission);
    105     }
    106
    107     /**
    108      * Returns the hash code value for this object.
    109      *
    110      * @return a hash code value for this object.
    111      */
    112
    113     public int hashCode() {
    114         return 1;
    115     }
    116
    117     /**
    118      * Returns the canonical string representation of the actions.
    119      *
    120      * @return the actions.
    121      */
    122     public String getActions() {
    123         return "<all actions>";
    124     }
    125
    126     /**
    127      * Returns a new PermissionCollection object for storing AllPermission
    128      * objects.
    129      *
    130      * @return a new PermissionCollection object suitable for
    131      * storing AllPermissions.
    132      */
    133     public PermissionCollection newPermissionCollection() {
    134         return new AllPermissionCollection();
    135     }
    136
    137 }
    138
    139 /**
    140  * A AllPermissionCollection stores a collection
    141  * of AllPermission permissions. AllPermission objects
    142  * must be stored in a manner that allows them to be inserted in any
    143  * order, but enable the implies function to evaluate the implies
    144  * method in an efficient (and consistent) manner.
    145  *
    146  * @see java.security.Permission
    147  * @see java.security.Permissions
    148  *
    149  *
    150  * @author Roland Schemers
    151  *
    152  * @serial include
    153  */
    154
    155 final class AllPermissionCollection
    156     extends PermissionCollection
    157     implements java.io.Serializable
    158 {
    159
    160     // use serialVersionUID from JDK 1.2.2 for interoperability
    161     @java.io.Serial
    162     private static final long serialVersionUID = -4023755556366636806L;
    163
    164     /**
    165      * true if any AllPermissions have been added
    166      */
    167     private boolean all_allowed;
    168
    169     /**
    170      * Create an empty AllPermissions object.
    171      *
    172      */
    173
    174     public AllPermissionCollection() {
    175         all_allowed = false;
    176     }
    177
    178     /**
    179      * Adds a permission to the AllPermissions. The key for the hash is
    180      * permission.path.
    181      *
    182      * @param permission the Permission object to add.
    183      *
    184      * @throws    IllegalArgumentException   if the permission is not an
    185      *                                       AllPermission
    186      *
    187      * @throws    SecurityException   if this AllPermissionCollection object
    188      *                                has been marked readonly
    189      */
    190
    191     public void add(Permission permission) {
    192         if (! (permission instanceof AllPermission))
    193             throw new IllegalArgumentException("invalid permission: "+
    194                                                permission);
    195         if (isReadOnly())
    196             throw new SecurityException("attempt to add a Permission to a readonly PermissionCollection");
    197
    198         all_allowed = true; // No sync; staleness OK
    199     }
    200
    201     /**
    202      * Check and see if this set of permissions implies the permissions
    203      * expressed in "permission".
    204      *
    205      * @param permission the Permission object to compare
    206      *
    207      * @return always returns true.
    208      */
    209
    210     public boolean implies(Permission permission) {
    211         return all_allowed; // No sync; staleness OK
    212     }
    213
    214     /**
    215      * Returns an enumeration of all the AllPermission objects in the
    216      * container.
    217      *
    218      * @return an enumeration of all the AllPermission objects.
    219      */
    220     public Enumeration<Permission> elements() {
    221         return new Enumeration<>() {
    222             private boolean hasMore = all_allowed;
    223
    224             public boolean hasMoreElements() {
    225                 return hasMore;
    226             }
    227
    228             public Permission nextElement() {
    229                 hasMore = false;
    230                 return SecurityConstants.ALL_PERMISSION;
    231             }
    232         };
    233     }
    234 }