/* | |
* Licensed to the Apache Software Foundation (ASF) under one or more | |
* contributor license agreements. See the NOTICE file distributed with | |
* this work for additional information regarding copyright ownership. | |
* The ASF licenses this file to You under the Apache License, Version 2.0 | |
* (the "License"); you may not use this file except in compliance with | |
* the License. You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
*/ | |
package org.apache.harmony.security.tests.support.acl; | |
import java.security.Principal; | |
import java.security.acl.*; | |
import java.util.*; | |
/** | |
* Additional class for verification Acl interface | |
*/ | |
public class AclImpl extends OwnerImpl implements Acl { | |
private Hashtable allowedUsersTable; | |
private Hashtable allowedGroupsTable; | |
private Hashtable deniedUsersTable; | |
private Hashtable deniedGroupsTable; | |
private String aclName; | |
private Vector zeroSet; | |
public AclImpl(Principal principal, String s) { | |
super(principal); | |
allowedUsersTable = new Hashtable(23); | |
allowedGroupsTable = new Hashtable(23); | |
deniedUsersTable = new Hashtable(23); | |
deniedGroupsTable = new Hashtable(23); | |
aclName = null; | |
zeroSet = new Vector(1, 1); | |
try { | |
setName(principal, s); | |
} catch(Exception exception) { } | |
} | |
public void setName(Principal principal, String s) | |
throws NotOwnerException { | |
if(!isOwner(principal)) { | |
throw new NotOwnerException(); | |
} else { | |
aclName = s; | |
return; | |
} | |
} | |
public String getName() { | |
return aclName; | |
} | |
public synchronized boolean addEntry(Principal principal, AclEntry aclentry) | |
throws NotOwnerException { | |
if(!isOwner(principal)) throw new NotOwnerException(); | |
Hashtable hashtable = findTable(aclentry); | |
Principal principal1 = aclentry.getPrincipal(); | |
if(hashtable.get(principal1) != null) { | |
return false; | |
} else { | |
hashtable.put(principal1, aclentry); | |
return true; | |
} | |
} | |
public synchronized boolean removeEntry(Principal principal, AclEntry aclentry) | |
throws NotOwnerException { | |
if(!isOwner(principal)) { | |
throw new NotOwnerException(); | |
} else { | |
Hashtable hashtable = findTable(aclentry); | |
Principal principal1 = aclentry.getPrincipal(); | |
Object obj = hashtable.remove(principal1); | |
return obj != null; | |
} | |
} | |
public synchronized Enumeration getPermissions(Principal principal) { | |
Enumeration enumeration2 = subtract(getGroupPositive(principal), getGroupNegative(principal)); | |
Enumeration enumeration3 = subtract(getGroupNegative(principal), getGroupPositive(principal)); | |
Enumeration enumeration = subtract(getIndividualPositive(principal), getIndividualNegative(principal)); | |
Enumeration enumeration1 = subtract(getIndividualNegative(principal), getIndividualPositive(principal)); | |
Enumeration enumeration4 = subtract(enumeration2, enumeration1); | |
Enumeration enumeration5 = union(enumeration, enumeration4); | |
enumeration = subtract(getIndividualPositive(principal), getIndividualNegative(principal)); | |
enumeration1 = subtract(getIndividualNegative(principal), getIndividualPositive(principal)); | |
enumeration4 = subtract(enumeration3, enumeration); | |
Enumeration enumeration6 = union(enumeration1, enumeration4); | |
return subtract(enumeration5, enumeration6); | |
} | |
public boolean checkPermission(Principal principal, Permission permission) { | |
for(Enumeration enumeration = getPermissions(principal); enumeration.hasMoreElements();) { | |
Permission permission1 = (Permission)enumeration.nextElement(); | |
if(permission1.equals(permission)) | |
return true; | |
} | |
return false; | |
} | |
public synchronized Enumeration entries() { | |
return new AclEnumerator(this, allowedUsersTable, allowedGroupsTable, deniedUsersTable, deniedGroupsTable); | |
} | |
public String toString() { | |
StringBuffer stringbuffer = new StringBuffer(); | |
for(Enumeration enumeration = entries(); enumeration.hasMoreElements(); stringbuffer.append("\n")) { | |
AclEntry aclentry = (AclEntry)enumeration.nextElement(); | |
stringbuffer.append(aclentry.toString().trim()); | |
} | |
return stringbuffer.toString(); | |
} | |
private Hashtable findTable(AclEntry aclentry) { | |
Hashtable hashtable = null; | |
Principal principal = aclentry.getPrincipal(); | |
if(principal instanceof Group) { | |
if(aclentry.isNegative()) | |
hashtable = deniedGroupsTable; | |
else | |
hashtable = allowedGroupsTable; | |
} else | |
if(aclentry.isNegative()) | |
hashtable = deniedUsersTable; | |
else | |
hashtable = allowedUsersTable; | |
return hashtable; | |
} | |
private static Enumeration union(Enumeration enumeration, Enumeration enumeration1) { | |
Vector vector = new Vector(20, 20); | |
for(; enumeration.hasMoreElements(); vector.addElement(enumeration.nextElement())); | |
do { | |
if(!enumeration1.hasMoreElements()) | |
break; | |
Object obj = enumeration1.nextElement(); | |
if(!vector.contains(obj)) | |
vector.addElement(obj); | |
} while(true); | |
return vector.elements(); | |
} | |
private Enumeration subtract(Enumeration enumeration, Enumeration enumeration1) { | |
Vector vector = new Vector(20, 20); | |
for(; enumeration.hasMoreElements(); vector.addElement(enumeration.nextElement())); | |
do { | |
if(!enumeration1.hasMoreElements()) | |
break; | |
Object obj = enumeration1.nextElement(); | |
if(vector.contains(obj)) | |
vector.removeElement(obj); | |
} while(true); | |
return vector.elements(); | |
} | |
private Enumeration getGroupPositive(Principal principal) { | |
Enumeration enumeration = zeroSet.elements(); | |
Enumeration enumeration1 = allowedGroupsTable.keys(); | |
do { | |
if(!enumeration1.hasMoreElements()) | |
break; | |
Group group = (Group)enumeration1.nextElement(); | |
if(group.isMember(principal)) { | |
AclEntry aclentry = (AclEntry)allowedGroupsTable.get(group); | |
enumeration = union(aclentry.permissions(), enumeration); | |
} | |
} while(true); | |
return enumeration; | |
} | |
private Enumeration getGroupNegative(Principal principal) { | |
Enumeration enumeration = zeroSet.elements(); | |
Enumeration enumeration1 = deniedGroupsTable.keys(); | |
do { | |
if(!enumeration1.hasMoreElements()) | |
break; | |
Group group = (Group)enumeration1.nextElement(); | |
if(group.isMember(principal)) { | |
AclEntry aclentry = (AclEntry)deniedGroupsTable.get(group); | |
enumeration = union(aclentry.permissions(), enumeration); | |
} | |
} while(true); | |
return enumeration; | |
} | |
private Enumeration getIndividualPositive(Principal principal) { | |
Enumeration enumeration = zeroSet.elements(); | |
AclEntry aclentry = (AclEntry)allowedUsersTable.get(principal); | |
if(aclentry != null) | |
enumeration = aclentry.permissions(); | |
return enumeration; | |
} | |
private Enumeration getIndividualNegative(Principal principal) { | |
Enumeration enumeration = zeroSet.elements(); | |
AclEntry aclentry = (AclEntry)deniedUsersTable.get(principal); | |
if(aclentry != null) | |
enumeration = aclentry.permissions(); | |
return enumeration; | |
} | |
} |