1 /*
   2  * Copyright (c) 1997, 2007, 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 
  27 package com.sun.jmx.snmp.IPAcl;
  28 
  29 
  30 
  31 import java.security.acl.Permission;
  32 import java.util.Vector;
  33 import java.util.Enumeration;
  34 import java.io.Serializable;
  35 import java.net.UnknownHostException;
  36 
  37 import java.security.Principal;
  38 import java.security.acl.AclEntry;
  39 
  40 
  41 /**
  42  * Represent one entry in the Access Control List (ACL).
  43  * This ACL entry object contains a permission associated with a particular principal.
  44  * (A principal represents an entity such as an individual machine or a group).
  45  *
  46  * @see java.security.acl.AclEntry
  47  */
  48 
  49 class AclEntryImpl implements AclEntry, Serializable {
  50   private static final long serialVersionUID = -5047185131260073216L;
  51 
  52   private AclEntryImpl (AclEntryImpl i) throws UnknownHostException {
  53         setPrincipal(i.getPrincipal());
  54         permList = new Vector<Permission>();
  55         commList = new Vector<String>();
  56 
  57         for (Enumeration<String> en = i.communities(); en.hasMoreElements();){
  58           addCommunity(en.nextElement());
  59         }
  60 
  61         for (Enumeration<Permission> en = i.permissions(); en.hasMoreElements();){
  62           addPermission(en.nextElement());
  63         }
  64         if (i.isNegative()) setNegativePermissions();
  65   }
  66 
  67   /**
  68    * Contructs an empty ACL entry.
  69    */
  70   public AclEntryImpl (){
  71         princ = null;
  72         permList = new Vector<Permission>();
  73         commList = new Vector<String>();
  74   }
  75 
  76   /**
  77    * Constructs an ACL entry with a specified principal.
  78    *
  79    * @param p the principal to be set for this entry.
  80    */
  81   public AclEntryImpl (Principal p) throws UnknownHostException {
  82         princ = p;
  83         permList = new Vector<Permission>();
  84         commList = new Vector<String>();
  85   }
  86 
  87   /**
  88    * Clones this ACL entry.
  89    *
  90    * @return a clone of this ACL entry.
  91    */
  92   public Object clone() {
  93         AclEntryImpl i;
  94         try {
  95           i = new AclEntryImpl(this);
  96         }catch (UnknownHostException e) {
  97           i = null;
  98         }
  99         return (Object) i;
 100   }
 101 
 102   /**
 103    * Returns true if this is a negative ACL entry (one denying the associated principal
 104    * the set of permissions in the entry), false otherwise.
 105    *
 106    * @return true if this is a negative ACL entry, false if it's not.
 107    */
 108   public boolean isNegative(){
 109         return neg;
 110   }
 111 
 112   /**
 113    * Adds the specified permission to this ACL entry. Note: An entry can
 114    * have multiple permissions.
 115    *
 116    * @param perm the permission to be associated with the principal in this
 117    *        entry
 118    * @return true if the permission is removed, false if the permission was
 119    *         not part of this entry's permission set.
 120    *
 121    */
 122   public boolean addPermission(java.security.acl.Permission perm){
 123         if (permList.contains(perm)) return false;
 124         permList.addElement(perm);
 125         return true;
 126   }
 127 
 128   /**
 129    * Removes the specified permission from this ACL entry.
 130    *
 131    * @param perm the permission to be removed from this entry.
 132    * @return true if the permission is removed, false if the permission
 133    *         was not part of this entry's permission set.
 134    */
 135   public boolean removePermission(java.security.acl.Permission perm){
 136         if (!permList.contains(perm)) return false;
 137         permList.removeElement(perm);
 138         return true;
 139   }
 140 
 141   /**
 142    * Checks if the specified permission is part of the permission set in
 143    * this entry.
 144    *
 145    * @param perm the permission to be checked for.
 146    * @return true if the permission is part of the permission set in this
 147    *         entry, false otherwise.
 148    */
 149 
 150   public boolean checkPermission(java.security.acl.Permission perm){
 151         return (permList.contains(perm));
 152   }
 153 
 154   /**
 155    * Returns an enumeration of the permissions in this ACL entry.
 156    *
 157    * @return an enumeration of the permissions in this ACL entry.
 158    */
 159   public Enumeration<Permission> permissions(){
 160         return permList.elements();
 161   }
 162 
 163   /**
 164    * Sets this ACL entry to be a negative one. That is, the associated principal
 165    * (e.g., a user or a group) will be denied the permission set specified in the
 166    * entry. Note: ACL entries are by default positive. An entry becomes a negative
 167    * entry only if this setNegativePermissions method is called on it.
 168    *
 169    * Not Implemented.
 170    */
 171   public void setNegativePermissions(){
 172         neg = true;
 173   }
 174 
 175   /**
 176    * Returns the principal for which permissions are granted or denied by this ACL
 177    * entry. Returns null if there is no principal set for this entry yet.
 178    *
 179    * @return the principal associated with this entry.
 180    */
 181   public Principal getPrincipal(){
 182         return princ;
 183   }
 184 
 185   /**
 186    * Specifies the principal for which permissions are granted or denied by
 187    * this ACL entry. If a principal was already set for this ACL entry,
 188    * false is returned, otherwise true is returned.
 189    *
 190    * @param p the principal to be set for this entry.
 191    * @return true if the principal is set, false if there was already a
 192    *         principal set for this entry.
 193    */
 194   public boolean setPrincipal(Principal p) {
 195         if (princ != null )
 196           return false;
 197         princ = p;
 198         return true;
 199   }
 200 
 201   /**
 202    * Returns a string representation of the contents of this ACL entry.
 203    *
 204    * @return a string representation of the contents.
 205    */
 206   public String toString(){
 207         return "AclEntry:"+princ.toString();
 208   }
 209 
 210   /**
 211    * Returns an enumeration of the communities in this ACL entry.
 212    *
 213    * @return an enumeration of the communities in this ACL entry.
 214    */
 215   public Enumeration<String> communities(){
 216         return commList.elements();
 217   }
 218 
 219   /**
 220    * Adds the specified community to this ACL entry. Note: An entry can
 221    * have multiple communities.
 222    *
 223    * @param comm the community to be associated with the principal
 224    *        in this entry.
 225    * @return true if the community was added, false if the community was
 226    *         already part of this entry's community set.
 227    */
 228   public boolean addCommunity(String comm){
 229         if (commList.contains(comm)) return false;
 230         commList.addElement(comm);
 231         return true;
 232   }
 233 
 234   /**
 235    * Removes the specified community from this ACL entry.
 236    *
 237    * @param comm the community  to be removed from this entry.
 238    * @return true if the community is removed, false if the community was
 239    *         not part of this entry's community set.
 240    */
 241   public boolean removeCommunity(String comm){
 242         if (!commList.contains(comm)) return false;
 243         commList.removeElement(comm);
 244         return true;
 245   }
 246 
 247   /**
 248    * Checks if the specified community is part of the community set in this
 249    * entry.
 250    *
 251    * @param  comm the community to be checked for.
 252    * @return true if the community is part of the community set in this
 253    *         entry, false otherwise.
 254    */
 255   public boolean checkCommunity(String comm){
 256         return (commList.contains(comm));
 257   }
 258 
 259   private Principal princ = null;
 260   private boolean neg     = false;
 261   private Vector<Permission> permList = null;
 262   private Vector<String> commList = null;
 263 }