package org.jboss.ejb.plugins;
import org.jboss.ejb.Container;
import org.jboss.invocation.Invocation;
import org.jboss.metadata.ApplicationMetaData;
import org.jboss.metadata.AssemblyDescriptorMetaData;
import org.jboss.metadata.BeanMetaData;
import org.jboss.metadata.SecurityIdentityMetaData;
import org.jboss.security.RunAsIdentity;
import java.util.Set;
public class RunAsSecurityInterceptor extends AbstractInterceptor
{
protected RunAsIdentity runAsIdentity;
public RunAsSecurityInterceptor()
{
}
public void setContainer(Container container)
{
super.setContainer(container);
if (container != null)
{
BeanMetaData beanMetaData = container.getBeanMetaData();
ApplicationMetaData application = beanMetaData.getApplicationMetaData();
AssemblyDescriptorMetaData assemblyDescriptor = application.getAssemblyDescriptor();
SecurityIdentityMetaData secMetaData = beanMetaData.getSecurityIdentityMetaData();
if (secMetaData != null && secMetaData.getUseCallerIdentity() == false)
{
String roleName = secMetaData.getRunAsRoleName();
String principalName = secMetaData.getRunAsPrincipalName();
if( principalName == null )
principalName = application.getUnauthenticatedPrincipal();
Set extraRoleNames = assemblyDescriptor.getSecurityRoleNamesByPrincipal(principalName);
runAsIdentity = new RunAsIdentity(roleName, principalName, extraRoleNames);
}
}
}
public void start() throws Exception
{
super.start();
}
public Object invokeHome(Invocation mi) throws Exception
{
SecurityActions.pushRunAsIdentity(runAsIdentity);
try
{
Object returnValue = getNext().invokeHome(mi);
return returnValue;
}
finally
{
SecurityActions.popRunAsIdentity();
}
}
public Object invoke(Invocation mi) throws Exception
{
SecurityActions.pushRunAsIdentity(runAsIdentity);
try
{
Object returnValue = getNext().invoke(mi);
return returnValue;
}
finally
{
SecurityActions.popRunAsIdentity();
}
}
}