package org.jboss.security;
import java.io.IOException;
import java.security.CodeSource;
import java.security.Permission;
import java.security.PermissionCollection;
import java.security.Permissions;
import java.security.Principal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
import javax.security.auth.AuthPermission;
import javax.security.auth.Subject;
public class AuthorizationInfo
{
private static Set emptySet = new HashSet();
private ArrayList policyMap = new ArrayList();
private PolicyEntry[] policyEntries;
static class PolicyEntry
{
private CodeSource cs;
private Principal[] principals;
private ArrayList permissions;
PolicyEntry(CodeSource cs, Principal[] principals, ArrayList permissions)
{
this.cs = cs;
this.principals = principals;
this.permissions = permissions;
}
public void getPermissions(PermissionCollection perms)
{
int length = permissions == null ? 0 : permissions.size();
for(int n = 0; n < length; n ++)
{
Permission permission = (Permission) permissions.get(n);
perms.add(permission);
}
}
public boolean implies(CodeSource codesrc, Set subjectPrincipals)
{
boolean implies = false;
if( this.cs == codesrc )
{ implies = true;
}
else if( this.cs != null && codesrc != null && this.cs.implies(codesrc) )
{
implies = true;
}
if( implies == true )
{
if( this.principals != null )
{ for(int p = 0; p < this.principals.length; p ++)
{
if( subjectPrincipals.contains(this.principals[p]) == false )
{
implies = false;
break;
}
}
}
}
return implies;
}
public boolean equals(Object obj)
{
PolicyEntry key = (PolicyEntry) obj;
boolean equals = this.cs == key.cs;
if( equals == false )
{
if( this.cs != null && key.cs != null )
equals = this.cs.equals(key.cs);
if( equals == true )
{ if( this.principals != null && key.principals != null && this.principals.length == key.principals.length )
{
for(int p = 0; p < this.principals.length; p ++)
{
if( this.principals[p].equals(key.principals[p]) == false )
{
equals = false;
break;
}
}
}
else if( this.principals != null || key.principals != null )
{
equals = false;
}
}
}
return equals;
}
public int hashCode()
{
int hashCode = 0;
if( cs != null )
hashCode = cs.hashCode();
int length = (this.principals == null ? 0 : this.principals.length);
for(int p = 0; p < length; p ++)
{
hashCode += this.principals[p].hashCode();
}
return hashCode;
}
public String toString()
{
StringBuffer buffer = new StringBuffer();
buffer.append("cs=");
buffer.append(cs);
buffer.append("; principals=");
for(int p = 0; principals != null && p < principals.length; p ++)
buffer.append(principals[p]);
buffer.append("; permissions=");
buffer.append(permissions);
return buffer.toString();
}
}
public AuthorizationInfo()
{
}
public PermissionCollection getPermissions(Subject subject, CodeSource codesource)
{
PermissionCollection perms = new Permissions();
Set subjectPrincipals = emptySet;
if( subject != null )
subjectPrincipals = subject.getPrincipals();
for(int n = 0; n < policyMap.size(); n ++)
{
PolicyEntry entry = (PolicyEntry) policyMap.get(n);
if( entry.implies(codesource, subjectPrincipals) == true )
entry.getPermissions(perms);
}
return perms;
}
public String toString()
{
StringBuffer buffer = new StringBuffer("permissions:");
return buffer.toString();
}
public void grant(CodeSource cs, ArrayList permissions)
{
grant(cs, permissions, null);
}
public void grant(CodeSource cs, ArrayList permissions, Principal[] principals)
{
PolicyEntry entry = new PolicyEntry(cs, principals, permissions);
policyMap.add(entry);
}
}