package org.jboss.proxy;
import java.security.Principal;
import java.security.PrivilegedAction;
import java.security.AccessController;
import org.jboss.invocation.Invocation;
import org.jboss.security.SecurityAssociation;
public class SecurityInterceptor
extends Interceptor
{
private static final long serialVersionUID = -4206940878404525061L;
public SecurityInterceptor()
{
}
public Object invoke(Invocation invocation)
throws Throwable
{
SecurityActions sa = SecurityActions.UTIL.getSecurityActions();
Principal principal = sa.getPrincipal();
if (principal != null)
{
invocation.setPrincipal(principal);
}
Object credential = sa.getCredential();
if (credential != null)
{
invocation.setCredential(credential);
}
return getNext().invoke(invocation);
}
interface SecurityActions
{
class UTIL
{
static SecurityActions getSecurityActions()
{
return System.getSecurityManager() == null ? NON_PRIVILEGED : PRIVILEGED;
}
}
SecurityActions NON_PRIVILEGED = new SecurityActions()
{
public Principal getPrincipal()
{
return SecurityAssociation.getPrincipal();
}
public Object getCredential()
{
return SecurityAssociation.getCredential();
}
};
SecurityActions PRIVILEGED = new SecurityActions()
{
private final PrivilegedAction getPrincipalAction = new PrivilegedAction()
{
public Object run()
{
return SecurityAssociation.getPrincipal();
}
};
private final PrivilegedAction getCredentialAction = new PrivilegedAction()
{
public Object run()
{
return SecurityAssociation.getCredential();
}
};
public Principal getPrincipal()
{
return (Principal)AccessController.doPrivileged(getPrincipalAction);
}
public Object getCredential()
{
return AccessController.doPrivileged(getCredentialAction);
}
};
Principal getPrincipal();
Object getCredential();
}
}