package org.exist.client.xacml;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.exist.client.ClientFrame;
import org.exist.security.User;
import org.exist.security.xacml.XACMLConstants;
import org.exist.xmldb.UserManagementService;
import org.xmldb.api.base.Collection;
import org.xmldb.api.base.XMLDBException;
import com.sun.xacml.ParsingException;
import com.sun.xacml.attr.AttributeDesignator;
import com.sun.xacml.attr.AttributeValue;
public class UserAttributeHandler implements AttributeHandler
{
private Collection collection;
private UserAttributeHandler() {}
public UserAttributeHandler(DatabaseInterface dbInterface)
{
if(dbInterface == null)
throw new NullPointerException("Database interface cannot be null");
this.collection = dbInterface.getPolicyCollection();
}
public void filterFunctions(Set functions, AttributeDesignator attribute)
{
URI id = attribute.getId();
if(id.equals(XACMLConstants.SUBJECT_ID_ATTRIBUTE) ||
id.equals(XACMLConstants.USER_NAME_ATTRIBUTE) ||
id.equals(XACMLConstants.GROUP_ATTRIBUTE) ||
id.equals(XACMLConstants.SUBJECT_NS_ATTRIBUTE))
{
List retain = new ArrayList(2);
retain.add("equals");
retain.add("=");
functions.retainAll(retain);
}
}
public boolean getAllowedValues(Set values, AttributeDesignator attribute)
{
URI id = attribute.getId();
if(id.equals(XACMLConstants.SUBJECT_ID_ATTRIBUTE))
{
User[] users = getUsers();
for(int i = 0; i < users.length; ++i)
values.add(new Integer(users[i].getUID()));
return false;
}
if(id.equals(XACMLConstants.USER_NAME_ATTRIBUTE))
{
User[] users = getUsers();
for(int i = 0; i < users.length; ++i)
values.add(users[i].getName());
return false;
}
if(id.equals(XACMLConstants.GROUP_ATTRIBUTE))
{
String[] groupNames = getGroups();
for(int i = 0; i < groupNames.length; ++i)
values.add(groupNames[i]);
return false;
}
if(id.equals(XACMLConstants.SUBJECT_NS_ATTRIBUTE))
{
values.add(XACMLConstants.SUBJECT_NS);
return false;
}
return true;
}
private User[] getUsers()
{
UserManagementService service = getUserService();
if(service == null)
return new User[0];
try
{
return service.getUsers();
}
catch (XMLDBException xe)
{
ClientFrame.showErrorMessage("Could not get list of users: user attributes will be invalid", xe);
return new User[0];
}
}
private String[] getGroups()
{
UserManagementService service = getUserService();
if(service == null)
return new String[0];
try
{
return service.getGroups();
}
catch (XMLDBException xe)
{
ClientFrame.showErrorMessage("Could not get list of groups: group attributes will be invalid", xe);
return new String[0];
}
}
private UserManagementService getUserService()
{
try
{
return (UserManagementService)collection.getService("UserManagementService", "1.0");
}
catch (XMLDBException xe)
{
ClientFrame.showErrorMessage("Could not get user management service: user and group attributes will be invalid.", xe);
return null;
}
}
public void checkUserValue(AttributeValue value, AttributeDesignator attribute) throws ParsingException
{
//user is not allowed to edit any of the handled attributes, so this
//method will not be called for those attributes
}
}