blob: 17c20f9ed62fe81ed581e57a2186c09ed6e040c7 [file] [log] [blame]
/*
* 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;
}
}