package org.jboss.security.jacc;
import java.security.Policy;
import java.security.PrivilegedAction;
import java.security.AccessController;
import java.lang.reflect.Constructor;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.security.jacc.PolicyContext;
import org.jboss.logging.Logger;
public class SecurityService
{
private static final String JACC_POLICY_PROVIDER = "javax.security.jacc.policy.provider";
private static final Logger log = Logger.getLogger(SecurityService.class);
private Policy oldPolicy;
private Policy jaccPolicy;
private ObjectName policyName;
private String policyAttributeName = "Policy";
private MBeanServer server;
public ObjectName getPolicyName()
{
return policyName;
}
public void setPolicyName(ObjectName policyName)
{
this.policyName = policyName;
}
public String getPolicyAttributeName()
{
return policyAttributeName;
}
public void setPolicyAttributeName(String policyAttributeName)
{
this.policyAttributeName = policyAttributeName;
}
public MBeanServer getMBeanServer()
{
return server;
}
public void setMBeanServer(MBeanServer server)
{
this.server = server;
}
public void start() throws Exception
{
oldPolicy = Policy.getPolicy();
if( server != null && policyName != null && server.isRegistered(policyName) )
{
try
{
jaccPolicy = (Policy) server.getAttribute(policyName, policyAttributeName);
}
catch(Exception e)
{
log.warn("Failed to get " + policyAttributeName
+ " attribute from: " + policyName, e);
}
}
if( jaccPolicy == null )
{
String provider = getProperty(JACC_POLICY_PROVIDER,
"org.jboss.security.jacc.DelegatingPolicy");
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Class providerClass = loader.loadClass(provider);
try
{
Class[] ctorSig = {Policy.class};
Constructor ctor = providerClass.getConstructor(ctorSig);
Object[] ctorArgs = {oldPolicy};
jaccPolicy = (Policy) ctor.newInstance(ctorArgs);
}
catch(NoSuchMethodException e)
{
log.debug("Provider does not support ctor(Policy)");
jaccPolicy = (Policy) providerClass.newInstance();
}
}
Policy.setPolicy(jaccPolicy);
jaccPolicy.refresh();
SubjectPolicyContextHandler handler = new SubjectPolicyContextHandler();
PolicyContext.registerHandler(SubjectPolicyContextHandler.SUBJECT_CONTEXT_KEY,
handler, true);
}
public void stop() throws Exception
{
if( jaccPolicy != null )
Policy.setPolicy(oldPolicy);
}
static class PropertyAccessAction implements PrivilegedAction
{
private String name;
private String defaultValue;
PropertyAccessAction(String name, String defaultValue)
{
this.name = name;
this.defaultValue = defaultValue;
}
public Object run()
{
return System.getProperty(name, defaultValue);
}
}
static String getProperty(String name)
{
return getProperty(name, null);
}
static String getProperty(String name, String defaultValue)
{
PrivilegedAction action = new PropertyAccessAction(name, defaultValue);
String property = (String) AccessController.doPrivileged(action);
return property;
}
}